diff --git a/ext/java/jar/jbson.jar b/ext/java/jar/jbson.jar index 61d1916..187ccf0 100644 Binary files a/ext/java/jar/jbson.jar and b/ext/java/jar/jbson.jar differ diff --git a/ext/java/jar/mongo-2.4.jar b/ext/java/jar/mongo-2.4.jar index d1e4322..6bbcc18 100644 Binary files a/ext/java/jar/mongo-2.4.jar and b/ext/java/jar/mongo-2.4.jar differ diff --git a/ext/java/src/org/jbson/RubyBSONDecoder.java b/ext/java/src/org/jbson/RubyBSONDecoder.java index b9e4300..892e677 100644 --- a/ext/java/src/org/jbson/RubyBSONDecoder.java +++ b/ext/java/src/org/jbson/RubyBSONDecoder.java @@ -14,14 +14,24 @@ import org.bson.types.*; public class RubyBSONDecoder extends BSONDecoder { -// public int decode( RubyString s , BSONCallback callback ){ -// byte[] b = s.getBytes(); -// try { -// return decode( new Input( new ByteArrayInputStream(b) ) , callback ); -// } -// catch ( IOException ioe ){ -// throw new RuntimeException( "should be impossible" , ioe ); -// } -// } + protected void _binary( String name ) + throws IOException { + final int totalLen = _in.readInt(); + final byte bType = _in.read(); + if( bType == 2 ) { + final int len = _in.readInt(); + if ( len + 4 != totalLen ) + throw new IllegalArgumentException( "bad data size subtype 2 len: " + len + "totalLen: " + totalLen ); + + final byte[] data = new byte[len]; + _in.fill( data ); + _callback.gotBinary( name, (byte)2, data ); + } + else { + byte[] data = new byte[totalLen]; + _in.fill( data ); + _callback.gotBinary( name, bType, data ); + } + } } diff --git a/ext/java/src/org/jbson/RubyBSONEncoder.java b/ext/java/src/org/jbson/RubyBSONEncoder.java index e7f8b79..e892ccf 100644 --- a/ext/java/src/org/jbson/RubyBSONEncoder.java +++ b/ext/java/src/org/jbson/RubyBSONEncoder.java @@ -558,7 +558,7 @@ public class RubyBSONEncoder extends BSONEncoder { long subtype = rbSubtype.longValue(); byte[] data = ra2ba( rarray ); if ( subtype == 2 ) { - putBinary( name, data ); + putBinaryTypeTwo( name, data ); } else { _put( BINARY , name ); @@ -568,11 +568,12 @@ public class RubyBSONEncoder extends BSONEncoder { } } - protected void putBinary( String name , byte[] data ){ + /* We have a special method because type 2 has a different format. */ + protected void putBinaryTypeTwo( String name , byte[] data ){ _put( BINARY , name ); _buf.writeInt( 4 + data.length ); - _buf.write( B_BINARY ); + _buf.write( 2 ); _buf.writeInt( data.length ); int before = _buf.getPosition(); _buf.write( data ); @@ -581,6 +582,13 @@ public class RubyBSONEncoder extends BSONEncoder { com.mongodb.util.MyAsserts.assertEquals( after - before , data.length ); } + protected void putBinary( String name , byte[] data ){ + _put( BINARY , name ); + _buf.writeInt( data.length ); + _buf.write( 0 ); + _buf.write( data ); + } + protected void putBinary( String name , Binary val ){ _put( BINARY , name ); _buf.writeInt( val.length() ); diff --git a/lib/bson.rb b/lib/bson.rb index fd7fe8a..4fcea5f 100644 --- a/lib/bson.rb +++ b/lib/bson.rb @@ -57,7 +57,6 @@ end if RUBY_PLATFORM =~ /java/ jar_dir = File.join(File.dirname(__FILE__), '..', 'ext', 'java', 'jar') require File.join(jar_dir, 'mongo-2.4.jar') - require File.join(jar_dir, 'bson-2.2.jar') require File.join(jar_dir, 'jbson.jar') require 'bson/bson_java' module BSON diff --git a/lib/bson/bson_java.rb b/lib/bson/bson_java.rb index 14257c5..9d2c6f1 100644 --- a/lib/bson/bson_java.rb +++ b/lib/bson/bson_java.rb @@ -11,7 +11,7 @@ module BSON end def self.deserialize(buf) - dec = Java::OrgBson::BSONDecoder.new + dec = Java::OrgJbson::RubyBSONDecoder.new callback = Java::OrgJbson::RubyBSONCallback.new(JRuby.runtime) dec.decode(buf.to_s.to_java_bytes, callback) callback.get