diff --git a/java/src/main/java/org/msgpack/CustomConverter.java b/java/src/main/java/org/msgpack/CustomConverter.java index 59054196..4351464c 100644 --- a/java/src/main/java/org/msgpack/CustomConverter.java +++ b/java/src/main/java/org/msgpack/CustomConverter.java @@ -20,8 +20,8 @@ package org.msgpack; import java.util.Map; import java.util.HashMap; -// FIXME public? -class CustomConverter { +// FIXME package private? +public class CustomConverter { public static void register(Class target, MessageConverter converter) { map.put(target, converter); } diff --git a/java/src/main/java/org/msgpack/CustomPacker.java b/java/src/main/java/org/msgpack/CustomPacker.java index f828c310..f0c6b62c 100644 --- a/java/src/main/java/org/msgpack/CustomPacker.java +++ b/java/src/main/java/org/msgpack/CustomPacker.java @@ -20,8 +20,8 @@ package org.msgpack; import java.util.Map; import java.util.HashMap; -// FIXME public? -class CustomPacker { +// FIXME package private? +public class CustomPacker { public static void register(Class target, MessagePacker converter) { map.put(target, converter); } diff --git a/java/src/main/java/org/msgpack/CustomUnpacker.java b/java/src/main/java/org/msgpack/CustomUnpacker.java index 255368da..b6047b84 100644 --- a/java/src/main/java/org/msgpack/CustomUnpacker.java +++ b/java/src/main/java/org/msgpack/CustomUnpacker.java @@ -20,8 +20,8 @@ package org.msgpack; import java.util.Map; import java.util.HashMap; -// FIXME public? -class CustomUnpacker { +// FIXME package private? +public class CustomUnpacker { public static void register(Class target, MessageUnpacker converter) { map.put(target, converter); } diff --git a/java/src/main/java/org/msgpack/Packer.java b/java/src/main/java/org/msgpack/Packer.java index 687f09cc..dd8cdee2 100644 --- a/java/src/main/java/org/msgpack/Packer.java +++ b/java/src/main/java/org/msgpack/Packer.java @@ -473,11 +473,19 @@ public class Packer { return packDouble((Double)o); } else if(o instanceof BigInteger) { return packBigInteger((BigInteger)o); - } else { - // FIXME check CustomPacker.get(o.getClass()); - // FIXME check annotations - throw new MessageTypeException("unknown object "+o+" ("+o.getClass()+")"); } + + Class klass = o.getClass(); + + MessagePacker packer = CustomPacker.get(klass); + if(packer != null) { + packer.pack(this, o); + return this; + } + + // FIXME check annotations -> code generation -> CustomMessage.registerPacker + + throw new MessageTypeException("unknown object "+o+" ("+o.getClass()+")"); } } diff --git a/java/src/main/java/org/msgpack/Templates.java b/java/src/main/java/org/msgpack/Templates.java index 4c3fdaee..a31dd919 100644 --- a/java/src/main/java/org/msgpack/Templates.java +++ b/java/src/main/java/org/msgpack/Templates.java @@ -28,6 +28,10 @@ public class Templates { return new MapTemplate(keyTemplate, valueTemplate); } + public static Template tClass(Class target) { + return new ClassTemplate(target); + } + public static final Template TString = StringTemplate.getInstance(); diff --git a/java/src/main/java/org/msgpack/Unpacker.java b/java/src/main/java/org/msgpack/Unpacker.java index 1b5621f3..4e397488 100644 --- a/java/src/main/java/org/msgpack/Unpacker.java +++ b/java/src/main/java/org/msgpack/Unpacker.java @@ -573,10 +573,25 @@ public class Unpacker implements Iterable { obj.messageUnpack(this); } - final public Object unpack(Class klass) throws MessageTypeException { - // FIXME check MessageUnpackable - // FIXME check CustomPacker - // FIXME check annotations + 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); + if(unpacker != null) { + return unpacker.unpack(this); + } + + // FIXME check annotations -> code generation -> CustomMessage.registerTemplate + + MessageConverter converter = CustomConverter.get(klass); + if(converter != null) { + return converter.convert(unpackObject()); + } + throw new MessageTypeException(); } } diff --git a/java/src/main/java/org/msgpack/template/ClassTemplate.java b/java/src/main/java/org/msgpack/template/ClassTemplate.java index b5ed854d..c529edd2 100644 --- a/java/src/main/java/org/msgpack/template/ClassTemplate.java +++ b/java/src/main/java/org/msgpack/template/ClassTemplate.java @@ -28,16 +28,35 @@ public class ClassTemplate implements Template { } public Object unpack(Unpacker pac) throws IOException, MessageTypeException { - return pac.unpack(klass); + try { + return pac.unpack(klass); + } catch (IllegalAccessException e) { + throw new MessageTypeException(e.getMessage()); // FIXME + } catch (InstantiationException e) { + throw new MessageTypeException(e.getMessage()); // FIXME + } } 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 + } + ((MessageConvertable)obj).messageConvert(from); + return obj; + } + MessageConverter converter = CustomConverter.get(klass); if(converter != null) { return converter.convert(from); } - // FIXME check annotations + // FIXME check annotations -> code generation -> CustomMessage.registerTemplate throw new MessageTypeException(); }