From 5d29248029966cd0ac6c3a8f3d8cf2a4298b69ad Mon Sep 17 00:00:00 2001 From: takeshita Date: Thu, 13 Oct 2011 03:13:28 +0900 Subject: [PATCH 1/4] To support scala messagepack, change some method accessibilities and add new constructor to MessagePack.java --- src/main/java/org/msgpack/MessagePack.java | 3 +++ src/main/java/org/msgpack/template/TemplateRegistry.java | 9 +++++++-- .../msgpack/template/builder/TemplateBuilderChain.java | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/msgpack/MessagePack.java b/src/main/java/org/msgpack/MessagePack.java index eb61d3a90..b0e774297 100644 --- a/src/main/java/org/msgpack/MessagePack.java +++ b/src/main/java/org/msgpack/MessagePack.java @@ -67,6 +67,9 @@ public MessagePack() { public MessagePack(MessagePack msgpack) { registry = new TemplateRegistry(msgpack.registry); } + public MessagePack(TemplateRegistry registry) { + this.registry = registry; + } /** * diff --git a/src/main/java/org/msgpack/template/TemplateRegistry.java b/src/main/java/org/msgpack/template/TemplateRegistry.java index 85792786d..0ea6389e1 100644 --- a/src/main/java/org/msgpack/template/TemplateRegistry.java +++ b/src/main/java/org/msgpack/template/TemplateRegistry.java @@ -69,7 +69,7 @@ public class TemplateRegistry { */ private TemplateRegistry() { parent = null; - chain = new TemplateBuilderChain(this); + chain = createTemplateBuilderChain(); genericCache = new HashMap(); cache = new HashMap>(); registerTemplates(); @@ -86,11 +86,16 @@ public TemplateRegistry(TemplateRegistry registry) { } else { parent = new TemplateRegistry(); } - chain = new TemplateBuilderChain(this); + chain = createTemplateBuilderChain(); cache = new HashMap>(); genericCache = parent.genericCache; } + protected TemplateBuilderChain createTemplateBuilderChain(){ + return new TemplateBuilderChain(this); + } + + public void setClassLoader(final ClassLoader cl) { chain = new TemplateBuilderChain(this, cl); } diff --git a/src/main/java/org/msgpack/template/builder/TemplateBuilderChain.java b/src/main/java/org/msgpack/template/builder/TemplateBuilderChain.java index 61dc6e65d..ab76a3364 100644 --- a/src/main/java/org/msgpack/template/builder/TemplateBuilderChain.java +++ b/src/main/java/org/msgpack/template/builder/TemplateBuilderChain.java @@ -45,7 +45,7 @@ public TemplateBuilderChain(final TemplateRegistry registry, final ClassLoader c reset(registry, cl); } - private void reset(final TemplateRegistry registry, final ClassLoader cl) { + protected void reset(final TemplateRegistry registry, final ClassLoader cl) { if (registry == null) { throw new NullPointerException("registry is null"); } From 31bd64b1b46e68c8e42b0eb29019c187745f89d4 Mon Sep 17 00:00:00 2001 From: takeshita Date: Fri, 14 Oct 2011 11:41:02 +0900 Subject: [PATCH 2/4] change accessibility of MessagePack@constructor(TemplateRepository) public -> protected --- src/main/java/org/msgpack/MessagePack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/msgpack/MessagePack.java b/src/main/java/org/msgpack/MessagePack.java index 93dc485f0..7412f10b8 100644 --- a/src/main/java/org/msgpack/MessagePack.java +++ b/src/main/java/org/msgpack/MessagePack.java @@ -67,7 +67,7 @@ public MessagePack() { public MessagePack(MessagePack msgpack) { registry = new TemplateRegistry(msgpack.registry); } - public MessagePack(TemplateRegistry registry) { + protected MessagePack(TemplateRegistry registry) { this.registry = registry; } From d33ea77d0ccbf7dda3b203822be00b5848767433 Mon Sep 17 00:00:00 2001 From: takeshita Date: Mon, 17 Oct 2011 17:18:40 +0900 Subject: [PATCH 3/4] Add new tests which pack org.msgpack.type.Value. --- .../java/org/msgpack/TestMessagePack01.java | 21 +++++++++++++ .../java/org/msgpack/TestPackConvert.java | 31 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/test/java/org/msgpack/TestMessagePack01.java b/src/test/java/org/msgpack/TestMessagePack01.java index 71c6b51ab..1e4f7ca3b 100644 --- a/src/test/java/org/msgpack/TestMessagePack01.java +++ b/src/test/java/org/msgpack/TestMessagePack01.java @@ -5,6 +5,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; @@ -17,6 +18,7 @@ import static org.msgpack.template.Templates.tList; import static org.msgpack.template.Templates.tMap; import org.msgpack.type.Value; +import org.msgpack.type.ValueFactory; public class TestMessagePack01 { @@ -701,4 +703,23 @@ public void testMap(Map v, Class keyElementClass, Class value } } } + + /*:* + * test pack org.msgpack.type.Value, but compiler recognize it as java.lang.Object + */ + @Test + public void testValuePassedAsObject() throws IOException { + + MessagePack msgpack = new MessagePack(); + String text = "This class is Value but..."; + Object value = ValueFactory.createRawValue("This class is Value but..."); + + byte[] strValue = msgpack.write(value); + for(byte b : strValue){ + System.out.print(String.format("%02x ", b)); + } + // should be raw type + assertEquals(0xa0 + text.length(),0xff & strValue[0]); + } + } diff --git a/src/test/java/org/msgpack/TestPackConvert.java b/src/test/java/org/msgpack/TestPackConvert.java index c96d57878..d0861dc67 100644 --- a/src/test/java/org/msgpack/TestPackConvert.java +++ b/src/test/java/org/msgpack/TestPackConvert.java @@ -5,6 +5,7 @@ import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; @@ -12,8 +13,10 @@ import java.util.List; import java.util.Map; +import junit.framework.Assert; import org.junit.Test; import org.msgpack.packer.Packer; +import org.msgpack.type.ValueFactory; import org.msgpack.unpacker.BufferUnpacker; import org.msgpack.unpacker.Converter; import org.msgpack.type.Value; @@ -303,4 +306,32 @@ public void testMap(Map v, Class keyElementClass, Class value assertEquals(e.getValue(), value); } } + @Test + public void testPackValue() throws IOException { + MessagePack msgpack = new MessagePack(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + Packer packer = msgpack.createPacker(out); + String text = "This is Value"; + Value value = ValueFactory.createRawValue(text); + packer.write(value); + byte[] bytes = out.toByteArray(); + Assert.assertEquals(text.length() + 1,bytes.length); + Assert.assertEquals(0xa0 + text.length(), 0xff & bytes[0]); + } + + + @Test + public void testPackValuePassedAsObject() throws IOException{ + MessagePack msgpack = new MessagePack(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + Packer packer = msgpack.createPacker(out); + String text = "This is Value"; + Object value = ValueFactory.createRawValue(text); + packer.write(value); // passed as object + byte[] bytes = out.toByteArray(); + Assert.assertEquals(text.length() + 1,bytes.length); + Assert.assertEquals(0xa0 + text.length(), 0xff & bytes[0]); + + } + } From b3446e2df5b2faf96406c494ab66f98b783b7ee6 Mon Sep 17 00:00:00 2001 From: takeshita Date: Mon, 17 Oct 2011 17:21:34 +0900 Subject: [PATCH 4/4] Fix to convert org.msgpack.type.Value when it is passed as Object. Add new method to MessagePack.java @ lookup(Type) --- src/main/java/org/msgpack/MessagePack.java | 8 +++++++- src/main/java/org/msgpack/packer/AbstractPacker.java | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/msgpack/MessagePack.java b/src/main/java/org/msgpack/MessagePack.java index 7412f10b8..cb047b54e 100644 --- a/src/main/java/org/msgpack/MessagePack.java +++ b/src/main/java/org/msgpack/MessagePack.java @@ -20,6 +20,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.IOException; +import java.lang.reflect.Type; import java.nio.ByteBuffer; import org.msgpack.template.Template; import org.msgpack.template.TemplateRegistry; @@ -188,7 +189,9 @@ public byte[] write(T v) throws IOException { BufferPacker pk = createBufferPacker(); if (v == null) { pk.writeNil(); - } else { + } else if(v instanceof Value){ + return write((Value)v); + }else { @SuppressWarnings("unchecked") Template tmpl = registry.lookup(v.getClass()); tmpl.write(pk, v); @@ -609,6 +612,9 @@ public Template lookup(Class type) { return registry.lookup(type); } + public Template lookup(Type type) { + return registry.lookup(type); + } private static final MessagePack globalMessagePack = new MessagePack(); /** diff --git a/src/main/java/org/msgpack/packer/AbstractPacker.java b/src/main/java/org/msgpack/packer/AbstractPacker.java index f8738a1f0..3858d3abe 100644 --- a/src/main/java/org/msgpack/packer/AbstractPacker.java +++ b/src/main/java/org/msgpack/packer/AbstractPacker.java @@ -199,6 +199,8 @@ public Packer write(String o) throws IOException { public Packer write(Object o) throws IOException { if(o == null) { writeNil(); + } else if(o instanceof Value){ + write((Value)o); } else { Template tmpl = msgpack.lookup(o.getClass()); tmpl.write(this, o);