You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2020/04/20 06:47:56 UTC

[felix-dev] branch master updated: FELIX-6264 : Catch JSON exceptions and rethrow as IOExceptions

This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git


The following commit(s) were added to refs/heads/master by this push:
     new 263ca9d  FELIX-6264 : Catch JSON exceptions and rethrow as IOExceptions
263ca9d is described below

commit 263ca9dee476eb778242c72ee2b8601e811612e5
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Mon Apr 20 08:47:42 2020 +0200

    FELIX-6264 : Catch JSON exceptions and rethrow as IOExceptions
---
 cm.json/pom.xml                                    |  4 +-
 .../cm/json/impl/ConfigurationReaderImpl.java      | 13 ++++-
 .../cm/json/impl/ConfigurationWriterImpl.java      | 31 ++++++----
 .../cm/json/impl/ConfigurationReaderImplTest.java  | 17 ++++++
 .../felix/cm/json/impl/TypeConverterTest.java      | 66 +++++++++++-----------
 5 files changed, 83 insertions(+), 48 deletions(-)

diff --git a/cm.json/pom.xml b/cm.json/pom.xml
index c5a654c..ad518cf 100644
--- a/cm.json/pom.xml
+++ b/cm.json/pom.xml
@@ -50,7 +50,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>3.5.0</version>
+                <version>4.2.1</version>
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
@@ -95,7 +95,7 @@
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.converter</artifactId>
-            <version>1.0.12</version>
+            <version>1.0.15-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/cm.json/src/main/java/org/apache/felix/cm/json/impl/ConfigurationReaderImpl.java b/cm.json/src/main/java/org/apache/felix/cm/json/impl/ConfigurationReaderImpl.java
index 467290f..286e93e 100644
--- a/cm.json/src/main/java/org/apache/felix/cm/json/impl/ConfigurationReaderImpl.java
+++ b/cm.json/src/main/java/org/apache/felix/cm/json/impl/ConfigurationReaderImpl.java
@@ -25,6 +25,7 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
+import javax.json.JsonException;
 import javax.json.JsonObject;
 import javax.json.JsonValue;
 import javax.json.JsonValue.ValueType;
@@ -106,7 +107,11 @@ public class ConfigurationReaderImpl
     public Hashtable<String, Object> readConfiguration() throws IOException {
         checkClosed();
         if (this.reader != null) {
-            this.jsonObject = JsonSupport.parseJson(this.identifier, this.reader);
+            try {
+                this.jsonObject = JsonSupport.parseJson(this.identifier, this.reader);
+            } catch ( final JsonException jpe) {
+                throw new IOException("Invalid JSON " + jpe.getMessage(), jpe);
+            }
         }
         return readSingleConfiguration("<configuration>", this.jsonObject);
     }
