From 6c91b862c9da56ce0914d430fea2cb388e32d5d5 Mon Sep 17 00:00:00 2001 From: frsyuki Date: Wed, 28 Jul 2010 01:17:20 +0900 Subject: [PATCH] java: MessagePackObject implements Cloneable and MessagePackable interfaces --- .../java/org/msgpack/MessagePackObject.java | 4 ++- java/src/main/java/org/msgpack/Packer.java | 22 +++++++++++++++ .../java/org/msgpack/object/ArrayType.java | 28 +++++++++++++++++-- .../msgpack/object/BigIntegerTypeIMPL.java | 19 +++++++++++++ .../java/org/msgpack/object/BooleanType.java | 19 +++++++++++++ .../org/msgpack/object/DoubleTypeIMPL.java | 19 +++++++++++++ .../org/msgpack/object/FloatTypeIMPL.java | 19 +++++++++++++ .../msgpack/object/LongIntegerTypeIMPL.java | 19 +++++++++++++ .../main/java/org/msgpack/object/MapType.java | 27 ++++++++++++++++++ .../main/java/org/msgpack/object/NilType.java | 19 +++++++++++++ .../main/java/org/msgpack/object/RawType.java | 23 ++++++++++++++- .../msgpack/object/ShortIntegerTypeIMPL.java | 19 +++++++++++++ 12 files changed, 233 insertions(+), 4 deletions(-) diff --git a/java/src/main/java/org/msgpack/MessagePackObject.java b/java/src/main/java/org/msgpack/MessagePackObject.java index aba27e48..b1a6faba 100644 --- a/java/src/main/java/org/msgpack/MessagePackObject.java +++ b/java/src/main/java/org/msgpack/MessagePackObject.java @@ -22,7 +22,7 @@ import java.util.Set; import java.util.Map; import java.math.BigInteger; -public abstract class MessagePackObject { +public abstract class MessagePackObject implements Cloneable, MessagePackable { public boolean isNull() { return false; } @@ -126,5 +126,7 @@ public abstract class MessagePackObject { public double doubleValue() { throw new MessageTypeException("type error"); } + + abstract public Object clone(); } diff --git a/java/src/main/java/org/msgpack/Packer.java b/java/src/main/java/org/msgpack/Packer.java index dd510f34..fbf7e35c 100644 --- a/java/src/main/java/org/msgpack/Packer.java +++ b/java/src/main/java/org/msgpack/Packer.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.List; import java.util.Map; +import java.math.BigInteger; /** * Packer enables you to serialize objects into OutputStream. @@ -194,6 +195,27 @@ public class Packer { return this; } + public Packer packBigInteger(BigInteger d) throws IOException { + if(d.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) <= 0) { + return packLong(d.longValue()); + } else if(d.bitLength() <= 64) { + castBytes[0] = (byte)0xcf; + byte[] barray = d.toByteArray(); + castBytes[1] = barray[0]; + castBytes[2] = barray[1]; + castBytes[3] = barray[2]; + castBytes[4] = barray[3]; + castBytes[5] = barray[4]; + castBytes[6] = barray[5]; + castBytes[7] = barray[6]; + castBytes[8] = barray[7]; + out.write(castBytes); + return this; + } else { + throw new MessageTypeException("can't BigInteger larger than 0xffffffffffffffff"); + } + } + public Packer packFloat(float d) throws IOException { castBytes[0] = (byte)0xca; castBuffer.putFloat(1, d); diff --git a/java/src/main/java/org/msgpack/object/ArrayType.java b/java/src/main/java/org/msgpack/object/ArrayType.java index 06e9b167..694f53f0 100644 --- a/java/src/main/java/org/msgpack/object/ArrayType.java +++ b/java/src/main/java/org/msgpack/object/ArrayType.java @@ -18,9 +18,8 @@ package org.msgpack.object; import java.util.List; -import java.util.Set; -import java.util.Map; import java.util.Arrays; +import java.io.IOException; import org.msgpack.*; public class ArrayType extends MessagePackObject { @@ -44,5 +43,30 @@ public class ArrayType extends MessagePackObject { public List asList() { return Arrays.asList(array); } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packArray(array.length); + for(int i=0; i < array.length; i++) { + array[i].messagePack(pk); + } + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return Arrays.equals(((ArrayType)obj).array, array); + } + + @Override + public Object clone() { + MessagePackObject[] copy = new MessagePackObject[array.length]; + for(int i=0; i < array.length; i++) { + copy[i] = (MessagePackObject)array[i].clone(); + } + return copy; + } } diff --git a/java/src/main/java/org/msgpack/object/BigIntegerTypeIMPL.java b/java/src/main/java/org/msgpack/object/BigIntegerTypeIMPL.java index 1ebb83df..f7c73ae1 100644 --- a/java/src/main/java/org/msgpack/object/BigIntegerTypeIMPL.java +++ b/java/src/main/java/org/msgpack/object/BigIntegerTypeIMPL.java @@ -18,6 +18,7 @@ package org.msgpack.object; import java.math.BigInteger; +import java.io.IOException; import org.msgpack.*; class BigIntegerTypeIMPL extends IntegerType { @@ -88,5 +89,23 @@ class BigIntegerTypeIMPL extends IntegerType { public double doubleValue() { return value.doubleValue(); } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packBigInteger(value); + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return ((BigIntegerTypeIMPL)obj).value.equals(value); + } + + @Override + public Object clone() { + return new BigIntegerTypeIMPL(value); + } } diff --git a/java/src/main/java/org/msgpack/object/BooleanType.java b/java/src/main/java/org/msgpack/object/BooleanType.java index d272b6f0..c6e4f300 100644 --- a/java/src/main/java/org/msgpack/object/BooleanType.java +++ b/java/src/main/java/org/msgpack/object/BooleanType.java @@ -17,6 +17,7 @@ // package org.msgpack.object; +import java.io.IOException; import org.msgpack.*; public class BooleanType extends MessagePackObject { @@ -35,5 +36,23 @@ public class BooleanType extends MessagePackObject { public boolean asBoolean() { return value; } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packBoolean(value); + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return ((BooleanType)obj).value == value; + } + + @Override + public Object clone() { + return new BooleanType(value); + } } diff --git a/java/src/main/java/org/msgpack/object/DoubleTypeIMPL.java b/java/src/main/java/org/msgpack/object/DoubleTypeIMPL.java index 8bbc52ac..dafe5405 100644 --- a/java/src/main/java/org/msgpack/object/DoubleTypeIMPL.java +++ b/java/src/main/java/org/msgpack/object/DoubleTypeIMPL.java @@ -18,6 +18,7 @@ package org.msgpack.object; import java.math.BigInteger; +import java.io.IOException; import org.msgpack.*; class DoubleTypeIMPL extends FloatType { @@ -67,5 +68,23 @@ class DoubleTypeIMPL extends FloatType { public double doubleValue() { return (double)value; } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packDouble(value); + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return ((DoubleTypeIMPL)obj).value == value; + } + + @Override + public Object clone() { + return new DoubleTypeIMPL(value); + } } diff --git a/java/src/main/java/org/msgpack/object/FloatTypeIMPL.java b/java/src/main/java/org/msgpack/object/FloatTypeIMPL.java index 8821640e..234b2ad9 100644 --- a/java/src/main/java/org/msgpack/object/FloatTypeIMPL.java +++ b/java/src/main/java/org/msgpack/object/FloatTypeIMPL.java @@ -18,6 +18,7 @@ package org.msgpack.object; import java.math.BigInteger; +import java.io.IOException; import org.msgpack.*; class FloatTypeIMPL extends FloatType { @@ -66,5 +67,23 @@ class FloatTypeIMPL extends FloatType { public double doubleValue() { return (double)value; } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packFloat(value); + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return ((FloatTypeIMPL)obj).value == value; + } + + @Override + public Object clone() { + return new FloatTypeIMPL(value); + } } diff --git a/java/src/main/java/org/msgpack/object/LongIntegerTypeIMPL.java b/java/src/main/java/org/msgpack/object/LongIntegerTypeIMPL.java index c914e91d..0ce22a25 100644 --- a/java/src/main/java/org/msgpack/object/LongIntegerTypeIMPL.java +++ b/java/src/main/java/org/msgpack/object/LongIntegerTypeIMPL.java @@ -18,6 +18,7 @@ package org.msgpack.object; import java.math.BigInteger; +import java.io.IOException; import org.msgpack.*; class LongIntegerTypeIMPL extends IntegerType { @@ -85,5 +86,23 @@ class LongIntegerTypeIMPL extends IntegerType { public double doubleValue() { return (double)value; } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packLong(value); + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return ((LongIntegerTypeIMPL)obj).value == value; + } + + @Override + public Object clone() { + return new LongIntegerTypeIMPL(value); + } } diff --git a/java/src/main/java/org/msgpack/object/MapType.java b/java/src/main/java/org/msgpack/object/MapType.java index 359ebe6a..d456e78f 100644 --- a/java/src/main/java/org/msgpack/object/MapType.java +++ b/java/src/main/java/org/msgpack/object/MapType.java @@ -19,6 +19,8 @@ package org.msgpack.object; import java.util.HashMap; import java.util.Map; +import java.util.Arrays; +import java.io.IOException; import org.msgpack.*; public class MapType extends MessagePackObject { @@ -44,5 +46,30 @@ public class MapType extends MessagePackObject { } return m; } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packMap(map.length / 2); + for(int i=0; i < map.length; i++) { + map[i].messagePack(pk); + } + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return Arrays.equals(((MapType)obj).map, map); + } + + @Override + public Object clone() { + MessagePackObject[] copy = new MessagePackObject[map.length]; + for(int i=0; i < map.length; i++) { + copy[i] = (MessagePackObject)map[i].clone(); + } + return copy; + } } diff --git a/java/src/main/java/org/msgpack/object/NilType.java b/java/src/main/java/org/msgpack/object/NilType.java index c36ff05c..7a463764 100644 --- a/java/src/main/java/org/msgpack/object/NilType.java +++ b/java/src/main/java/org/msgpack/object/NilType.java @@ -17,6 +17,7 @@ // package org.msgpack.object; +import java.io.IOException; import org.msgpack.*; public class NilType extends MessagePackObject { @@ -24,5 +25,23 @@ public class NilType extends MessagePackObject { public boolean isNull() { return true; } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packNil(); + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return true; + } + + @Override + public Object clone() { + return new NilType(); + } } diff --git a/java/src/main/java/org/msgpack/object/RawType.java b/java/src/main/java/org/msgpack/object/RawType.java index 107ba278..18a419d1 100644 --- a/java/src/main/java/org/msgpack/object/RawType.java +++ b/java/src/main/java/org/msgpack/object/RawType.java @@ -17,9 +17,11 @@ // package org.msgpack.object; +import java.util.Arrays; +import java.io.IOException; import org.msgpack.*; -class RawType extends MessagePackObject { +public class RawType extends MessagePackObject { private byte[] bytes; public RawType(byte[] bytes) { @@ -44,5 +46,24 @@ class RawType extends MessagePackObject { throw new MessageTypeException("type error"); } } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packRaw(bytes.length); + pk.packRawBody(bytes); + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return ((RawType)obj).bytes.equals(bytes); + } + + @Override + public Object clone() { + return new RawType((byte[])bytes.clone()); + } } diff --git a/java/src/main/java/org/msgpack/object/ShortIntegerTypeIMPL.java b/java/src/main/java/org/msgpack/object/ShortIntegerTypeIMPL.java index a725950d..83a4daf6 100644 --- a/java/src/main/java/org/msgpack/object/ShortIntegerTypeIMPL.java +++ b/java/src/main/java/org/msgpack/object/ShortIntegerTypeIMPL.java @@ -18,6 +18,7 @@ package org.msgpack.object; import java.math.BigInteger; +import java.io.IOException; import org.msgpack.*; class ShortIntegerTypeIMPL extends IntegerType { @@ -87,5 +88,23 @@ class ShortIntegerTypeIMPL extends IntegerType { public double doubleValue() { return (double)value; } + + @Override + public void messagePack(Packer pk) throws IOException { + pk.packInt(value); + } + + @Override + public boolean equals(Object obj) { + if(obj.getClass() != getClass()) { + return false; + } + return ((ShortIntegerTypeIMPL)obj).value == value; + } + + @Override + public Object clone() { + return new ShortIntegerTypeIMPL(value); + } }