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;
}