diff options
author | Haavard <havardpe@yahoo-inc.com> | 2017-03-01 11:30:47 +0000 |
---|---|---|
committer | Haavard <havardpe@yahoo-inc.com> | 2017-03-01 11:30:47 +0000 |
commit | 68d862fcd0ba3b9834b7fe66f3ec928fc8ba62b6 (patch) | |
tree | b8e61a98d8ffcc579a0bb2024c069ebb169937ca /vespajlib | |
parent | f1179b5e605a528e561b9ef98b41422b0a603dee (diff) |
handle null-pointers (Data/String/Utf8) as Nix values
[VESPA-6609]
Diffstat (limited to 'vespajlib')
6 files changed, 62 insertions, 29 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/slime/DataValue.java b/vespajlib/src/main/java/com/yahoo/slime/DataValue.java index abaeac52245..ab2dfb61e3b 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/DataValue.java +++ b/vespajlib/src/main/java/com/yahoo/slime/DataValue.java @@ -3,7 +3,14 @@ package com.yahoo.slime; final class DataValue extends Value { private final byte[] value; - public DataValue(byte[] value) { this.value = value; } + private DataValue(byte[] value) { this.value = value; } + public static Value create(byte[] value) { + if (value == null) { + return NixValue.instance(); + } else { + return new DataValue(value); + } + } public final Type type() { return Type.DATA; } public final byte[] asData() { return this.value; } public final void accept(Visitor v) { v.visitData(value); } diff --git a/vespajlib/src/main/java/com/yahoo/slime/Slime.java b/vespajlib/src/main/java/com/yahoo/slime/Slime.java index 387a81a7655..b4c2cdc8aeb 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/Slime.java +++ b/vespajlib/src/main/java/com/yahoo/slime/Slime.java @@ -91,7 +91,7 @@ public final class Slime * @param str the actual string for the new value **/ public Cursor setString(String str) { - root = new StringValue(str); + root = StringValue.create(str); return root; } @@ -100,7 +100,7 @@ public final class Slime * @param utf8 the actual string (encoded as UTF-8 data) for the new value **/ public Cursor setString(byte[] utf8) { - root = new Utf8Value(utf8); + root = Utf8Value.create(utf8); return root; } @@ -109,7 +109,7 @@ public final class Slime * @param data the actual data to be put into the new value. **/ public Cursor setData(byte[] data) { - root = new DataValue(data); + root = DataValue.create(data); return root; } diff --git a/vespajlib/src/main/java/com/yahoo/slime/StringValue.java b/vespajlib/src/main/java/com/yahoo/slime/StringValue.java index a5b72578d5d..a8a605e174a 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/StringValue.java +++ b/vespajlib/src/main/java/com/yahoo/slime/StringValue.java @@ -8,7 +8,14 @@ package com.yahoo.slime; final class StringValue extends Value { private final String value; private byte[] utf8; - public StringValue(String value) { this.value = value; } + private StringValue(String value) { this.value = value; } + public static Value create(String value) { + if (value == null) { + return NixValue.instance(); + } else { + return new StringValue(value); + } + } public final Type type() { return Type.STRING; } public final String asString() { return this.value; } public final byte[] asUtf8() { diff --git a/vespajlib/src/main/java/com/yahoo/slime/Utf8Value.java b/vespajlib/src/main/java/com/yahoo/slime/Utf8Value.java index 6aa95310b86..d8fd629f46c 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/Utf8Value.java +++ b/vespajlib/src/main/java/com/yahoo/slime/Utf8Value.java @@ -9,7 +9,14 @@ package com.yahoo.slime; final class Utf8Value extends Value { private final byte[] value; private String string; - public Utf8Value(byte[] value) { this.value = value; } + private Utf8Value(byte[] value) { this.value = value; } + public static Value create(byte[] value) { + if (value == null) { + return NixValue.instance(); + } else { + return new Utf8Value(value); + } + } public final Type type() { return Type.STRING; } public final String asString() { if (string == null) { diff --git a/vespajlib/src/main/java/com/yahoo/slime/Value.java b/vespajlib/src/main/java/com/yahoo/slime/Value.java index d86bf8607bd..7bbdecff0fc 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/Value.java +++ b/vespajlib/src/main/java/com/yahoo/slime/Value.java @@ -43,9 +43,9 @@ abstract class Value implements Cursor { public final Cursor addBool(boolean bit) { return addLeaf(BoolValue.instance(bit)); } public final Cursor addLong(long l) { return addLeaf(new LongValue(l)); } public final Cursor addDouble(double d) { return addLeaf(new DoubleValue(d)); } - public final Cursor addString(String str) { return addLeaf(new StringValue(str)); } - public final Cursor addString(byte[] utf8) { return addLeaf(new Utf8Value(utf8)); } - public final Cursor addData(byte[] data) { return addLeaf(new DataValue(data)); } + public final Cursor addString(String str) { return addLeaf(StringValue.create(str)); } + public final Cursor addString(byte[] utf8) { return addLeaf(Utf8Value.create(utf8)); } + public final Cursor addData(byte[] data) { return addLeaf(DataValue.create(data)); } protected Cursor setLeaf(int sym, Value value) { return NixValue.invalid(); } public Cursor setArray(int sym) { return NixValue.invalid(); } @@ -55,9 +55,9 @@ abstract class Value implements Cursor { public final Cursor setBool(int sym, boolean bit) { return setLeaf(sym, BoolValue.instance(bit)); } public final Cursor setLong(int sym, long l) { return setLeaf(sym, new LongValue(l)); } public final Cursor setDouble(int sym, double d) { return setLeaf(sym, new DoubleValue(d)); } - public final Cursor setString(int sym, String str) { return setLeaf(sym, new StringValue(str)); } - public final Cursor setString(int sym, byte[] utf8) { return setLeaf(sym, new Utf8Value(utf8)); } - public final Cursor setData(int sym, byte[] data) { return setLeaf(sym, new DataValue(data)); } + public final Cursor setString(int sym, String str) { return setLeaf(sym, StringValue.create(str)); } + public final Cursor setString(int sym, byte[] utf8) { return setLeaf(sym, Utf8Value.create(utf8)); } + public final Cursor setData(int sym, byte[] data) { return setLeaf(sym, DataValue.create(data)); } protected Cursor setLeaf(String name, Value value) { return NixValue.invalid(); } public Cursor setArray(String name) { return NixValue.invalid(); } @@ -67,9 +67,9 @@ abstract class Value implements Cursor { public final Cursor setBool(String name, boolean bit) { return setLeaf(name, BoolValue.instance(bit)); } public final Cursor setLong(String name, long l) { return setLeaf(name, new LongValue(l)); } public final Cursor setDouble(String name, double d) { return setLeaf(name, new DoubleValue(d)); } - public final Cursor setString(String name, String str) { return setLeaf(name, new StringValue(str)); } - public final Cursor setString(String name, byte[] utf8) { return setLeaf(name, new Utf8Value(utf8)); } - public final Cursor setData(String name, byte[] data) { return setLeaf(name, new DataValue(data)); } + public final Cursor setString(String name, String str) { return setLeaf(name, StringValue.create(str)); } + public final Cursor setString(String name, byte[] utf8) { return setLeaf(name, Utf8Value.create(utf8)); } + public final Cursor setData(String name, byte[] data) { return setLeaf(name, DataValue.create(data)); } public final String toString() { try { diff --git a/vespajlib/src/test/java/com/yahoo/slime/JsonFormatTestCase.java b/vespajlib/src/test/java/com/yahoo/slime/JsonFormatTestCase.java index e48a717f150..86fe40c7817 100644 --- a/vespajlib/src/test/java/com/yahoo/slime/JsonFormatTestCase.java +++ b/vespajlib/src/test/java/com/yahoo/slime/JsonFormatTestCase.java @@ -104,6 +104,32 @@ public class JsonFormatTestCase { } @Test + public void testNullJavaStringNixFallback() { + Slime slime = new Slime(); + String str = null; + slime.setString(str); + assertThat(slime.get().type(), is(Type.NIX)); + verifyEncoding(slime, "null"); + } + + @Test + public void testNullUtf8StringNixFallback() { + Slime slime = new Slime(); + byte[] utf8 = null; + slime.setString(utf8); + assertThat(slime.get().type(), is(Type.NIX)); + verifyEncoding(slime, "null"); + } + + @Test + public void testNullDataNixFallback() { + Slime slime = new Slime(); + slime.setData(null); + assertThat(slime.get().type(), is(Type.NIX)); + verifyEncoding(slime, "null"); + } + + @Test public void testArray() { System.out.println("test encoding slime holding an array of various basic values"); Slime slime = new Slime(); @@ -211,20 +237,6 @@ public class JsonFormatTestCase { new JsonFormat(true).encode(a, slime); String val = new String(a.toByteArray(), "UTF-8"); assertEquals("\"M\u00E6L\"", val); - - // TODO Some issues with newline - /* - slime = new Slime(); - final String str = "# Use unicode equivalents in java source:\n" + - " #\n" + - " #\n" + - " # 佳:\u4f73\n"; - slime.setString(str); - a = new ByteArrayOutputStream(); - new JsonFormat(true).encode(a, slime); - val = new String(a.toByteArray(), "UTF-8"); - assertEquals(str, val); - */ } private void verifyEncoding(Slime slime, String expected, boolean compact) { |