You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2015/04/21 17:02:42 UTC

[2/2] olingo-odata4 git commit: [OLINGO-622] Fix: EDM getter methods support concurrent access

[OLINGO-622] Fix: EDM getter methods support concurrent access


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/05cbf674
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/05cbf674
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/05cbf674

Branch: refs/heads/master
Commit: 05cbf674fbcb473beb5e403d2ac00cff376874da
Parents: 935a9b8
Author: Christian Holzer <c....@sap.com>
Authored: Thu Apr 16 10:44:20 2015 +0200
Committer: Christian Holzer <c....@sap.com>
Committed: Tue Apr 21 16:57:30 2015 +0200

----------------------------------------------------------------------
 .../core/domain/ODataCollectionValueImpl.java   |  6 +-
 .../core/domain/ODataComplexValueImpl.java      |  6 +-
 .../olingo/commons/core/edm/AbstractEdm.java    | 49 ++++++++-------
 .../EdmConstantAnnotationExpressionImpl.java    |  3 +-
 .../edm/provider/AbstractEdmAnnotatable.java    |  8 ++-
 .../edm/provider/AbstractEdmBindingTarget.java  |  9 ++-
 .../core/edm/provider/AbstractEdmOperation.java | 25 ++++----
 .../edm/provider/AbstractEdmStructuredType.java | 44 ++++++++------
 .../core/edm/provider/EdmAnnotationsImpl.java   | 51 +++++++++-------
 .../edm/provider/EdmEntityContainerImpl.java    | 63 +++++++++++---------
 .../core/edm/provider/EdmEntityTypeImpl.java    |  5 +-
 .../core/edm/provider/EdmEnumTypeImpl.java      | 11 ++--
 .../edm/provider/EdmNavigationPropertyImpl.java |  6 +-
 .../core/edm/provider/EdmProviderImpl.java      |  6 +-
 .../core/edm/provider/EdmSchemaImpl.java        |  1 -
 .../commons/core/edm/provider/EdmTermImpl.java  |  6 +-
 16 files changed, 170 insertions(+), 129 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java
index bd58713..c608313 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataCollectionValueImpl.java
@@ -40,10 +40,6 @@ public class ODataCollectionValueImpl<OV extends ODataValue> extends AbstractODa
     super(typeName == null || typeName.startsWith("Collection(") ? typeName : "Collection(" + typeName + ")");
   }
 
-  protected ODataCollectionValueImpl getThis() {
-    return this;
-  }
-
   @Override
   public boolean isEnum() {
     return false;
@@ -91,7 +87,7 @@ public class ODataCollectionValueImpl<OV extends ODataValue> extends AbstractODa
   @SuppressWarnings("unchecked")
   public ODataCollectionValue<OV> add(final ODataValue value) {
     values.add((OV) value);
-    return getThis();
+    return this;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java
index 677d34b..efb5744 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/ODataComplexValueImpl.java
@@ -59,10 +59,6 @@ public class ODataComplexValueImpl extends AbstractODataValue implements ODataCo
     super(typeName);
   }
 
-  protected ODataComplexValue getThis() {
-    return this;
-  }
-
   @Override
   public boolean isEnum() {
     return false;
@@ -172,7 +168,7 @@ public class ODataComplexValueImpl extends AbstractODataValue implements ODataCo
   @Override
   public ODataComplexValue add(final ODataProperty field) {
     fields.put(field.getName(), field);
-    return getThis();
+    return this;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
index e865aa6..8880c8a 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
@@ -45,38 +45,47 @@ public abstract class AbstractEdm implements Edm {
   protected List<EdmSchema> schemaList;
 
   private final Map<FullQualifiedName, EdmEntityContainer> entityContainers =
-      new HashMap<FullQualifiedName, EdmEntityContainer>();
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmEntityContainer>());
 
-  private final Map<FullQualifiedName, EdmEnumType> enumTypes = new HashMap<FullQualifiedName, EdmEnumType>();
+  private final Map<FullQualifiedName, EdmEnumType> enumTypes = 
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmEnumType>());
 
   private final Map<FullQualifiedName, EdmTypeDefinition> typeDefinitions =
-      new HashMap<FullQualifiedName, EdmTypeDefinition>();
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmTypeDefinition>());
 
-  private final Map<FullQualifiedName, EdmEntityType> entityTypes = new HashMap<FullQualifiedName, EdmEntityType>();
+  private final Map<FullQualifiedName, EdmEntityType> entityTypes = 
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmEntityType>());
 
