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> {