diff --git a/java/src/main/java/org/msgpack/MessageConverter.java b/java/src/main/java/org/msgpack/MessageConverter.java index 8388ddc9..8ad60ae0 100644 --- a/java/src/main/java/org/msgpack/MessageConverter.java +++ b/java/src/main/java/org/msgpack/MessageConverter.java @@ -20,6 +20,6 @@ package org.msgpack; import java.io.IOException; public interface MessageConverter { - public Object convert(MessagePackObject obj) throws MessageTypeException; + public Object convert(MessagePackObject from) throws MessageTypeException; } diff --git a/java/src/main/java/org/msgpack/ReflectionBase.java b/java/src/main/java/org/msgpack/ReflectionBase.java new file mode 100644 index 00000000..66ec12a4 --- /dev/null +++ b/java/src/main/java/org/msgpack/ReflectionBase.java @@ -0,0 +1,26 @@ +// +// 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; + +import java.io.IOException; +import java.lang.reflect.*; + +// FIXME mock-up +abstract class ReflectionBase { +} + diff --git a/java/src/main/java/org/msgpack/ReflectionPacker.java b/java/src/main/java/org/msgpack/ReflectionPacker.java new file mode 100644 index 00000000..72406aaa --- /dev/null +++ b/java/src/main/java/org/msgpack/ReflectionPacker.java @@ -0,0 +1,49 @@ +// +// 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; + +import java.io.IOException; +import java.lang.reflect.*; + +// FIXME mock-up +public class ReflectionPacker extends ReflectionBase implements MessagePacker { + private Class klass; + + private ReflectionPacker(Class klass) { + this.klass = klass; + } + + static public ReflectionPacker create(Class klass) { + // FIXME code generation: generates subclass of ReflectionPacker + // returned instance will be cached by Packer into CustomPacker + return new ReflectionPacker(klass); + } + + public void pack(Packer pk, Object target) throws IOException { + Field[] fields = klass.getDeclaredFields(); + pk.packArray(fields.length); + try { + for(int i=0; i < fields.length; i++) { + pk.pack(fields[i].get(target)); + } + } catch(IllegalAccessException e) { + throw new MessageTypeException(e.getMessage()); // FIXME + } + } +} + diff --git a/java/src/main/java/org/msgpack/ReflectionTemplate.java b/java/src/main/java/org/msgpack/ReflectionTemplate.java new file mode 100644 index 00000000..5b490787 --- /dev/null +++ b/java/src/main/java/org/msgpack/ReflectionTemplate.java @@ -0,0 +1,74 @@ +// +// 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; + +import java.io.IOException; +import java.lang.reflect.*; +import org.msgpack.template.ClassTemplate; + +// FIXME mock-up +public class ReflectionTemplate extends ReflectionBase implements Template { + private Class klass; + + private ReflectionTemplate(Class klass) { + this.klass = klass; + } + + static public ReflectionTemplate create(Class klass) { + // FIXME code generation: generates subclass of ReflectionPacker + // returned instance will be cached by ClassTemplate into CustomUnpacker/CustomConverter + return new ReflectionTemplate(klass); + } + + public Object unpack(Unpacker pac) throws IOException, MessageTypeException { + // FIXME optimize it + return convert(pac.unpackObject()); + } + + public Object convert(MessagePackObject from) throws MessageTypeException { + Object obj; + try { + obj = klass.newInstance(); + } catch (IllegalAccessException e) { + throw new MessageTypeException(e.getMessage()); // FIXME + } catch (InstantiationException e) { + throw new MessageTypeException(e.getMessage()); // FIXME + } + + // FIXME check Requred/Optional + + Field[] fields = klass.getDeclaredFields(); + MessagePackObject[] array = from.asArray(); + if(fields.length < array.length) { + throw new MessageTypeException(); + } + + try { + for(int i=0; i < fields.length; i++) { + // FIXME generics getDeclaringClass + Object value = new ClassTemplate(fields[i].getType()).convert(array[i]); + fields[i].set(obj, value); + } + } catch(IllegalAccessException e) { + throw new MessageTypeException(e.getMessage()); // FIXME + } + + return obj; + } +} + diff --git a/java/src/test/java/org/msgpack/TestReflectionPackerTemplate.java b/java/src/test/java/org/msgpack/TestReflectionPackerTemplate.java new file mode 100644 index 00000000..ddf88a06 --- /dev/null +++ b/java/src/test/java/org/msgpack/TestReflectionPackerTemplate.java @@ -0,0 +1,46 @@ +package org.msgpack; + +import static org.msgpack.Templates.*; + +import java.util.*; +import java.io.*; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class TestReflectionPackerTemplate { + + public static class StringFieldClass { + public String s1; + public String s2; + public StringFieldClass() { } + } + + @Test + public void testPackConvert() throws Exception { + tString(); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + MessagePacker packer = ReflectionPacker.create(StringFieldClass.class); + + StringFieldClass src = new StringFieldClass(); + + src.s1 = "kumofs"; + src.s2 = "frsyuki"; + + packer.pack(new Packer(out), src); + + Template tmpl = ReflectionTemplate.create(StringFieldClass.class); + + ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); + + Object obj = tmpl.unpack(new Unpacker(in)); + assertEquals(obj.getClass(), StringFieldClass.class); + + StringFieldClass dst = (StringFieldClass)obj; + assertEquals(src.s1, dst.s1); + assertEquals(src.s2, dst.s2); + } +} +