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:03 UTC
[08/50] [abbrv] git commit: Refactored EdmNavigationProperty
annotation
Refactored EdmNavigationProperty annotation
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/4d80947e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/tree/4d80947e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/diff/4d80947e
Branch: refs/heads/ODataServlet
Commit: 4d80947e511a900383315c08c2b7ae9826470840
Parents: f97d37f
Author: Michael Bolz <mi...@apache.org>
Authored: Thu Nov 21 09:35:49 2013 +0100
Committer: Michael Bolz <mi...@apache.org>
Committed: Thu Nov 21 10:50:25 2013 +0100
----------------------------------------------------------------------
.../annotation/data/AnnotationInMemoryDs.java | 120 +++++-----
.../annotation/data/AnnotationValueAccess.java | 38 +---
.../odata2/core/annotation/data/DataStore.java | 63 +++---
.../annotation/edm/AnnotationEdmProvider.java | 127 ++++++-----
.../core/annotation/edm/AnnotationHelper.java | 218 +++++++++----------
.../annotation/processor/ListsProcessor.java | 7 +-
.../data/AnnotationsInMemoryDsTest.java | 79 ++++---
.../edm/AnnotationEdmProviderTest.java | 20 +-
.../odata2/core/annotation/model/Building.java | 19 +-
.../odata2/core/annotation/model/Employee.java | 38 ++--
.../odata2/core/annotation/model/Manager.java | 10 +-
.../odata2/core/annotation/model/Room.java | 13 +-
.../odata2/core/annotation/model/Team.java | 12 +-
.../edm-annotation-webref/pom.xml | 10 -
.../odata2/ref/annotation/model/Building.java | 10 +-
.../odata2/ref/annotation/model/Employee.java | 35 +--
.../odata2/ref/annotation/model/Manager.java | 5 +-
.../odata2/ref/annotation/model/Room.java | 12 +-
.../odata2/ref/annotation/model/Team.java | 11 +-
.../processor/AnnotationPocServiceFactory.java | 36 ++-
.../src/main/webapp/index.jsp | 26 ++-
.../annotation/edm/EdmNavigationProperty.java | 11 +-
.../api/annotation/edm/NavigationEnd.java | 35 ---
23 files changed, 453 insertions(+), 502 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/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 6414264..d7c7f59 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
@@ -21,7 +21,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
import org.apache.olingo.odata2.api.annotation.edm.EdmMediaResourceContent;
import org.apache.olingo.odata2.api.annotation.edm.EdmMediaResourceMimeType;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
@@ -46,7 +45,7 @@ public class AnnotationInMemoryDs implements ListsDataSource {
List<Class<?>> foundClasses = ClassHelper.loadClasses(packageToScan, new ClassHelper.ClassValidator() {
@Override
public boolean isClassValid(Class<?> c) {
- return null != c.getAnnotation(EdmEntityType.class);
+ return null != c.getAnnotation(org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet.class);
}
});
@@ -58,8 +57,9 @@ public class AnnotationInMemoryDs implements ListsDataSource {
for (Class<?> clz : foundClasses) {
DataStore<Object> dhs = (DataStore<Object>) DataStore.createInMemory(clz);
- String entityTypeName = ANNOTATION_HELPER.extractEntityTypeName(clz);
- dataStores.put(entityTypeName, dhs);
+ 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);
}
}
@@ -69,11 +69,11 @@ public class AnnotationInMemoryDs implements ListsDataSource {
@Override
public List<?> readData(EdmEntitySet entitySet) throws ODataNotImplementedException,
- ODataNotFoundException, EdmException, ODataApplicationException {
+ ODataNotFoundException, EdmException, ODataApplicationException {
DataStore<Object> holder = getDataStore(entitySet);
if (holder != null) {
- return new ArrayList(holder.read());
+ return new ArrayList<Object>(holder.read());
}
throw new ODataNotFoundException(ODataNotFoundException.ENTITY);
@@ -81,7 +81,7 @@ public class AnnotationInMemoryDs implements ListsDataSource {
@Override
public Object readData(EdmEntitySet entitySet, Map<String, Object> keys)
- throws ODataNotFoundException, EdmException, ODataApplicationException {
+ throws ODataNotFoundException, EdmException, ODataApplicationException {
DataStore<Object> store = getDataStore(entitySet);
if (store != null) {
@@ -99,71 +99,72 @@ public class AnnotationInMemoryDs implements ListsDataSource {
@Override
public Object readData(EdmFunctionImport function, Map<String, Object> parameters, Map<String, Object> keys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+ throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
}
@Override
public Object readRelatedData(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
- Map<String, Object> targetKeys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+ Map<String, Object> targetKeys)
+ throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
- if (targetKeys.isEmpty()) {
- String sourceName = sourceEntitySet.getEntityType().getName();
- DataStore sourceStore = dataStores.get(sourceName);
+ DataStore<?> sourceStore = dataStores.get(sourceEntitySet.getName());
+ DataStore<?> targetStore = dataStores.get(targetEntitySet.getName());
- String targetName = targetEntitySet.getEntityType().getName();
- DataStore targetStore = dataStores.get(targetName);
-
- AnnotationHelper.AnnotatedNavInfo navigationInfo = extractNavigationInfo(sourceStore, targetStore);
+ Field sourceField = extractSourceField(sourceStore, targetStore);
+ if (sourceField == null) {
+ throw new ODataRuntimeException("Missing source field for related data (sourceStore='" + sourceStore
+ + "', targetStore='" + targetStore + "').");
+ }
- Field sourceFieldAtTarget = navigationInfo.getToField();
- if (sourceFieldAtTarget == null) {
- throw new ODataRuntimeException("Missing source field for related data.");
+ Object navigationInstance = getValue(sourceField, sourceData);
+ List<Object> resultData = new ArrayList<Object>();
+ for (Object targetInstance : targetStore.read()) {
+ if (navigationInstance instanceof Collection) {
+ for (Object object : (Collection<?>) navigationInstance) {
+ if (ANNOTATION_HELPER.keyMatch(targetInstance, object)) {
+ resultData.add(targetInstance);
+ }
+ }
+ } else if (ANNOTATION_HELPER.keyMatch(targetInstance, navigationInstance)) {
+ resultData.add(targetInstance);
}
+ }
- Collection targetData = targetStore.read();
- List resultData = new ArrayList();
- for (Object targetInstance : targetData) {
- Object targetNavigationInstance = getValue(sourceFieldAtTarget, targetInstance);
- if(targetNavigationInstance instanceof Collection) {
- Collection c = (Collection) targetNavigationInstance;
- for (Object object : c) {
- if (ANNOTATION_HELPER.keyMatch(sourceData, object)) {
- resultData.add(targetInstance);
- }
+ EdmNavigationProperty navProperty = sourceField.getAnnotation(EdmNavigationProperty.class);
+ if (navProperty.toMultiplicity() == EdmMultiplicity.MANY) {
+ if (targetKeys.isEmpty()) {
+ return resultData;
+ } else {
+ for (Object result : resultData) {
+ if (ANNOTATION_HELPER.keyMatch(result, targetKeys)) {
+ return result;
}
- } else if (ANNOTATION_HELPER.keyMatch(sourceData, targetNavigationInstance)) {
- resultData.add(targetInstance);
}
- }
-
- if(resultData.isEmpty()) {
return null;
- } else if(navigationInfo.getToMultiplicity() == EdmMultiplicity.ONE) {
- return resultData.get(0);
- } else {
- return resultData;
}
} else {
- throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+ if (resultData.isEmpty()) {
+ return null;
+ }
+ return resultData.get(0);
}
}
@Override
public BinaryData readBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+ throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
Object data = ANNOTATION_HELPER.getValueForField(mediaLinkEntryData, EdmMediaResourceContent.class);
Object mimeType = ANNOTATION_HELPER.getValueForField(mediaLinkEntryData, EdmMediaResourceMimeType.class);
- BinaryData db = new BinaryData((byte[])data, String.valueOf(mimeType));
+ BinaryData db = new BinaryData((byte[]) data, String.valueOf(mimeType));
return db;
}
@Override
public Object newDataObject(EdmEntitySet entitySet)
- throws ODataNotImplementedException, EdmException, ODataApplicationException {
+ throws ODataNotImplementedException, EdmException, ODataApplicationException {
DataStore<Object> dataStore = getDataStore(entitySet);
if (dataStore != null) {
@@ -175,7 +176,7 @@ public class AnnotationInMemoryDs implements ListsDataSource {
@Override
public void writeBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData, BinaryData binaryData)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+ throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
}
@@ -199,7 +200,7 @@ public class AnnotationInMemoryDs implements ListsDataSource {
@Override
public void deleteData(EdmEntitySet entitySet, Map<String, Object> keys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+ throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
DataStore<Object> dataStore = getDataStore(entitySet);
Object keyInstance = dataStore.createInstance();
ANNOTATION_HELPER.setKeyFields(keyInstance, keys);
@@ -208,7 +209,7 @@ public class AnnotationInMemoryDs implements ListsDataSource {
@Override
public void createData(EdmEntitySet entitySet, Object data)
- throws ODataNotImplementedException, EdmException, ODataApplicationException {
+ throws ODataNotImplementedException, EdmException, ODataApplicationException {
DataStore<Object> dataStore = getDataStore(entitySet);
dataStore.create(data);
@@ -216,19 +217,18 @@ public class AnnotationInMemoryDs implements ListsDataSource {
@Override
public void deleteRelation(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
- Map<String, Object> targetKeys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+ Map<String, Object> targetKeys)
+ throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
}
@Override
public void writeRelation(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
- Map<String, Object> targetKeys)
- throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+ Map<String, Object> targetKeys)
+ throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
}
-
/**
* Returns corresponding DataStore for EdmEntitySet or if no data store is registered an
* ODataRuntimeException is thrown.
@@ -240,9 +240,9 @@ public class AnnotationInMemoryDs implements ListsDataSource {
* @throws ODataRuntimeException if no DataStore is found
*/
private DataStore<Object> getDataStore(EdmEntitySet entitySet) throws EdmException {
- final String name = entitySet.getEntityType().getName();
+ final String name = entitySet.getName();
DataStore<Object> dataStore = dataStores.get(name);
- if(dataStore == null) {
+ if (dataStore == null) {
throw new ODataRuntimeException("No DataStore found for entity set '" + entitySet + "'.");
}
return dataStore;
@@ -257,17 +257,17 @@ public class AnnotationInMemoryDs implements ListsDataSource {
return value;
} catch (IllegalArgumentException e) {
throw new ODataRuntimeException("Error for getting value of field '"
- + field + "' at instance '" + instance + "'.", e);
+ + field + "' at instance '" + instance + "'.", e);
} catch (IllegalAccessException e) {
throw new ODataRuntimeException("Error for getting value of field '"
- + field + "' at instance '" + instance + "'.", e);
+ + field + "' at instance '" + instance + "'.", e);
}
}
- private AnnotationHelper.AnnotatedNavInfo extractNavigationInfo(DataStore sourceStore, DataStore targetStore) {
- Class sourceDataTypeClass = sourceStore.getDataTypeClass();
- Class targetDataTypeClass = targetStore.getDataTypeClass();
-
- return ANNOTATION_HELPER.getCommonNavigationInfo(sourceDataTypeClass, targetDataTypeClass);
+ private Field extractSourceField(DataStore<?> sourceStore, DataStore<?> targetStore) {
+ Class<?> sourceDataTypeClass = sourceStore.getDataTypeClass();
+ Class<?> targetDataTypeClass = targetStore.getDataTypeClass();
+
+ return ANNOTATION_HELPER.getCommonNavigationInfo(sourceDataTypeClass, targetDataTypeClass).getFromField();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java
index ceea74d..3408c84 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/data/AnnotationValueAccess.java
@@ -18,23 +18,19 @@
******************************************************************************/
package org.apache.olingo.odata2.core.annotation.data;
-import java.util.Collection;
import org.apache.olingo.odata2.api.data.ValueAccess;
import org.apache.olingo.odata2.api.edm.EdmMapping;
import org.apache.olingo.odata2.api.edm.EdmProperty;
import org.apache.olingo.odata2.api.exception.ODataException;
-import org.apache.olingo.odata2.api.exception.ODataHttpException;
-import org.apache.olingo.odata2.api.exception.ODataNotFoundException;
import org.apache.olingo.odata2.api.exception.ODataNotImplementedException;
import org.apache.olingo.odata2.core.annotation.edm.AnnotationHelper;
-import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
/**
*
*/
public class AnnotationValueAccess implements ValueAccess {
private final AnnotationHelper annotationHelper = new AnnotationHelper();
-
+
/**
* Retrieves the value of an EDM property for the given data object.
* @param data the Java data object
@@ -43,22 +39,7 @@ public class AnnotationValueAccess implements ValueAccess {
*/
@Override
public <T> Object getPropertyValue(final T data, final EdmProperty property) throws ODataException {
- if(data == null) {
- if(property.getFacets() == null || property.getFacets().isNullable()) {
- return null;
- }
- throw new ODataRuntimeException("Invalid value for data '" + data + "' and property '" + property + "'.");
- }
-
- if(data instanceof Collection) {
- Collection c = (Collection) data;
- for (Object object : c) {
- if(annotationHelper.isEdmAnnotated(object)) {
- return annotationHelper.getValueForProperty(object, property.getName());
- }
- }
- }
- if(annotationHelper.isEdmAnnotated(data)) {
+ if (annotationHelper.isEdmAnnotated(data)) {
return annotationHelper.getValueForProperty(data, property.getName());
}
throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
@@ -72,7 +53,7 @@ public class AnnotationValueAccess implements ValueAccess {
*/
@Override
public <T, V> void setPropertyValue(T data, final EdmProperty property, final V value) throws ODataException {
- if(annotationHelper.isEdmAnnotated(data)) {
+ if (annotationHelper.isEdmAnnotated(data)) {
annotationHelper.setValueForProperty(data, property.getName(), value);
} else {
throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
@@ -86,9 +67,9 @@ public class AnnotationValueAccess implements ValueAccess {
* @return the requested Java type
*/
public <T> Class<?> getPropertyType(final T data, final EdmProperty property) throws ODataException {
- if(annotationHelper.isEdmAnnotated(data)) {
+ if (annotationHelper.isEdmAnnotated(data)) {
Class<?> fieldType = annotationHelper.getFieldTypeForProperty(data, property.getName());
- if(fieldType == null) {
+ if (fieldType == null) {
throw new ODataException("No field type found for property " + property);
}
return fieldType;
@@ -103,7 +84,10 @@ public class AnnotationValueAccess implements ValueAccess {
* @return the requested value
*/
public <T> Object getMappingValue(final T data, final EdmMapping mapping) throws ODataException {
- throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+ if (mapping != null && mapping.getMediaResourceMimeTypeKey() != null) {
+ return annotationHelper.getValueForProperty(data, mapping.getMediaResourceMimeTypeKey());
+ }
+ return null;
}
/**
@@ -113,6 +97,8 @@ public class AnnotationValueAccess implements ValueAccess {
* @param value the new value
*/
public <T, V> void setMappingValue(T data, final EdmMapping mapping, final V value) throws ODataException {
- throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+ if (mapping != null && mapping.getMediaResourceMimeTypeKey() != null) {
+ annotationHelper.setValueForProperty(data, mapping.getMediaResourceMimeTypeKey(), value);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/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 55a839e..f52e023 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
@@ -28,11 +28,6 @@ import java.util.Locale;
import java.util.Map;
import org.apache.olingo.odata2.api.annotation.edm.EdmKey;
-import org.apache.olingo.odata2.api.annotation.edm.ds.EntityCreate;
-import org.apache.olingo.odata2.api.annotation.edm.ds.EntityDelete;
-import org.apache.olingo.odata2.api.annotation.edm.ds.EntityRead;
-import org.apache.olingo.odata2.api.annotation.edm.ds.EntitySetRead;
-import org.apache.olingo.odata2.api.annotation.edm.ds.EntityUpdate;
import org.apache.olingo.odata2.api.exception.ODataApplicationException;
import org.apache.olingo.odata2.core.annotation.edm.AnnotationHelper;
import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
@@ -47,25 +42,26 @@ public class DataStore<T> {
private final Class<T> dataTypeClass;
private int idCounter = 1;
-
+
private static class InMemoryDataStore {
private static final Map<Class<?>, DataStore<?>> c2ds = new HashMap<Class<?>, DataStore<?>>();
+
@SuppressWarnings("unchecked")
static DataStore<?> getInstance(Class<?> clz) {
DataStore<?> ds = c2ds.get(clz);
- if(ds == null) {
+ if (ds == null) {
ds = new DataStore<Object>((Class<Object>) clz);
c2ds.put(clz, ds);
}
return ds;
}
}
-
+
@SuppressWarnings("unchecked")
public static <T> DataStore<T> createInMemory(Class<T> clazz) {
return (DataStore<T>) InMemoryDataStore.getInstance(clazz);
}
-
+
private DataStore(List<T> wrapStore, Class<T> clz) {
dataStore = wrapStore;
dataTypeClass = clz;
@@ -74,15 +70,15 @@ public class DataStore<T> {
private DataStore(Class<T> clz) {
this(new ArrayList<T>(), clz);
}
-
+
public Class<T> getDataTypeClass() {
return dataTypeClass;
}
-
+
public String getEntityTypeName() {
return ANNOTATION_HELPER.extractEntityTypeName(dataTypeClass);
}
-
+
public T createInstance() {
try {
return dataTypeClass.newInstance();
@@ -92,8 +88,7 @@ public class DataStore<T> {
throw new ODataRuntimeException("Unable to create instance of class '" + dataTypeClass + "'.", e);
}
}
-
- @EntityRead
+
public T read(T obj) {
List<Object> objKeys = getKeys(obj);
for (T stored : dataStore) {
@@ -104,19 +99,18 @@ public class DataStore<T> {
return null;
}
- @EntitySetRead
public Collection<T> read() {
return Collections.unmodifiableCollection(dataStore);
}
- @EntityCreate
public T create(T object) throws DataStoreException {
- createKeys(object);
+ if (read(object) != null || getKeys(object).contains(null)) {
+ createKeys(object);
+ }
dataStore.add(object);
return object;
}
- @EntityUpdate
public T update(T object) {
T stored = read(object);
dataStore.remove(stored);
@@ -124,55 +118,54 @@ public class DataStore<T> {
return object;
}
- @EntityDelete
public T delete(T object) {
T stored = read(object);
- if(stored != null) {
+ if (stored != null) {
dataStore.remove(stored);
}
return stored;
}
-
+
private List<Object> getKeys(T object) {
Map<String, Object> keys = ANNOTATION_HELPER.getValueForAnnotatedFields(object, EdmKey.class);
-
+
// XXX: list should be in a defined order -> better to create an 'Key' object which is comparable
- List<Object> keyList = new ArrayList(keys.values());
+ List<Object> keyList = new ArrayList<Object>(keys.values());
return keyList;
}
-
+
private T createKeys(T object) throws DataStoreException {
List<Field> fields = ANNOTATION_HELPER.getAnnotatedFields(object, EdmKey.class);
- if(fields.isEmpty()) {
+ if (fields.isEmpty()) {
throw new DataStoreException("No EdmKey annotated fields found for class " + object.getClass());
}
Map<String, Object> fieldName2KeyValue = new HashMap<String, Object>();
-
+
for (Field field : fields) {
Object key = createKey(field);
fieldName2KeyValue.put(ANNOTATION_HELPER.getCanonicalName(field), key);
}
-
+
ANNOTATION_HELPER.setValuesToAnnotatedFields(fieldName2KeyValue, object, EdmKey.class);
-
+
return object;
}
private Object createKey(Field field) {
Class<?> type = field.getType();
-
- if(type == String.class) {
+
+ if (type == String.class) {
return String.valueOf(idCounter++);
- } else if(type == Integer.class || type == int.class) {
+ } else if (type == Integer.class || type == int.class) {
return Integer.valueOf(idCounter++);
- } else if(type == Long.class || type == long.class) {
+ } else if (type == Long.class || type == long.class) {
return Long.valueOf(idCounter++);
}
-
+
throw new UnsupportedOperationException("Automated key generation for type '" + type
- + "' is not supported (caused on field '" + field + "').");
+ + "' is not supported (caused on field '" + field + "').");
}
-
+
public static class DataStoreException extends ODataApplicationException {
public DataStoreException(String message) {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
index 8f9a2f4..5d705dc 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
@@ -20,13 +20,17 @@ package org.apache.olingo.odata2.core.annotation.edm;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import java.math.BigDecimal;
+import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
import org.apache.olingo.odata2.api.annotation.edm.EdmComplexType;
import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
@@ -35,7 +39,6 @@ import org.apache.olingo.odata2.api.annotation.edm.EdmKey;
import org.apache.olingo.odata2.api.annotation.edm.EdmMediaResourceContent;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
import org.apache.olingo.odata2.api.annotation.edm.EdmProperty;
-import org.apache.olingo.odata2.api.annotation.edm.NavigationEnd;
import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
import org.apache.olingo.odata2.api.edm.FullQualifiedName;
@@ -97,7 +100,7 @@ public class AnnotationEdmProvider extends EdmProvider {
return ANNOTATION_HELPER.isEdmAnnotated(c);
}
});
-
+
init();
}
@@ -126,7 +129,7 @@ public class AnnotationEdmProvider extends EdmProvider {
@Override
public AssociationSet getAssociationSet(String entityContainer, FullQualifiedName association,
- String sourceEntitySetName, String sourceEntitySetRole) throws ODataException {
+ String sourceEntitySetName, String sourceEntitySetRole) throws ODataException {
EntityContainer container = name2Container.get(entityContainer);
if (container != null) {
List<AssociationSet> associations = container.getAssociationSets();
@@ -134,12 +137,12 @@ public class AnnotationEdmProvider extends EdmProvider {
if (associationSet.getAssociation().equals(association)) {
final AssociationSetEnd endOne = associationSet.getEnd1();
if (endOne.getRole().equals(sourceEntitySetRole)
- && endOne.getEntitySet().equals(sourceEntitySetName)) {
+ && endOne.getEntitySet().equals(sourceEntitySetName)) {
return associationSet;
}
final AssociationSetEnd endTwo = associationSet.getEnd2();
if (endTwo.getRole().equals(sourceEntitySetRole)
- && endTwo.getEntitySet().equals(sourceEntitySetName)) {
+ && endTwo.getEntitySet().equals(sourceEntitySetName)) {
return associationSet;
}
}
@@ -273,14 +276,14 @@ public class AnnotationEdmProvider extends EdmProvider {
private void handleEntityContainer(Class<?> aClass) {
EdmEntityType entityType = aClass.getAnnotation(EdmEntityType.class);
if (entityType != null) {
- String containerName = getCanonicalContainerName(entityType);
+ String containerName = DEFAULT_CONTAINER_NAME;
ContainerBuilder builder = containerName2ContainerBuilder.get(containerName);
if (builder == null) {
builder = ContainerBuilder.init(entityType.namespace(), containerName);
containerName2ContainerBuilder.put(containerName, builder);
}
EdmEntitySet entitySet = aClass.getAnnotation(EdmEntitySet.class);
- if(entitySet != null) {
+ if (entitySet != null) {
FullQualifiedName typeName = createFqnForEntityType(aClass, entityType);
builder.addEntitySet(createEntitySet(typeName, entitySet));
}
@@ -293,8 +296,8 @@ public class AnnotationEdmProvider extends EdmProvider {
private FullQualifiedName createFqnForEntityType(Class<?> annotatedClass, EdmEntityType entityType) {
String name = entityType.name();
- if(name.isEmpty()) {
- return new FullQualifiedName(entityType.namespace(), annotatedClass.getSimpleName());
+ if (name.isEmpty()) {
+ return new FullQualifiedName(entityType.namespace(), annotatedClass.getSimpleName());
} else {
return new FullQualifiedName(entityType.namespace(), entityType.name());
}
@@ -321,10 +324,6 @@ public class AnnotationEdmProvider extends EdmProvider {
}
}
- private String getCanonicalContainerName(EdmEntityType entity) {
- return DEFAULT_CONTAINER_NAME;
- }
-
//
//
//
@@ -340,10 +339,10 @@ public class AnnotationEdmProvider extends EdmProvider {
private final List<NavigationProperty> navProperties = new ArrayList<NavigationProperty>();
private final List<Association> associations = new ArrayList<Association>();
-// public TypeBuilder(String namespace, String name) {
-// this.namespace = namespace;
-// this.name = name;
-// }
+ // public TypeBuilder(String namespace, String name) {
+ // this.namespace = namespace;
+ // this.name = name;
+ // }
public TypeBuilder(FullQualifiedName fqn) {
this.namespace = fqn.getNamespace();
this.name = fqn.getName();
@@ -382,7 +381,7 @@ public class AnnotationEdmProvider extends EdmProvider {
associations.add(association);
}
EdmMediaResourceContent emrc = field.getAnnotation(EdmMediaResourceContent.class);
- if(emrc != null) {
+ if (emrc != null) {
isMediaResource = true;
}
}
@@ -416,7 +415,7 @@ public class AnnotationEdmProvider extends EdmProvider {
complexType.setBaseType(baseEntityType);
}
return complexType.setName(name)
- .setProperties(properties);
+ .setProperties(properties);
}
public EntityType buildEntityType() {
@@ -431,9 +430,9 @@ public class AnnotationEdmProvider extends EdmProvider {
entityType.setNavigationProperties(navProperties);
}
return entityType.setName(name)
- .setAbstract(isAbstract)
- .setHasStream(isMediaResource)
- .setProperties(properties);
+ .setAbstract(isAbstract)
+ .setHasStream(isMediaResource)
+ .setProperties(properties);
}
public Collection<Association> buildAssociations() {
@@ -450,13 +449,12 @@ public class AnnotationEdmProvider extends EdmProvider {
}
private Property createProperty(EdmProperty ep, Field field, String defaultNamespace) {
- if(isAnnotatedEntity(field.getType())) {
+ if (isAnnotatedEntity(field.getType())) {
return createComplexProperty(field, defaultNamespace);
} else {
return createSimpleProperty(ep, field);
}
}
-
private Property createSimpleProperty(EdmProperty ep, Field field) {
SimpleProperty sp = new SimpleProperty();
@@ -477,7 +475,7 @@ public class AnnotationEdmProvider extends EdmProvider {
// settings from property
String entityName = ANNOTATION_HELPER.getPropertyName(field);
cp.setName(entityName);
-
+
// settings from related complex entity
EdmComplexType ece = field.getType().getAnnotation(EdmComplexType.class);
String complexEntityNamespace = ece.namespace();
@@ -491,18 +489,14 @@ public class AnnotationEdmProvider extends EdmProvider {
private NavigationProperty createNavigationProperty(String namespace, EdmNavigationProperty enp, Field field) {
NavigationProperty navProp = new NavigationProperty();
- String entityName = ANNOTATION_HELPER.getPropertyName(field);
- navProp.setName(entityName);
- //
- NavigationEnd from = enp.from();
- String fromRole = ANNOTATION_HELPER.extractRoleName(from, field.getDeclaringClass());
+ navProp.setName(ANNOTATION_HELPER.getPropertyName(field));
+ String fromRole = ANNOTATION_HELPER.extractFromRoleName(enp, field);
navProp.setFromRole(fromRole);
- NavigationEnd to = enp.to();
- String toRole = ANNOTATION_HELPER.extractRoleName(to, field.getType());
+ String toRole = ANNOTATION_HELPER.extractToRoleName(enp, field);
navProp.setToRole(toRole);
- String relationshipName = ANNOTATION_HELPER.extractRelationshipName(enp, fromRole, toRole);
+ String relationshipName = ANNOTATION_HELPER.extractRelationshipName(enp, field);
navProp.setRelationship(new FullQualifiedName(namespace, relationshipName));
return navProp;
@@ -511,18 +505,32 @@ public class AnnotationEdmProvider extends EdmProvider {
private EdmSimpleTypeKind getEdmSimpleType(Class<?> type) {
if (type == String.class) {
return EdmSimpleTypeKind.String;
+ } else if (type == boolean.class || type == Boolean.class) {
+ return EdmSimpleTypeKind.Boolean;
+ } else if (type == byte.class || type == Byte.class) {
+ return EdmSimpleTypeKind.SByte;
+ } else if (type == short.class || type == Short.class) {
+ return EdmSimpleTypeKind.Int16;
} else if (type == int.class || type == Integer.class) {
return EdmSimpleTypeKind.Int32;
- } else if (type == double.class || type == Double.class) {
- return EdmSimpleTypeKind.Double;
} else if (type == long.class || type == Long.class) {
return EdmSimpleTypeKind.Int64;
- } else if (type == Calendar.class) {
- return EdmSimpleTypeKind.DateTime;
+ } else if (type == double.class || type == Double.class) {
+ return EdmSimpleTypeKind.Double;
+ } else if (type == float.class || type == Float.class) {
+ return EdmSimpleTypeKind.Single;
+ } else if (type == BigInteger.class || type == BigDecimal.class) {
+ return EdmSimpleTypeKind.Decimal;
} else if (type == Byte[].class || type == byte[].class) {
return EdmSimpleTypeKind.Binary;
+ } else if (type == Date.class) {
+ return EdmSimpleTypeKind.DateTime;
+ } else if (type == Calendar.class) {
+ return EdmSimpleTypeKind.DateTimeOffset;
+ } else if (type == UUID.class) {
+ return EdmSimpleTypeKind.Guid;
} else {
- throw new UnsupportedOperationException("Not yet supported type '" + type + "'.");
+ throw new UnsupportedOperationException("Not yet supported type '" + type + "'.");
}
}
@@ -552,29 +560,18 @@ public class AnnotationEdmProvider extends EdmProvider {
Association association = new Association();
EdmNavigationProperty navigation = field.getAnnotation(EdmNavigationProperty.class);
- NavigationEnd from = navigation.from();
AssociationEnd fromEnd = new AssociationEnd();
fromEnd.setRole(navProperty.getFromRole());
- String typeName = ANNOTATION_HELPER.extractEntitTypeName(from, field.getDeclaringClass());
+ String typeName = ANNOTATION_HELPER.extractEntityTypeName(field.getDeclaringClass());
fromEnd.setType(new FullQualifiedName(namespace, typeName));
- fromEnd.setMultiplicity(from.multiplicity());
+ fromEnd.setMultiplicity(EdmMultiplicity.ONE);
association.setEnd1(fromEnd);
- NavigationEnd to = navigation.to();
AssociationEnd toEnd = new AssociationEnd();
toEnd.setRole(navProperty.getToRole());
- String toTypeName = ANNOTATION_HELPER.extractEntitTypeName(to, field.getType());
+ String toTypeName = ANNOTATION_HELPER.extractEntitTypeName(navigation, field);
toEnd.setType(new FullQualifiedName(namespace, toTypeName));
-
- EdmMultiplicity toMultiplicity = to.multiplicity();
- Class<?> toClass = field.getType();
- boolean isCollectionType = toClass.isArray() || Collection.class.isAssignableFrom(toClass);
- if (toMultiplicity == EdmMultiplicity.ONE && isCollectionType) {
- // XXX: magic, please check and or remove/refactore
- toEnd.setMultiplicity(EdmMultiplicity.MANY);
- } else {
- toEnd.setMultiplicity(toMultiplicity);
- }
+ toEnd.setMultiplicity(ANNOTATION_HELPER.getMultiplicity(navigation, field));
association.setEnd2(toEnd);
String associationName = navProperty.getRelationship().getName();
@@ -585,7 +582,7 @@ public class AnnotationEdmProvider extends EdmProvider {
private String getCanonicalName(Field field) {
return ANNOTATION_HELPER.getCanonicalName(field);
}
-
+
private boolean isAnnotatedEntity(Class<?> clazz) {
return ANNOTATION_HELPER.isEdmTypeAnnotated(clazz);
}
@@ -594,7 +591,7 @@ public class AnnotationEdmProvider extends EdmProvider {
static class SchemaBuilder {
final private String namespace;
-// private String alias;
+ // private String alias;
private final List<Using> usings = new ArrayList<Using>();
private final List<EntityType> entityTypes = new ArrayList<EntityType>();
private final List<ComplexType> complexTypes = new ArrayList<ComplexType>();
@@ -641,7 +638,7 @@ public class AnnotationEdmProvider extends EdmProvider {
AssociationEnd oneEnd2 = associationOne.getEnd2();
AssociationEnd twoEnd1 = associationTwo.getEnd1();
AssociationEnd twoEnd2 = associationTwo.getEnd2();
- AssociationEnd[] oneEnds = new AssociationEnd[]{oneEnd1, oneEnd2};
+ AssociationEnd[] oneEnds = new AssociationEnd[] { oneEnd1, oneEnd2 };
for (AssociationEnd associationEnd : oneEnds) {
if (associationEnd.getRole().equals(twoEnd1.getRole())) {
@@ -677,10 +674,11 @@ public class AnnotationEdmProvider extends EdmProvider {
final private String name;
final private String namespace;
private boolean defaultContainer = true;
- private List<EntitySet> entitySets = new ArrayList<EntitySet>();
- private List<AssociationSet> associationSets = new ArrayList<AssociationSet>();
- private List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
-// private Documentation documentation;
+ private final List<EntitySet> entitySets = new ArrayList<EntitySet>();
+ private final List<AssociationSet> associationSets = new ArrayList<AssociationSet>();
+ private final List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
+
+ // private Documentation documentation;
private ContainerBuilder(String namespace, String containerName) {
this.namespace = namespace;
@@ -704,7 +702,7 @@ public class AnnotationEdmProvider extends EdmProvider {
entitySets.add(entitySet);
return this;
}
-
+
public void addAssociationSets(Collection<Association> associations) {
for (Association association : associations) {
AssociationSet as = new AssociationSet();
@@ -716,12 +714,12 @@ public class AnnotationEdmProvider extends EdmProvider {
asEnd1.setEntitySet(getEntitySetName(association.getEnd1()));
asEnd1.setRole(association.getEnd1().getRole());
as.setEnd1(asEnd1);
-
+
AssociationSetEnd asEnd2 = new AssociationSetEnd();
asEnd2.setEntitySet(getEntitySetName(association.getEnd2()));
asEnd2.setRole(association.getEnd2().getRole());
as.setEnd2(asEnd2);
-
+
associationSets.add(as);
}
}
@@ -736,10 +734,9 @@ public class AnnotationEdmProvider extends EdmProvider {
return ec;
}
-
private String getEntitySetName(AssociationEnd end) {
for (EntitySet entitySet : entitySets) {
- if(entitySet.getEntityType().equals(end.getType())) {
+ if (entitySet.getEntityType().equals(end.getType())) {
return entitySet.getName();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java
index dfa461a..7e92284 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationHelper.java
@@ -16,7 +16,9 @@ package org.apache.olingo.odata2.core.annotation.edm;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@@ -29,7 +31,6 @@ import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
import org.apache.olingo.odata2.api.annotation.edm.EdmKey;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
import org.apache.olingo.odata2.api.annotation.edm.EdmProperty;
-import org.apache.olingo.odata2.api.annotation.edm.NavigationEnd;
import org.apache.olingo.odata2.api.edm.EdmLiteralKind;
import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException;
@@ -43,6 +44,13 @@ import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
*/
public class AnnotationHelper {
+ /**
+ * Compare keys of both instances.
+ *
+ * @param firstInstance
+ * @param secondInstance
+ * @return
+ */
public boolean keyMatch(Object firstInstance, Object secondInstance) {
if (firstInstance == null || secondInstance == null) {
return false;
@@ -53,13 +61,29 @@ public class AnnotationHelper {
Map<String, Object> firstKeyFields = getValueForAnnotatedFields(firstInstance, EdmKey.class);
Map<String, Object> secondKeyFields = getValueForAnnotatedFields(secondInstance, EdmKey.class);
- if (firstKeyFields.size() != secondKeyFields.size()) {
+ return keyValuesMatch(firstKeyFields, secondKeyFields);
+ }
+
+ /**
+ * Compare keys of instance with key values in map.
+ *
+ * @param instance
+ * @param keyName2Value
+ * @return
+ */
+ public boolean keyMatch(Object instance, Map<String, Object> keyName2Value) {
+ Map<String, Object> instanceKeyFields = getValueForAnnotatedFields(instance, EdmKey.class);
+ return keyValuesMatch(instanceKeyFields, keyName2Value);
+ }
+
+ private boolean keyValuesMatch(Map<String, Object> firstKeyValues, Map<String, Object> secondKeyValues) {
+ if (firstKeyValues.size() != secondKeyValues.size()) {
return false;
} else {
- Set<Map.Entry<String, Object>> entries = firstKeyFields.entrySet();
+ Set<Map.Entry<String, Object>> entries = firstKeyValues.entrySet();
for (Map.Entry<String, Object> entry : entries) {
Object firstKey = entry.getValue();
- Object secondKey = secondKeyFields.get(entry.getKey());
+ Object secondKey = secondKeyValues.get(entry.getKey());
if (!isEqual(firstKey, secondKey)) {
return false;
}
@@ -67,7 +91,7 @@ public class AnnotationHelper {
return true;
}
}
-
+
private boolean isEqual(Object firstKey, Object secondKey) {
if (firstKey == null) {
if (secondKey == null) {
@@ -80,19 +104,20 @@ public class AnnotationHelper {
}
}
- public String extractEntitTypeName(NavigationEnd navEnd, Class<?> fallbackClass) {
- Class<?> entityTypeClass = navEnd.entitySet();
+ public String extractEntitTypeName(EdmNavigationProperty enp, Class<?> fallbackClass) {
+ Class<?> entityTypeClass = enp.toType();
+ return extractEntityTypeName(entityTypeClass == Object.class ? fallbackClass : entityTypeClass);
+ }
+
+ public String extractEntitTypeName(EdmNavigationProperty enp, Field field) {
+ Class<?> entityTypeClass = enp.toType();
if (entityTypeClass == Object.class) {
- return extractEntityTypeName(fallbackClass);
- }
- EdmEntityType type = entityTypeClass.getAnnotation(EdmEntityType.class);
- if (type == null) {
- return null;
- }
- if(type.name().isEmpty()) {
- return extractEntityTypeName(fallbackClass);
+ Class<?> toClass = field.getType();
+ return extractEntityTypeName((toClass.isArray() || Collection.class.isAssignableFrom(toClass) ?
+ (Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0] : toClass));
+ } else {
+ return extractEntityTypeName(entityTypeClass);
}
- return type.name();
}
/**
@@ -165,7 +190,7 @@ public class AnnotationHelper {
EdmNavigationProperty navProperty = field.getAnnotation(EdmNavigationProperty.class);
if (navProperty == null) {
throw new EdmAnnotationException("Given field '" + field
- + "' has no EdmProperty or EdmNavigationProperty annotation.");
+ + "' has no EdmProperty or EdmNavigationProperty annotation.");
}
return navProperty.name();
}
@@ -180,53 +205,54 @@ public class AnnotationHelper {
return propertyName;
}
- public String extractRoleName(NavigationEnd navigationEnd, Class<?> fallbackClass) {
- String role = navigationEnd.role();
- if (role.isEmpty()) {
- role = getCanonicalRole(navigationEnd, fallbackClass);
- }
- return role;
+ public String extractFromRoleName(EdmNavigationProperty enp, Field field) {
+ return getCanonicalRole(field.getDeclaringClass());
}
-
- public String getCanonicalRole(NavigationEnd navEnd, Class<?> fallbackClass) {
- String toRole = extractEntityTypeName(navEnd.entitySet());
- if (toRole == null) {
- toRole = extractEntityTypeName(fallbackClass);
+
+ public String extractToRoleName(EdmNavigationProperty enp, Field field) {
+ String role = enp.toRole();
+ if (role.isEmpty()) {
+ role = getCanonicalRole(
+ field.getType().isArray() || Collection.class.isAssignableFrom(field.getType()) ?
+ (Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0] : field.getType());
}
+ return role;
+ }
+
+ public String getCanonicalRole(Class<?> fallbackClass) {
+ String toRole = extractEntityTypeName(fallbackClass);
return "r_" + toRole;
}
public String extractRelationshipName(EdmNavigationProperty enp, Field field) {
- String fromRole = extractRoleName(enp.from(), field.getDeclaringClass());
- String toRole = extractRoleName(enp.to(), field.getType());
-
- return extractRelationshipName(enp, fromRole, toRole);
- }
-
- public String extractRelationshipName(EdmNavigationProperty enp, String fromRole, String toRole) {
- String relationshipName = enp.association();
- if(relationshipName.isEmpty()) {
- if(fromRole.compareTo(toRole) > 0) {
- relationshipName = toRole + "-" + fromRole;
- } else {
- relationshipName = fromRole + "-" + toRole;
- }
+ String relationshipName = enp.association();
+ if (relationshipName.isEmpty()) {
+ final String fromRole = extractFromRoleName(enp, field);
+ final String toRole = extractToRoleName(enp, field);
+ if (fromRole.compareTo(toRole) > 0) {
+ relationshipName = toRole + "-" + fromRole;
+ } else {
+ relationshipName = fromRole + "-" + toRole;
}
- return relationshipName;
+ }
+ return relationshipName;
}
- public static final class ODataAnnotationException extends ODataException {
+ public EdmMultiplicity getMultiplicity(EdmNavigationProperty enp, Field field) {
+ EdmMultiplicity multiplicity = enp.toMultiplicity();
+ final boolean isCollectionType = field.getType().isArray() || Collection.class.isAssignableFrom(field.getType());
- public ODataAnnotationException(String message) {
- super(message);
+ if (multiplicity == EdmMultiplicity.ONE && isCollectionType) {
+ return EdmMultiplicity.MANY;
}
+ return multiplicity;
}
public <T> T setKeyFields(T instance, Map<String, Object> keys) {
List<Field> fields = getAnnotatedFields(instance, EdmKey.class);
if (fields.size() != keys.size()) {
throw new IllegalStateException("Wrong amount of key properties. Expected read keys = "
- + fields + " given key predicates = " + keys);
+ + fields + " given key predicates = " + keys);
}
for (Field field : fields) {
@@ -238,15 +264,21 @@ public class AnnotationHelper {
return instance;
}
- public static class AnnotatedNavInfo {
+ public static final class ODataAnnotationException extends ODataException {
+ public ODataAnnotationException(String message) {
+ super(message);
+ }
+ }
+
+ public class AnnotatedNavInfo {
private final Field fromField;
private final Field toField;
private final EdmNavigationProperty fromNavigation;
private final EdmNavigationProperty toNavigation;
public AnnotatedNavInfo(Field fromField, Field toField, EdmNavigationProperty fromNavigation,
- EdmNavigationProperty toNavigation) {
+ EdmNavigationProperty toNavigation) {
this.fromField = fromField;
this.toField = toField;
this.fromNavigation = fromNavigation;
@@ -262,33 +294,11 @@ public class AnnotationHelper {
}
public EdmMultiplicity getFromMultiplicity() {
- EdmMultiplicity from = fromNavigation.from().multiplicity();
- EdmMultiplicity to = toNavigation.to().multiplicity();
-
- if (from.equals(to)) {
- return from;
- } else {
- if (EdmMultiplicity.MANY == from || EdmMultiplicity.MANY == to) {
- return EdmMultiplicity.MANY;
- } else {
- return EdmMultiplicity.ONE;
- }
- }
+ return getMultiplicity(toNavigation, toField);
}
public EdmMultiplicity getToMultiplicity() {
- EdmMultiplicity from = fromNavigation.to().multiplicity();
- EdmMultiplicity to = toNavigation.from().multiplicity();
-
- if (from.equals(to)) {
- return from;
- } else {
- if (EdmMultiplicity.MANY == from || EdmMultiplicity.MANY == to) {
- return EdmMultiplicity.MANY;
- } else {
- return EdmMultiplicity.ONE;
- }
- }
+ return getMultiplicity(fromNavigation, fromField);
}
}
@@ -296,12 +306,12 @@ public class AnnotationHelper {
List<Field> sourceFields = getAnnotatedFields(sourceClass, EdmNavigationProperty.class);
List<Field> targetFields = getAnnotatedFields(targetClass, EdmNavigationProperty.class);
- for (Field targetField : targetFields) {
- for (Field sourceField : sourceFields) {
- EdmNavigationProperty sourceNav = sourceField.getAnnotation(EdmNavigationProperty.class);
- EdmNavigationProperty targetNav = targetField.getAnnotation(EdmNavigationProperty.class);
- String sourceAssociation = extractRelationshipName(sourceNav, sourceField);
- String targetAssociation = extractRelationshipName(targetNav, targetField);
+ for (Field sourceField : sourceFields) {
+ final EdmNavigationProperty sourceNav = sourceField.getAnnotation(EdmNavigationProperty.class);
+ final String sourceAssociation = extractRelationshipName(sourceNav, sourceField);
+ for (Field targetField : targetFields) {
+ final EdmNavigationProperty targetNav = targetField.getAnnotation(EdmNavigationProperty.class);
+ final String targetAssociation = extractRelationshipName(targetNav, targetField);
if (sourceAssociation.equals(targetAssociation)) {
return new AnnotatedNavInfo(sourceField, targetField, sourceNav, targetNav);
}
@@ -310,22 +320,6 @@ public class AnnotationHelper {
return null;
}
- public Field getCommonNavigationFieldFromTarget(Class<?> sourceClass, Class<?> targetClass) {
- List<Field> sourceFields = getAnnotatedFields(sourceClass, EdmNavigationProperty.class);
- List<Field> targetFields = getAnnotatedFields(targetClass, EdmNavigationProperty.class);
-
- for (Field targetField : targetFields) {
- for (Field sourcField : sourceFields) {
- EdmNavigationProperty sourceNav = sourcField.getAnnotation(EdmNavigationProperty.class);
- EdmNavigationProperty targetNav = targetField.getAnnotation(EdmNavigationProperty.class);
- if (sourceNav.association().equals(targetNav.association())) {
- return targetField;
- }
- }
- }
- return null;
- }
-
public Class<?> getFieldTypeForProperty(Object instance, String propertyName) throws ODataAnnotationException {
if (instance == null) {
return null;
@@ -334,7 +328,7 @@ public class AnnotationHelper {
Field field = getFieldForPropertyName(instance, propertyName, instance.getClass(), true);
if (field == null) {
throw new ODataAnnotationException("No field for property '" + propertyName
- + "' found at class '" + instance.getClass() + "'.");
+ + "' found at class '" + instance.getClass() + "'.");
}
return field.getType();
}
@@ -347,7 +341,7 @@ public class AnnotationHelper {
Field field = getFieldForPropertyName(instance, propertyName, instance.getClass(), true);
if (field == null) {
throw new ODataAnnotationException("No field for property '" + propertyName
- + "' found at class '" + instance.getClass() + "'.");
+ + "' found at class '" + instance.getClass() + "'.");
}
return getFieldValue(instance, field);
}
@@ -362,7 +356,7 @@ public class AnnotationHelper {
}
private Field getFieldForPropertyName(Object instance, String propertyName,
- Class<?> resultClass, boolean inherited) {
+ Class<?> resultClass, boolean inherited) {
if (instance == null) {
return null;
}
@@ -402,17 +396,17 @@ public class AnnotationHelper {
}
private Object getValueForField(Object instance, Class<?> resultClass,
- Class<? extends Annotation> annotation, boolean inherited) {
+ Class<? extends Annotation> annotation, boolean inherited) {
return getValueForField(instance, null, resultClass, annotation, inherited);
}
public Map<String, Object> getValueForAnnotatedFields(Object instance,
- Class<? extends Annotation> annotation) {
+ Class<? extends Annotation> annotation) {
return getValueForAnnotatedFields(instance, instance.getClass(), annotation, true);
}
private Map<String, Object> getValueForAnnotatedFields(Object instance, Class<?> resultClass,
- Class<? extends Annotation> annotation, boolean inherited) {
+ Class<? extends Annotation> annotation, boolean inherited) {
if (instance == null) {
return null;
}
@@ -423,7 +417,9 @@ public class AnnotationHelper {
for (Field field : fields) {
if (field.getAnnotation(annotation) != null) {
Object value = getFieldValue(instance, field);
- fieldName2Value.put(field.getName(), value);
+ final EdmProperty property = field.getAnnotation(EdmProperty.class);
+ final String name = property == null || property.name().isEmpty() ? field.getName() : property.name();
+ fieldName2Value.put(name, value);
}
}
@@ -437,7 +433,7 @@ public class AnnotationHelper {
}
public void setValuesToAnnotatedFields(Map<String, Object> fieldName2Value, Object instance,
- Class<? extends Annotation> annotation) {
+ Class<? extends Annotation> annotation) {
List<Field> fields = getAnnotatedFields(instance, annotation);
// XXX: refactore
@@ -470,7 +466,7 @@ public class AnnotationHelper {
* @return
*/
private List<Field> getAnnotatedFields(Class<?> resultClass,
- Class<? extends Annotation> annotation, boolean inherited) {
+ Class<? extends Annotation> annotation, boolean inherited) {
if (resultClass == null) {
return null;
}
@@ -494,7 +490,7 @@ public class AnnotationHelper {
}
private Object getValueForField(Object instance, String fieldName, Class<?> resultClass,
- Class<? extends Annotation> annotation, boolean inherited) {
+ Class<? extends Annotation> annotation, boolean inherited) {
if (instance == null) {
return null;
}
@@ -502,7 +498,7 @@ public class AnnotationHelper {
Field[] fields = resultClass.getDeclaredFields();
for (Field field : fields) {
if (field.getAnnotation(annotation) != null
- && (fieldName == null || field.getName().equals(fieldName))) {
+ && (fieldName == null || field.getName().equals(fieldName))) {
return getFieldValue(instance, field);
}
}
@@ -532,8 +528,8 @@ public class AnnotationHelper {
private void setFieldValue(Object instance, Field field, Object propertyValue) {
try {
if (propertyValue != null
- && field.getType() != propertyValue.getClass()
- && propertyValue.getClass() == String.class) {
+ && field.getType() != propertyValue.getClass()
+ && propertyValue.getClass() == String.class) {
propertyValue = convert(field, (String) propertyValue);
}
boolean access = field.isAccessible();
@@ -548,15 +544,15 @@ public class AnnotationHelper {
}
public Object convert(Field field, String propertyValue) {
- Class fieldClass = field.getType();
+ Class<?> fieldClass = field.getType();
try {
EdmProperty property = field.getAnnotation(EdmProperty.class);
EdmSimpleTypeKind type = property.type();
return type.getEdmSimpleTypeInstance().valueOfString(propertyValue,
- EdmLiteralKind.DEFAULT, null, fieldClass);
+ EdmLiteralKind.DEFAULT, null, fieldClass);
} catch (EdmSimpleTypeException ex) {
throw new ODataRuntimeException("Conversion failed for string property with error: "
- + ex.getMessage(), ex);
+ + ex.getMessage(), ex);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/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 f659383..b4a2c6f 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
@@ -1001,9 +1001,8 @@ public class ListsProcessor extends ODataSingleProcessor {
relatedData = null;
}
- if(relatedData == null) {
- result.setEntryData(new HashMap<String, Object>());
- return result;
+ if (relatedData == null) {
+ result.setEntryData(Collections.<String, Object> emptyMap());
} else {
result.setEntryData(getStructuralTypeValueMap(relatedData, entityType));
@@ -1012,8 +1011,8 @@ public class ListsProcessor extends ODataSingleProcessor {
getCallbacks(relatedData, entityType)).expandSelectTree(context.getCurrentExpandSelectTreeNode())
.build();
result.setInlineProperties(inlineProperties);
- return result;
}
+ return result;
} catch (final ODataException e) {
throw new ODataApplicationException(e.getLocalizedMessage(), Locale.ROOT, e);
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/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 0aaf309..3063004 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
@@ -17,18 +17,17 @@ package org.apache.olingo.odata2.core.annotation.data;
import java.util.HashMap;
import java.util.Map;
+
import org.apache.olingo.odata2.api.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.edm.EdmEntityType;
import org.apache.olingo.odata2.api.edm.FullQualifiedName;
-import org.apache.olingo.odata2.api.edm.provider.EntityType;
-import org.apache.olingo.odata2.api.exception.ODataApplicationException;
+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.model.Building;
import org.apache.olingo.odata2.core.annotation.model.ModelSharedConstants;
import org.apache.olingo.odata2.core.annotation.model.Photo;
import org.junit.Assert;
-import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;
@@ -36,7 +35,7 @@ import org.mockito.Mockito;
*
*/
public class AnnotationsInMemoryDsTest {
-
+
private final AnnotationInMemoryDs datasource;
private AnnotationEdmProvider edmProvider;
private static final String DEFAULT_CONTAINER = ModelSharedConstants.CONTAINER_1;
@@ -47,59 +46,55 @@ public class AnnotationsInMemoryDsTest {
edmProvider = new AnnotationEdmProvider(Building.class.getPackage().getName());
}
-
- @Test(expected = ODataApplicationException.class)
- public void invalidEntity() throws Exception {
- EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Building");
-
- datasource.createData(edmEntitySet, this);
- }
+ // @Test(expected = ODataApplicationException.class)
+ // public void invalidEntity() throws Exception {
+ // EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Buildings");
+ //
+ // datasource.createData(edmEntitySet, this);
+ // }
@Test
public void createSimpleEntity() throws Exception {
- EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Building");
-
+ EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Buildings");
+
Building building = new Building();
building.setName("Common Building");
datasource.createData(edmEntitySet, building);
-
+
Map<String, Object> keys = new HashMap<String, Object>();
keys.put("Id", "1");
-
+
Building read = (Building) datasource.readData(edmEntitySet, keys);
Assert.assertEquals("Common Building", read.getName());
}
@Test
public void createEntityTwoKeys() throws Exception {
- EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Photo");
-
+ EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Photos");
+
Photo photo = new Photo();
photo.setName("BigPicture");
photo.setType("PNG");
photo.setImageUri("https://localhost/image.png");
photo.setImageType("image/png");
datasource.createData(edmEntitySet, photo);
-
+
Map<String, Object> keys = new HashMap<String, Object>();
-// keys.put("ImageFormat", "PNG");
-// keys.put("Name", "BigPicture");
- keys.put("Name", "1");
- keys.put("ImageFormat", "2");
-
+ keys.put("ImageFormat", "PNG");
+ keys.put("Name", "BigPicture");
+
Photo read = (Photo) datasource.readData(edmEntitySet, keys);
-// Assert.assertEquals("BigPicture", read.getName());
- 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());
}
@Test
-// @Ignore("Rethink update method")
+ // @Ignore("Rethink update method")
public void createAndUpdateEntityTwoKeys() throws Exception {
- EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Photo");
-
+ EdmEntitySet edmEntitySet = createMockedEdmEntitySet("Photos");
+
Photo photo = new Photo();
final String nameKeyValue = "BigPicture";
final String typeKeyValue = "PNG";
@@ -108,34 +103,33 @@ public class AnnotationsInMemoryDsTest {
photo.setImageUri("https://localhost/image.png");
photo.setImageType("image/png");
datasource.createData(edmEntitySet, photo);
-
+
Map<String, Object> keys = new HashMap<String, Object>();
keys.put("Name", "1");
keys.put("ImageFormat", "2");
-
+
Photo read = (Photo) datasource.readData(edmEntitySet, keys);
Assert.assertEquals("1", read.getName());
Assert.assertEquals("2", 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(nameKeyValue);
+ // updatedPhoto.setType(typeKeyValue);
updatedPhoto.setName("1");
updatedPhoto.setType("2");
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", nameKeyValue);
+ // updatedKeys.put("ImageFormat", typeKeyValue);
updatedKeys.put("Name", "1");
updatedKeys.put("ImageFormat", "2");
-
+
Photo readUpdated = (Photo) datasource.readData(edmEntitySet, updatedKeys);
Assert.assertEquals("1", readUpdated.getName());
Assert.assertEquals("2", readUpdated.getType());
@@ -144,14 +138,15 @@ public class AnnotationsInMemoryDsTest {
}
private EdmEntitySet createMockedEdmEntitySet(String entitySetName) throws ODataException {
-// EntitySet entitySet = edmProvider.getEntitySet(DEFAULT_CONTAINER, entitySetName);
- EntityType entityType = edmProvider.getEntityType(new FullQualifiedName(DEFAULT_NAMESPACE, entitySetName));
-
+ EntitySet entitySet = edmProvider.getEntitySet(DEFAULT_CONTAINER, entitySetName);
+ FullQualifiedName entityType = entitySet.getEntityType();
+
EdmEntitySet edmEntitySet = Mockito.mock(EdmEntitySet.class);
+ Mockito.when(edmEntitySet.getName()).thenReturn(entitySetName);
EdmEntityType edmEntityType = Mockito.mock(EdmEntityType.class);
Mockito.when(edmEntitySet.getEntityType()).thenReturn(edmEntityType);
Mockito.when(edmEntityType.getName()).thenReturn(entityType.getName());
-
+
return edmEntitySet;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProviderTest.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProviderTest.java b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProviderTest.java
index 4d1a6b7..b772d6c 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProviderTest.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProviderTest.java
@@ -86,7 +86,7 @@ public class AnnotationEdmProviderTest {
final List<PropertyRef> employeeKeys = employee.getKey().getKeys();
assertEquals(1, employeeKeys.size());
assertEquals("EmployeeId", employeeKeys.get(0).getName());
- assertEquals(4, employee.getProperties().size());
+ assertEquals(6, employee.getProperties().size());
assertEquals(3, employee.getNavigationProperties().size());
List<Schema> schemas = localAep.getSchemas();
@@ -165,7 +165,7 @@ public class AnnotationEdmProviderTest {
private void validateAssociation(Association association) {
String name = association.getName();
- if(name.equals("RoomEmployees")) {
+ if(name.equals("r_Employee-r_Room")) {
validateAssociation(association,
"r_Room", EdmMultiplicity.ONE, defaultFqn("Room"),
"r_Employee", EdmMultiplicity.MANY, defaultFqn("Employee"));
@@ -176,8 +176,8 @@ public class AnnotationEdmProviderTest {
} else if(name.equals("ManagerEmployees")) {
validateAssociation(association,
"r_Manager", EdmMultiplicity.ONE, defaultFqn("Manager"),
- "r_Employees", EdmMultiplicity.MANY, defaultFqn("Employee"));
- } else if(name.equals("r_Employee-r_Team")) {
+ "r_Employee", EdmMultiplicity.MANY, defaultFqn("Employee"));
+ } else if(name.equals("TeamEmployees")) {
validateAssociation(association,
"r_Team", EdmMultiplicity.ONE, defaultFqn("Team"),
"r_Employee", EdmMultiplicity.MANY, defaultFqn("Employee"));
@@ -227,16 +227,16 @@ public class AnnotationEdmProviderTest {
final List<PropertyRef> employeeKeys = employee.getKey().getKeys();
assertEquals(1, employeeKeys.size());
assertEquals("EmployeeId", employeeKeys.get(0).getName());
- assertEquals(4, employee.getProperties().size());
+ assertEquals(6, employee.getProperties().size());
assertEquals(3, employee.getNavigationProperties().size());
for (NavigationProperty navigationProperty : employee.getNavigationProperties()) {
if (navigationProperty.getName().equals("ne_Manager")) {
- validateNavProperty(navigationProperty, "ManagerEmployees", "r_Employees", "r_Manager");
+ validateNavProperty(navigationProperty, "ManagerEmployees", "r_Employee", "r_Manager");
} else if (navigationProperty.getName().equals("ne_Team")) {
- validateNavProperty(navigationProperty, "r_Employee-r_Team", "r_Employee", "r_Team");
+ validateNavProperty(navigationProperty, "TeamEmployees", "r_Employee", "r_Team");
} else if (navigationProperty.getName().equals("ne_Room")) {
- validateNavProperty(navigationProperty, "RoomEmployees", "r_Employee", "r_Room");
+ validateNavProperty(navigationProperty, "r_Employee-r_Room", "r_Employee", "r_Room");
} else {
fail("Got unexpected navigation property with name '" + navigationProperty.getName() + "'.");
}
@@ -254,7 +254,7 @@ public class AnnotationEdmProviderTest {
assertEquals(1, team.getProperties().size());
assertEquals(1, team.getNavigationProperties().size());
NavigationProperty navigationProperty= team.getNavigationProperties().get(0);
- validateNavProperty(navigationProperty, "r_Employee-r_Team", "r_Team", "r_Employee");
+ validateNavProperty(navigationProperty, "TeamEmployees", "r_Team", "r_Employee");
}
@Test
@@ -335,7 +335,7 @@ public class AnnotationEdmProviderTest {
for (NavigationProperty navigationProperty : navigationProperties) {
if(navigationProperty.getName().equals("nr_Employees")) {
- validateNavProperty(navigationProperty, "RoomEmployees", "r_Room", "r_Employee");
+ validateNavProperty(navigationProperty, "r_Employee-r_Room", "r_Room", "r_Employee");
} else if(navigationProperty.getName().equals("nr_Building")) {
validateNavProperty(navigationProperty, "BuildingRooms", "r_Room", "r_Building");
} else {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Building.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Building.java b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Building.java
index f1a3fa9..15cd3ae 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Building.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Building.java
@@ -21,32 +21,34 @@ package org.apache.olingo.odata2.core.annotation.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
+import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
import org.apache.olingo.odata2.api.annotation.edm.EdmKey;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
import org.apache.olingo.odata2.api.annotation.edm.EdmProperty;
-import org.apache.olingo.odata2.api.annotation.edm.NavigationEnd;
import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
/**
*
*/
-@EdmEntityType(name="Building", namespace=ModelSharedConstants.NAMESPACE_1)
+@EdmEntityType(name = "Building", namespace = ModelSharedConstants.NAMESPACE_1)
@EdmEntitySet(name = "Buildings")
public class Building {
@EdmKey
- @EdmProperty(type = EdmSimpleTypeKind.String)
+ @EdmProperty(type = EdmSimpleTypeKind.Int32)
private String id;
@EdmProperty
private String name;
+ @EdmProperty(name = "Image", type = EdmSimpleTypeKind.Binary)
private byte[] image;
- @EdmNavigationProperty(name="nb_rooms", association="BuildingRooms",
- to = @NavigationEnd(role = "r_Room", entitySet=Room.class, multiplicity = EdmMultiplicity.MANY))
+ @EdmNavigationProperty(name = "nb_Rooms", toType = Room.class,
+ association = "BuildingRooms", toMultiplicity = EdmMultiplicity.MANY)
private List<Room> rooms = new ArrayList<Room>();
+ public Building() {}
+
public String getId() {
return id;
}
@@ -77,10 +79,7 @@ public class Building {
@Override
public int hashCode() {
- if(id == null) {
- return 0;
- }
- return id.hashCode();
+ return id == null ? 0 : id.hashCode();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Employee.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Employee.java b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Employee.java
index a384689..dc97c68 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Employee.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Employee.java
@@ -20,53 +20,54 @@ package org.apache.olingo.odata2.core.annotation.model;
import java.text.DateFormat;
import java.util.Calendar;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
+import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
import org.apache.olingo.odata2.api.annotation.edm.EdmKey;
+import org.apache.olingo.odata2.api.annotation.edm.EdmMediaResourceContent;
+import org.apache.olingo.odata2.api.annotation.edm.EdmMediaResourceMimeType;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
import org.apache.olingo.odata2.api.annotation.edm.EdmProperty;
-import org.apache.olingo.odata2.api.annotation.edm.NavigationEnd;
-import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
/**
*
*/
-@EdmEntityType(name="Employee", namespace=ModelSharedConstants.NAMESPACE_1)
+@EdmEntityType(name = "Employee", namespace = ModelSharedConstants.NAMESPACE_1)
@EdmEntitySet(name = "Employees")
public class Employee {
private static int counter = 1;
@EdmKey
- @EdmProperty(name="EmployeeId", type = EdmSimpleTypeKind.Int32)
- private int employeeId;
- @EdmProperty(name="EmployeeName")
+ @EdmProperty(name = "EmployeeId", type = EdmSimpleTypeKind.String)
+ private String employeeId;
+ @EdmProperty(name = "EmployeeName")
private String employeeName;
@EdmProperty
private int age;
- @EdmNavigationProperty(name="ne_Manager", association="ManagerEmployees",
- from = @NavigationEnd(role="r_Employees", entitySet=Employee.class, multiplicity=EdmMultiplicity.MANY))//,
-// to = @NavigationEnd(type = "Manager"))
+ @EdmNavigationProperty(name = "ne_Manager", association = "ManagerEmployees")
private Manager manager;
- @EdmNavigationProperty(name = "ne_Team")
+ @EdmNavigationProperty(name = "ne_Team", association = "TeamEmployees")
private Team team;
- @EdmNavigationProperty(name = "ne_Room", association = "RoomEmployees",
- from = @NavigationEnd(multiplicity = EdmMultiplicity.MANY))
+ @EdmNavigationProperty(name = "ne_Room")
private Room room;
+ @EdmMediaResourceMimeType
private String imageType;
+ @EdmMediaResourceContent
private byte[] image;
+ @EdmProperty(name = "ImageUrl")
private String imageUrl;
+ @EdmProperty(name = "EntryDate", type = EdmSimpleTypeKind.DateTime)
private Calendar entryDate;
- @EdmProperty(name="Location")
+ @EdmProperty(name = "Location")
private Location location;
- public Employee(final int employeeId, final String name) {
+ public Employee(final String employeeId, final String name) {
this.employeeId = employeeId;
setEmployeeName(name);
}
public String getId() {
- return Integer.toString(employeeId);
+ return employeeId;
}
public void setEmployeeName(final String employeeName) {
@@ -154,7 +155,10 @@ public class Employee {
@Override
public int hashCode() {
- return employeeId;
+ if (employeeId == null) {
+ return 0;
+ }
+ return employeeId.hashCode();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Manager.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Manager.java b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Manager.java
index fcfbf7d..7785d3c 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Manager.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Manager.java
@@ -20,24 +20,24 @@ package org.apache.olingo.odata2.core.annotation.model;
import java.util.ArrayList;
import java.util.List;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
+import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
-import org.apache.olingo.odata2.api.annotation.edm.NavigationEnd;
+import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
/**
*
*/
-@EdmEntityType(name = "Manager", namespace = ModelSharedConstants.NAMESPACE_1)
+@EdmEntityType(name = "Manager", namespace = ModelSharedConstants.NAMESPACE_1)
@EdmEntitySet(name = "Managers")
public class Manager extends Employee {
@EdmNavigationProperty(name = "nm_Employees", association = "ManagerEmployees",
- to = @NavigationEnd(role = "r_Employees", entitySet = Employee.class))
+ toMultiplicity = EdmMultiplicity.MANY)
private List<Employee> employees = new ArrayList<Employee>();
- public Manager(final int id, final String name) {
+ public Manager(final String id, final String name) {
super(id, name);
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Room.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Room.java b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Room.java
index 14319ef..7c9e486 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Room.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Room.java
@@ -17,13 +17,11 @@ package org.apache.olingo.odata2.core.annotation.model;
import java.util.ArrayList;
import java.util.List;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
+import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
import org.apache.olingo.odata2.api.annotation.edm.EdmProperty;
-import org.apache.olingo.odata2.api.annotation.edm.NavigationEnd;
-import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
/**
*
@@ -36,12 +34,9 @@ public class Room extends RefBase {
private Integer seats;
@EdmProperty
private Integer version;
- @EdmNavigationProperty(name = "nr_Building", association = "BuildingRooms",
- from = @NavigationEnd(role = "r_Room", multiplicity = EdmMultiplicity.MANY))
+ @EdmNavigationProperty(name = "nr_Building", association = "BuildingRooms")
private Building building;
- @EdmNavigationProperty(name = "nr_Employees", association = "RoomEmployees",
-// from = @NavigationEnd(role = "r_Room", entitySet = Room.class, multiplicity = EdmMultiplicity.ONE),
- to = @NavigationEnd(entitySet = Employee.class, multiplicity = EdmMultiplicity.MANY))
+ @EdmNavigationProperty(name = "nr_Employees")
private List<Employee> employees = new ArrayList<Employee>();
public Room(final int id, final String name) {
@@ -84,7 +79,7 @@ public class Room extends RefBase {
@Override
public boolean equals(final Object obj) {
return this == obj
- || obj != null && getClass() == obj.getClass() && id == ((Room) obj).id;
+ || obj != null && getClass() == obj.getClass() && id == ((Room) obj).id;
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Team.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Team.java b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Team.java
index e24c28b..6e3463b 100644
--- a/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Team.java
+++ b/odata2-edm-annotation/edm-annotation-core/src/test/java/org/apache/olingo/odata2/core/annotation/model/Team.java
@@ -20,31 +20,29 @@ package org.apache.olingo.odata2.core.annotation.model;
import java.util.ArrayList;
import java.util.List;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
+import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
import org.apache.olingo.odata2.api.annotation.edm.EdmProperty;
-import org.apache.olingo.odata2.api.annotation.edm.NavigationEnd;
import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
/**
*
*/
-@EdmEntityType(name="Team", namespace = ModelSharedConstants.NAMESPACE_1)
+@EdmEntityType(name = "Team", namespace = ModelSharedConstants.NAMESPACE_1)
@EdmEntitySet(name = "Teams")
public class Team extends RefBase {
@EdmProperty(type = EdmSimpleTypeKind.Boolean)
private Boolean isScrumTeam;
- @EdmNavigationProperty(name = "ne_Teams",
- to = @NavigationEnd(entitySet = Employee.class, multiplicity = EdmMultiplicity.MANY))
+ @EdmNavigationProperty(name = "nt_Employees", association = "TeamEmployees", toMultiplicity = EdmMultiplicity.MANY)
private List<Employee> employees = new ArrayList<Employee>();
public Team() {
super(-1, null);
}
-
+
public Team(final int id, final String name) {
super(id, name);
}
@@ -56,7 +54,7 @@ public class Team extends RefBase {
public void setScrumTeam(final Boolean isScrumTeam) {
this.isScrumTeam = isScrumTeam;
}
-
+
public void addEmployee(Employee e) {
this.employees.add(e);
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/4d80947e/odata2-edm-annotation/edm-annotation-webref/pom.xml
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-webref/pom.xml b/odata2-edm-annotation/edm-annotation-webref/pom.xml
index cfc7f92..9f4e99f 100644
--- a/odata2-edm-annotation/edm-annotation-webref/pom.xml
+++ b/odata2-edm-annotation/edm-annotation-webref/pom.xml
@@ -100,16 +100,6 @@ the License. -->
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.1</version>
</dependency>
- <dependency>
- <groupId>org.glassfish.jersey.containers</groupId>
- <artifactId>jersey-container-servlet</artifactId>
- <version>2.0</version>
- </dependency>
- <dependency>
- <groupId>org.glassfish.jersey.core</groupId>
- <artifactId>jersey-client</artifactId>
- <version>2.0</version>
- </dependency>
</dependencies>
<profiles>