You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rs...@apache.org on 2016/12/13 19:50:57 UTC

johnzon git commit: JOHNZON-101 remove NPE if no mapping for JsonObject.getJson*

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 <rs...@apache.org>
Authored: Tue Dec 13 20:49:43 2016 +0100
Committer: Reinhard Sandtner <rs...@apache.org>
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();
+    }
+
+
 }