Repository: johnzon Updated Branches: refs/heads/master 42cb0949b -> d7b768fe1
JOHNZON-101 remove NPE if no mapping for JsonObject.getJson* Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/d7b768fe Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/d7b768fe Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/d7b768fe Branch: refs/heads/master Commit: d7b768fe10f6163be58ec3d4905c404ee9ce2f30 Parents: 42cb094 Author: Reinhard Sandtner <[email protected]> Authored: Tue Dec 13 20:49:43 2016 +0100 Committer: Reinhard Sandtner <[email protected]> Committed: Tue Dec 13 20:49:43 2016 +0100 ---------------------------------------------------------------------- .../org/apache/johnzon/core/JsonObjectImpl.java | 50 +++++------ .../apache/johnzon/core/JsonObjectImplTest.java | 93 ++++++++++++++++++++ 2 files changed, 118 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/d7b768fe/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java index 98c38da..263f43e 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java @@ -36,11 +36,20 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso private final Map<String, JsonValue> unmodifieableBackingMap; private <T> T value(final String name, final Class<T> clazz) { - final Object v = unmodifieableBackingMap.get(name); + final JsonValue v = unmodifieableBackingMap.get(name); if (v != null) { return clazz.cast(v); } - throw new NullPointerException("no mapping for " + name); + return null; + } + + private <T> T valueOrExcpetion(final String name, final Class<T> clazz) { + T value = value(name, clazz); + if (value == null) { + throw new NullPointerException("no mapping for " + name); + } + + return value; } JsonObjectImpl(final Map<String, JsonValue> backingMap) { @@ -70,51 +79,42 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso @Override public String getString(final String name) { - return getJsonString(name).getString(); + return valueOrExcpetion(name, JsonString.class).getString(); } @Override public String getString(final String name, final String defaultValue) { - final Object v = unmodifieableBackingMap.get(name); - if (v != null) { - if (v instanceof JsonString) { - return JsonString.class.cast(v).getString(); - } else { - return defaultValue; - } - } else { - return defaultValue; + final Object v = value(name, JsonValue.class); + if (v != null && v instanceof JsonString) { + return JsonString.class.cast(v).getString(); } + return defaultValue; } @Override public int getInt(final String name) { - return getJsonNumber(name).intValue(); + return valueOrExcpetion(name, JsonNumber.class).intValue(); } @Override public int getInt(final String name, final int defaultValue) { - final Object v = unmodifieableBackingMap.get(name); - if (v != null) { - if (v instanceof JsonNumber) { - return JsonNumber.class.cast(v).intValue(); - } else { - return defaultValue; - } - } else { - return defaultValue; + final Object v = value(name, JsonValue.class); + if (v != null && v instanceof JsonNumber) { + return JsonNumber.class.cast(v).intValue(); } + + return defaultValue; } @Override public boolean getBoolean(final String name) { - return JsonValue.TRUE.equals(value(name, JsonValue.class)); + return JsonValue.TRUE.equals(valueOrExcpetion(name, JsonValue.class)); } @Override public boolean getBoolean(final String name, final boolean defaultValue) { - final Object v = unmodifieableBackingMap.get(name); + final Object v = value(name, JsonValue.class); if (v != null) { return JsonValue.TRUE.equals(v) || !JsonValue.FALSE.equals(v) && defaultValue; } else { @@ -124,7 +124,7 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso @Override public boolean isNull(final String name) { - return JsonValue.NULL.equals(value(name, JsonValue.class)); + return JsonValue.NULL.equals(valueOrExcpetion(name, JsonValue.class)); } @Override http://git-wip-us.apache.org/repos/asf/johnzon/blob/d7b768fe/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java index 6f4ba86..e7b5c06 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java @@ -19,9 +19,14 @@ package org.apache.johnzon.core; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import javax.json.Json; +import javax.json.JsonObject; import javax.json.JsonObjectBuilder; +import javax.json.JsonValue; import org.junit.Test; @@ -32,4 +37,92 @@ public class JsonObjectImplTest { ob.add("a", new JsonStringImpl("b")); assertEquals("{\"a\":\"b\"}", ob.build().toString()); } + + + @Test(expected = NullPointerException.class) + public void testGetBooleanMissingKeyShouldThrowNullPointerException() { + getObject().getBoolean("missing"); + } + + @Test + public void testGetBooleanWithDefaultMissingKeyShouldReturnDefault() { + assertTrue(getObject().getBoolean("missing", true)); + } + + + @Test(expected = NullPointerException.class) + public void testGetIntMissingKeyShouldThrowNullPointerException() { + getObject().getInt("missing"); + } + + @Test + public void testGetIntWithDefaultShouldReturnDefault() { + assertEquals(42, getObject().getInt("missing", 42)); + } + + + @Test + public void testGetJsonArrayMissingKeyShouldReturnNull() { + assertNull(getObject().getJsonArray("missing")); + } + + + @Test + public void testGetJsonNumberMissingKeyShouldReturnNull() { + assertNull(getObject().getJsonNumber("missing")); + } + + + @Test + public void testGetJsonObjectMissingKeyShouldReturnNull() { + assertNull(getObject().getJsonObject("missing")); + } + + + @Test + public void testGetJsonStringMissingKeyShouldReturnNull() { + assertNull(getObject().getJsonString("missing")); + } + + + @Test(expected = NullPointerException.class) + public void testGetStringMissingKeyShouldThrowNullPointerException() { + getObject().getString("missing"); + } + + @Test + public void testGetStringWithDefaultShouldReturnDefault() { + String expected = "default"; + assertEquals(expected, getObject().getString("missing", expected)); + } + + + @Test(expected = NullPointerException.class) + public void testIsNullMissingKeyShouldThrowNullPointerException() { + getObject().isNull("missing"); + } + + @Test + public void testIsNullShouldReturnTrue() { + assertTrue(Json.createObjectBuilder() + .add("key", JsonValue.NULL) + .build() + .isNull("key")); + } + + @Test + public void testIsNullShouldReturnFalse() { + assertFalse(Json.createObjectBuilder() + .add("key", "value") + .build() + .isNull("key")); + } + + + private JsonObject getObject() { + return Json.createObjectBuilder() + .build(); + } + + }
