From d3a02fb2ca89c51cddfab30bcfa3fdeb818ebcb4 Mon Sep 17 00:00:00 2001
From: FURUHASHI Sadayuki <frsyuki@users.sourceforge.jp>
Date: Tue, 30 Nov 2010 21:57:12 +0900
Subject: [PATCH] java: @MessagePackMessage(default field option)

---
 java/src/main/java/org/msgpack/MessagePack.java             | 1 +
 java/src/main/java/org/msgpack/MessagePackObject.java       | 2 +-
 java/src/main/java/org/msgpack/MessageTypeException.java    | 4 ++++
 .../java/org/msgpack/annotation/MessagePackDelegate.java    | 1 +
 .../java/org/msgpack/annotation/MessagePackMessage.java     | 2 ++
 .../main/java/org/msgpack/buffer/VectoredByteBuffer.java    | 6 +-----
 java/src/main/java/org/msgpack/template/ClassTemplate.java  | 2 +-
 .../java/org/msgpack/util/codegen/DynamicCodeGenBase.java   | 2 ++
 8 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/java/src/main/java/org/msgpack/MessagePack.java b/java/src/main/java/org/msgpack/MessagePack.java
index b8e66d3d..8dab2530 100644
--- a/java/src/main/java/org/msgpack/MessagePack.java
+++ b/java/src/main/java/org/msgpack/MessagePack.java
@@ -21,6 +21,7 @@ import java.io.OutputStream;
 import java.io.InputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import org.msgpack.buffer.VectoredByteBuffer;
 import org.msgpack.util.codegen.DynamicTemplate;
 import org.msgpack.util.codegen.DynamicOrdinalEnumTemplate;
 import org.msgpack.util.codegen.FieldList;
diff --git a/java/src/main/java/org/msgpack/MessagePackObject.java b/java/src/main/java/org/msgpack/MessagePackObject.java
index 07c5d300..0d88038d 100644
--- a/java/src/main/java/org/msgpack/MessagePackObject.java
+++ b/java/src/main/java/org/msgpack/MessagePackObject.java
@@ -155,7 +155,7 @@ public abstract class MessagePackObject implements Cloneable, MessagePackable {
 		return convert((Class<T>)to.getClass(), to);
 	}
 
-	private <T> T convert(Class<T> klass, T to) throws MessageTypeException {
+	public <T> T convert(Class<T> klass, T to) throws MessageTypeException {
 		// FIXME nullable?
 		return (T)convert(new NullableTemplate(new ClassTemplate(klass)), to);
 	}
diff --git a/java/src/main/java/org/msgpack/MessageTypeException.java b/java/src/main/java/org/msgpack/MessageTypeException.java
index 7a06a3e3..bd148447 100644
--- a/java/src/main/java/org/msgpack/MessageTypeException.java
+++ b/java/src/main/java/org/msgpack/MessageTypeException.java
@@ -27,5 +27,9 @@ public class MessageTypeException extends RuntimeException {
 	public MessageTypeException(String s, Throwable t) {
 		super(s, t);
 	}
+	
+	public MessageTypeException(Throwable t) {
+		super(t);
+	}
 }
 
diff --git a/java/src/main/java/org/msgpack/annotation/MessagePackDelegate.java b/java/src/main/java/org/msgpack/annotation/MessagePackDelegate.java
index 88c6f8cf..bb16e2ce 100644
--- a/java/src/main/java/org/msgpack/annotation/MessagePackDelegate.java
+++ b/java/src/main/java/org/msgpack/annotation/MessagePackDelegate.java
@@ -25,4 +25,5 @@ import java.lang.annotation.Target;
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface MessagePackDelegate {
+	String value();
 }
diff --git a/java/src/main/java/org/msgpack/annotation/MessagePackMessage.java b/java/src/main/java/org/msgpack/annotation/MessagePackMessage.java
index 5f781e01..ab3ad0a1 100644
--- a/java/src/main/java/org/msgpack/annotation/MessagePackMessage.java
+++ b/java/src/main/java/org/msgpack/annotation/MessagePackMessage.java
@@ -21,8 +21,10 @@ import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import org.msgpack.template.FieldOption;
 
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface MessagePackMessage {
+	FieldOption value() default FieldOption.DEFAULT;
 }
diff --git a/java/src/main/java/org/msgpack/buffer/VectoredByteBuffer.java b/java/src/main/java/org/msgpack/buffer/VectoredByteBuffer.java
index bb182036..df73bc08 100644
--- a/java/src/main/java/org/msgpack/buffer/VectoredByteBuffer.java
+++ b/java/src/main/java/org/msgpack/buffer/VectoredByteBuffer.java
@@ -143,12 +143,8 @@ public class VectoredByteBuffer implements GatheringByteChannel, ScatteringByteC
 			// optimization: concatenates to the last buffer instead
 			//               of adding new reference
 			ByteBuffer dup = vec.get(vec.size()-1);
-			int dpos = dup.position();
 			internalBuffer.put(b, off, len);
-			ByteBuffer dup2 = internalBuffer.duplicate();
-			dup2.position(dpos);
-			dup2.limit(ipos + len);
-			vec.set(vec.size()-1, dup2);
+			dup.limit(ipos + len);
 			return;
 		}
 		internalBuffer.put(b, off, len);
diff --git a/java/src/main/java/org/msgpack/template/ClassTemplate.java b/java/src/main/java/org/msgpack/template/ClassTemplate.java
index bf8a5be9..28314528 100644
--- a/java/src/main/java/org/msgpack/template/ClassTemplate.java
+++ b/java/src/main/java/org/msgpack/template/ClassTemplate.java
@@ -200,7 +200,7 @@ public class ClassTemplate implements Template {
 				return tmpl.convert(pac.unpackObject(), to);
 			}
 
-			throw new MessageTypeException();
+			throw new MessageTypeException("unknown type: "+klass);
 
 		} catch (IllegalAccessException e) {
 			throw new MessageTypeException(e.getMessage());  // FIXME
diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
index ac5fb50d..f2088ffa 100644
--- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
+++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
@@ -333,6 +333,8 @@ public class DynamicCodeGenBase implements Constants {
 				return Templates.tString();
 			} else if (c.equals(BigInteger.class)) {
 				return Templates.tBigInteger();
+			} else if (c.equals(byte[].class)) {
+				return Templates.tByteArray();
 			} else if (c.equals(ByteBuffer.class)) {
 				return Templates.tByteBuffer();
 			} else if (CustomConverter.isRegistered(c)) {// FIXME