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