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>