Mercurial > hg > Members > sugi > MessagePack-java
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); + } +}