[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 <[email protected]> Authored: Thu Apr 16 10:44:20 2015 +0200 Committer: Christian Holzer <[email protected]> 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; }
