Skip to content

Commit 5742c62

Browse files
committed
2 parents 25b8b10 + 0dba772 commit 5742c62

27 files changed

+292
-176
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Currently included backends are:
2323
Standard supported formats that are not yet included here (but are likely added
2424
in future) are:
2525

26-
* [XML](../../jackson-dataformt-xml)
26+
* [XML](../../../jackson-dataformat-xml)
2727

2828
## License
2929

csv/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Since version 2.3 this module is considered complete and production ready.
1010
All Jackson layers (streaming, databind, tree model) are supported.
1111

1212
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.fasterxml.jackson.dataformat/jackson-dataformat-csv/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.fasterxml.jackson.dataformat/jackson-dataformat-csv/)
13-
[![Javadoc](https://javadoc-emblem.rhcloud.com/doc/com.fasterxml.jackson.dataformat/jackson-dataformat-csv/badge.svg)](http://www.javadoc.io/doc/com.fasterxml.jackson.dataformat/jackson-dataformat-csv)
13+
[![Javadoc](https://javadoc.io/badge/com.fasterxml.jackson.dataformat/jackson-dataformat-csv.svg)](http://www.javadoc.io/doc/com.fasterxml.jackson.dataformat/jackson-dataformat-csv)
1414

1515
## Maven dependency
1616

release-notes/VERSION

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@ Modules:
88
=== Releases ===
99
------------------------------------------------------------------------
1010

11-
2.9.3 (not yet released)
11+
2.9.3 (09-Dec-2017)
1212

13+
#39 (yamk): Binary data not recognized by YAML parser
14+
(repoted by tmoschou@github)
1315
#42 (csv): Add support for escaping double quotes with the configured escape character
1416
(contributed by frankgrimes97@github)
1517
#51 (csv): Set of custom objects with `IGNORE_UNKNOWN` brokes silently csv
1618
(reported by Simone L)
19+
#53: (yaml) Binary values written without type tag
20+
(reported by arulrajnet@github)
1721

1822
2.9.2 (14-Oct-2017)
1923

yaml/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Project is licensed under [Apache License 2.0](http://www.apache.org/licenses/LI
1010

1111
[![Build Status](https://travis-ci.org/FasterXML/jackson-dataformat-yaml.svg?branch=master)](https://travis-ci.org/FasterXML/jackson-dataformat-yaml)
1212
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/)
13-
[![Javadoc](https://javadoc-emblem.rhcloud.com/doc/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/badge.svg)](http://www.javadoc.io/doc/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml)
13+
[![Javadoc](https://javadoc.io/badge/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml.svg)](http://www.javadoc.io/doc/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml)
1414

1515
Module has been production ready since version 2.5.
1616

yaml/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
<dependency>
3131
<groupId>org.yaml</groupId>
3232
<artifactId>snakeyaml</artifactId>
33-
<version>1.18</version>
33+
<version>1.19</version>
3434
</dependency>
3535

3636
<!-- and for testing need annotations -->

yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
1313
import org.yaml.snakeyaml.emitter.Emitter;
1414
import org.yaml.snakeyaml.events.*;
15+
import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
16+
import org.yaml.snakeyaml.nodes.Tag;
1517

1618
import com.fasterxml.jackson.core.*;
1719
import com.fasterxml.jackson.core.base.GeneratorBase;
@@ -139,6 +141,7 @@ private Feature(boolean defaultState) {
139141
protected final static long MIN_INT_AS_LONG = (long) Integer.MIN_VALUE;
140142
protected final static long MAX_INT_AS_LONG = (long) Integer.MAX_VALUE;
141143
protected final static Pattern PLAIN_NUMBER_P = Pattern.compile("[0-9]*(\\.[0-9]*)?");
144+
protected final static String TAG_BINARY = Tag.BINARY.toString();
142145

143146
/*
144147
/**********************************************************
@@ -170,7 +173,8 @@ private Feature(boolean defaultState) {
170173
private final static Character STYLE_LITERAL = Character.valueOf('|');
171174

172175
// Which flow style to use for Base64? Maybe basic quoted?
173-
private final static Character STYLE_BASE64 = Character.valueOf('"');
176+
// 29-Nov-2017, tatu: Actually SnakeYAML uses block style so:
177+
private final static Character STYLE_BASE64 = STYLE_LITERAL;
174178

175179
private final static Character STYLE_PLAIN = null;
176180

@@ -593,12 +597,10 @@ public void writeBinary(Base64Variant b64variant, byte[] data, int offset, int l
593597
return;
594598
}
595599
_verifyValueWrite("write Binary value");
596-
// ok, better just Base64 encode as a String...
597600
if (offset > 0 || (offset+len) != data.length) {
598601
data = Arrays.copyOfRange(data, offset, offset+len);
599602
}
600-
String encoded = b64variant.encode(data);
601-
_writeScalar(encoded, "byte[]", STYLE_BASE64);
603+
_writeScalarBinary(data);
602604
}
603605

604606
/*
@@ -762,13 +764,24 @@ protected void _releaseBuffers() {
762764
*/
763765

764766
// Implicit means that (type) tags won't be shown, right?
765-
private final static ImplicitTuple DEFAULT_IMPLICIT = new ImplicitTuple(true, true);
767+
private final static ImplicitTuple NO_TAGS = new ImplicitTuple(true, true);
768+
769+
// ... and sometimes we specifically DO want explicit tag:
770+
private final static ImplicitTuple EXPLICIT_TAGS = new ImplicitTuple(false, false);
766771

767772
protected void _writeScalar(String value, String type, Character style) throws IOException
768773
{
769774
_emitter.emit(_scalarEvent(value, style));
770775
}
771776

777+
private void _writeScalarBinary(byte[] data) throws IOException
778+
{
779+
// 29-Nov-2017, tatu: Use SnakeYAML encoder instead of Jackson's
780+
String encoded = Base64Coder.encodeLines(data);
781+
_emitter.emit(new ScalarEvent(null, TAG_BINARY, EXPLICIT_TAGS, encoded,
782+
null, null, STYLE_BASE64));
783+
}
784+
772785
protected ScalarEvent _scalarEvent(String value, Character style)
773786
{
774787
String yamlTag = _typeId;
@@ -779,7 +792,9 @@ protected ScalarEvent _scalarEvent(String value, Character style)
779792
if (anchor != null) {
780793
_objectId = null;
781794
}
782-
return new ScalarEvent(anchor, yamlTag, DEFAULT_IMPLICIT, value,
795+
// 29-Nov-2017, tatu: Not 100% sure why we don't force explicit tags for
796+
// type id, but trying to do so seems to double up tag output...
797+
return new ScalarEvent(anchor, yamlTag, NO_TAGS, value,
783798
null, null, style);
784799
}
785800
}

yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLParser.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,17 @@
77

88
import org.yaml.snakeyaml.error.Mark;
99
import org.yaml.snakeyaml.events.*;
10+
import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
1011
import org.yaml.snakeyaml.nodes.NodeId;
1112
import org.yaml.snakeyaml.nodes.Tag;
1213
import org.yaml.snakeyaml.parser.ParserImpl;
1314
import org.yaml.snakeyaml.reader.StreamReader;
15+
import org.yaml.snakeyaml.resolver.Resolver;
1416

1517
import com.fasterxml.jackson.core.*;
1618
import com.fasterxml.jackson.core.base.ParserBase;
1719
import com.fasterxml.jackson.core.io.IOContext;
1820
import com.fasterxml.jackson.core.util.BufferRecycler;
19-
import com.fasterxml.jackson.core.util.ByteArrayBuilder;
20-
21-
import org.yaml.snakeyaml.resolver.Resolver;
2221

2322
/**
2423
* {@link JsonParser} implementation used to expose YAML documents
@@ -419,7 +418,7 @@ public JsonToken nextToken() throws IOException
419418
}
420419
}
421420

422-
protected JsonToken _decodeScalar(ScalarEvent scalar)
421+
protected JsonToken _decodeScalar(ScalarEvent scalar) throws IOException
423422
{
424423
String value = scalar.getValue();
425424
_textValue = value;
@@ -429,7 +428,6 @@ protected JsonToken _decodeScalar(ScalarEvent scalar)
429428

430429
if (typeTag == null || typeTag.equals("!")) { // no, implicit
431430
Tag nodeTag = _yamlResolver.resolve(NodeId.scalar, value, scalar.getImplicit().canOmitTagInPlainScalar());
432-
433431
if (nodeTag == Tag.STR) {
434432
return JsonToken.VALUE_STRING;
435433
}
@@ -458,6 +456,14 @@ protected JsonToken _decodeScalar(ScalarEvent scalar)
458456
typeTag = typeTag.split(",")[0];
459457
}
460458
}
459+
// [dataformats-text#39]: support binary type
460+
if ("binary".equals(typeTag)) {
461+
// 29-Nov-2017, tatu: two choices for base64 codecs (or 3 with Java 8):
462+
// Jackson's own or SnakeYAML. Former is faster, but maybe makes sense
463+
// to use latter for sake of consistency.
464+
_binaryValue = Base64Coder.decodeLines(value);
465+
return JsonToken.VALUE_EMBEDDED_OBJECT;
466+
}
461467
// canonical values by YAML are actually 'y' and 'n'; but plenty more unofficial:
462468
if ("bool".equals(typeTag)) { // must be "true" or "false"
463469
Boolean B = _matchYAMLBoolean(value, len);
@@ -623,23 +629,21 @@ public int getText(Writer writer) throws IOException
623629

624630
@Override
625631
public Object getEmbeddedObject() throws IOException {
632+
if (_currToken == JsonToken.VALUE_EMBEDDED_OBJECT ) {
633+
return _binaryValue;
634+
}
626635
return null;
627636
}
628637

629-
// TODO: can remove from 2.9 or so (base impl added in 2.8)
630-
@SuppressWarnings("resource")
638+
// Base impl from `ParserBase` works fine here:
639+
// public byte[] getBinaryValue(Base64Variant variant) throws IOException
640+
631641
@Override
632-
public byte[] getBinaryValue(Base64Variant variant) throws IOException
642+
public int readBinaryValue(Base64Variant b64variant, OutputStream out) throws IOException
633643
{
634-
if (_binaryValue == null) {
635-
if (_currToken != JsonToken.VALUE_STRING) {
636-
_reportError("Current token ("+_currToken+") not VALUE_STRING, can not access as binary");
637-
}
638-
ByteArrayBuilder builder = _getByteArrayBuilder();
639-
_decodeBase64(getText(), builder, variant);
640-
_binaryValue = builder.toByteArray();
641-
}
642-
return _binaryValue;
644+
byte[] b = getBinaryValue(b64variant);
645+
out.write(b);
646+
return b.length;
643647
}
644648

645649
/*

yaml/src/test/java/com/fasterxml/jackson/dataformat/yaml/EventsTest.java

Lines changed: 0 additions & 52 deletions
This file was deleted.

yaml/src/test/java/com/fasterxml/jackson/dataformat/yaml/ExceptionConversionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class ExceptionConversionTest extends ModuleTestBase
1010
{
1111
public void testSimpleParsingLeakage() throws Exception
1212
{
13-
YAMLMapper mapper = mapperForYAML();
13+
YAMLMapper mapper = newObjectMapper();
1414
try {
1515
mapper.readTree("foo:\nbar: true\n baz: false");
1616
fail("Should not pass with invalid YAML");

yaml/src/test/java/com/fasterxml/jackson/dataformat/yaml/ModuleTestBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ protected ModuleTestBase() { }
6767
/* Helper methods, setup
6868
/**********************************************************************
6969
*/
70-
71-
protected YAMLMapper mapperForYAML()
70+
71+
protected YAMLMapper newObjectMapper()
7272
{
7373
return new YAMLMapper();
7474
}

0 commit comments

Comments
 (0)