You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2016/08/28 19:08:27 UTC
olingo-odata2 git commit: [OLINGO-1014] Preserve existing key values
of an entity with multiple keys when saving to in-memory data store.
Repository: olingo-odata2
Updated Branches:
refs/heads/master cd4810b9b -> 798f898ed
[OLINGO-1014] Preserve existing key values of an entity with multiple keys when saving to in-memory data store.
Signed-off-by: mibo <mi...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/798f898e
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/798f898e
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/798f898e
Branch: refs/heads/master
Commit: 798f898ed588bc2d57a48febd19c7e1cb5ab29f8
Parents: cd4810b
Author: Michael Strasser <mi...@michaelstrasser.com>
Authored: Sun Aug 28 21:23:06 2016 +1000
Committer: mibo <mi...@apache.org>
Committed: Sun Aug 28 21:06:53 2016 +0200
----------------------------------------------------------------------
.../processor/core/datasource/DataStore.java | 22 ++++++---
.../datasource/AnnotationsInMemoryDsTest.java | 52 ++++++++++++++++++++
2 files changed, 67 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/798f898e/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/datasource/DataStore.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/datasource/DataStore.java b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/datasource/DataStore.java
index 98f86f1..6e7bd13 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/datasource/DataStore.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/datasource/DataStore.java
@@ -113,10 +113,15 @@ public class DataStore<T> {
return create(object, keyElement);
}
+ /**
+ * Store an entity, preserving any existing keys if possible. If the combination of
+ * existing and generated keys would produce a duplicate entry, replace all keys.
+ */
private T create(final T object, final KeyElement keyElement) throws DataStoreException {
synchronized (dataStore) {
- if (keyElement.keyValuesMissing() || dataStore.containsKey(keyElement)) {
- KeyElement newKey = createSetAndGetKeys(object);
+ final boolean replaceKeys = dataStore.containsKey(keyElement);
+ if (keyElement.keyValuesMissing() || replaceKeys) {
+ KeyElement newKey = createSetAndGetKeys(object, replaceKeys);
return this.create(object, newKey);
}
dataStore.put(keyElement, object);
@@ -244,11 +249,14 @@ public class DataStore<T> {
return keyElement;
}
- KeyElement createSetAndGetKeys(final T object) throws DataStoreException {
+ KeyElement createSetAndGetKeys(final T object, boolean replaceKeys) throws DataStoreException {
KeyElement keyElement = new KeyElement(keyFields.size());
for (Field field : keyFields) {
- Object key = createKey(field);
- ClassHelper.setFieldValue(object, field, key);
+ Object key = ClassHelper.getFieldValue(object, field);
+ if (key == null || replaceKeys) {
+ key = createKey(field);
+ ClassHelper.setFieldValue(object, field, key);
+ }
keyElement.addValue(key);
}
@@ -277,8 +285,8 @@ public class DataStore<T> {
return keyAccess.getKeyValues(object);
}
- private KeyElement createSetAndGetKeys(final T object) throws DataStoreException {
- return keyAccess.createSetAndGetKeys(object);
+ private KeyElement createSetAndGetKeys(final T object, boolean replaceKeys) throws DataStoreException {
+ return keyAccess.createSetAndGetKeys(object, replaceKeys);
}
public static class DataStoreException extends ODataApplicationException {
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/798f898e/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/datasource/AnnotationsInMemoryDsTest.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/datasource/AnnotationsInMemoryDsTest.java b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/datasource/AnnotationsInMemoryDsTest.java
index 089b6d4..9abd18b 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/datasource/AnnotationsInMemoryDsTest.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/datasource/AnnotationsInMemoryDsTest.java
@@ -688,6 +688,58 @@ public class AnnotationsInMemoryDsTest {
}
@Test
+ public void createTwoKeyEntityWithOneKeyAlreadySet() throws Exception {
+ EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Photos");
+
+ final String typeKeyValue = "PNG";
+ final String automaticNameKeyValue = "1";
+
+ Photo photo = new Photo();
+ photo.setType(typeKeyValue);
+ photo.setImageUri("https://localhost/big_picture.png");
+ photo.setImageType("image/png");
+ datasource.createData(edmEntitySet, photo);
+
+ List photos = datasource.readData(edmEntitySet);
+ Photo readPhoto = (Photo) photos.get(0);
+ Assert.assertEquals(automaticNameKeyValue + ":" + typeKeyValue,
+ readPhoto.getName() + ":" + readPhoto.getType());
+ }
+
+ @Test
+ public void ensureTwoKeyEntityKeysAreUnique() throws Exception {
+ EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Photos");
+
+ final String nameKeyValue = "Big Picture";
+ final String typeKeyValue = "PNG";
+
+ Photo photo1 = new Photo();
+ photo1.setName(nameKeyValue);
+ photo1.setType(typeKeyValue);
+ photo1.setImageUri("https://localhost/big_picture.png");
+ photo1.setImageType("image/png");
+ datasource.createData(edmEntitySet, photo1);
+
+ Photo photo2 = new Photo();
+ photo2.setName(nameKeyValue);
+ photo2.setType(typeKeyValue);
+ photo2.setImageUri("https://localhost/bigger_picture.png");
+ photo2.setImageType("image/png");
+ datasource.createData(edmEntitySet, photo2);
+
+ List photos = datasource.readData(edmEntitySet);
+
+ Assert.assertEquals(2, photos.size());
+ Photo readPhoto = (Photo) photos.get(0);
+ Assert.assertEquals(nameKeyValue + ":" + typeKeyValue,
+ readPhoto.getName() + ":" + readPhoto.getType());
+
+ readPhoto = (Photo) photos.get(1);
+ Assert.assertEquals("1:2",
+ readPhoto.getName() + ":" + readPhoto.getType());
+ }
+
+ @Test
public void createGuidKeyEntity() throws Exception {
EdmEntitySet edmEntitySet = createMockedEdmEntitySet(GuidKeyEntity.GUID_KEY_ENTITIES);