Fixed [JACKSON-376], problems writing Smile binary data as object property
diff --git a/release-notes/CREDITS b/release-notes/CREDITS
index 4ed9c41..4ae05ab 100644
--- a/release-notes/CREDITS
+++ b/release-notes/CREDITS
@@ -173,6 +173,8 @@
Shay Banon:
* Suggested [JACKSON-168] Make JsonLocation serializable (and deserializable)
[1.3.0]
+ * Reported [JACKSON-376] writing binary data as object field value with Smile fails
+ [1.6.1]
Brian McCallister:
* Suggested [JACKSON-173]: Add "JsonParser.Feature.ALLOW_SINGLE_QUOTES"
@@ -398,4 +400,6 @@
* Suggested [JACKSON-308] Configurable date formatting support for XMLGregorianCalendar,
XMLGregorianCalendar now uses same Date/Calendar serialization as other date types.
[1.6.0]
+
+
\ No newline at end of file
diff --git a/release-notes/VERSION b/release-notes/VERSION
index a3ae114..d263ff1 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -9,6 +9,8 @@
Fixes:
* [JACKSON-372] handle missing primitive type values for @JsonCreator gracefully (with defaults)
+ * [JACKSON-376] writing binary data as object field value with Smile failed
+ (report by Shay B)
* all fixes from 1.5.x up to 1.5.7
------------------------------------------------------------------------
diff --git a/src/smile/java/org/codehaus/jackson/smile/SmileGenerator.java b/src/smile/java/org/codehaus/jackson/smile/SmileGenerator.java
index 58312bb..e99053c 100644
--- a/src/smile/java/org/codehaus/jackson/smile/SmileGenerator.java
+++ b/src/smile/java/org/codehaus/jackson/smile/SmileGenerator.java
@@ -722,13 +722,11 @@
@Override
public void writeBinary(Base64Variant b64variant, byte[] data, int offset, int len) throws IOException, JsonGenerationException
{
- _verifyValueWrite("write Binary value");
if (data == null) {
writeNull();
return;
}
_verifyValueWrite("write Binary value");
-
if (this.isEnabled(Feature.ENCODE_BINARY_AS_7BIT)) {
_writeByte((byte) TOKEN_MISC_BINARY_7BIT);
_write7BitBinaryWithLength(data, offset, len);
diff --git a/src/test/org/codehaus/jackson/smile/TestSmileParserBinary.java b/src/test/org/codehaus/jackson/smile/TestSmileParserBinary.java
index 2ca22c3..821918a 100644
--- a/src/test/org/codehaus/jackson/smile/TestSmileParserBinary.java
+++ b/src/test/org/codehaus/jackson/smile/TestSmileParserBinary.java
@@ -16,23 +16,35 @@
139000
};
- public void testRaw() throws IOException
+ public void testRawAsArray() throws IOException
{
- _testBinary(true);
+ _testBinaryAsArray(true);
}
- public void test7Bit() throws IOException
+ public void test7BitAsArray() throws IOException
{
- _testBinary(false);
+ _testBinaryAsArray(false);
}
+ // Added based on [JACKSON-376]
+ public void testRawAsObject() throws IOException
+ {
+ _testBinaryAsObject(true);
+ }
+
+ // Added based on [JACKSON-376]
+ public void test7BitAsObject() throws IOException
+ {
+ _testBinaryAsObject(false);
+ }
+
/*
/**********************************************************
/* Helper methods
/**********************************************************
*/
- private void _testBinary(boolean raw) throws IOException
+ private void _testBinaryAsArray(boolean raw) throws IOException
{
SmileFactory f = new SmileFactory();
f.configure(SmileGenerator.Feature.ENCODE_BINARY_AS_7BIT, !raw);
@@ -70,6 +82,45 @@
}
}
+ private void _testBinaryAsObject(boolean raw) throws IOException
+ {
+ SmileFactory f = new SmileFactory();
+ f.configure(SmileGenerator.Feature.ENCODE_BINARY_AS_7BIT, !raw);
+ for (int size : SIZES) {
+ byte[] data = _generateData(size);
+ ByteArrayOutputStream bo = new ByteArrayOutputStream(size+10);
+ SmileGenerator g = f.createJsonGenerator(bo);
+ g.writeStartObject();
+ g.writeFieldName("binary");
+ g.writeBinary(data);
+ g.writeEndObject();
+ g.close();
+ byte[] smile = bo.toByteArray();
+
+ // and verify
+ SmileParser p = f.createJsonParser(smile);
+ assertToken(JsonToken.START_OBJECT, p.nextToken());
+
+ assertToken(JsonToken.FIELD_NAME, p.nextToken());
+ assertEquals("binary", p.getCurrentName());
+ assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+ byte[] result = p.getBinaryValue();
+ assertArrayEquals(data, result);
+ assertToken(JsonToken.END_OBJECT, p.nextToken());
+ assertNull(p.nextToken());
+ p.close();
+
+ // and second time around, skipping
+ p = f.createJsonParser(smile);
+ assertToken(JsonToken.START_OBJECT, p.nextToken());
+ assertToken(JsonToken.FIELD_NAME, p.nextToken());
+ assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+ assertToken(JsonToken.END_OBJECT, p.nextToken());
+ assertNull(p.nextToken());
+ p.close();
+ }
+ }
+
private byte[] _generateData(int size)
{
byte[] result = new byte[size];