Merge pull request #327 from Degubi/mappingctx_refactor

Refactor MappingContext.java
diff --git a/src/main/java/org/eclipse/yasson/internal/MappingContext.java b/src/main/java/org/eclipse/yasson/internal/MappingContext.java
index 2f3c098..f512701 100644
--- a/src/main/java/org/eclipse/yasson/internal/MappingContext.java
+++ b/src/main/java/org/eclipse/yasson/internal/MappingContext.java
@@ -19,7 +19,6 @@
 
 import java.util.ArrayDeque;
 import java.util.Deque;
-import java.util.Iterator;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
@@ -34,31 +33,6 @@
  * @author Roman Grigoriadi
  */
 public class MappingContext {
-
-    private static class ParseClassModelFunction implements Function<Class, ClassModel> {
-
-        private ClassModel parentClassModel;
-
-        private ClassParser classParser;
-
-        private JsonbContext jsonbContext;
-
-        public ParseClassModelFunction(ClassModel parentClassModel, ClassParser classParser, JsonbContext jsonbContext) {
-            this.parentClassModel = parentClassModel;
-            this.classParser = classParser;
-            this.jsonbContext = jsonbContext;
-        }
-
-        @Override
-        public ClassModel apply(Class aClass) {
-            final JsonbAnnotatedElement<Class<?>> clsElement = jsonbContext.getAnnotationIntrospector().collectAnnotations(aClass);
-            final ClassCustomization customization = jsonbContext.getAnnotationIntrospector().introspectCustomization(clsElement);
-            final ClassModel newClassModel = new ClassModel(aClass, customization, parentClassModel, jsonbContext.getConfigProperties().getPropertyNamingStrategy());
-            classParser.parseProperties(newClassModel, clsElement);
-            return newClassModel;
-        }
-    }
-
     private final JsonbContext jsonbContext;
 
     private final ConcurrentHashMap<Class<?>, ClassModel> classes = new ConcurrentHashMap<>();
@@ -90,48 +64,33 @@
         if (classModel != null) {
             return classModel;
         }
-        final Deque<Class> newClassModels = new ArrayDeque<>();
-        for (Class classToParse = clazz; classToParse != Object.class; classToParse = classToParse.getSuperclass()) {
+        
+        Deque<Class<?>> newClassModels = new ArrayDeque<>();
+        for (Class<?> classToParse = clazz; classToParse != Object.class; classToParse = classToParse.getSuperclass()) {
             if (classToParse == null){
                 break;
             }
             newClassModels.push(classToParse);
         }
         if (clazz == Object.class) {
-            classes.computeIfAbsent(clazz, (c) -> new ClassModel(c, null, null, null));
-            return classes.get(clazz);
+            return classes.computeIfAbsent(clazz, (c) -> new ClassModel(c, null, null, null));
         }
 
         ClassModel parentClassModel = null;
         while (!newClassModels.isEmpty()) {
-            Class toParse = newClassModels.pop();
-            parentClassModel = classes.computeIfAbsent(toParse, new ParseClassModelFunction(parentClassModel, classParser, jsonbContext));
+            Class<?> toParse = newClassModels.pop();
+            parentClassModel = classes.computeIfAbsent(toParse, createParseClassModelFunction(parentClassModel, classParser, jsonbContext));
         }
         return classes.get(clazz);
     }
 
-    /**
-     * Provided class class model is returned first by iterator.
-     * Following class models are sorted by hierarchy from provided class up to the Object.class.
-     *
-     * @param clazz class to start iteration of class models from
-     * @return iterator of class models
-     */
-    public Iterator<ClassModel> classModelIterator(final Class<?> clazz) {
-        return new Iterator<ClassModel>() {
-            private Class<?> next = clazz;
-
-            @Override
-            public boolean hasNext() {
-                return next != Object.class;
-            }
-
-            @Override
-            public ClassModel next() {
-                final ClassModel result = classes.get(next);
-                next = next.getSuperclass();
-                return result;
-            }
+    private static Function<Class<?>, ClassModel> createParseClassModelFunction(ClassModel parentClassModel, ClassParser classParser, JsonbContext jsonbContext){
+        return aClass -> {
+            JsonbAnnotatedElement<Class<?>> clsElement = jsonbContext.getAnnotationIntrospector().collectAnnotations(aClass);
+            ClassCustomization customization = jsonbContext.getAnnotationIntrospector().introspectCustomization(clsElement);
+            ClassModel newClassModel = new ClassModel(aClass, customization, parentClassModel, jsonbContext.getConfigProperties().getPropertyNamingStrategy());
+            classParser.parseProperties(newClassModel, clsElement);
+            return newClassModel;
         };
     }
 
@@ -164,4 +123,4 @@
     public void addSerializerProvider(Class<?> clazz, ContainerSerializerProvider serializerProvider) {
         serializers.putIfAbsent(clazz, serializerProvider);
     }
-}
+}
\ No newline at end of file