-  private final Map<FullQualifiedName, EdmComplexType> complexTypes = new HashMap<FullQualifiedName, EdmComplexType>();
+  private final Map<FullQualifiedName, EdmComplexType> complexTypes = 
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmComplexType>());
 
-  private final Map<FullQualifiedName, EdmAction> unboundActions = new HashMap<FullQualifiedName, EdmAction>();
+  private final Map<FullQualifiedName, EdmAction> unboundActions = 
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmAction>());
 
   private final Map<FullQualifiedName, List<EdmFunction>> unboundFunctionsByName =
-      new HashMap<FullQualifiedName, List<EdmFunction>>();
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, List<EdmFunction>>());
 
-  private final Map<FunctionMapKey, EdmFunction> unboundFunctionsByKey = new HashMap<FunctionMapKey, EdmFunction>();
+  private final Map<FunctionMapKey, EdmFunction> unboundFunctionsByKey = 
+      Collections.synchronizedMap(new HashMap<FunctionMapKey, EdmFunction>());
 
-  private final Map<ActionMapKey, EdmAction> boundActions = new HashMap<ActionMapKey, EdmAction>();
+  private final Map<ActionMapKey, EdmAction> boundActions = 
+      Collections.synchronizedMap(new HashMap<ActionMapKey, EdmAction>());
 
-  private final Map<FunctionMapKey, EdmFunction> boundFunctions = new HashMap<FunctionMapKey, EdmFunction>();
+  private final Map<FunctionMapKey, EdmFunction> boundFunctions = 
+      Collections.synchronizedMap(new HashMap<FunctionMapKey, EdmFunction>());
 
-  private final Map<FullQualifiedName, EdmTerm> terms = new HashMap<FullQualifiedName, EdmTerm>();
+  private final Map<FullQualifiedName, EdmTerm> terms = 
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmTerm>());
 
   private final Map<FullQualifiedName, EdmAnnotations> annotationGroups =
-      new HashMap<FullQualifiedName, EdmAnnotations>();
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, EdmAnnotations>());
 
   private final Map<FullQualifiedName, List<EdmAnnotation>> annotations =
-      new HashMap<FullQualifiedName, List<EdmAnnotation>>();
-
-  private Map<String, String> aliasToNamespaceInfo;
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, List<EdmAnnotation>>());
 
