You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by tb...@apache.org on 2013/12/10 14:50:24 UTC
[29/50] [abbrv] git commit: Fixed handling for already set keys
Fixed handling for already set keys
Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/commit/e7a17fe9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/tree/e7a17fe9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/diff/e7a17fe9
Branch: refs/heads/ODataServlet
Commit: e7a17fe9a19afabebf8fc6e8595eff70260771b1
Parents: d108298
Author: Michael Bolz <mi...@apache.org>
Authored: Wed Dec 4 15:11:56 2013 +0100
Committer: Michael Bolz <mi...@apache.org>
Committed: Wed Dec 4 15:11:56 2013 +0100
----------------------------------------------------------------------
.../annotation/data/AnnotationInMemoryDs.java | 10 ++-
.../odata2/core/annotation/data/DataStore.java | 40 +++++++----
.../annotation/processor/ListsProcessor.java | 6 +-
.../data/AnnotationsInMemoryDsTest.java | 76 ++++++++++++++++----
4 files changed, 100 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/e7a17fe9/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
index 3389140..7c41945 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationInMemoryDs.java
@@ -42,8 +42,14 @@ public class AnnotationInMemoryDs implements ListsDataSource {
private static final AnnotationHelper ANNOTATION_HELPER = new AnnotationHelper();
private final Map<String, DataStore<Object>> dataStores = new HashMap<String, DataStore<Object>>();
+ private final boolean persistInMemory;
public AnnotationInMemoryDs(String packageToScan) {
+ this(packageToScan, true);
+ }
+
+ public AnnotationInMemoryDs(String packageToScan, boolean persistInMemory) {
+ this.persistInMemory = persistInMemory;
List<Class<?>> foundClasses = ClassHelper.loadClasses(packageToScan, new ClassHelper.ClassValidator() {
@Override
public boolean isClassValid(Class<?> c) {
@@ -58,7 +64,7 @@ public class AnnotationInMemoryDs implements ListsDataSource {
private void init(List<Class<?>> foundClasses) {
for (Class<?> clz : foundClasses) {
- DataStore<Object> dhs = (DataStore<Object>) DataStore.createInMemory(clz);
+ DataStore<Object> dhs = (DataStore<Object>) getDataStore(clz);
org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet entitySet =
clz.getAnnotation(org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet.class);
dataStores.put(entitySet.name(), dhs);
@@ -66,7 +72,7 @@ public class AnnotationInMemoryDs implements ListsDataSource {
}
public <T> DataStore<T> getDataStore(Class<T> clazz) {
- return DataStore.createInMemory(clazz);
+ return DataStore.createInMemory(clazz, persistInMemory);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/e7a17fe9/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java
index 4e43db4..834e33a 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/DataStore.java
@@ -47,9 +47,9 @@ public class DataStore<T> {
private static final Map<Class<?>, DataStore<?>> c2ds = new HashMap<Class<?>, DataStore<?>>();
@SuppressWarnings("unchecked")
- static DataStore<?> getInstance(Class<?> clz) {
+ static DataStore<?> getInstance(Class<?> clz, boolean createNewInstance) {
DataStore<?> ds = c2ds.get(clz);
- if (ds == null) {
+ if (createNewInstance || ds == null) {
ds = new DataStore<Object>((Class<Object>) clz);
c2ds.put(clz, ds);
}
@@ -59,11 +59,16 @@ public class DataStore<T> {
@SuppressWarnings("unchecked")
public static <T> DataStore<T> createInMemory(Class<T> clazz) {
- return (DataStore<T>) InMemoryDataStore.getInstance(clazz);
+ return (DataStore<T>) InMemoryDataStore.getInstance(clazz, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <T> DataStore<T> createInMemory(Class<T> clazz, boolean keepExisting) {
+ return (DataStore<T>) InMemoryDataStore.getInstance(clazz, !keepExisting);
}
private DataStore(List<T> wrapStore, Class<T> clz) {
- dataStore = wrapStore;
+ dataStore = Collections.synchronizedList(wrapStore);
dataTypeClass = clz;
}
@@ -104,26 +109,33 @@ public class DataStore<T> {
}
public T create(T object) throws DataStoreException {
- if (read(object) != null || getKeys(object).contains(null)) {
- createKeys(object);
+ synchronized (dataStore) {
+ if (read(object) != null || getKeys(object).contains(null)) {
+ createKeys(object);
+ return this.create(object);
+ }
+ dataStore.add(object);
}
- dataStore.add(object);
return object;
}
public T update(T object) {
- T stored = read(object);
- dataStore.remove(stored);
- dataStore.add(object);
+ synchronized (dataStore) {
+ T stored = read(object);
+ dataStore.remove(stored);
+ dataStore.add(object);
+ }
return object;
}
public T delete(T object) {
- T stored = read(object);
- if (stored != null) {
- dataStore.remove(stored);
+ synchronized (dataStore) {
+ T stored = read(object);
+ if (stored != null) {
+ dataStore.remove(stored);
+ }
+ return stored;
}
- return stored;
}
private List<Object> getKeys(T object) {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/e7a17fe9/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/processor/ListsProcessor.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/processor/ListsProcessor.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/processor/ListsProcessor.java
index b4a2c6f..16e1eab 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/processor/ListsProcessor.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/processor/ListsProcessor.java
@@ -1578,8 +1578,12 @@ public class ListsProcessor extends ODataSingleProcessor {
for (final String propertyName : type.getPropertyNames()) {
final EdmProperty property = (EdmProperty) type.getProperty(propertyName);
if (type instanceof EdmEntityType && ((EdmEntityType) type).getKeyProperties().contains(property)) {
- continue;
+ Object v = valueAccess.getPropertyValue(data, property);
+ if(v != null) {
+ continue;
+ }
}
+
if (!merge || valueMap != null && valueMap.containsKey(propertyName)) {
final Object value = valueMap == null ? null : valueMap.get(propertyName);
if (property.isSimple()) {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/e7a17fe9/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/data/AnnotationsInMemoryDsTest.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/data/AnnotationsInMemoryDsTest.java b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/data/AnnotationsInMemoryDsTest.java
index 02881f0..b132a0b 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/data/AnnotationsInMemoryDsTest.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/data/AnnotationsInMemoryDsTest.java
@@ -24,6 +24,7 @@ import org.apache.olingo.odata2.api.edm.FullQualifiedName;
import org.apache.olingo.odata2.api.edm.provider.EntitySet;
import org.apache.olingo.odata2.api.exception.ODataException;
import org.apache.olingo.odata2.core.annotation.edm.AnnotationEdmProvider;
+import org.apache.olingo.odata2.core.annotation.edm.AnnotationHelper;
import org.apache.olingo.odata2.core.annotation.model.Building;
import org.apache.olingo.odata2.core.annotation.model.ModelSharedConstants;
import org.apache.olingo.odata2.core.annotation.model.Photo;
@@ -41,7 +42,7 @@ public class AnnotationsInMemoryDsTest {
private static final String DEFAULT_CONTAINER = ModelSharedConstants.CONTAINER_1;
public AnnotationsInMemoryDsTest() {
- datasource = new AnnotationInMemoryDs(Building.class.getPackage().getName());
+ datasource = new AnnotationInMemoryDs(Building.class.getPackage().getName(), false);
edmProvider = new AnnotationEdmProvider(Building.class.getPackage().getName());
}
@@ -58,8 +59,57 @@ public class AnnotationsInMemoryDsTest {
Building read = (Building) datasource.readData(edmEntitySet, keys);
Assert.assertEquals("Common Building", read.getName());
+ Assert.assertEquals("1", read.getId());
}
+
+ @Test
+ public void createSimpleEntityWithOwnKey() throws Exception {
+ EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Buildings");
+
+ Building building = new Building();
+ building.setName("Common Building");
+ AnnotationHelper ah = new AnnotationHelper();
+ ah.setValueForProperty(building, "Id", "42");
+ datasource.createData(edmEntitySet, building);
+
+ Map<String, Object> keys = new HashMap<String, Object>();
+ keys.put("Id", "42");
+
+ Building read = (Building) datasource.readData(edmEntitySet, keys);
+ Assert.assertEquals("Common Building", read.getName());
+ Assert.assertEquals("42", read.getId());
+ }
+
+ @Test
+ public void createSimpleEntityWithDuplicateKey() throws Exception {
+ EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Buildings");
+ AnnotationHelper ah = new AnnotationHelper();
+
+ Building building = new Building();
+ building.setName("Common Building");
+ ah.setValueForProperty(building, "Id", "42");
+ datasource.createData(edmEntitySet, building);
+ //
+ Building buildingDuplicate = new Building();
+ buildingDuplicate.setName("Duplicate Building");
+ ah.setValueForProperty(buildingDuplicate, "Id", "42");
+ datasource.createData(edmEntitySet, buildingDuplicate);
+
+ Map<String, Object> keys42 = new HashMap<String, Object>();
+ keys42.put("Id", "42");
+ Building read42 = (Building) datasource.readData(edmEntitySet, keys42);
+ Assert.assertEquals("Common Building", read42.getName());
+ Assert.assertEquals("42", read42.getId());
+
+ Map<String, Object> keys = new HashMap<String, Object>();
+ keys.put("Id", "1");
+ Building read = (Building) datasource.readData(edmEntitySet, keys);
+ Assert.assertEquals("Duplicate Building", read.getName());
+ Assert.assertEquals("1", read.getId());
+}
+
+
@Test
public void createEntityTwoKeys() throws Exception {
EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Photos");
@@ -97,34 +147,30 @@ public class AnnotationsInMemoryDsTest {
datasource.createData(edmEntitySet, photo);
Map<String, Object> keys = new HashMap<String, Object>();
- keys.put("Name", "1");
- keys.put("ImageFormat", "2");
+ keys.put("Name", "BigPicture");
+ keys.put("ImageFormat", "PNG");
Photo read = (Photo) datasource.readData(edmEntitySet, keys);
- Assert.assertEquals("1", read.getName());
- Assert.assertEquals("2", read.getType());
+ Assert.assertEquals("BigPicture", read.getName());
+ Assert.assertEquals("PNG", read.getType());
Assert.assertEquals("image/png", read.getImageType());
Assert.assertEquals("https://localhost/image.png", read.getImageUri());
// update
Photo updatedPhoto = new Photo();
- // updatedPhoto.setName(nameKeyValue);
- // updatedPhoto.setType(typeKeyValue);
- updatedPhoto.setName("1");
- updatedPhoto.setType("2");
+ updatedPhoto.setName(nameKeyValue);
+ updatedPhoto.setType(typeKeyValue);
updatedPhoto.setImageUri("https://localhost/image.jpg");
updatedPhoto.setImageType("image/jpg");
datasource.updateData(edmEntitySet, updatedPhoto);
Map<String, Object> updatedKeys = new HashMap<String, Object>();
- // updatedKeys.put("Name", nameKeyValue);
- // updatedKeys.put("ImageFormat", typeKeyValue);
- updatedKeys.put("Name", "1");
- updatedKeys.put("ImageFormat", "2");
+ updatedKeys.put("Name", nameKeyValue);
+ updatedKeys.put("ImageFormat", typeKeyValue);
Photo readUpdated = (Photo) datasource.readData(edmEntitySet, updatedKeys);
- Assert.assertEquals("1", readUpdated.getName());
- Assert.assertEquals("2", readUpdated.getType());
+ Assert.assertEquals("BigPicture", readUpdated.getName());
+ Assert.assertEquals("PNG", readUpdated.getType());
Assert.assertEquals("image/jpg", readUpdated.getImageType());
Assert.assertEquals("https://localhost/image.jpg", readUpdated.getImageUri());
}