package org.embulk.spi.json; import java.io.ByteArrayOutputStream; import java.io.IOException; import com.google.common.base.Throwables; import org.msgpack.core.MessagePack; import org.msgpack.core.MessageBufferPacker; import org.msgpack.core.buffer.MessageBuffer; import org.msgpack.value.Value; import org.jruby.Ruby; import org.jruby.RubyString; import org.jruby.runtime.builtin.IRubyObject; import org.jruby.util.ByteList; import org.jcodings.specific.ASCIIEncoding; public class RubyValueApi { public static Value fromMessagePack(RubyString content) { ByteList list = content.getByteList(); try { return MessagePack.newDefaultUnpacker(list.unsafeBytes(), list.begin(), list.length()).unpackValue(); } catch (IOException ex) { throw Throwables.propagate(ex); } } private static class OpenByteArrayOutputStream extends ByteArrayOutputStream { public byte[] getBuffer() { return buf; } public int getCount() { return count; } } public static RubyString toMessagePack(Ruby runtime, Value value) { try { MessageBufferPacker packer = MessagePack.newDefaultBufferPacker(); packer.packValue(value); MessageBuffer mb = packer.toMessageBuffer(); ByteList list = new ByteList(mb.array(), mb.arrayOffset(), mb.size(), ASCIIEncoding.INSTANCE, false); return RubyString.newString(runtime, list); } catch (IOException ex) { throw Throwables.propagate(ex); } } public static Value toValue(Ruby runtime, IRubyObject object) { RubyString string = (RubyString) object.callMethod(runtime.getCurrentContext(), "to_msgpack"); return fromMessagePack(string); } }