Fixed thread safety in JsonbContext. (#168)
Signed-off-by: Roman Grigoriadi <roman.grigoriadi@oracle.com>
diff --git a/src/main/java/org/eclipse/yasson/internal/JsonbContext.java b/src/main/java/org/eclipse/yasson/internal/JsonbContext.java
index 0ea52cb..67acf20 100644
--- a/src/main/java/org/eclipse/yasson/internal/JsonbContext.java
+++ b/src/main/java/org/eclipse/yasson/internal/JsonbContext.java
@@ -20,7 +20,6 @@
import javax.json.spi.JsonProvider;
import java.util.HashSet;
import java.util.Objects;
-import java.util.Set;
/**
* Jsonb context holding central components and configuration of jsonb runtime. Scoped to instance of Jsonb runtime.
@@ -47,12 +46,6 @@
private JsonbConfigProperties configProperties;
/**
- * Used to avoid StackOverflowError, when adapted / serialized object
- * contains contains instance of its type inside it or when object has recursive reference.
- */
- private Set<Object> currentlyProcessedObjects;
-
- /**
* Creates and initialize context.
*
* @param jsonbConfig jsonb jsonbConfig not null
@@ -67,7 +60,6 @@
this.annotationIntrospector = new AnnotationIntrospector(this);
this.jsonProvider = jsonProvider;
this.configProperties = new JsonbConfigProperties(jsonbConfig);
- this.currentlyProcessedObjects = new HashSet<>();
}
/**
@@ -146,11 +138,4 @@
return configProperties;
}
- public boolean addProcessedObject(Object object) {
- return this.currentlyProcessedObjects.add(object);
- }
-
- public boolean removeProcessedObject(Object object) {
- return currentlyProcessedObjects.remove(object);
- }
}
diff --git a/src/main/java/org/eclipse/yasson/internal/ProcessingContext.java b/src/main/java/org/eclipse/yasson/internal/ProcessingContext.java
index 7df50cf..e5e2fdc 100644
--- a/src/main/java/org/eclipse/yasson/internal/ProcessingContext.java
+++ b/src/main/java/org/eclipse/yasson/internal/ProcessingContext.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2015, 2017 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
@@ -13,6 +13,9 @@
******************************************************************************/
package org.eclipse.yasson.internal;
+import java.util.HashSet;
+import java.util.Set;
+
/**
* Jsonb processing (serializing/deserializing) context.
* Instance is thread bound (in contrast to {@link JsonbContext}.
@@ -26,6 +29,12 @@
protected final JsonbContext jsonbContext;
/**
+ * Used to avoid StackOverflowError, when adapted / serialized object
+ * contains contains instance of its type inside it or when object has recursive reference.
+ */
+ private Set<Object> currentlyProcessedObjects = new HashSet<>();
+
+ /**
* Parent instance for marshaller and unmarshaller.
*
* @param jsonbContext context of Jsonb
@@ -52,4 +61,13 @@
return getJsonbContext().getMappingContext();
}
+
+ public boolean addProcessedObject(Object object) {
+ return this.currentlyProcessedObjects.add(object);
+ }
+
+ public boolean removeProcessedObject(Object object) {
+ return currentlyProcessedObjects.remove(object);
+ }
+
}
diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/AdaptedObjectSerializer.java b/src/main/java/org/eclipse/yasson/internal/serializer/AdaptedObjectSerializer.java
index 303b425..96ce82a 100644
--- a/src/main/java/org/eclipse/yasson/internal/serializer/AdaptedObjectSerializer.java
+++ b/src/main/java/org/eclipse/yasson/internal/serializer/AdaptedObjectSerializer.java
@@ -13,13 +13,13 @@
package org.eclipse.yasson.internal.serializer;
-import org.eclipse.yasson.internal.JsonbContext;
import org.eclipse.yasson.internal.Marshaller;
+import org.eclipse.yasson.internal.ProcessingContext;
import org.eclipse.yasson.internal.components.AdapterBinding;
-import org.eclipse.yasson.internal.properties.MessageKeys;
-import org.eclipse.yasson.internal.properties.Messages;
import org.eclipse.yasson.internal.model.ClassModel;
import org.eclipse.yasson.internal.model.JsonbPropertyInfo;
+import org.eclipse.yasson.internal.properties.MessageKeys;
+import org.eclipse.yasson.internal.properties.Messages;
import javax.json.bind.JsonbException;
import javax.json.bind.adapter.JsonbAdapter;
@@ -54,9 +54,9 @@
@Override
@SuppressWarnings("unchecked")
public void serialize(T obj, JsonGenerator generator, SerializationContext ctx) {
- JsonbContext jsonbContext = ((Marshaller) ctx).getJsonbContext();
+ ProcessingContext context = (ProcessingContext) ctx;
try {
- if (jsonbContext.addProcessedObject(obj)) {
+ if (context.addProcessedObject(obj)) {
final JsonbAdapter<T, A> adapter = (JsonbAdapter<T, A>) adapterInfo.getAdapter();
A adapted = adapter.adaptToJson(obj);
final JsonbSerializer<A> serializer = resolveSerializer((Marshaller) ctx, adapted);
@@ -67,7 +67,7 @@
} catch (Exception e) {
throw new JsonbException(Messages.getMessage(MessageKeys.ADAPTER_EXCEPTION, adapterInfo.getBindingType(), adapterInfo.getToType(), adapterInfo.getAdapter().getClass()), e);
} finally {
- jsonbContext.removeProcessedObject(obj);
+ context.removeProcessedObject(obj);
}
}
diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/UserSerializerSerializer.java b/src/main/java/org/eclipse/yasson/internal/serializer/UserSerializerSerializer.java
index b6b7df4..5b0f070 100644
--- a/src/main/java/org/eclipse/yasson/internal/serializer/UserSerializerSerializer.java
+++ b/src/main/java/org/eclipse/yasson/internal/serializer/UserSerializerSerializer.java
@@ -13,8 +13,8 @@
package org.eclipse.yasson.internal.serializer;
-import org.eclipse.yasson.internal.JsonbContext;
import org.eclipse.yasson.internal.Marshaller;
+import org.eclipse.yasson.internal.ProcessingContext;
import org.eclipse.yasson.internal.model.ClassModel;
import org.eclipse.yasson.internal.properties.MessageKeys;
import org.eclipse.yasson.internal.properties.Messages;
@@ -49,15 +49,15 @@
@Override
public void serialize(T obj, JsonGenerator generator, SerializationContext ctx) {
- JsonbContext jsonbContext = ((Marshaller) ctx).getJsonbContext();
+ ProcessingContext context = (Marshaller) ctx;
try {
- if (jsonbContext.addProcessedObject(obj)) {
+ if (context.addProcessedObject(obj)) {
userSerializer.serialize(obj, generator, ctx);
} else {
throw new JsonbException(Messages.getMessage(MessageKeys.RECURSIVE_REFERENCE, obj.getClass()));
}
} finally {
- jsonbContext.removeProcessedObject(obj);
+ context.removeProcessedObject(obj);
}
}
}
diff --git a/src/test/java/org/eclipse/yasson/DefaultGetterInInterface.java b/src/test/java/org/eclipse/yasson/DefaultGetterInInterface.java
index 267bf3f..c694e54 100644
--- a/src/test/java/org/eclipse/yasson/DefaultGetterInInterface.java
+++ b/src/test/java/org/eclipse/yasson/DefaultGetterInInterface.java
@@ -12,17 +12,19 @@
******************************************************************************/
package org.eclipse.yasson;
-import java.lang.reflect.Method;
+import org.eclipse.yasson.internal.JsonbContext;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;
import javax.json.bind.annotation.JsonbProperty;
import javax.json.spi.JsonProvider;
-import org.eclipse.yasson.internal.JsonbContext;
-import org.junit.Assert;
+import java.lang.reflect.Method;
+
import static org.junit.Assert.assertEquals;
-import org.junit.Before;
-import org.junit.Test;
/**
*
@@ -51,7 +53,6 @@
public void testWithDefault() {
PojoWithDefault pojo = new PojoWithDefault();
String result = jsonb.toJson(pojo);
- System.out.println("JSON: " + result);
Assert.assertEquals("{\"getterA\":\"valueA\"}", result);
}
diff --git a/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java b/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
index c2fc5ad..41b763c 100644
--- a/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
+++ b/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
@@ -432,7 +432,8 @@
Assert.assertEquals("{\"firstName\":\"J\",\"lastName\":\"Connor\"}", json);
Author result = jsonb.fromJson("{\"firstName\":\"J\",\"lastName\":\"Connor\"}", Author.class);
- System.out.println(result);
+ Assert.assertEquals("\"J\"", result.getFirstName());
+ Assert.assertEquals("Connor", result.getLastName());
}
@Test
diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java
index ee92a58..356cd8a 100644
--- a/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java
+++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java
@@ -421,7 +421,6 @@
collectionWrapper.setWrappedCollection(new ArrayList<>());
collectionWrapper.setWrappedMap(new HashMap<>());
String s = jsonb.toJson(collectionWrapper);
- System.out.println("s = " + s);
}
public interface FunctionalInterface<T> {