+  private Map<String, String> aliasToNamespaceInfo = Collections.synchronizedMap(new HashMap<String, String>());
+  private boolean aliasToNamespaceInfoCreated = false;
+  
   @Override
   public List<EdmSchema> getSchemas() {
     if (schemaList == null) {
@@ -93,7 +102,7 @@ public abstract class AbstractEdm implements Edm {
 
     EdmSchema schema = schemas.get(namespace);
     if (schema == null) {
-      if (aliasToNamespaceInfo == null) {
+      if (!aliasToNamespaceInfoCreated) {
         aliasToNamespaceInfo = createAliasToNamespaceInfo();
       }
       schema = schemas.get(aliasToNamespaceInfo.get(namespace));
@@ -103,8 +112,9 @@ public abstract class AbstractEdm implements Edm {
   }
 
   private void initSchemas() {
-    aliasToNamespaceInfo = new HashMap<String, String>();
     schemas = createSchemas();
+    aliasToNamespaceInfoCreated = true;
+    
     if (schemas == null) {
       schemas = Collections.emptyMap();
     }
@@ -329,7 +339,7 @@ public abstract class AbstractEdm implements Edm {
   }
 
   private FullQualifiedName resolvePossibleAlias(final FullQualifiedName namespaceOrAliasFQN) {
-    if (aliasToNamespaceInfo == null) {
+    if (!aliasToNamespaceInfoCreated) {
       aliasToNamespaceInfo = createAliasToNamespaceInfo();
     }
     FullQualifiedName finalFQN = null;
@@ -350,9 +360,6 @@ public abstract class AbstractEdm implements Edm {
   protected abstract Map<String, String> createAliasToNamespaceInfo();
 
   public void cacheAliasNamespaceInfo(String alias, String namespace) {
-    if (aliasToNamespaceInfo == null) {
-      aliasToNamespaceInfo = new HashMap<String, String>();
-    }
     aliasToNamespaceInfo.put(alias, namespace);
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java
index 83ad8ec..15658ab 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java
@@ -52,7 +52,8 @@ public class EdmConstantAnnotationExpressionImpl implements EdmConstantAnnotatio
       if (enumValues.size() == 1) {
         value = enumValues.get(0);
       } else {
-        final ODataCollectionValueImpl collValue = new ODataCollectionValueImpl(enumTypeName);
+        final ODataCollectionValueImpl<ODataEnumValue> collValue 
+          = new ODataCollectionValueImpl<ODataEnumValue>(enumTypeName);
         for (ODataValue enumValue : enumValues) {
           collValue.add(enumValue);
         }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java
index ccc8801..0574a4e 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java
@@ -55,13 +55,15 @@ public abstract class AbstractEdmAnnotatable implements EdmAnnotatable {
   @Override
   public List<EdmAnnotation> getAnnotations() {
     if (annotations == null) {
-      annotations = new ArrayList<EdmAnnotation>();
+      final List<EdmAnnotation> annotationsLocal = new ArrayList<EdmAnnotation>();
       if (annotatable != null) {
         for (Annotation annotation : annotatable.getAnnotations()) {
-          annotations.add(new EdmAnnotationImpl(edm, annotation));
+          annotationsLocal.add(new EdmAnnotationImpl(edm, annotation));
         }
+        
+        annotations = Collections.unmodifiableList(annotationsLocal);
       }
     }
-    return Collections.unmodifiableList(annotations);
+    return annotations;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java
index d64270d..9ef4c74 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java
@@ -50,14 +50,17 @@ public abstract class AbstractEdmBindingTarget extends AbstractEdmNamed implemen
   public List<EdmNavigationPropertyBinding> getNavigationPropertyBindings() {
     if (navigationPropertyBindings == null) {
       List<NavigationPropertyBinding> providerBindings = target.getNavigationPropertyBindings();
-      navigationPropertyBindings = new ArrayList<EdmNavigationPropertyBinding>();
+      final List<EdmNavigationPropertyBinding> navigationPropertyBindingsLocal = 
+          new ArrayList<EdmNavigationPropertyBinding>();
       if (providerBindings != null) {
         for (NavigationPropertyBinding binding : providerBindings) {
-          navigationPropertyBindings.add(new EdmNavigationPropertyBindingImpl(binding.getPath(), binding.getTarget()));
+          navigationPropertyBindingsLocal.add(new EdmNavigationPropertyBindingImpl(binding.getPath(), 
+                                                                                   binding.getTarget()));
         }
+        navigationPropertyBindings = Collections.unmodifiableList(navigationPropertyBindingsLocal);
       }
     }
-    return Collections.unmodifiableList(navigationPropertyBindings);
+    return navigationPropertyBindings;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java
index 936a5ff..c615376 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java
@@ -67,18 +67,21 @@ public abstract class AbstractEdmOperation extends EdmTypeImpl implements EdmOpe
   }
   
   private void createParameters() {
-    parameters = new LinkedHashMap<String, EdmParameter>();
-
-    final List<Parameter> providerParameters = operation.getParameters();
-    if (providerParameters != null) {
-      parameterNames = new ArrayList<String>(providerParameters.size());
-      for (Parameter parameter : providerParameters) {
-        parameters.put(parameter.getName(), new EdmParameterImpl(edm, parameter));
-        parameterNames.add(parameter.getName());
+    if(parameters == null) {
+      final Map<String, EdmParameter> parametersLocal = new LinkedHashMap<String, EdmParameter>();
+      final List<Parameter> providerParameters = operation.getParameters();
+      if (providerParameters != null) {
+        final List<String> parameterNamesLocal = new ArrayList<String>(providerParameters.size());
+        for (Parameter parameter : providerParameters) {
+          parametersLocal.put(parameter.getName(), new EdmParameterImpl(edm, parameter));
+          parameterNamesLocal.add(parameter.getName());
+        }
+        
+        parameters = parametersLocal;
+        parameterNames = parameterNamesLocal;
+      } else {
+        parameterNames = Collections.emptyList();
       }
-
-    } else {
-      parameterNames = Collections.emptyList();
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java
index 555652f..29d08ce 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java
@@ -67,27 +67,29 @@ public abstract class AbstractEdmStructuredType extends EdmTypeImpl implements E
   @Override
   public List<String> getPropertyNames() {
     if (propertyNames == null) {
-      propertyNames = new ArrayList<String>();
+      final List<String> localPropertyNames = new ArrayList<String>();
       checkBaseType();
       if (baseType != null) {
-        propertyNames.addAll(baseType.getPropertyNames());
+        localPropertyNames.addAll(baseType.getPropertyNames());
       }
-      propertyNames.addAll(getProperties().keySet());
+      localPropertyNames.addAll(getProperties().keySet());
+      propertyNames = Collections.unmodifiableList(localPropertyNames);
     }
-    return Collections.unmodifiableList(propertyNames);
+    return propertyNames;
   }
 
   @Override
   public List<String> getNavigationPropertyNames() {
     if (navigationPropertyNames == null) {
-      navigationPropertyNames = new ArrayList<String>();
+      final ArrayList<String> localNavigatinPropertyNames = new ArrayList<String>();
       checkBaseType();
       if (baseType != null) {
-        navigationPropertyNames.addAll(baseType.getNavigationPropertyNames());
+        localNavigatinPropertyNames.addAll(baseType.getNavigationPropertyNames());
       }
-      navigationPropertyNames.addAll(getNavigationProperties().keySet());
+      localNavigatinPropertyNames.addAll(getNavigationProperties().keySet());
+      navigationPropertyNames = Collections.unmodifiableList(localNavigatinPropertyNames);
     }
-    return Collections.unmodifiableList(navigationPropertyNames);
+    return navigationPropertyNames;
   }
 
   @Override
@@ -155,25 +157,33 @@ public abstract class AbstractEdmStructuredType extends EdmTypeImpl implements E
 
   public Map<String, EdmProperty> getProperties() {
     if (properties == null) {
-      properties = new LinkedHashMap<String, EdmProperty>();
-        for (Property property : providerStructuredType.getProperties()) {
-          properties.put(property.getName(), new EdmPropertyImpl(edm, typeName, property));
+      final Map<String, EdmProperty> localPorperties = new LinkedHashMap<String, EdmProperty>();
+      final List<Property> structureTypeProperties = providerStructuredType.getProperties();
+        for (Property property : structureTypeProperties) {
+          localPorperties.put(property.getName(), new EdmPropertyImpl(edm, typeName, property));
       }
+      properties = Collections.unmodifiableMap(localPorperties);
     }
-    return Collections.unmodifiableMap(properties);
+    return properties;
   }
 
   public Map<String, EdmNavigationProperty> getNavigationProperties() {
     if (navigationProperties == null) {
-      navigationProperties = new LinkedHashMap<String, EdmNavigationProperty>();
-      if (providerStructuredType.getNavigationProperties() != null) {
-        for (NavigationProperty navigationProperty : providerStructuredType.getNavigationProperties()) {
-          navigationProperties.put(navigationProperty.getName(),
+      final Map<String, EdmNavigationProperty> localNavigationProperties = 
+          new LinkedHashMap<String, EdmNavigationProperty>();
+      final List<NavigationProperty> structuredTypeNavigationProperties = 
+          providerStructuredType.getNavigationProperties();
+
+      if (structuredTypeNavigationProperties != null) {
+        for (NavigationProperty navigationProperty : structuredTypeNavigationProperties) {
+          localNavigationProperties.put(navigationProperty.getName(),
                   new EdmNavigationPropertyImpl(edm, typeName, navigationProperty));
         }
       }
+      
+      navigationProperties = Collections.unmodifiableMap(localNavigationProperties);
     }
-    return Collections.unmodifiableMap(navigationProperties);
+    return navigationProperties;
   }
 
   public boolean isOpenType() {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java
index 4de911c..d12010d 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java
@@ -81,28 +81,29 @@ public class EdmAnnotationsImpl implements EdmAnnotations {
       final String path = splitted.length > 1 ? splitted[1] : null;
 
       final EdmEntityContainer baseEntityContainer = schema.getEntityContainer();
-
-      target = baseEntityContainer == null ? null : baseEntityContainer.getActionImport(path);
-      if (target == null) {
-        target = getTarget(edm.getComplexType(base), path);
-        if (target == null) {
+      
+      EdmAnnotationsTarget localTarget = baseEntityContainer == null ? null 
+                                                                     : baseEntityContainer.getActionImport(path);
+      if (localTarget == null) {
+        localTarget = getTarget(edm.getComplexType(base), path);
+        if (localTarget == null) {
           if(baseEntityContainer != null && baseEntityContainer.getFullQualifiedName().equals(base)){
-            target = baseEntityContainer;
+            localTarget = baseEntityContainer;
           }
-          if (target == null) {
-            target = baseEntityContainer == null ? null : baseEntityContainer.getEntitySet(path);
-            if (target == null) {
-              target = getTarget(edm.getEntityType(base), path);
-              if (target == null) {
-                target = getTarget(edm.getEnumType(base), path);
-                if (target == null) {
-                  target = baseEntityContainer == null ? null : baseEntityContainer.getFunctionImport(path);
-                  if (target == null) {
-                    target = baseEntityContainer == null ? null : baseEntityContainer.getSingleton(path);
-                    if (target == null) {
-                      target = edm.getTerm(base);
-                      if (target == null) {
-                        target = edm.getTypeDefinition(base);
+          if (localTarget == null) {
+            localTarget = baseEntityContainer == null ? null : baseEntityContainer.getEntitySet(path);
+            if (localTarget == null) {
+              localTarget = getTarget(edm.getEntityType(base), path);
+              if (localTarget == null) {
+                localTarget = getTarget(edm.getEnumType(base), path);
+                if (localTarget == null) {
+                  localTarget = baseEntityContainer == null ? null : baseEntityContainer.getFunctionImport(path);
+                  if (localTarget == null) {
+                    localTarget = baseEntityContainer == null ? null : baseEntityContainer.getSingleton(path);
+                    if (localTarget == null) {
+                      localTarget = edm.getTerm(base);
+                      if (localTarget == null) {
+                        localTarget = edm.getTypeDefinition(base);
                       }
                     }
                   }
@@ -112,7 +113,9 @@ public class EdmAnnotationsImpl implements EdmAnnotations {
           }
         }
       }
+      target = localTarget;
     }
+    
     return target;
   }
 
@@ -135,12 +138,14 @@ public class EdmAnnotationsImpl implements EdmAnnotations {
   @Override
   public List<EdmAnnotation> getAnnotations() {
     if (annotations == null) {
-      annotations = new ArrayList<EdmAnnotation>();
+      List<EdmAnnotation> annotationsLocal = new ArrayList<EdmAnnotation>();
       for (Annotation annotation : annotationGroup.getAnnotations()) {
-        annotations.add(new EdmAnnotationImpl(edm, annotation));
+        annotationsLocal.add(new EdmAnnotationImpl(edm, annotation));
       }
+      
+      annotations = Collections.unmodifiableList(annotationsLocal);
     }
-    return Collections.unmodifiableList(annotations);
+    return annotations;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
index df6adcb..165b5cd 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
@@ -49,17 +49,18 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
   private final FullQualifiedName entityContainerName;
   private final FullQualifiedName parentContainerName;
 
-  private final Map<String, EdmSingleton> singletonCache = new LinkedHashMap<String, EdmSingleton>();
   private List<EdmSingleton> singletons;
-
-  private final Map<String, EdmEntitySet> entitySetCache = new LinkedHashMap<String, EdmEntitySet>();
+  private final Map<String, EdmSingleton> singletonCache = Collections.synchronizedMap(
+                                                                    new LinkedHashMap<String, EdmSingleton>());
   private List<EdmEntitySet> entitySets;
-
-  private final Map<String, EdmActionImport> actionImportCache = new LinkedHashMap<String, EdmActionImport>();
+  private final Map<String, EdmEntitySet> entitySetCache = Collections.synchronizedMap(
+                                                                    new LinkedHashMap<String, EdmEntitySet>());
   private List<EdmActionImport> actionImports;
-
-  private final Map<String, EdmFunctionImport> functionImportCache = new LinkedHashMap<String, EdmFunctionImport>();
+  private final Map<String, EdmActionImport> actionImportCache = Collections.synchronizedMap(
+                                                                    new LinkedHashMap<String, EdmActionImport>());
   private List<EdmFunctionImport> functionImports;
+  private final Map<String, EdmFunctionImport> functionImportCache = Collections.synchronizedMap(
+                                                                    new LinkedHashMap<String, EdmFunctionImport>());
 
   public EdmEntityContainerImpl(final Edm edm, final EdmProvider provider,
       final EntityContainerInfo entityContainerInfo) {
@@ -235,55 +236,61 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
 
   protected void loadAllEntitySets() {
     loadContainer();
-    List<EntitySet> providerEntitySets = container.getEntitySets();
-    entitySets = new ArrayList<EdmEntitySet>();
+    final List<EntitySet> providerEntitySets = container.getEntitySets();
+    final List<EdmEntitySet> entitySetsLocal = new ArrayList<EdmEntitySet>();
+    
     if (providerEntitySets != null) {
       for (EntitySet entitySet : providerEntitySets) {
-        EdmEntitySetImpl impl = new EdmEntitySetImpl(edm, this, entitySet);
+        final EdmEntitySetImpl impl = new EdmEntitySetImpl(edm, this, entitySet);
         entitySetCache.put(impl.getName(), impl);
-        entitySets.add(impl);
+        entitySetsLocal.add(impl);
       }
+      entitySets = entitySetsLocal;
     }
   }
 
   protected void loadAllFunctionImports() {
     loadContainer();
-    List<FunctionImport> providerFunctionImports = container.getFunctionImports();
-    functionImports = new ArrayList<EdmFunctionImport>();
+    final List<FunctionImport> providerFunctionImports = container.getFunctionImports();
+    final ArrayList<EdmFunctionImport> functionImportsLocal = new ArrayList<EdmFunctionImport>();
+    
     if (providerFunctionImports != null) {
       for (FunctionImport functionImport : providerFunctionImports) {
         EdmFunctionImportImpl impl = new EdmFunctionImportImpl(edm, this, functionImport);
         functionImportCache.put(impl.getName(), impl);
-        functionImports.add(impl);
+        functionImportsLocal.add(impl);
       }
+      functionImports = functionImportsLocal;
     }
-
   }
 
   protected void loadAllSingletons() {
     loadContainer();
-    List<Singleton> providerSingletons = container.getSingletons();
-    singletons = new ArrayList<EdmSingleton>();
+    final List<Singleton> providerSingletons = container.getSingletons();
+    final List<EdmSingleton> singletonsLocal = new ArrayList<EdmSingleton>();
+    
     if (providerSingletons != null) {
       for (Singleton singleton : providerSingletons) {
-        EdmSingletonImpl impl = new EdmSingletonImpl(edm, this, singleton);
+        final EdmSingletonImpl impl = new EdmSingletonImpl(edm, this, singleton);
         singletonCache.put(singleton.getName(), impl);
-        singletons.add(impl);
+        singletonsLocal.add(impl);
       }
+      singletons = singletonsLocal;
     }
-
   }
 
   protected void loadAllActionImports() {
     loadContainer();
-    List<ActionImport> providerActionImports = container.getActionImports();
-    actionImports = new ArrayList<EdmActionImport>();
+    final List<ActionImport> providerActionImports = container.getActionImports();
+    final List<EdmActionImport> actionImportsLocal = new ArrayList<EdmActionImport>();
+
     if (providerActionImports != null) {
       for (ActionImport actionImport : providerActionImports) {
-        EdmActionImportImpl impl = new EdmActionImportImpl(edm, this, actionImport);
+        final EdmActionImportImpl impl = new EdmActionImportImpl(edm, this, actionImport);
         actionImportCache.put(actionImport.getName(), impl);
-        actionImports.add(impl);
+        actionImportsLocal.add(impl);
       }
+      actionImports = actionImportsLocal;
     }
 
   }
@@ -291,10 +298,12 @@ public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntit
   private void loadContainer() {
     if (container == null) {
       try {
-        container = provider.getEntityContainer();
-        if (container == null) {
-          container = new EntityContainer().setName(getName());
+        EntityContainer containerLocal = provider.getEntityContainer();
+        if (containerLocal == null) {
+          containerLocal = new EntityContainer().setName(getName());
         }
+        
+        container = containerLocal;
       } catch (ODataException e) {
         throw new EdmException(e);
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java
index ac68499..3040499 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java
@@ -40,8 +40,9 @@ public class EdmEntityTypeImpl extends AbstractEdmStructuredType implements EdmE
   private boolean baseTypeChecked = false;
   private final boolean hasStream;
   protected EdmEntityType entityBaseType;
-  private final List<String> keyPredicateNames = new ArrayList<String>();
-  private final Map<String, EdmKeyPropertyRef> keyPropertyRefs = new LinkedHashMap<String, EdmKeyPropertyRef>();
+  private final List<String> keyPredicateNames = Collections.synchronizedList(new ArrayList<String>());
+  private final Map<String, EdmKeyPropertyRef> keyPropertyRefs = 
+      Collections.synchronizedMap(new LinkedHashMap<String, EdmKeyPropertyRef>());
   private List<EdmKeyPropertyRef> keyPropertyRefsList;
 
   public EdmEntityTypeImpl(final Edm edm, final FullQualifiedName name, final EntityType entityType) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java
index 53650bb..4745c65 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java
@@ -99,13 +99,16 @@ public class EdmEnumTypeImpl extends EdmTypeImpl implements EdmEnumType {
   }
 
   private void createEdmMembers() {
-    membersMap = new LinkedHashMap<String, EdmMember>();
-    memberNames = new ArrayList<String>();
+    final LinkedHashMap<String, EdmMember> membersMapLocal = new LinkedHashMap<String, EdmMember>();
+    final List<String> memberNamesLocal = new ArrayList<String>();
     if (enumType.getMembers() != null) {
       for (final EnumMember member : enumType.getMembers()) {
-        membersMap.put(member.getName(), new EdmMemberImpl(edm, getFullQualifiedName(), member));
-        memberNames.add(member.getName());
+        membersMapLocal.put(member.getName(), new EdmMemberImpl(edm, getFullQualifiedName(), member));
+        memberNamesLocal.add(member.getName());
       }
+      
+      membersMap = membersMapLocal;
+      memberNames = memberNamesLocal;
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java
index 2dd6dce..d6a56bf 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java
@@ -113,12 +113,14 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNamed implements EdmEl
   public List<EdmReferentialConstraint> getReferentialConstraints() {
     if (referentialConstraints == null) {
       final List<ReferentialConstraint> providerConstraints = navigationProperty.getReferentialConstraints();
-      referentialConstraints = new ArrayList<EdmReferentialConstraint>();
+      final List<EdmReferentialConstraint> referentialConstraintsLocal = new ArrayList<EdmReferentialConstraint>();
       if (providerConstraints != null) {
         for (ReferentialConstraint constraint : providerConstraints) {
-          referentialConstraints.add(new EdmReferentialConstraintImpl(edm, constraint));
+          referentialConstraintsLocal.add(new EdmReferentialConstraintImpl(edm, constraint));
         }
       }
+      
+      referentialConstraints = referentialConstraintsLocal;
     }
     return Collections.unmodifiableList(referentialConstraints);
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java
index daa0e87..5a11a7b 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java
@@ -59,8 +59,10 @@ import org.apache.olingo.commons.core.edm.AbstractEdm;
 public class EdmProviderImpl extends AbstractEdm {
 
   private final EdmProvider provider;
-  private final Map<FullQualifiedName, List<Action>> actionsMap = new HashMap<FullQualifiedName, List<Action>>();
-  private final Map<FullQualifiedName, List<Function>> functionsMap = new HashMap<FullQualifiedName, List<Function>>();
+  private final Map<FullQualifiedName, List<Action>> actionsMap = 
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, List<Action>>());
+  private final Map<FullQualifiedName, List<Function>> functionsMap = 
+      Collections.synchronizedMap(new HashMap<FullQualifiedName, List<Function>>());
 
   public EdmProviderImpl(final EdmProvider provider) {
     this.provider = provider;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java
index ea44dc6..4d994f6 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java
@@ -86,7 +86,6 @@ public class EdmSchemaImpl implements EdmSchema {
     annotationGroups = createAnnotationGroups();
     annotations = createAnnotations();
     terms = createTerms();
-
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/05cbf674/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java
index 146ff7e..f500ec2 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmTermImpl.java
@@ -87,14 +87,16 @@ public class EdmTermImpl extends AbstractEdmNamed implements EdmTerm {
   @Override
   public List<Class<?>> getAppliesTo() {
     if (appliesTo == null) {
-      appliesTo = new ArrayList<Class<?>>();
+      final List<Class<?>> appliesToLocal = new ArrayList<Class<?>>();
       for (String element : term.getAppliesTo()) {
         try {
-          appliesTo.add(ClassUtils.getClass(EdmTerm.class.getPackage().getName() + ".Edm" + element));
+          appliesToLocal.add(ClassUtils.getClass(EdmTerm.class.getPackage().getName() + ".Edm" + element));
         } catch (ClassNotFoundException e) {
           LOG.error("Could not load Edm class for {}", element, e);
         }
       }
+      
+      appliesTo = appliesToLocal;
     }
     return appliesTo;
   }