Fixes #146: Avoid using exceptions for flow control in JsonObject implementation (#191)

Signed-off-by: Jason Hinch <jhinch@atlassian.com>
diff --git a/impl/src/main/java/org/glassfish/json/JsonObjectBuilderImpl.java b/impl/src/main/java/org/glassfish/json/JsonObjectBuilderImpl.java
index 594851e..c1dc0e0 100644
--- a/impl/src/main/java/org/glassfish/json/JsonObjectBuilderImpl.java
+++ b/impl/src/main/java/org/glassfish/json/JsonObjectBuilderImpl.java
@@ -236,9 +236,10 @@
 
         @Override
         public String getString(String name, String defaultValue) {
-            try {
-                return getString(name);
-            } catch (Exception e) {
+            JsonValue value = get(name);
+            if (value instanceof JsonString) {
+                return ((JsonString) value).getString();
+            } else {
                 return defaultValue;
             }
         }
@@ -250,9 +251,10 @@
 
         @Override
         public int getInt(String name, int defaultValue) {
-            try {
-                return getInt(name);
-            } catch (Exception e) {
+            JsonValue value = get(name);
+            if (value instanceof JsonNumber) {
+                return ((JsonNumber) value).intValue();
+            } else {
                 return defaultValue;
             }
         }
@@ -273,9 +275,12 @@
 
         @Override
         public boolean getBoolean(String name, boolean defaultValue) {
-            try {
-                return getBoolean(name);
-            } catch (Exception e) {
+            JsonValue value = get(name);
+            if (value == JsonValue.TRUE) {
+                return true;
+            } else if (value == JsonValue.FALSE) {
+                return false;
+            } else {
                 return defaultValue;
             }
         }
diff --git a/tests/src/test/java/org/glassfish/json/tests/JsonObjectTest.java b/tests/src/test/java/org/glassfish/json/tests/JsonObjectTest.java
index 59fdddb..c1c4b98 100644
--- a/tests/src/test/java/org/glassfish/json/tests/JsonObjectTest.java
+++ b/tests/src/test/java/org/glassfish/json/tests/JsonObjectTest.java
@@ -48,6 +48,39 @@
         assertEquals(person1, person2);
     }
 
+    public void testGetStringOrDefault() throws Exception {
+        JsonObject object = Json.createObjectBuilder()
+                .add("string", "value")
+                .add("number", 25)
+                .add("boolean", false)
+                .build();
+        assertEquals("value", object.getString("string", "default"));
+        assertEquals("default", object.getString("missing", "default"));
+        assertEquals("default", object.getString("number", "default"));
+    }
+
+    public void testGetIntOrDefault() throws Exception {
+        JsonObject object = Json.createObjectBuilder()
+                .add("string", "value")
+                .add("number", 25)
+                .add("boolean", false)
+                .build();
+        assertEquals(25, object.getInt("number", 10));
+        assertEquals(10, object.getInt("missing", 10));
+        assertEquals(10, object.getInt("string", 10));
+    }
+
+    public void testGetBooleanOrDefault() throws Exception {
+        JsonObject object = Json.createObjectBuilder()
+                .add("string", "value")
+                .add("number", 25)
+                .add("boolean", false)
+                .build();
+        assertFalse(object.getBoolean("boolean", true));
+        assertTrue(object.getBoolean("missing", true));
+        assertTrue(object.getBoolean("string", true));
+    }
+
     static void testPerson(JsonObject person) {
         assertEquals(5, person.size());
         assertEquals("John", person.getString("firstName"));