diff --git a/src/main/java/net/openhft/chronicle/wire/YamlWire.java b/src/main/java/net/openhft/chronicle/wire/YamlWire.java index 53e1ec11c..e27ea811e 100644 --- a/src/main/java/net/openhft/chronicle/wire/YamlWire.java +++ b/src/main/java/net/openhft/chronicle/wire/YamlWire.java @@ -53,6 +53,7 @@ public class YamlWire extends YamlWireOut { static final String SEQ_MAP = "!seqmap"; static final String BINARY_TAG = "!binary"; static final String DATA_TAG = "!data"; + static final String NULL_TAG = "!null"; //for (char ch : "?%&*@`0123456789+- ',#:{}[]|>!\\".toCharArray()) private final TextValueIn valueIn = createValueIn(); @@ -845,9 +846,19 @@ public StringBuilder textTo(@NotNull StringBuilder sb) { public Bytes textTo(@NotNull Bytes bytes) { bytes.clear(); if (yt.current() == YamlToken.TEXT) { - bytes.clear(); bytes.append(yt.text()); yt.next(); + } else if (yt.current() == YamlToken.TAG) { + if (yt.isText(NULL_TAG)) { + yt.next(); + yt.next(); + return null; + } else if (yt.isText(BINARY_TAG)) { + yt.next(); + bytes.write((byte[]) decodeBinary(byte[].class)); + } else { + throw new UnsupportedOperationException(yt.toString()); + } } else { throw new UnsupportedOperationException(yt.toString()); } @@ -878,17 +889,6 @@ public BracketType getBracketType() { } } - @Nullable - Bytes textTo0(@NotNull Bytes a) { - consumePadding(); - if (yt.current() == YamlToken.TEXT) { - a.append(yt.text()); - } else { - throw new UnsupportedOperationException(yt.toString()); - } - return a; - } - @Nullable StringBuilder textTo0(@NotNull StringBuilder a) { consumePadding(); @@ -900,7 +900,7 @@ StringBuilder textTo0(@NotNull StringBuilder a) { unescape(a, yt.blockQuote()); yt.next(); } else if (yt.current() == YamlToken.TAG) { - if (yt.isText("!null")) { + if (yt.isText(NULL_TAG)) { yt.next(); yt.next(); return null; @@ -969,7 +969,7 @@ public WireIn bytes(@NotNull ReadBytesMarshallable bytesConsumer) { bytes.releaseLast(); } - } else if (StringUtils.isEqual(sb, "!null")) { + } else if (StringUtils.isEqual(sb, NULL_TAG)) { bytesConsumer.readMarshallable(null); yt.next(); @@ -1639,7 +1639,7 @@ private Map map(@NotNull final Class kClass, private Map typedMap(@NotNull Class kClazz, @NotNull Class vClass, @NotNull Map usingMap, @NotNull StringBuilder sb) throws InvalidMarshallableException { yt.text(sb); yt.next(); - if (("!null").contentEquals(sb)) { + if (NULL_TAG.contentEquals(sb)) { text(); return null; @@ -1766,7 +1766,7 @@ public float float32() { public boolean isNull() { consumePadding(); - if (yt.current() == YamlToken.TAG && yt.isText("!null")) { + if (yt.current() == YamlToken.TAG && yt.isText(NULL_TAG)) { consumeAny(0); return true; } diff --git a/src/test/java/net/openhft/chronicle/wire/BinaryInTextTest.java b/src/test/java/net/openhft/chronicle/wire/BinaryInTextTest.java index d8ef3aea3..894d81869 100644 --- a/src/test/java/net/openhft/chronicle/wire/BinaryInTextTest.java +++ b/src/test/java/net/openhft/chronicle/wire/BinaryInTextTest.java @@ -21,36 +21,49 @@ import net.openhft.chronicle.bytes.Bytes; import net.openhft.chronicle.bytes.BytesStore; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; import static junit.framework.TestCase.assertEquals; import static org.junit.Assert.assertTrue; +@RunWith(value = Parameterized.class) public class BinaryInTextTest extends WireTestCommon { + private final WireType wireType; + + public BinaryInTextTest(WireType wireType) { + this.wireType = wireType; + } + + @Parameterized.Parameters(name = "{0}") + public static Collection wireTypes() { + return Arrays.asList( + new Object[]{WireType.TEXT}, + new Object[]{WireType.YAML}); + } + @SuppressWarnings("rawtypes") @Test public void testBytesFromText() { - Bytes a = Marshallable.fromString(Bytes.class, "A=="); + Bytes a = wireType.fromString(Bytes.class, "A=="); assertEquals("A==", a.toString()); - BytesStore a2 = Marshallable.fromString(BytesStore.class, "A=="); + BytesStore a2 = wireType.fromString(BytesStore.class, "A=="); assertEquals("A==", a2.toString()); - Bytes b = Marshallable.fromString(Bytes.class, "!!binary BA=="); - assertEquals("[pos: 0, rlim: 1, wlim: 2147483632, cap: 2147483632 ] ǁ⒋‡٠٠٠٠٠٠٠٠٠٠٠٠٠٠٠", b.toDebugString()); + Bytes b = wireType.fromString(Bytes.class, "!!binary BA=="); + assertEquals("00000000 04", b.toHexString().substring(0, 58).trim()); - Bytes b2 = Marshallable.fromString(Bytes.class, "!!binary A1=="); - assertEquals("[pos: 0, rlim: 1, wlim: 2147483632, cap: 2147483632 ] ǁ⒊‡٠٠٠٠٠٠٠٠٠٠٠٠٠٠٠", b2.toDebugString()); + Bytes b2 = wireType.fromString(Bytes.class, "!!binary A1=="); + assertEquals("00000000 03", b2.toHexString().substring(0, 58).trim()); } @Test public void testReserialize() { - BIT b = new BIT(); - byte[] a = new byte[5]; - b.b = Bytes.wrapForRead(a); - b.c = Bytes.wrapForRead(a); - // System.out.println(b); - - BIT bit = Marshallable.fromString(BIT.class, "{\n" + + BIT bit = wireType.fromString(BIT.class, "{\n" + "b: !!binary AAAAAAA=,\n" + "c: !!binary CCCCCCCC,\n" + "}");