@@ -115,7 +120,11 @@ public class ConfigurationReaderImpl
     public ConfigurationResource readConfigurationResource() throws IOException {
         checkClosed();
         if (this.reader != null) {
-            this.jsonObject = JsonSupport.parseJson(this.identifier, this.reader);
+            try {
+                this.jsonObject = JsonSupport.parseJson(this.identifier, this.reader);
+            } catch ( final JsonException jpe) {
+                throw new IOException("Invalid JSON " + jpe.getMessage(), jpe);
+            }
         }
         verifyJsonResource();
         final ConfigurationResource resource = new ConfigurationResource();
diff --git a/cm.json/src/main/java/org/apache/felix/cm/json/impl/ConfigurationWriterImpl.java b/cm.json/src/main/java/org/apache/felix/cm/json/impl/ConfigurationWriterImpl.java
index ef44ab9..01d3666 100644
--- a/cm.json/src/main/java/org/apache/felix/cm/json/impl/ConfigurationWriterImpl.java
+++ b/cm.json/src/main/java/org/apache/felix/cm/json/impl/ConfigurationWriterImpl.java
@@ -28,6 +28,7 @@ import java.util.Hashtable;
 import java.util.Map;
 
 import javax.json.Json;
+import javax.json.JsonException;
 import javax.json.JsonValue;
 import javax.json.stream.JsonGenerator;
 
@@ -76,8 +77,12 @@ public class ConfigurationWriterImpl
     @Override
     public void writeConfiguration(final Dictionary<String, Object> properties) throws IOException {
         checkClosed();
-        writeConfigurationInternal(properties);
-        if ( this.closeGenerator) this.generator.close();
+        try {
+            writeConfigurationInternal(properties);
+            if ( this.closeGenerator) this.generator.close();
+        } catch ( final JsonException je) {
+            throw new IOException(je.getMessage(), je);
+        }
     }
 
     private void writeConfigurationInternal(final Dictionary<String, Object> properties) throws IOException {
@@ -102,15 +107,19 @@ public class ConfigurationWriterImpl
     @Override
     public void writeConfigurationResource(final ConfigurationResource resource) throws IOException {
         checkClosed();
-        generator.writeStartObject();
-        for (final Map.Entry<String, Object> entry : resource.getProperties().entrySet()) {
-            generator.write(entry.getKey(), JsonSupport.convertToJson(entry.getValue()));
-        }
-        for (final Map.Entry<String, Hashtable<String, Object>> entry : resource.getConfigurations().entrySet()) {
-            generator.writeKey(entry.getKey());
-            writeConfigurationInternal(entry.getValue());
+        try {
+            generator.writeStartObject();
+            for (final Map.Entry<String, Object> entry : resource.getProperties().entrySet()) {
+                generator.write(entry.getKey(), JsonSupport.convertToJson(entry.getValue()));
+            }
+            for (final Map.Entry<String, Hashtable<String, Object>> entry : resource.getConfigurations().entrySet()) {
+                generator.writeKey(entry.getKey());
+                writeConfigurationInternal(entry.getValue());
+            }
+            generator.writeEnd();
+            if ( this.closeGenerator) this.generator.close();
+        } catch ( final JsonException je) {
+            throw new IOException(je.getMessage(), je);
         }
-        generator.writeEnd();
-        if ( this.closeGenerator) this.generator.close();
     }
 }
diff --git a/cm.json/src/test/java/org/apache/felix/cm/json/impl/ConfigurationReaderImplTest.java b/cm.json/src/test/java/org/apache/felix/cm/json/impl/ConfigurationReaderImplTest.java
index 75efcb4..91162b3 100644
--- a/cm.json/src/test/java/org/apache/felix/cm/json/impl/ConfigurationReaderImplTest.java
+++ b/cm.json/src/test/java/org/apache/felix/cm/json/impl/ConfigurationReaderImplTest.java
@@ -20,17 +20,21 @@ package org.apache.felix.cm.json.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.io.StringReader;
 import java.nio.charset.StandardCharsets;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.Map;
 
+import javax.json.JsonException;
+
 import org.junit.Test;
 
 public class ConfigurationReaderImplTest {
@@ -89,4 +93,17 @@ public class ConfigurationReaderImplTest {
         assertEquals("Hello World", configs.get("config.a").get("text"));
         assertEquals(8080, configs.get("config.b").get("port"));
     }
+
+    @Test
+    public void testReadInvalidJson() throws IOException {
+        final String json = "{\n \"a\" : 5 \n \"b\" : 2\n}";
+
+        final ConfigurationReaderImpl cfgReader = new ConfigurationReaderImpl();
+        try {
+            cfgReader.build(new StringReader(json)).readConfigurationResource();
+            fail();
+        } catch ( final IOException ioe) {
+            assertTrue(ioe.getCause() instanceof JsonException);
+        }
+    }
 }
diff --git a/cm.json/src/test/java/org/apache/felix/cm/json/impl/TypeConverterTest.java b/cm.json/src/test/java/org/apache/felix/cm/json/impl/TypeConverterTest.java
index 36bc5fb..5cfd4db 100644
--- a/cm.json/src/test/java/org/apache/felix/cm/json/impl/TypeConverterTest.java
+++ b/cm.json/src/test/java/org/apache/felix/cm/json/impl/TypeConverterTest.java
@@ -478,24 +478,24 @@ public class TypeConverterTest {
                 (Integer[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Integer[]"));
         assertArrayEquals(new long[] { 1 },
                 (long[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "long[]"));
-//        assertArrayEquals(new Long[] { 1L },
-//                (Long[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Long[]"));
-//        assertArrayEquals(new float[] { 1f },
-//                (float[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "float[]"), 0.1f);
-//        assertArrayEquals(new Float[] { 1f },
-//                (Float[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Float[]"));
-//        assertArrayEquals(new double[] { 1 },
-//                (double[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "double[]"), 0.1);
-//        assertArrayEquals(new Double[] { 1.0 },
-//                (Double[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Double[]"));
-//        assertArrayEquals(new byte[] { 1 },
-//                (byte[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "byte[]"));
-//        assertArrayEquals(new Byte[] { 1 },
-//                (Byte[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Byte[]"));
-//        assertArrayEquals(new short[] { 1 },
-//                (short[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "short[]"));
-//        assertArrayEquals(new Short[] { 1 },
-//                (Short[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Short[]"));
+        assertArrayEquals(new Long[] { 1L },
+                (Long[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Long[]"));
+        assertArrayEquals(new float[] { 1f },
+                (float[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "float[]"), 0.1f);
+        assertArrayEquals(new Float[] { 1f },
+                (Float[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Float[]"));
+        assertArrayEquals(new double[] { 1 },
+                (double[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "double[]"), 0.1);
+        assertArrayEquals(new Double[] { 1.0 },
+                (Double[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Double[]"));
+        assertArrayEquals(new byte[] { 1 },
+                (byte[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "byte[]"));
+        assertArrayEquals(new Byte[] { 1 },
+                (Byte[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Byte[]"));
+        assertArrayEquals(new short[] { 1 },
+                (short[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "short[]"));
+        assertArrayEquals(new Short[] { 1 },
+                (Short[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "Short[]"));
         assertArrayEquals(new char[] { (char)1 },
                 (char[]) TypeConverter.convertObjectToType(JsonValue.TRUE, "char[]"));
         assertArrayEquals(new Character[] { Character.valueOf((char)1) },
@@ -513,21 +513,21 @@ public class TypeConverterTest {
         assertArrayEquals(new Integer[] { 1 },
                 ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Integer>"))
                         .toArray());
-//        assertArrayEquals(new Long[] { 1L },
-//                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Long>"))
-//                        .toArray());
-//        assertArrayEquals(new Float[] { 1f },
-//                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Float>"))
-//                        .toArray());
-//        assertArrayEquals(new Double[] { 1.0 },
-//                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Double>"))
-//                        .toArray());
-//        assertArrayEquals(new Byte[] { 1 },
-//                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Byte>"))
-//                        .toArray());
-//        assertArrayEquals(new Short[] { 1 },
-//                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Short>"))
-//                        .toArray());
+        assertArrayEquals(new Long[] { 1L },
+                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Long>"))
+                        .toArray());
+        assertArrayEquals(new Float[] { 1f },
+                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Float>"))
+                        .toArray());
+        assertArrayEquals(new Double[] { 1.0 },
+                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Double>"))
+                        .toArray());
+        assertArrayEquals(new Byte[] { 1 },
+                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Byte>"))
+                        .toArray());
+        assertArrayEquals(new Short[] { 1 },
+                ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Short>"))
+                        .toArray());
         assertArrayEquals(Arrays.asList(Character.valueOf((char)1)).toArray(),
                 ((Collection<?>) TypeConverter.convertObjectToType(JsonValue.TRUE, "Collection<Character>"))
                         .toArray());