diff src/main/java/org/msgpack/MessagePack.java @ 0:cb825acd883a

first commit
author sugi
date Sat, 18 Oct 2014 15:06:15 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/msgpack/MessagePack.java	Sat Oct 18 15:06:15 2014 +0900
@@ -0,0 +1,837 @@
+//
+// MessagePack for Java
+//
+// Copyright (C) 2009 - 2013 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.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;
+import org.msgpack.packer.Packer;
+import org.msgpack.packer.BufferPacker;
+import org.msgpack.packer.MessagePackPacker;
+import org.msgpack.packer.MessagePackBufferPacker;
+import org.msgpack.packer.Unconverter;
+import org.msgpack.unpacker.Unpacker;
+import org.msgpack.unpacker.BufferUnpacker;
+import org.msgpack.unpacker.MessagePackUnpacker;
+import org.msgpack.unpacker.MessagePackBufferUnpacker;
+import org.msgpack.unpacker.Converter;
+import org.msgpack.type.Value;
+
+/**
+ * <p>
+ * This is basic class to use MessagePack for Java. It creates serializers and
+ * deserializers for objects of classes.
+ * </p>
+ * 
+ * <p>
+ * See <a
+ * href="http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+Java">Quick
+ * Start for Java</a> on MessagePack wiki.
+ * </p>
+ * 
+ */
+public class MessagePack {
+    private TemplateRegistry registry;
+
+    /**
+     * 
+     * @since 0.6.0
+     */
+    public MessagePack() {
+        registry = new TemplateRegistry(null);
+    }
+
+    /**
+     * 
+     * @since 0.6.0
+     * @param msgpack
+     */
+    public MessagePack(MessagePack msgpack) {
+        registry = new TemplateRegistry(msgpack.registry);
+    }
+
+    protected MessagePack(TemplateRegistry registry) {
+        this.registry = registry;
+    }
+
+    /**
+     * 
+     * @since 0.6.0
+     * @param cl
+     */
+    public void setClassLoader(final ClassLoader cl) {
+        registry.setClassLoader(cl);
+    }
+
+    /**
+     * Returns serializer that enables serializing objects into
+     * {@link java.io.OutputStream} object.
+     * 
+     * @since 0.6.0
+     * @param out
+     *            output stream
+     * @return stream-based serializer
+     */
+    public Packer createPacker(OutputStream out) {
+        return new MessagePackPacker(this, out);
+    }
+
+    /**
+     * Returns serializer that enables serializing objects into buffer.
+     * 
+     * @since 0.6.0
+     * @return buffer-based serializer
+     */
+    public BufferPacker createBufferPacker() {
+        return new MessagePackBufferPacker(this);
+    }
+
+    /**
+     * Returns serializer that enables serializing objects into buffer.
+     * 
+     * @since 0.6.0
+     * @param bufferSize
+     *            initial size of buffer
+     * @return buffer-based serializer
+     */
+    public BufferPacker createBufferPacker(int bufferSize) {
+        return new MessagePackBufferPacker(this, bufferSize);
+    }
+
+    /**
+     * Returns deserializer that enables deserializing
+     * {@link java.io.InputStream} object.
+     * 
+     * @since 0.6.0
+     * @param in
+     *            input stream
+     * @return stream-based deserializer
+     */
+    public Unpacker createUnpacker(InputStream in) {
+        return new MessagePackUnpacker(this, in);
+    }
+
+    /**
+     * Returns empty deserializer that enables deserializing buffer.
+     * 
+     * @since 0.6.0
+     * @return buffer-based deserializer
+     */
+    public BufferUnpacker createBufferUnpacker() {
+        return new MessagePackBufferUnpacker(this);
+    }
+
+    /**
+     * Returns deserializer that enables deserializing buffer.
+     * 
+     * @since 0.6.0
+     * @param bytes
+     *            input byte array
+     * @return buffer-based deserializer
+     */
+    public BufferUnpacker createBufferUnpacker(byte[] bytes) {
+        return createBufferUnpacker().wrap(bytes);
+    }
+
+    /**
+     * Returns deserializer that enables deserializing buffer.
+     * 
+     * @since 0.6.0
+     * @param bytes
+     * @param off
+     * @param len
+     * @return buffer-based deserializer
+     */
+    public BufferUnpacker createBufferUnpacker(byte[] bytes, int off, int len) {
+        return createBufferUnpacker().wrap(bytes, off, len);
+    }
+
+    /**
+     * Returns deserializer that enables deserializing buffer.
+     * 
+     * @since 0.6.0
+     * @param buffer
+     *            input {@link java.nio.ByteBuffer} object
+     * @return buffer-based deserializer
+     */
+    public BufferUnpacker createBufferUnpacker(ByteBuffer buffer) {
+        return createBufferUnpacker().wrap(buffer);
+    }
+
+    /**
+     * Serializes specified object.
+     * 
+     * @since 0.6.0
+     * @param v
+     *            serialized object
+     * @return output byte array
+     * @throws IOException
+     */
+    public <T> byte[] write(T v) throws IOException {
+        BufferPacker pk = createBufferPacker();
+        if (v == null) {
+            pk.writeNil();
+        } else {
+            @SuppressWarnings("unchecked")
+            Template<T> tmpl = registry.lookup(v.getClass());
+            tmpl.write(pk, v);
+        }
+        return pk.toByteArray();
+    }
+
+    /**
+     * Serializes specified object. It allows serializing object by specified
+     * template.
+     * 
+     * @since 0.6.0
+     * @param v
+     * @param template
+     * @return
+     * @throws IOException
+     */
+    public <T> byte[] write(T v, Template<T> template) throws IOException {
+        BufferPacker pk = createBufferPacker();
+        template.write(pk, v);
+        return pk.toByteArray();
+    }
+
+    /**
+     * Serializes specified object to output stream.
+     * 
+     * @since 0.6.0
+     * @param out
+     *            output stream
+     * @param v
+     *            serialized object
+     * @throws IOException
+     */
+    public <T> void write(OutputStream out, T v) throws IOException {
+        Packer pk = createPacker(out);
+        if (v == null) {
+            pk.writeNil();
+        } else {
+            @SuppressWarnings("unchecked")
+            Template<T> tmpl = registry.lookup(v.getClass());
+            tmpl.write(pk, v);
+        }
+    }
+
+    /**
+     * Serializes object to output stream by specified template.
+     * 
+     * @since 0.6.0
+     * @param out
+     *            output stream
+     * @param v
+     *            serialized object
+     * @param template
+     *            serializer/deserializer for the object
+     * @throws IOException
+     */
+    public <T> void write(OutputStream out, T v, Template<T> template)
+            throws IOException {
+        Packer pk = createPacker(out);
+        template.write(pk, v);
+    }
+
+    /**
+     * Serializes {@link org.msgpack.type.Value} object to byte array.
+     * 
+     * @since 0.6.0
+     * @param v
+     *            serialized {@link org.msgpack.type.Value} object
+     * @return output byte array
+     * @throws IOException
+     */
+    public byte[] write(Value v) throws IOException {
+        // FIXME ValueTemplate should do this
+        BufferPacker pk = createBufferPacker();
+        pk.write(v);
+        return pk.toByteArray();
+    }
+
+    /**
+     * Deserializes specified byte array to {@link org.msgpack.type.Value}
+     * object.
+     * 
+     * @since 0.6.0
+     * @param bytes
+     *            input byte array
+     * @return
+     * @throws IOException
+     */
+    public Value read(byte[] bytes) throws IOException {
+        return read(bytes, 0, bytes.length);
+    }
+
+    /**
+     * Deserializes byte array to {@link org.msgpack.type.Value} object.
+     * 
+     * @since 0.6.0
+     * @param bytes
+     * @param off
+     * @param len
+     * @return
+     * @throws IOException
+     */
+    public Value read(byte[] bytes, int off, int len) throws IOException {
+        return createBufferUnpacker(bytes, off, len).readValue();
+    }
+
+    /**
+     * Deserializes {@link java.nio.ByteBuffer} object to
+     * {@link org.msgpack.type.Value} object.
+     * 
+     * @since 0.6.0
+     * @param buffer
+     *            input buffer
+     * @return
+     * @throws IOException
+     */
+    public Value read(ByteBuffer buffer) throws IOException {
+        return createBufferUnpacker(buffer).readValue();
+    }
+
+    /**
+     * Deserializes input stream to {@link org.msgpack.type.Value} object.
+     * 
+     * @since 0.6.0
+     * @param in
+     *            input stream
+     * @return deserialized {@link org.msgpack.type.Value} object
+     * @throws IOException
+     */
+    public Value read(InputStream in) throws IOException {
+        return createUnpacker(in).readValue();
+    }
+
+    /**
+     * Deserializes byte array to object.
+     * 
+     * @since 0.6.0
+     * @param bytes
+     *            input byte array
+     * @param v
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(byte[] bytes, T v) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(v.getClass());
+        return read(bytes, v, tmpl);
+    }
+
+    /**
+     * Deserializes byte array to object according to template.
+     * 
+     * @since 0.6.0
+     * @param bytes
+     *            input byte array
+     * @param tmpl
+     *            template
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(byte[] bytes, Template<T> tmpl) throws IOException {
+        return read(bytes, null, tmpl);
+    }
+
+    /**
+     * Deserializes byte array to object of specified class.
+     * 
+     * @since 0.6.0
+     * @param bytes
+     *            input byte array
+     * @param c
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(byte[] bytes, Class<T> c) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(c);
+        return read(bytes, null, tmpl);
+    }
+
+    /**
+     * Deserializes byte array to object according to specified template.
+     * 
+     * @since 0.6.0
+     * @param bytes
+     *            input byte array
+     * @param v
+     * @param tmpl
+     *            template
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(byte[] bytes, T v, Template<T> tmpl) throws IOException {
+        BufferUnpacker u = createBufferUnpacker(bytes);
+        return (T) tmpl.read(u, v);
+    }
+
+    /**
+     * Deserializes byte array to object.
+     *
+     * @since 0.6.8
+     * @param bytes
+     *            input byte array
+     * @param v
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(byte[] bytes, int off, int len, Class<T> c) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(c);
+        BufferUnpacker u = createBufferUnpacker(bytes, off, len);
+        return (T) tmpl.read(u, null);
+    }
+
+    /**
+     * Deserializes buffer to object.
+     * 
+     * @since 0.6.0
+     * @param b
+     *            input {@link java.nio.ByteBuffer} object
+     * @param v
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(ByteBuffer b, T v) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(v.getClass());
+        return read(b, v, tmpl);
+    }
+
+    /**
+     * Deserializes buffer to object according to template.
+     * 
+     * @since 0.6.0
+     * @param b
+     *            input buffer object
+     * @param tmpl
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(ByteBuffer b, Template<T> tmpl) throws IOException {
+        return read(b, null, tmpl);
+    }
+
+    /**
+     * Deserializes buffer to object of specified class.
+     * 
+     * @since 0.6.0
+     * @param b
+     * @param c
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(ByteBuffer b, Class<T> c) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(c);
+        return read(b, null, tmpl);
+    }
+
+    /**
+     * Deserializes buffer to object according to template.
+     * 
+     * @since 0.6.0
+     * @param b
+     *            input buffer object
+     * @param v
+     * @param tmpl
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(ByteBuffer b, T v, Template<T> tmpl) throws IOException {
+        BufferUnpacker u = createBufferUnpacker(b);
+        return tmpl.read(u, v);
+    }
+
+    /**
+     * Deserializes input stream to object.
+     * 
+     * @since 0.6.0
+     * @param in
+     *            input stream
+     * @param v
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(InputStream in, T v) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(v.getClass());
+        return read(in, v, tmpl);
+    }
+
+    /**
+     * Deserializes input stream to object according to template.
+     * 
+     * @since 0.6.0
+     * @param in
+     *            input stream
+     * @param tmpl
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(InputStream in, Template<T> tmpl) throws IOException {
+        return read(in, null, tmpl);
+    }
+
+    /**
+     * Deserializes input stream to object of specified class.
+     * 
+     * @since 0.6.0
+     * @param in
+     * @param c
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(InputStream in, Class<T> c) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(c);
+        return read(in, null, tmpl);
+    }
+
+    /**
+     * Deserializes input stream to object according to template
+     * 
+     * @since 0.6.0
+     * @param in
+     *            input stream
+     * @param v
+     * @param tmpl
+     * @return
+     * @throws IOException
+     */
+    public <T> T read(InputStream in, T v, Template<T> tmpl) throws IOException {
+        Unpacker u = createUnpacker(in);
+        return tmpl.read(u, v);
+    }
+
+    /**
+     * Converts specified {@link org.msgpack.type.Value} object to object.
+     * 
+     * @since 0.6.0
+     * @param v
+     * @param to
+     * @return
+     * @throws IOException
+     */
+    public <T> T convert(Value v, T to) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(to.getClass());
+        return tmpl.read(new Converter(this, v), to);
+    }
+
+    /**
+     * Converts {@link org.msgpack.type.Value} object to object specified class.
+     * 
+     * @since 0.6.0
+     * @param v
+     * @param c
+     * @return
+     * @throws IOException
+     */
+    public <T> T convert(Value v, Class<T> c) throws IOException {
+        @SuppressWarnings("unchecked")
+        Template<T> tmpl = registry.lookup(c);
+        return tmpl.read(new Converter(this, v), null);
+    }
+        
+    /**
+     * Converts {@link org.msgpack.type.Value} object to object according to template
+     * 
+     * @since 0.6.8
+     * @param v
+     * @param tmpl
+     * @return
+     * @throws IOException
+     */
+    public <T> T convert(Value v, Template<T> tmpl) throws IOException {
+        return tmpl.read(new Converter(this, v), null);
+    }
+
+    /**
+     * Unconverts specified object to {@link org.msgpack.type.Value} object.
+     * 
+     * @since 0.6.0
+     * @param v
+     * @return
+     * @throws IOException
+     */
+    public <T> Value unconvert(T v) throws IOException {
+        Unconverter pk = new Unconverter(this);
+        if (v == null) {
+            pk.writeNil();
+        } else {
+            @SuppressWarnings("unchecked")
+            Template<T> tmpl = registry.lookup(v.getClass());
+            tmpl.write(pk, v);
+        }
+        return pk.getResult();
+    }
+
+    /**
+     * Registers {@link org.msgpack.template.Template} object for objects of
+     * specified class. <tt>Template</tt> object is a pair of serializer and
+     * deserializer for object serialization. It is generated automatically.
+     * 
+     * @since 0.6.0
+     * @param type
+     */
+    public void register(Class<?> type) {
+        registry.register(type);
+    }
+
+    /**
+     * Registers specified {@link org.msgpack.template.Template} object
+     * associated by class.
+     * 
+     * @see #register(Class)
+     * @since 0.6.0
+     * @param type
+     * @param template
+     */
+    public <T> void register(Class<T> type, Template<T> template) {
+        registry.register(type, template);
+    }
+
+    /**
+     * Unregisters {@link org.msgpack.template.Template} object for objects of
+     * specified class.
+     * 
+     * @since 0.6.0
+     * @param type
+     * @return
+     */
+    public boolean unregister(Class<?> type) {
+        return registry.unregister(type);
+    }
+
+    /**
+     * Unregisters all {@link org.msgpack.template.Template} objects that have
+     * been registered in advance.
+     * 
+     * @since 0.6.0
+     */
+    public void unregister() {
+        registry.unregister();
+    }
+
+    /**
+     * Looks up a {@link org.msgpack.template.Template} object, which is
+     * serializer/deserializer associated by specified class.
+     * 
+     * @since 0.6.0
+     * @param type
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public <T> Template<T> lookup(Class<T> type) {
+        return registry.lookup(type);
+    }
+
+    public Template<?> lookup(Type type) {
+        return registry.lookup(type);
+    }
+
+    private static final MessagePack globalMessagePack = new MessagePack();
+
+    /**
+     * Serializes specified object and returns the byte array.
+     * 
+     * @deprecated {@link MessagePack#write(Object)}
+     * @param v
+     * @return
+     * @throws IOException
+     */
+    @Deprecated
+    public static byte[] pack(Object v) throws IOException {
+        return globalMessagePack.write(v);
+    }
+
+    /**
+     * Serializes specified object to output stream.
+     * 
+     * @deprecated {@link MessagePack#write(OutputStream, Object)}
+     * @param out
+     * @param v
+     * @throws IOException
+     */
+    @Deprecated
+    public static void pack(OutputStream out, Object v) throws IOException {
+        globalMessagePack.write(out, v);
+    }
+
+    /**
+     * Serializes object by specified template and return the byte array.
+     * 
+     * @deprecated {@link MessagePack#write(Object, Template)}
+     * @param v
+     * @param template
+     * @return
+     * @throws IOException
+     */
+    @Deprecated
+    public static <T> byte[] pack(T v, Template<T> template) throws IOException {
+        return globalMessagePack.write(v, template);
+    }
+
+    /**
+     * Serializes object to output stream. The object is serialized by specified
+     * template.
+     * 
+     * @deprecated {@link MessagePack#write(OutputStream, Object, Template)}
+     * @param out
+     * @param v
+     * @param template
+     * @throws IOException
+     */
+    @Deprecated
+    public static <T> void pack(OutputStream out, T v, Template<T> template)
+            throws IOException {
+        globalMessagePack.write(out, v, template);
+    }
+
+    /**
+     * Converts byte array to {@link org.msgpack.type.Value} object.
+     * 
+     * @deprecated {@link MessagePack#read(byte[])}
+     * @param bytes
+     * @return
+     * @throws IOException
+     */
+    @Deprecated
+    public static Value unpack(byte[] bytes) throws IOException {
+        return globalMessagePack.read(bytes);
+    }
+
+    @Deprecated
+    public static <T> T unpack(byte[] bytes, Template<T> template) throws IOException {
+        BufferUnpacker u = new MessagePackBufferUnpacker(globalMessagePack).wrap(bytes);
+        return template.read(u, null);
+    }
+
+    @Deprecated
+    public static <T> T unpack(byte[] bytes, Template<T> template, T to) throws IOException {
+        BufferUnpacker u = new MessagePackBufferUnpacker(globalMessagePack).wrap(bytes);
+        return template.read(u, to);
+    }
+
+    /**
+     * Deserializes byte array to object of specified class.
+     * 
+     * @deprecated {@link MessagePack#read(byte[], Class)}
+     * @param bytes
+     * @param klass
+     * @return
+     * @throws IOException
+     */
+    @Deprecated
+    public static <T> T unpack(byte[] bytes, Class<T> klass) throws IOException {
+        return globalMessagePack.read(bytes, klass);
+    }
+
+    /**
+     * Deserializes byte array to object.
+     * 
+     * @param bytes
+     * @param to
+     * @return
+     * @throws IOException
+     */
+    @Deprecated
+    public static <T> T unpack(byte[] bytes, T to) throws IOException {
+        return globalMessagePack.read(bytes, to);
+    }
+
+    /**
+     * Converts input stream to {@link org.msgpack.type.Value} object.
+     * 
+     * @deprecated {@link MessagePack#read(InputStream)}
+     * @param in
+     * @return
+     * @throws IOException
+     */
+    @Deprecated
+    public static Value unpack(InputStream in) throws IOException {
+        return globalMessagePack.read(in);
+    }
+
+    /**
+     * @deprecated
+     * @param in
+     * @param tmpl
+     * @return
+     * @throws IOException
+     * @throws MessageTypeException
+     */
+    @Deprecated
+    public static <T> T unpack(InputStream in, Template<T> tmpl)
+            throws IOException, MessageTypeException {
+        return tmpl.read(new MessagePackUnpacker(globalMessagePack, in), null);
+    }
+
+    /**
+     * @deprecated
+     * @param in
+     * @param tmpl
+     * @param to
+     * @return
+     * @throws IOException
+     * @throws MessageTypeException
+     */
+    @Deprecated
+    public static <T> T unpack(InputStream in, Template<T> tmpl, T to)
+            throws IOException, MessageTypeException {
+        return (T) tmpl.read(new MessagePackUnpacker(globalMessagePack, in), to);
+    }
+
+    /**
+     * Deserializes input stream to object of specified class.
+     * 
+     * @deprecated {@link MessagePack#read(InputStream, Class)}
+     * @param in
+     * @param klass
+     * @return
+     * @throws IOException
+     */
+    @Deprecated
+    public static <T> T unpack(InputStream in, Class<T> klass)
+            throws IOException {
+        return globalMessagePack.read(in, klass);
+    }
+
+    /**
+     * Deserializes input stream to object.
+     * 
+     * @deprecated {@link MessagePack#read(InputStream, Object)}
+     * @param in
+     * @param to
+     * @return
+     * @throws IOException
+     */
+    @Deprecated
+    public static <T> T unpack(InputStream in, T to) throws IOException {
+        return globalMessagePack.read(in, to);
+    }
+}