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 <cziege...@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());