You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2016/08/26 16:22:30 UTC
johnzon git commit: JOHNZON-94 ignoring null and true/false
serialization to ensure == works for these values
Repository: johnzon
Updated Branches:
refs/heads/master 60525af05 -> b0af96e6d
JOHNZON-94 ignoring null and true/false serialization to ensure == works for these values
Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/b0af96e6
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/b0af96e6
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/b0af96e6
Branch: refs/heads/master
Commit: b0af96e6d819adf7a28782ebc535894bd27345da
Parents: 60525af
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Fri Aug 26 18:22:22 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Fri Aug 26 18:22:22 2016 +0200
----------------------------------------------------------------------
.../johnzon/core/JsonArrayBuilderImpl.java | 2 +-
.../org/apache/johnzon/core/JsonArrayImpl.java | 11 ++-
.../johnzon/core/JsonObjectBuilderImpl.java | 13 ++-
.../org/apache/johnzon/core/JsonObjectImpl.java | 9 +-
.../org/apache/johnzon/core/JsonReaderImpl.java | 6 +-
.../johnzon/core/SerializablePrimitives.java | 97 --------------------
.../apache/johnzon/core/SerializableValue.java | 56 +++++++++++
.../apache/johnzon/core/SerializationTest.java | 24 +++--
8 files changed, 92 insertions(+), 126 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/johnzon/blob/b0af96e6/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
index ea46072..913c22a 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
@@ -76,7 +76,7 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable {
@Override
public JsonArrayBuilder add(final boolean value) {
- addValue(value ? SerializablePrimitives.TRUE : SerializablePrimitives.FALSE);
+ addValue(value ? JsonValue.TRUE : JsonValue.FALSE);
return this;
}
http://git-wip-us.apache.org/repos/asf/johnzon/blob/b0af96e6/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
index 6906645..cfb563d 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
@@ -23,6 +23,7 @@ import javax.json.JsonNumber;
import javax.json.JsonObject;
import javax.json.JsonString;
import javax.json.JsonValue;
+import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.AbstractList;
import java.util.Iterator;
@@ -118,9 +119,9 @@ class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serial
public boolean getBoolean(final int index) {
final JsonValue val = value(index, JsonValue.class);
- if (SerializablePrimitives.TRUE.equals(val)) {
+ if (JsonValue.TRUE.equals(val)) {
return true;
- } else if (SerializablePrimitives.FALSE.equals(val)) {
+ } else if (JsonValue.FALSE.equals(val)) {
return false;
} else {
throw new ClassCastException();
@@ -143,7 +144,7 @@ class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serial
}
final JsonValue val = get(index);
- return SerializablePrimitives.TRUE.equals(val) || !SerializablePrimitives.FALSE.equals(val) && defaultValue;
+ return JsonValue.TRUE.equals(val) || !JsonValue.FALSE.equals(val) && defaultValue;
}
@Override
@@ -201,4 +202,8 @@ class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serial
public int size() {
return unmodifieableBackingList.size();
}
+
+ private Object writeReplace() throws ObjectStreamException {
+ return new SerializableValue(toString());
+ }
}
http://git-wip-us.apache.org/repos/asf/johnzon/blob/b0af96e6/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
index 2a260f3..d625383 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
@@ -18,6 +18,10 @@
*/
package org.apache.johnzon.core;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonValue;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -25,11 +29,6 @@ import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonObject;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonValue;
-
class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
private Map<String, JsonValue> tmpMap;
@@ -77,13 +76,13 @@ class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
@Override
public JsonObjectBuilder add(final String name, final boolean value) {
- putValue(name, value ? SerializablePrimitives.TRUE : SerializablePrimitives.FALSE);
+ putValue(name, value ? JsonValue.TRUE : JsonValue.FALSE);
return this;
}
@Override
public JsonObjectBuilder addNull(final String name) {
- putValue(name, SerializablePrimitives.NULL);
+ putValue(name, JsonValue.NULL);
return this;
}
http://git-wip-us.apache.org/repos/asf/johnzon/blob/b0af96e6/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 ef8b84d..98c38da 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
@@ -23,6 +23,7 @@ import javax.json.JsonNumber;
import javax.json.JsonObject;
import javax.json.JsonString;
import javax.json.JsonValue;
+import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.AbstractMap;
import java.util.Iterator;
@@ -108,14 +109,14 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso
@Override
public boolean getBoolean(final String name) {
- return SerializablePrimitives.TRUE.equals(value(name, JsonValue.class));
+ return JsonValue.TRUE.equals(value(name, JsonValue.class));
}
@Override
public boolean getBoolean(final String name, final boolean defaultValue) {
final Object v = unmodifieableBackingMap.get(name);
if (v != null) {
- return SerializablePrimitives.TRUE.equals(v) || !SerializablePrimitives.FALSE.equals(v) && defaultValue;
+ return JsonValue.TRUE.equals(v) || !JsonValue.FALSE.equals(v) && defaultValue;
} else {
return defaultValue;
}
@@ -176,4 +177,8 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso
public Set<java.util.Map.Entry<String, JsonValue>> entrySet() {
return unmodifieableBackingMap.entrySet();
}
+
+ private Object writeReplace() throws ObjectStreamException {
+ return new SerializableValue(toString());
+ }
}
http://git-wip-us.apache.org/repos/asf/johnzon/blob/b0af96e6/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
index 2632c9a..b0107ee 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
@@ -79,19 +79,19 @@ public class JsonReaderImpl implements JsonReader {
throw new JsonParsingException("Expected end of file", parser.getLocation());
}
close();
- return SerializablePrimitives.FALSE;
+ return JsonValue.FALSE;
case VALUE_TRUE:
if (parser.hasNext()) {
throw new JsonParsingException("Expected end of file", parser.getLocation());
}
close();
- return SerializablePrimitives.TRUE;
+ return JsonValue.TRUE;
case VALUE_NULL:
if (parser.hasNext()) {
throw new JsonParsingException("Expected end of file", parser.getLocation());
}
close();
- return SerializablePrimitives.NULL;
+ return JsonValue.NULL;
case VALUE_NUMBER:
if (parser.hasNext()) {
throw new JsonParsingException("Expected end of file", parser.getLocation());
http://git-wip-us.apache.org/repos/asf/johnzon/blob/b0af96e6/johnzon-core/src/main/java/org/apache/johnzon/core/SerializablePrimitives.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/SerializablePrimitives.java b/johnzon-core/src/main/java/org/apache/johnzon/core/SerializablePrimitives.java
deleted file mode 100644
index c046f85..0000000
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/SerializablePrimitives.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.johnzon.core;
-
-import javax.json.JsonValue;
-import java.io.InvalidObjectException;
-import java.io.ObjectStreamException;
-import java.io.Serializable;
-
-public final class SerializablePrimitives {
- private SerializablePrimitives() {
- // no-op
- }
-
- public static final JsonValue NULL = new SerializableJsonValue(JsonValue.NULL);
- public static final JsonValue TRUE = new SerializableJsonValue(JsonValue.TRUE);
- public static final JsonValue FALSE = new SerializableJsonValue(JsonValue.FALSE);
-
- private static final class SerializableJsonValue implements JsonValue, Serializable {
- private final JsonValue delegate;
-
- SerializableJsonValue(final JsonValue value) {
- delegate = value;
- }
-
- @Override
- public ValueType getValueType() {
- return delegate.getValueType();
- }
-
- @Override
- public String toString() {
- return delegate.toString();
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o || o == delegate) {
- return true;
- }
- if (o == null) {
- return false;
- }
- if (SerializableJsonValue.class.isInstance(o)) {
- return SerializableJsonValue.class.cast(o).delegate.equals(delegate);
- }
- return JsonValue.class.isInstance(o) && o.equals(delegate);
-
- }
-
- @Override
- public int hashCode() {
- return delegate.hashCode();
- }
-
- private Object writeReplace() throws ObjectStreamException {
- return new SerializationReplacement(delegate.toString());
- }
- }
-
- private static final class SerializationReplacement implements Serializable {
- private final String value;
-
- private SerializationReplacement(final String value) {
- this.value = value;
- }
-
- private Object readResolve() throws ObjectStreamException {
- if ("null".equals(value)) {
- return NULL;
- }
- if ("true".equals(value)) {
- return TRUE;
- }
- if ("false".equals(value)) {
- return FALSE;
- }
- throw new InvalidObjectException("Unknown " + value);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/johnzon/blob/b0af96e6/johnzon-core/src/main/java/org/apache/johnzon/core/SerializableValue.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/SerializableValue.java b/johnzon-core/src/main/java/org/apache/johnzon/core/SerializableValue.java
new file mode 100644
index 0000000..76b3ec6
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/SerializableValue.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.johnzon.core;
+
+import javax.json.JsonReader;
+import javax.json.JsonReaderFactory;
+import javax.json.spi.JsonProvider;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.io.StringReader;
+import java.util.Collections;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class SerializableValue implements Serializable {
+ private static final AtomicReference<JsonReaderFactory> FACTORY_ATOMIC_REFERENCE = new AtomicReference<JsonReaderFactory>();
+
+ private final String value;
+
+ SerializableValue(final String value) {
+ this.value = value;
+ }
+
+ private Object readResolve() throws ObjectStreamException {
+ final JsonReader parser = factory().createReader(new StringReader(value));
+ try {
+ return parser.read();
+ } finally {
+ parser.close();
+ }
+ }
+
+ private static JsonReaderFactory factory() { // avoid to create too much instances of provider or factories, not needed
+ JsonReaderFactory factory = FACTORY_ATOMIC_REFERENCE.get();
+ if (factory == null) {
+ FACTORY_ATOMIC_REFERENCE.compareAndSet(null, JsonProvider.provider().createReaderFactory(Collections.<String, Object>emptyMap()));
+ factory = FACTORY_ATOMIC_REFERENCE.get();
+ }
+ return factory;
+ }
+}
http://git-wip-us.apache.org/repos/asf/johnzon/blob/b0af96e6/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
index b80aae7..383dae9 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
@@ -31,11 +31,11 @@ import java.io.ObjectOutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
@@ -81,38 +81,36 @@ public class SerializationTest {
public void jsonObject() throws IOException, ClassNotFoundException {
final Map<String, JsonValue> map = new LinkedHashMap<String, JsonValue>();
map.put("test", new JsonStringImpl("val"));
+ map.put("test2", JsonValue.TRUE);
final JsonObject source = new JsonObjectImpl(Collections.unmodifiableMap(map));
final JsonObject serialization = serialDeser(source);
assertNotSame(source, serialization);
assertTrue(serialization.containsKey("test"));
assertEquals("val", serialization.getString("test"));
- assertEquals(1, serialization.size());
+ assertEquals(true, serialization.getBoolean("test2"));
+ assertEquals(2, serialization.size());
}
@Test
public void jsonArray() throws IOException, ClassNotFoundException {
final List<JsonValue> list = new ArrayList<JsonValue>();
list.add(new JsonStringImpl("test"));
+ list.add(JsonValue.TRUE); // not ser but we should be able to handle that
final JsonArray source = new JsonArrayImpl(Collections.unmodifiableList(list));
final JsonArray serialization = serialDeser(source);
assertNotSame(source, serialization);
- assertEquals(1, serialization.size());
- assertEquals("test", JsonString.class.cast(serialization.iterator().next()).getString());
- }
-
- @Test
- public void jsonPrimitives() throws IOException, ClassNotFoundException { // NOTE: spec jar primitives are not serializable
- for (final JsonValue v : asList(SerializablePrimitives.FALSE, SerializablePrimitives.TRUE, SerializablePrimitives.NULL)) {
- assertEquals(v, serialDeser(v));
- }
+ assertEquals(2, serialization.size());
+ final Iterator<JsonValue> iterator = serialization.iterator();
+ assertEquals("test", JsonString.class.cast(iterator.next()).getString());
+ assertEquals(JsonValue.TRUE, iterator.next());
}
@Test
public void primitiveInObject() throws IOException, ClassNotFoundException {
assertTrue(serialDeser(JsonProviderImpl.provider().createObjectBuilder()
.add("bool", true)
- .build()
- .getBoolean("bool")));
+ .build())
+ .getBoolean("bool"));
}
private static <T> T serialDeser(final T instance) throws IOException, ClassNotFoundException {