summaryrefslogtreecommitdiff
path: root/java/src/main
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2010-10-24 18:46:48 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2010-10-24 18:46:48 +0900
commitdbb28d9a8ffd259d9a9d977892d71434eebffb5a (patch)
treed52a9ca6cdaa8e8a5051b98452fb4ba6a5fe873b /java/src/main
parent19fd4e755cd88fc0b108e2c860ebf88394d98f03 (diff)
downloadmsgpack-python-dbb28d9a8ffd259d9a9d977892d71434eebffb5a.tar.gz
java: Template extends MessagePacker
Diffstat (limited to 'java/src/main')
-rw-r--r--java/src/main/java/org/msgpack/Packer.java108
-rw-r--r--java/src/main/java/org/msgpack/Template.java2
-rw-r--r--java/src/main/java/org/msgpack/Templates.java15
-rw-r--r--java/src/main/java/org/msgpack/Unpacker.java46
-rw-r--r--java/src/main/java/org/msgpack/template/AnyTemplate.java52
-rw-r--r--java/src/main/java/org/msgpack/template/BigIntegerTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/BooleanTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/ByteArrayTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/ByteTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/ClassTemplate.java218
-rw-r--r--java/src/main/java/org/msgpack/template/CollectionTemplate.java11
-rw-r--r--java/src/main/java/org/msgpack/template/DoubleTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/FloatTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/IntegerTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/ListTemplate.java10
-rw-r--r--java/src/main/java/org/msgpack/template/LongTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/MapTemplate.java11
-rw-r--r--java/src/main/java/org/msgpack/template/OptionalTemplate.java14
-rw-r--r--java/src/main/java/org/msgpack/template/ShortTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/template/StringTemplate.java4
-rw-r--r--java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java6
21 files changed, 376 insertions, 157 deletions
diff --git a/java/src/main/java/org/msgpack/Packer.java b/java/src/main/java/org/msgpack/Packer.java
index 1475ac6..8349a30 100644
--- a/java/src/main/java/org/msgpack/Packer.java
+++ b/java/src/main/java/org/msgpack/Packer.java
@@ -29,7 +29,7 @@ import java.math.BigInteger;
import org.msgpack.annotation.MessagePackDelegate;
import org.msgpack.annotation.MessagePackMessage;
import org.msgpack.annotation.MessagePackOrdinalEnum;
-import org.msgpack.packer.*;
+import org.msgpack.util.codegen.DynamicTemplate;
/**
* Packer enables you to serialize objects into OutputStream.
@@ -49,17 +49,7 @@ import org.msgpack.packer.*;
*/
public class Packer {
static {
- // final classes
- BooleanPacker.getInstance();
- ByteArrayPacker.getInstance();
- BytePacker.getInstance();
- DoublePacker.getInstance();
- FloatPacker.getInstance();
- IntegerPacker.getInstance();
- LongPacker.getInstance();
- ShortPacker.getInstance();
- StringPacker.getInstance();
- //BigIntegerPacker.getInstance(); // BigInteger is not final
+ Templates.load();
}
public static void load() { }
@@ -429,12 +419,6 @@ public class Packer {
return packString(o);
}
- public Packer pack(MessagePackable o) throws IOException {
- if(o == null) { return packNil(); }
- o.messagePack(this);
- return this;
- }
-
public Packer pack(byte[] o) throws IOException {
if(o == null) { return packNil(); }
packRaw(o.length);
@@ -458,86 +442,20 @@ public class Packer {
return this;
}
+ public Packer pack(MessagePackable o) throws IOException {
+ if(o == null) { return packNil(); }
+ o.messagePack(this);
+ return this;
+ }
public Packer pack(Object o) throws IOException {
- if(o == null) {
- return packNil();
- //} else if(o instanceof String) {
- // byte[] b = ((String)o).getBytes("UTF-8");
- // packRaw(b.length);
- // return packRawBody(b);
- } else if(o instanceof MessagePackable) {
- ((MessagePackable)o).messagePack(this);
- return this;
- //} else if(o instanceof byte[]) {
- // byte[] b = (byte[])o;
- // packRaw(b.length);
- // return packRawBody(b);
- } else if(o instanceof List) {
- List<Object> l = (List<Object>)o;
- packArray(l.size());
- for(Object i : l) { pack(i); }
- return this;
- } else if(o instanceof Set) {
- Set<Object> l = (Set<Object>)o;
- packArray(l.size());
- for(Object i : l) { pack(i); }
- return this;
- } else if(o instanceof Map) {
- Map<Object,Object> m = (Map<Object,Object>)o;
- packMap(m.size());
- for(Map.Entry<Object,Object> e : m.entrySet()) {
- pack(e.getKey());
- pack(e.getValue());
- }
- return this;
- } else if(o instanceof Collection) {
- Collection<Object> l = (Collection<Object>)o;
- packArray(l.size());
- for(Object i : l) { pack(i); }
- return this;
- //} else if(o instanceof Boolean) {
- // if((Boolean)o) {
- // return packTrue();
- // } else {
- // return packFalse();
- // }
- //} else if(o instanceof Integer) {
- // return packInt((Integer)o);
- //} else if(o instanceof Long) {
- // return packLong((Long)o);
- //} else if(o instanceof Short) {
- // return packShort((Short)o);
- //} else if(o instanceof Byte) {
- // return packByte((Byte)o);
- //} else if(o instanceof Float) {
- // return packFloat((Float)o);
- //} else if(o instanceof Double) {
- // return packDouble((Double)o);
- } else if(o instanceof BigInteger) {
- return packBigInteger((BigInteger)o);
- }
+ Templates.TAny.pack(this, o);
+ return this;
+ }
- Class<?> klass = o.getClass();
- MessagePacker packer = CustomPacker.get(klass);
- if(packer != null) {
- packer.pack(this, o);
- return this;
- } else if (CustomMessage.isAnnotated(klass, MessagePackMessage.class)) {
- packer = ReflectionPacker.create(klass);
- packer.pack(this, o);
- return this;
- } else if (CustomMessage.isAnnotated(klass, MessagePackDelegate.class)) {
- // FIXME DelegatePacker
- throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
- } else if (CustomMessage.isAnnotated(klass, MessagePackOrdinalEnum.class)) {
- // FIXME OrdinalEnumPacker
- throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
- }
- if (packer != null) {
- CustomMessage.registerPacker(klass, packer);
- }
- throw new MessageTypeException("unknown object "+o+" ("+o.getClass()+")");
+ public Packer pack(Object o, Template tmpl) throws IOException {
+ tmpl.pack(this, o);
+ return this;
}
}
diff --git a/java/src/main/java/org/msgpack/Template.java b/java/src/main/java/org/msgpack/Template.java
index 71e64e0..19808af 100644
--- a/java/src/main/java/org/msgpack/Template.java
+++ b/java/src/main/java/org/msgpack/Template.java
@@ -17,6 +17,6 @@
//
package org.msgpack;
-public interface Template extends MessageUnpacker, MessageConverter {
+public interface Template extends MessagePacker, MessageUnpacker, MessageConverter {
}
diff --git a/java/src/main/java/org/msgpack/Templates.java b/java/src/main/java/org/msgpack/Templates.java
index 270f59b..3d7ccc5 100644
--- a/java/src/main/java/org/msgpack/Templates.java
+++ b/java/src/main/java/org/msgpack/Templates.java
@@ -22,6 +22,21 @@ import org.msgpack.template.*;
public class Templates {
public static void load() { }
+
+ public static final Template TAny = AnyTemplate.getInstance();
+ public static Template tAny() {
+ return TAny;
+ }
+
+ public static Template tOptional(Template elementTemplate) {
+ return new OptionalTemplate(elementTemplate);
+ }
+
+ public static Template tOptional(Template elementTemplate, Object defaultObject) {
+ return new OptionalTemplate(elementTemplate, defaultObject);
+ }
+
+
public static Template tList(Template elementTemplate) {
return new ListTemplate(elementTemplate);
}
diff --git a/java/src/main/java/org/msgpack/Unpacker.java b/java/src/main/java/org/msgpack/Unpacker.java
index 8bbafb3..e458b62 100644
--- a/java/src/main/java/org/msgpack/Unpacker.java
+++ b/java/src/main/java/org/msgpack/Unpacker.java
@@ -24,10 +24,6 @@ import java.util.Iterator;
import java.nio.ByteBuffer;
import java.math.BigInteger;
-import org.msgpack.annotation.MessagePackDelegate;
-import org.msgpack.annotation.MessagePackMessage;
-import org.msgpack.annotation.MessagePackOrdinalEnum;
-
/**
* Unpacker enables you to deserialize objects from stream.
*
@@ -572,46 +568,20 @@ public class Unpacker implements Iterable<MessagePackObject> {
return impl.tryUnpackNull();
}
- final public Object unpack(MessageUnpacker unpacker) throws IOException, MessageTypeException {
- return unpacker.unpack(this);
- }
-
final public void unpack(MessageUnpackable obj) throws IOException, MessageTypeException {
obj.messageUnpack(this);
}
- final public Object unpack(Class<?> klass) throws IOException, MessageTypeException, InstantiationException, IllegalAccessException {
- if(MessageUnpackable.class.isAssignableFrom(klass)) {
- Object obj = klass.newInstance();
- ((MessageUnpackable)obj).messageUnpack(this);
- return obj;
- }
-
- MessageUnpacker unpacker = CustomUnpacker.get(klass);
+ //final public MessagePackObject unpack() throws IOException {
+ // return unpackObject();
+ //}
- if(unpacker != null) {
- return unpacker.unpack(this);
- }
+ final public Object unpack(Template tmpl) throws IOException, MessageTypeException {
+ return tmpl.unpack(this);
+ }
- Template tmpl = null;
- if (CustomMessage.isAnnotated(klass, MessagePackMessage.class)) {
- tmpl = ReflectionTemplate.create(klass);
- return tmpl.unpack(this);
- } else if (CustomMessage.isAnnotated(klass, MessagePackDelegate.class)) {
- // FIXME DelegateTemplate
- throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
- } else if (CustomMessage.isAnnotated(klass, MessagePackOrdinalEnum.class)) {
- // FIXME OrdinalEnumTemplate
- throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
- }
- if (tmpl != null) {
- CustomMessage.registerTemplate(klass, tmpl);
- }
- MessageConverter converter = CustomConverter.get(klass);
- if(converter != null) {
- return converter.convert(unpackObject());
- }
- throw new MessageTypeException();
+ final public Object unpack(Class<?> klass) throws IOException, MessageTypeException, InstantiationException, IllegalAccessException {
+ return unpack(Templates.tClass(klass));
}
}
diff --git a/java/src/main/java/org/msgpack/template/AnyTemplate.java b/java/src/main/java/org/msgpack/template/AnyTemplate.java
new file mode 100644
index 0000000..fb2e1ee
--- /dev/null
+++ b/java/src/main/java/org/msgpack/template/AnyTemplate.java
@@ -0,0 +1,52 @@
+//
+// MessagePack for Java
+//
+// Copyright (C) 2009-2010 FURUHASHI Sadayuki
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+package org.msgpack.template;
+
+import java.io.IOException;
+import org.msgpack.*;
+
+public class AnyTemplate implements Template {
+ private AnyTemplate() { }
+
+ public void pack(Packer pk, Object target) throws IOException {
+ if(target == null) {
+ pk.packNil();
+ } else {
+ new ClassTemplate(target.getClass()).pack(pk, target);
+ }
+ }
+
+ public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
+ return pac.unpackObject();
+ }
+
+ public Object convert(MessagePackObject from) throws MessageTypeException {
+ return from;
+ }
+
+ static public AnyTemplate getInstance() {
+ return instance;
+ }
+
+ static final AnyTemplate instance = new AnyTemplate();
+
+ static {
+ CustomMessage.registerTemplate(MessagePackObject.class, instance);
+ }
+}
+
diff --git a/java/src/main/java/org/msgpack/template/BigIntegerTemplate.java b/java/src/main/java/org/msgpack/template/BigIntegerTemplate.java
index e8a2993..66e142b 100644
--- a/java/src/main/java/org/msgpack/template/BigIntegerTemplate.java
+++ b/java/src/main/java/org/msgpack/template/BigIntegerTemplate.java
@@ -24,6 +24,10 @@ import org.msgpack.*;
public class BigIntegerTemplate implements Template {
private BigIntegerTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packBigInteger((BigInteger)target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackBigInteger();
}
diff --git a/java/src/main/java/org/msgpack/template/BooleanTemplate.java b/java/src/main/java/org/msgpack/template/BooleanTemplate.java
index 0d64ecc..e9fd33c 100644
--- a/java/src/main/java/org/msgpack/template/BooleanTemplate.java
+++ b/java/src/main/java/org/msgpack/template/BooleanTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class BooleanTemplate implements Template {
private BooleanTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packBoolean((Boolean)target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackBoolean();
}
diff --git a/java/src/main/java/org/msgpack/template/ByteArrayTemplate.java b/java/src/main/java/org/msgpack/template/ByteArrayTemplate.java
index fe26369..45a006f 100644
--- a/java/src/main/java/org/msgpack/template/ByteArrayTemplate.java
+++ b/java/src/main/java/org/msgpack/template/ByteArrayTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class ByteArrayTemplate implements Template {
private ByteArrayTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packByteArray((byte[])target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackByteArray();
}
diff --git a/java/src/main/java/org/msgpack/template/ByteTemplate.java b/java/src/main/java/org/msgpack/template/ByteTemplate.java
index 8d0e6e6..d58e8b0 100644
--- a/java/src/main/java/org/msgpack/template/ByteTemplate.java
+++ b/java/src/main/java/org/msgpack/template/ByteTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class ByteTemplate implements Template {
private ByteTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packByte((Byte)target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackByte();
}
diff --git a/java/src/main/java/org/msgpack/template/ClassTemplate.java b/java/src/main/java/org/msgpack/template/ClassTemplate.java
index 9bb957c..86e8fe8 100644
--- a/java/src/main/java/org/msgpack/template/ClassTemplate.java
+++ b/java/src/main/java/org/msgpack/template/ClassTemplate.java
@@ -19,21 +19,186 @@ package org.msgpack.template;
import java.io.IOException;
import org.msgpack.*;
+import org.msgpack.annotation.MessagePackDelegate;
+import org.msgpack.annotation.MessagePackMessage;
+import org.msgpack.annotation.MessagePackOrdinalEnum;
+import org.msgpack.util.codegen.DynamicPacker;
+import org.msgpack.util.codegen.DynamicConverter;
+import org.msgpack.util.codegen.DynamicUnpacker;
+
+import java.util.*;
+import java.math.BigInteger;
public class ClassTemplate implements Template {
static {
Templates.load();
}
- private Class klass;
+ private Class<?> klass;
- public ClassTemplate(Class klass) {
+ public ClassTemplate(Class<?> klass) {
this.klass = klass;
}
+ public void pack(Packer pk, Object o) throws IOException {
+ // FIXME
+ if(o == null) {
+ pk.packNil();
+ return;
+ }
+ //if(o instanceof String) {
+ // pk.packString((String)o);
+ // return;
+ //}
+ if(o instanceof MessagePackable) {
+ ((MessagePackable)o).messagePack(pk);
+ return;
+ }
+ //if(o instanceof byte[]) {
+ // pk.packByteArray((byte[])o);
+ // return;
+ //}
+ if(o instanceof List) {
+ List<Object> l = (List<Object>)o;
+ pk.packArray(l.size());
+ for(Object i : l) {
+ pk.pack(i);
+ }
+ return;
+ }
+ if(o instanceof Set) {
+ Set<Object> l = (Set<Object>)o;
+ pk.packArray(l.size());
+ for(Object i : l) {
+ pk.pack(i);
+ }
+ return;
+ }
+ if(o instanceof Map) {
+ Map<Object,Object> m = (Map<Object,Object>)o;
+ pk.packMap(m.size());
+ for(Map.Entry<Object,Object> e : m.entrySet()) {
+ pk.pack(e.getKey());
+ pk.pack(e.getValue());
+ }
+ return;
+ }
+ if(o instanceof Collection) {
+ Collection<Object> l = (Collection<Object>)o;
+ pk.packArray(l.size());
+ for(Object i : l) {
+ pk.pack(i);
+ }
+ return;
+ }
+ //if(o instanceof Boolean) {
+ // pk.packBoolean((Boolean)o);
+ // return;
+ //}
+ //if(o instanceof Integer) {
+ // pk.packInt((Integer)o);
+ // return;
+ //}
+ //if(o instanceof Long) {
+ // pk.packLong((Long)o);
+ // return;
+ //}
+ //if(o instanceof Short) {
+ // pk.packShort((Short)o);
+ // return;
+ //}
+ //if(o instanceof Byte) {
+ // pk.packByte((Byte)o);
+ // return;
+ //}
+ //if(o instanceof Float) {
+ // pk.packFloat((Float)o);
+ // return;
+ //}
+ //if(o instanceof Double) {
+ // pk.packDouble((Double)o);
+ // return;
+ //}
+ if(o instanceof BigInteger) {
+ pk.packBigInteger((BigInteger)o);
+ return;
+ }
+
+ MessagePacker packer = CustomPacker.get(klass);
+ if(packer != null) {
+ packer.pack(pk, o);
+ return;
+ }
+
+ if (CustomMessage.isAnnotated(klass, MessagePackMessage.class)) {
+ packer = DynamicPacker.create(klass);
+ } else if (CustomMessage.isAnnotated(klass, MessagePackDelegate.class)) {
+ // FIXME DelegatePacker
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ } else if (CustomMessage.isAnnotated(klass, MessagePackOrdinalEnum.class)) {
+ // FIXME OrdinalEnumPacker
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ }
+
+ if (packer != null) {
+ CustomPacker.register(klass, packer);
+ packer.pack(pk, o);
+ return;
+ }
+
+ throw new MessageTypeException("unknown object "+o+" ("+o.getClass()+")");
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
try {
- return pac.unpack(klass);
+ MessageUnpacker unpacker = CustomUnpacker.get(klass);
+ if(unpacker != null) {
+ return unpacker.unpack(pac);
+ }
+
+ if(MessageUnpackable.class.isAssignableFrom(klass)) {
+ Object obj = klass.newInstance();
+ ((MessageUnpackable)obj).messageUnpack(pac);
+ return obj;
+ }
+
+ if (CustomMessage.isAnnotated(klass, MessagePackMessage.class)) {
+ unpacker = DynamicUnpacker.create(klass);
+ } else if (CustomMessage.isAnnotated(klass, MessagePackDelegate.class)) {
+ // TODO DelegateUnpacker
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ } else if (CustomMessage.isAnnotated(klass, MessagePackOrdinalEnum.class)) {
+ // TODO OrdinalEnumUnpacker
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ }
+
+ if (unpacker != null) {
+ CustomUnpacker.register(klass, unpacker);
+ return unpacker.unpack(pac);
+ }
+
+ // fallback
+ {
+ MessageConverter converter = null;
+
+ if (CustomMessage.isAnnotated(klass, MessagePackMessage.class)) {
+ converter = DynamicConverter.create(klass);
+ } else if (CustomMessage.isAnnotated(klass, MessagePackDelegate.class)) {
+ // TODO DelegateConverter
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ } else if (CustomMessage.isAnnotated(klass, MessagePackOrdinalEnum.class)) {
+ // TODO OrdinalEnumConverter
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ }
+
+ if (converter != null) {
+ CustomConverter.register(klass, converter);
+ return converter.convert(pac.unpackObject());
+ }
+ }
+
+ throw new MessageTypeException();
+
} catch (IllegalAccessException e) {
throw new MessageTypeException(e.getMessage()); // FIXME
} catch (InstantiationException e) {
@@ -42,27 +207,40 @@ public class ClassTemplate implements Template {
}
public Object convert(MessagePackObject from) throws MessageTypeException {
- if(MessageConvertable.class.isAssignableFrom(klass)) {
- Object obj;
- try {
- obj = klass.newInstance();
- } catch (IllegalAccessException e) {
- throw new MessageTypeException(e.getMessage()); // FIXME
- } catch (InstantiationException e) {
- throw new MessageTypeException(e.getMessage()); // FIXME
+ try {
+ MessageConverter converter = CustomConverter.get(klass);
+ if(converter != null) {
+ return converter.convert(from);
}
- ((MessageConvertable)obj).messageConvert(from);
- return obj;
- }
- MessageConverter converter = CustomConverter.get(klass);
- if(converter != null) {
- return converter.convert(from);
- }
+ if(MessageConvertable.class.isAssignableFrom(klass)) {
+ Object obj = klass.newInstance();
+ ((MessageConvertable)obj).messageConvert(from);
+ return obj;
+ }
+
+ if (CustomMessage.isAnnotated(klass, MessagePackMessage.class)) {
+ converter = DynamicConverter.create(klass);
+ } else if (CustomMessage.isAnnotated(klass, MessagePackDelegate.class)) {
+ // TODO DelegateConverter
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ } else if (CustomMessage.isAnnotated(klass, MessagePackOrdinalEnum.class)) {
+ // TODO OrdinalEnumConverter
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ }
+
+ if (converter != null) {
+ CustomConverter.register(klass, converter);
+ return converter.convert(from);
+ }
- // FIXME check annotations -> code generation -> CustomMessage.registerTemplate
+ throw new MessageTypeException();
- throw new MessageTypeException();
+ } catch (IllegalAccessException e) {
+ throw new MessageTypeException(e.getMessage()); // FIXME
+ } catch (InstantiationException e) {
+ throw new MessageTypeException(e.getMessage()); // FIXME
+ }
}
}
diff --git a/java/src/main/java/org/msgpack/template/CollectionTemplate.java b/java/src/main/java/org/msgpack/template/CollectionTemplate.java
index 0c9ff17..0269d67 100644
--- a/java/src/main/java/org/msgpack/template/CollectionTemplate.java
+++ b/java/src/main/java/org/msgpack/template/CollectionTemplate.java
@@ -17,6 +17,7 @@
//
package org.msgpack.template;
+import java.util.Collection;
import java.util.List;
import java.util.LinkedList;
import java.io.IOException;
@@ -29,6 +30,16 @@ public class CollectionTemplate implements Template {
this.elementTemplate = elementTemplate;
}
+ public void pack(Packer pk, Object target) throws IOException {
+ if(target instanceof Collection) {
+ throw new MessageTypeException();
+ }
+ Collection<Object> collection = (Collection<Object>)target;
+ for(Object element : collection) {
+ elementTemplate.pack(pk, element);
+ }
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
int length = pac.unpackArray();
List<Object> list = new LinkedList<Object>();
diff --git a/java/src/main/java/org/msgpack/template/DoubleTemplate.java b/java/src/main/java/org/msgpack/template/DoubleTemplate.java
index 2e26f50..c899e73 100644
--- a/java/src/main/java/org/msgpack/template/DoubleTemplate.java
+++ b/java/src/main/java/org/msgpack/template/DoubleTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class DoubleTemplate implements Template {
private DoubleTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packDouble(((Double)target));
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackDouble();
}
diff --git a/java/src/main/java/org/msgpack/template/FloatTemplate.java b/java/src/main/java/org/msgpack/template/FloatTemplate.java
index 8730172..354e3f8 100644
--- a/java/src/main/java/org/msgpack/template/FloatTemplate.java
+++ b/java/src/main/java/org/msgpack/template/FloatTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class FloatTemplate implements Template {
private FloatTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packFloat((Float)target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackFloat();
}
diff --git a/java/src/main/java/org/msgpack/template/IntegerTemplate.java b/java/src/main/java/org/msgpack/template/IntegerTemplate.java
index c56c044..21ff0af 100644
--- a/java/src/main/java/org/msgpack/template/IntegerTemplate.java
+++ b/java/src/main/java/org/msgpack/template/IntegerTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class IntegerTemplate implements Template {
private IntegerTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packInt((Integer)target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackInt();
}
diff --git a/java/src/main/java/org/msgpack/template/ListTemplate.java b/java/src/main/java/org/msgpack/template/ListTemplate.java
index 4ea7a9b..6703df4 100644
--- a/java/src/main/java/org/msgpack/template/ListTemplate.java
+++ b/java/src/main/java/org/msgpack/template/ListTemplate.java
@@ -33,6 +33,16 @@ public class ListTemplate implements Template {
return elementTemplate;
}
+ public void pack(Packer pk, Object target) throws IOException {
+ if(target instanceof List) {
+ throw new MessageTypeException();
+ }
+ List<Object> list = (List<Object>)target;
+ for(Object element : list) {
+ elementTemplate.pack(pk, element);
+ }
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
int length = pac.unpackArray();
List<Object> list = new ArrayList<Object>(length);
diff --git a/java/src/main/java/org/msgpack/template/LongTemplate.java b/java/src/main/java/org/msgpack/template/LongTemplate.java
index a0c8210..d8990af 100644
--- a/java/src/main/java/org/msgpack/template/LongTemplate.java
+++ b/java/src/main/java/org/msgpack/template/LongTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class LongTemplate implements Template {
private LongTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packLong((Long)target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackLong();
}
diff --git a/java/src/main/java/org/msgpack/template/MapTemplate.java b/java/src/main/java/org/msgpack/template/MapTemplate.java
index d23282e..6925982 100644
--- a/java/src/main/java/org/msgpack/template/MapTemplate.java
+++ b/java/src/main/java/org/msgpack/template/MapTemplate.java
@@ -39,6 +39,17 @@ public class MapTemplate implements Template {
return valueTemplate;
}
+ public void pack(Packer pk, Object target) throws IOException {
+ if(target instanceof Map) {
+ throw new MessageTypeException();
+ }
+ Map<Object,Object> map = (Map<Object,Object>)target;
+ for(Map.Entry<Object,Object> pair : map.entrySet()) {
+ keyTemplate.pack(pk, pair.getKey());
+ valueTemplate.pack(pk, pair.getValue());
+ }
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
int length = pac.unpackMap();
Map<Object,Object> map = new HashMap<Object,Object>(length);
diff --git a/java/src/main/java/org/msgpack/template/OptionalTemplate.java b/java/src/main/java/org/msgpack/template/OptionalTemplate.java
index cc5ee60..6358d7d 100644
--- a/java/src/main/java/org/msgpack/template/OptionalTemplate.java
+++ b/java/src/main/java/org/msgpack/template/OptionalTemplate.java
@@ -28,13 +28,21 @@ public class OptionalTemplate implements Template {
this(elementTemplate, null);
}
+ public OptionalTemplate(Template elementTemplate, Object defaultObject) {
+ this.elementTemplate = elementTemplate;
+ this.defaultObject = defaultObject;
+ }
+
public Template getElementTemplate() {
return elementTemplate;
}
- public OptionalTemplate(Template elementTemplate, Object defaultObject) {
- this.elementTemplate = elementTemplate;
- this.defaultObject = defaultObject;
+ public void pack(Packer pk, Object target) throws IOException {
+ if(target == null) {
+ pk.pack(defaultObject);
+ } else {
+ elementTemplate.pack(pk, target);
+ }
}
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
diff --git a/java/src/main/java/org/msgpack/template/ShortTemplate.java b/java/src/main/java/org/msgpack/template/ShortTemplate.java
index b3bf43b..0268797 100644
--- a/java/src/main/java/org/msgpack/template/ShortTemplate.java
+++ b/java/src/main/java/org/msgpack/template/ShortTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class ShortTemplate implements Template {
private ShortTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packShort((Short)target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackShort();
}
diff --git a/java/src/main/java/org/msgpack/template/StringTemplate.java b/java/src/main/java/org/msgpack/template/StringTemplate.java
index 563112d..4a4be3e 100644
--- a/java/src/main/java/org/msgpack/template/StringTemplate.java
+++ b/java/src/main/java/org/msgpack/template/StringTemplate.java
@@ -23,6 +23,10 @@ import org.msgpack.*;
public class StringTemplate implements Template {
private StringTemplate() { }
+ public void pack(Packer pk, Object target) throws IOException {
+ pk.packString((String)target);
+ }
+
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
return pac.unpackString();
}
diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
index 3222b47..c80d354 100644
--- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
+++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
@@ -153,6 +153,12 @@ public class DynamicCodeGenBase implements Constants {
}
@Override
+ public void pack(Packer pk, Object target) throws IOException {
+ // FIXME
+ pk.pack(target);
+ }
+
+ @Override
public Object unpack(Unpacker unpacker) throws IOException,
MessageTypeException {
try {