From 7161a235f180fcb23e6451c6a10bfa5a55065eff Mon Sep 17 00:00:00 2001 From: frsyuki Date: Mon, 27 Sep 2010 03:33:21 +0900 Subject: java: uses CustomMessage class on Packer, Unpacker and ClassTemplate --- .../src/main/java/org/msgpack/CustomConverter.java | 4 ++-- java/src/main/java/org/msgpack/CustomPacker.java | 4 ++-- java/src/main/java/org/msgpack/CustomUnpacker.java | 4 ++-- java/src/main/java/org/msgpack/Packer.java | 16 +++++++++++---- java/src/main/java/org/msgpack/Templates.java | 4 ++++ java/src/main/java/org/msgpack/Unpacker.java | 23 ++++++++++++++++++---- .../java/org/msgpack/template/ClassTemplate.java | 23 ++++++++++++++++++++-- 7 files changed, 62 insertions(+), 16 deletions(-) (limited to 'java/src') diff --git a/java/src/main/java/org/msgpack/CustomConverter.java b/java/src/main/java/org/msgpack/CustomConverter.java index 5905419..4351464 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 f828c31..f0c6b62 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 255368d..b6047b8 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 687f09c..dd8cdee 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 4c3fdae..a31dd91 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 1b5621f..4e39748 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 b5ed854..c529edd 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(); } -- cgit v1.2.1