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/06 17:52:47 UTC

[05/50] [abbrv] git commit: Poc for ListsDs and Processor

Poc for ListsDs and Processor


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/3bebf610
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/tree/3bebf610
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/diff/3bebf610

Branch: refs/heads/ODataServlet
Commit: 3bebf6107474336b8b866ff568451229a5e399d7
Parents: d53a11c
Author: Michael Bolz <mi...@apache.org>
Authored: Tue Nov 12 06:22:38 2013 +0100
Committer: Tamara Boehm <ta...@sap.com>
Committed: Fri Dec 6 17:47:25 2013 +0100

----------------------------------------------------------------------
 .../api/annotation/edm/EdmComplexEntity.java    |   31 -
 .../api/annotation/edm/EdmEntityType.java       |   34 -
 .../odata2/api/annotation/edm/EdmFacets.java    |   33 -
 .../odata2/api/annotation/edm/EdmKey.java       |   29 -
 .../annotation/edm/EdmMediaResourceContent.java |   29 -
 .../edm/EdmMediaResourceMimeType.java           |   29 -
 .../annotation/edm/EdmMediaResourceSource.java  |   29 -
 .../annotation/edm/EdmNavigationProperty.java   |   36 -
 .../odata2/api/annotation/edm/EdmProperty.java  |   36 -
 .../api/annotation/edm/NavigationEnd.java       |   34 -
 .../olingo/odata2/api/data/ListsDataSource.java |  200 +++
 .../olingo/odata2/api/data/ValueAccess.java     |   69 +
 .../edm-annotation-core/pom.xml                 |    7 +
 .../annotation/ds/AnnotationInMemoryDs.java     |  185 ++
 .../annotation/ds/AnnotationValueAccess.java    |   99 ++
 .../core/annotation/ds/BeanPropertyAccess.java  |  186 ++
 .../core/annotation/ds/DataSourceHolder.java    |  212 +++
 .../odata2/core/annotation/ds/DataStore.java    |  166 ++
 .../annotation/edm/AnnotationEdmProvider.java   |    1 +
 .../core/annotation/edm/AnnotationHelper.java   |  267 ++-
 .../processor/AnnotationProcessor.java          |  181 +-
 .../annotation/processor/ListsProcessor.java    | 1625 ++++++++++++++++++
 .../processor/json/EdmAnnotationSerializer.java |    8 +-
 .../annotation/processor/json/JsonConsumer.java |    6 +-
 .../annotation/processor/json/JsonWriter.java   |    1 +
 .../edm/AnnotationEdmProviderTest.java          |   12 +-
 .../odata2/core/annotation/model/Building.java  |    1 +
 .../odata2/core/annotation/model/City.java      |    1 +
 .../odata2/core/annotation/model/Employee.java  |    3 +-
 .../odata2/core/annotation/model/Location.java  |    1 +
 .../odata2/core/annotation/model/Manager.java   |    1 +
 .../odata2/core/annotation/model/RefBase.java   |    2 +-
 .../odata2/core/annotation/model/Room.java      |    1 +
 .../odata2/core/annotation/model/Team.java      |    1 +
 .../processor/json/JsonConsumerTest.java        |    2 +-
 .../edm-annotation-webref/pom.xml               |    7 +
 .../odata2/ref/annotation/model/Building.java   |    7 -
 .../odata2/ref/annotation/model/Employee.java   |    7 +-
 .../odata2/ref/annotation/model/Manager.java    |    4 -
 .../odata2/ref/annotation/model/Photo.java      |    5 -
 .../odata2/ref/annotation/model/RefBase.java    |    5 -
 .../odata2/ref/annotation/model/Room.java       |    4 -
 .../odata2/ref/annotation/model/Team.java       |    8 -
 .../ref/annotation/model/ds/BuildingDs.java     |   67 -
 .../odata2/ref/annotation/model/ds/PhotoDs.java |   63 -
 .../odata2/ref/annotation/model/ds/TeamDs.java  |   66 -
 .../processor/AnnotationPocServiceFactory.java  |  161 ++
 .../processor/ScenarioErrorCallback.java        |   47 -
 .../processor/ScenarioServiceFactory.java       |  110 --
 odata2-lib/odata-annotation/pom.xml             |   60 +-
 .../api/annotation/edm/EdmComplexEntity.java    |   31 +
 .../api/annotation/edm/EdmEntityType.java       |   34 +
 .../odata2/api/annotation/edm/EdmFacets.java    |   33 +
 .../odata2/api/annotation/edm/EdmKey.java       |   29 +
 .../annotation/edm/EdmMediaResourceContent.java |   29 +
 .../edm/EdmMediaResourceMimeType.java           |   29 +
 .../annotation/edm/EdmMediaResourceSource.java  |   29 +
 .../annotation/edm/EdmNavigationProperty.java   |   36 +
 .../odata2/api/annotation/edm/EdmProperty.java  |   36 +
 .../api/annotation/edm/NavigationEnd.java       |   34 +
 .../olingo/odata2/fit/ref/AbstractRefTest.java  |    2 +
 .../odata2/fit/ref/EntryXmlReadOnlyTest.java    |    2 +-
 .../AbstractContentNegotiationTest.java         |    4 +-
 odata2-lib/odata-ref/pom.xml                    |    5 +
 .../ref/processor/BeanPropertyAccess.java       |  185 --
 .../odata2/ref/processor/ListsDataSource.java   |  200 ---
 .../odata2/ref/processor/ListsProcessor.java    | 1623 -----------------
 .../ref/processor/ScenarioDataSource.java       |    1 +
 .../ref/processor/ScenarioServiceFactory.java   |    2 +
 .../odata2/ref/processor/ValueAccess.java       |   69 -
 .../olingo/odata2/ref/read/EntitySetTest.java   |    4 +-
 .../olingo/odata2/ref/read/EntityTest.java      |    4 +-
 odata2-processor-jpa/jpa-web/pom.xml            |   10 +
 73 files changed, 3570 insertions(+), 3040 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmComplexEntity.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmComplexEntity.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmComplexEntity.java
deleted file mode 100644
index adec2d7..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmComplexEntity.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface EdmComplexEntity {
-  String name() default "";
-  String namespace();
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmEntityType.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmEntityType.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmEntityType.java
deleted file mode 100644
index ed5d802..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmEntityType.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface EdmEntityType {
-  String name() default "";
-  String namespace();
-  /* If set this entity is exposed as entity set with given name. If not set theire will be no entity set generated. */
-  String entitySetName() default "";
-  String container() default "";
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmFacets.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmFacets.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmFacets.java
deleted file mode 100644
index 4ea2bd5..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmFacets.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.ANNOTATION_TYPE)
-public @interface EdmFacets {
-  int maxLength() default 0;
-  int scale() default -1;
-  int precision() default 0;
-  boolean nullable() default false;
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmKey.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmKey.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmKey.java
deleted file mode 100644
index 48db91f..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmKey.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface EdmKey {
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceContent.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceContent.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceContent.java
deleted file mode 100644
index 80e9cd8..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceContent.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface EdmMediaResourceContent {
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceMimeType.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceMimeType.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceMimeType.java
deleted file mode 100644
index d255ff4..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceMimeType.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface EdmMediaResourceMimeType {
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceSource.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceSource.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceSource.java
deleted file mode 100644
index 78e72b5..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmMediaResourceSource.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface EdmMediaResourceSource {
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmNavigationProperty.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmNavigationProperty.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmNavigationProperty.java
deleted file mode 100644
index cf898df..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmNavigationProperty.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface EdmNavigationProperty {
-  String name();
-  String relationship();
-  
-  //
-  NavigationEnd from() default @NavigationEnd;
-  NavigationEnd to() default @NavigationEnd;
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmProperty.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmProperty.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmProperty.java
deleted file mode 100644
index 66c5282..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/EdmProperty.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface EdmProperty {
-  EdmSimpleTypeKind type() default EdmSimpleTypeKind.Null;
-  String name() default "";
-  /* only for complex property */
-  String namespace() default "";
-  EdmFacets facets() default @EdmFacets;
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/NavigationEnd.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/NavigationEnd.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/NavigationEnd.java
deleted file mode 100644
index 2ce5ef1..0000000
--- a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/annotation/edm/NavigationEnd.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.api.annotation.edm;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface NavigationEnd {
-  String role() default "";
-  String type() default "";
-  
-  EdmMultiplicity multiplicity() default EdmMultiplicity.ONE;
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ListsDataSource.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ListsDataSource.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ListsDataSource.java
new file mode 100644
index 0000000..e9229e3
--- /dev/null
+++ b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ListsDataSource.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.api.data;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.olingo.odata2.api.edm.EdmEntitySet;
+import org.apache.olingo.odata2.api.edm.EdmException;
+import org.apache.olingo.odata2.api.edm.EdmFunctionImport;
+import org.apache.olingo.odata2.api.exception.ODataApplicationException;
+import org.apache.olingo.odata2.api.exception.ODataNotFoundException;
+import org.apache.olingo.odata2.api.exception.ODataNotImplementedException;
+
+/**
+ * <p>This interface is intended to make it easier to implement an OData
+ * service in cases where all data for each entity set can be provided as a {@link List} of objects from which all
+ * properties described in the
+ * Entity Data Model can be retrieved and set.</p>
+ * <p>By obeying these restrictions, data-source implementations get the
+ * following advantages:
+ * <ul>
+ * <li>All system query options can be handled centrally.</li>
+ * <li>Following navigation paths must only be done step by step.</li>
+ * </ul>
+ * </p>
+ * 
+ */
+public interface ListsDataSource {
+
+  /**
+   * Retrieves the whole data list for the specified entity set.
+   * @param entitySet the requested {@link EdmEntitySet}
+   * @return the requested data list
+   */
+  List<?> readData(EdmEntitySet entitySet) throws ODataNotImplementedException, ODataNotFoundException, EdmException,
+      ODataApplicationException;
+
+  /**
+   * Retrieves a single data object for the specified entity set and key.
+   * @param entitySet the requested {@link EdmEntitySet}
+   * @param keys the entity key as map of key names to key values
+   * @return the requested data object
+   */
+  Object readData(EdmEntitySet entitySet, Map<String, Object> keys) throws ODataNotImplementedException,
+      ODataNotFoundException, EdmException, ODataApplicationException;
+
+  /**
+   * <p>Retrieves data for the specified function import and key.</p>
+   * <p>This method is called also for function imports that have defined in
+   * their metadata an other HTTP method than <code>GET</code>.</p>
+   * @param function the requested {@link EdmFunctionImport}
+   * @param parameters the parameters of the function import
+   * as map of parameter names to parameter values
+   * @param keys the key of the returned entity set, as map of key names to key values,
+   * if the return type of the function import is a collection of entities
+   * (optional)
+   * @return the requested data object, either a list or a single object;
+   * if the function import's return type is of type <code>Binary</code>,
+   * the returned object(s) must be of type {@link BinaryData}
+   */
+  Object readData(EdmFunctionImport function, Map<String, Object> parameters, Map<String, Object> keys)
+      throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException;
+
+  /**
+   * <p>Retrieves related data for the specified source data, entity set, and key.</p>
+   * <p>If the underlying association of the EDM is specified to have target
+   * multiplicity '*' and no target key is given, this method returns a list of
+   * related data, otherwise it returns a single data object.</p>
+   * @param sourceEntitySet the {@link EdmEntitySet} of the source entity
+   * @param sourceData the data object of the source entity
+   * @param targetEntitySet the requested target {@link EdmEntitySet}
+   * @param targetKeys the key of the target entity as map of key names to key values
+   * (optional)
+   * @return the requested releated data object, either a list or a single object
+   */
+  Object readRelatedData(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
+      Map<String, Object> targetKeys) throws ODataNotImplementedException, ODataNotFoundException, EdmException,
+      ODataApplicationException;
+
+  /**
+   * Retrieves the binary data and the MIME type for the media resource
+   * associated to the specified media-link entry.
+   * @param entitySet the {@link EdmEntitySet} of the media-link entry
+   * @param mediaLinkEntryData the data object of the media-link entry
+   * @return the binary data and the MIME type of the media resource
+   */
+  BinaryData readBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData) throws ODataNotImplementedException,
+      ODataNotFoundException, EdmException, ODataApplicationException;
+
+  /**
+   * <p>Creates and returns a new instance of the requested data-object type.</p>
+   * <p>This instance must not be part of the corresponding list and should
+   * have empty content, apart from the key and other mandatory properties.
+   * However, intermediate objects to access complex properties must not be
+   * <code>null</code>.</p>
+   * @param entitySet the {@link EdmEntitySet} the object must correspond to
+   * @return the new data object
+   */
+  Object newDataObject(EdmEntitySet entitySet) throws ODataNotImplementedException, EdmException,
+      ODataApplicationException;
+
+  /**
+   * Writes the binary data for the media resource associated to the
+   * specified media-link entry.
+   * @param entitySet the {@link EdmEntitySet} of the media-link entry
+   * @param mediaLinkEntryData the data object of the media-link entry
+   * @param binaryData the binary data of the media resource along with
+   * the MIME type of the binary data
+   */
+  void writeBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData, BinaryData binaryData)
+      throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException;
+
+  /**
+   * Deletes a single data object identified by the specified entity set and key.
+   * @param entitySet the {@link EdmEntitySet} of the entity to be deleted
+   * @param keys the entity key as map of key names to key values
+   */
+  void deleteData(EdmEntitySet entitySet, Map<String, Object> keys) throws ODataNotImplementedException,
+      ODataNotFoundException, EdmException, ODataApplicationException;
+
+  /**
+   * <p>Inserts an instance into the entity list of the specified entity set.</p>
+   * <p>If {@link #newDataObject} has not set the key and other mandatory
+   * properties already, this method must set them before inserting the
+   * instance into the list.</p>
+   * @param entitySet the {@link EdmEntitySet} the object must correspond to
+   * @param data the data object of the new entity
+   */
+  void createData(EdmEntitySet entitySet, Object data) throws ODataNotImplementedException, EdmException,
+      ODataApplicationException;
+
+  /**
+   * Deletes the relation from the specified source data to a target entity
+   * specified by entity set and key.
+   * @param sourceEntitySet the {@link EdmEntitySet} of the source entity
+   * @param sourceData the data object of the source entity
+   * @param targetEntitySet the {@link EdmEntitySet} of the target entity
+   * @param targetKeys the key of the target entity as map of key names to key values
+   * (optional)
+   */
+  void deleteRelation(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
+      Map<String, Object> targetKeys) throws ODataNotImplementedException, ODataNotFoundException, EdmException,
+      ODataApplicationException;
+
+  /**
+   * Writes a relation from the specified source data to a target entity
+   * specified by entity set and key.
+   * @param sourceEntitySet the {@link EdmEntitySet} of the source entity
+   * @param sourceData the data object of the source entity
+   * @param targetEntitySet the {@link EdmEntitySet} of the relation target
+   * @param targetKeys the key of the target entity as map of key names to key values
+   */
+  void writeRelation(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
+      Map<String, Object> targetKeys) throws ODataNotImplementedException, ODataNotFoundException, EdmException,
+      ODataApplicationException;
+
+  /**
+   * Container to store binary data (as byte array) and the associated MIME type.
+   */
+  public class BinaryData {
+    private final byte[] data;
+    private final String mimeType;
+
+    public BinaryData(final byte[] data, final String mimeType) {
+      this.data = data;
+      this.mimeType = mimeType;
+    }
+
+    public byte[] getData() {
+      return data;
+    }
+
+    public String getMimeType() {
+      return mimeType;
+    }
+
+    @Override
+    public String toString() {
+      return "data=" + Arrays.toString(data) + ", mimeType=" + mimeType;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ValueAccess.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ValueAccess.java b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ValueAccess.java
new file mode 100644
index 0000000..685e1b6
--- /dev/null
+++ b/odata2-edm-annotation/edm-annotation-api/src/main/java/org/apache/olingo/odata2/api/data/ValueAccess.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.api.data;
+
+import org.apache.olingo.odata2.api.edm.EdmMapping;
+import org.apache.olingo.odata2.api.edm.EdmProperty;
+import org.apache.olingo.odata2.api.exception.ODataException;
+
+/**
+ * This interface is intended to access values in a Java object.
+ */
+public interface ValueAccess {
+
+  /**
+   * Retrieves the value of an EDM property for the given data object.
+   * @param data     the Java data object
+   * @param property the requested {@link EdmProperty}
+   * @return the requested property value
+   */
+  public <T> Object getPropertyValue(final T data, final EdmProperty property) throws ODataException;
+
+  /**
+   * Sets the value of an EDM property for the given data object.
+   * @param data     the Java data object
+   * @param property the {@link EdmProperty}
+   * @param value    the new value of the property
+   */
+  public <T, V> void setPropertyValue(T data, final EdmProperty property, final V value) throws ODataException;
+
+  /**
+   * Retrieves the Java type of an EDM property for the given data object.
+   * @param data     the Java data object
+   * @param property the requested {@link EdmProperty}
+   * @return the requested Java type
+   */
+  public <T> Class<?> getPropertyType(final T data, final EdmProperty property) throws ODataException;
+
+  /**
+   * Retrieves the value defined by a mapping object for the given data object.
+   * @param data     the Java data object
+   * @param mapping  the requested {@link EdmMapping}
+   * @return the requested value
+   */
+  public <T> Object getMappingValue(final T data, final EdmMapping mapping) throws ODataException;
+
+  /**
+   * Sets the value defined by a mapping object for the given data object.
+   * @param data     the Java data object
+   * @param mapping  the {@link EdmMapping}
+   * @param value    the new value
+   */
+  public <T, V> void setMappingValue(T data, final EdmMapping mapping, final V value) throws ODataException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-core/pom.xml
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/pom.xml b/odata2-edm-annotation/edm-annotation-core/pom.xml
index 4f34c8d..4e408f7 100644
--- a/odata2-edm-annotation/edm-annotation-core/pom.xml
+++ b/odata2-edm-annotation/edm-annotation-core/pom.xml
@@ -34,8 +34,15 @@ the License. -->
     </dependency>
     <dependency>
       <groupId>org.apache.olingo</groupId>
+      <artifactId>olingo-odata2-api-annotation-incubating</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.olingo</groupId>
       <artifactId>olingo-odata2-core-incubating</artifactId>
       <version>${project.version}</version>
     </dependency>
   </dependencies>
+  
+
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/AnnotationInMemoryDs.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/AnnotationInMemoryDs.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/AnnotationInMemoryDs.java
new file mode 100644
index 0000000..bdf5d77
--- /dev/null
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/AnnotationInMemoryDs.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.core.annotation.ds;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+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.EdmKey;
+import org.apache.olingo.odata2.api.data.ListsDataSource;
+import org.apache.olingo.odata2.api.edm.EdmEntitySet;
+import org.apache.olingo.odata2.api.edm.EdmException;
+import org.apache.olingo.odata2.api.edm.EdmFunctionImport;
+import org.apache.olingo.odata2.api.exception.ODataApplicationException;
+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.annotation.edm.ClassHelper;
+
+public class AnnotationInMemoryDs implements ListsDataSource {
+
+  private static final AnnotationHelper ANNOTATION_HELPER = new AnnotationHelper();
+  private final Map<String, DataStore<Object>> dataStores = new HashMap<String, DataStore<Object>>();
+
+  public AnnotationInMemoryDs(String packageToScan) {
+    List<Class<?>> foundClasses = ClassHelper.loadClasses(packageToScan, new ClassHelper.ClassValidator() {
+      @Override
+      public boolean isClassValid(Class<?> c) {
+        return null != c.getAnnotation(EdmEntityType.class);
+      }
+    });
+
+    init(foundClasses);
+  }
+
+  @SuppressWarnings("unchecked")
+  private void init(List<Class<?>> foundClasses) {
+    for (Class<?> clz : foundClasses) {
+
+      DataStore<Object> dhs = (DataStore<Object>) DataStore.createInMemory(clz);
+      EdmEntityType entityType = clz.getAnnotation(EdmEntityType.class);
+      dataStores.put(entityType.name(), dhs);
+    }
+  }
+  
+  public <T> DataStore<T> getDataStore(Class<T> clazz) {
+    return DataStore.createInMemory(clazz);
+  }
+
+  @Override
+  public List<?> readData(EdmEntitySet entitySet) throws ODataNotImplementedException,
+          ODataNotFoundException, EdmException, ODataApplicationException {
+
+    final String name = entitySet.getEntityType().getName();
+
+    DataStore<Object> holder = dataStores.get(name);
+    if (holder != null) {
+      return new ArrayList(holder.read());
+    }
+
+    throw new ODataNotFoundException(ODataNotFoundException.ENTITY);
+  }
+
+  @Override
+  public Object readData(EdmEntitySet entitySet, Map<String, Object> keys) 
+      throws ODataNotFoundException, EdmException, ODataApplicationException {
+    final String name = entitySet.getEntityType().getName();
+
+    DataStore<Object> store = dataStores.get(name);
+    if (store != null) {
+        Object keyInstance = store.createInstance();
+        setKeyFields(keyInstance, keys.values().toArray());
+
+        Object result = store.read(keyInstance);
+        if (result != null) {
+          return result;
+        }
+    }
+
+    throw new ODataNotFoundException(ODataNotFoundException.ENTITY);
+  }
+
+  
+  @Override
+  public Object readData(EdmFunctionImport function, Map<String, Object> parameters, Map<String, Object> keys)
+          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 {
+    final Object data;
+    if (targetKeys.isEmpty()) {
+      data = this.readData(targetEntitySet);
+    } else {
+      data = this.readData(targetEntitySet, targetKeys);
+    }
+
+    return data;
+  }
+
+  @Override
+  public BinaryData readBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData)
+          throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+  }
+
+  @Override
+  public Object newDataObject(EdmEntitySet entitySet)
+          throws ODataNotImplementedException, EdmException, ODataApplicationException {
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+  }
+
+  @Override
+  public void writeBinaryData(EdmEntitySet entitySet, Object mediaLinkEntryData, BinaryData binaryData)
+          throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+
+  }
+
+  @Override
+  public void deleteData(EdmEntitySet entitySet, Map<String, Object> keys)
+          throws ODataNotImplementedException, ODataNotFoundException, EdmException, ODataApplicationException {
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+
+  }
+
+  @Override
+  public void createData(EdmEntitySet entitySet, Object data)
+          throws ODataNotImplementedException, EdmException, ODataApplicationException {
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+
+  }
+
+  @Override
+  public void deleteRelation(EdmEntitySet sourceEntitySet, Object sourceData, EdmEntitySet targetEntitySet,
+          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 {
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+  }
+  
+
+  private <T> T setKeyFields(T instance, Object[] keyValues) {
+    List<Field> fields = ANNOTATION_HELPER.getAnnotatedFields(instance, EdmKey.class);
+    if (fields.size() != keyValues.length) {
+      throw new IllegalStateException("Wrong amount of key properties. Expected read keys = "
+              + fields + " given key predicates = " + Arrays.toString(keyValues));
+    }
+    
+    String propertyName = ANNOTATION_HELPER.getCanonicalName(fields.get(0));
+    ANNOTATION_HELPER.setValueForProperty(instance, propertyName, keyValues[0]);
+
+    return instance;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/AnnotationValueAccess.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/AnnotationValueAccess.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/AnnotationValueAccess.java
new file mode 100644
index 0000000..2c8ac96
--- /dev/null
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/AnnotationValueAccess.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.core.annotation.ds;
+
+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.ODataNotImplementedException;
+import org.apache.olingo.odata2.core.annotation.edm.AnnotationHelper;
+
+/**
+ *
+ */
+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
+   * @param property the requested {@link EdmProperty}
+   * @return the requested property value
+   */
+  @Override
+  public <T> Object getPropertyValue(final T data, final EdmProperty property) throws ODataException {
+    if(annotationHelper.isEdmAnnotated(data)) {
+      return annotationHelper.getValueForProperty(data, property.getName());
+    }
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+  }
+
+  /**
+   * Sets the value of an EDM property for the given data object.
+   * @param data     the Java data object
+   * @param property the {@link EdmProperty}
+   * @param value    the new value of the property
+   */
+  @Override
+  public <T, V> void setPropertyValue(T data, final EdmProperty property, final V value) throws ODataException {
+    if(annotationHelper.isEdmAnnotated(data)) {
+      annotationHelper.setValueForProperty(data, property.getName(), value);
+    } else {
+      throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+    }
+  }
+
+  /**
+   * Retrieves the Java type of an EDM property for the given data object.
+   * @param data     the Java data object
+   * @param property the requested {@link EdmProperty}
+   * @return the requested Java type
+   */
+  public <T> Class<?> getPropertyType(final T data, final EdmProperty property) throws ODataException {
+    if(annotationHelper.isEdmAnnotated(data)) {
+      Class<?> fieldType = annotationHelper.getFieldTypeForProperty(data, property.getName());
+      if(fieldType == null) {
+        throw new ODataException("No field type found for property " + property);
+      }
+      return fieldType;
+    }
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+  }
+
+  /**
+   * Retrieves the value defined by a mapping object for the given data object.
+   * @param data     the Java data object
+   * @param mapping  the requested {@link EdmMapping}
+   * @return the requested value
+   */
+  public <T> Object getMappingValue(final T data, final EdmMapping mapping) throws ODataException {
+    throw new ODataNotImplementedException(ODataNotImplementedException.COMMON);
+  }
+
+  /**
+   * Sets the value defined by a mapping object for the given data object.
+   * @param data     the Java data object
+   * @param mapping  the {@link EdmMapping}
+   * @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);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/BeanPropertyAccess.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/BeanPropertyAccess.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/BeanPropertyAccess.java
new file mode 100644
index 0000000..4b00c40
--- /dev/null
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/BeanPropertyAccess.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.core.annotation.ds;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+import org.apache.olingo.odata2.api.data.ValueAccess;
+import org.apache.olingo.odata2.api.edm.EdmException;
+import org.apache.olingo.odata2.api.edm.EdmMapping;
+import org.apache.olingo.odata2.api.edm.EdmProperty;
+import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
+import org.apache.olingo.odata2.api.exception.ODataException;
+import org.apache.olingo.odata2.api.exception.ODataHttpException;
+import org.apache.olingo.odata2.api.exception.ODataNotFoundException;
+
+/**
+ * Data access.
+ */
+public class BeanPropertyAccess implements ValueAccess {
+
+  @Override
+  public <T> Object getPropertyValue(final T data, final EdmProperty property) throws ODataException {
+    return getValue(data, getGetterMethodName(property));
+  }
+
+  @Override
+  public <T, V> void setPropertyValue(T data, final EdmProperty property, final V value) throws ODataException {
+    final String methodName = getSetterMethodName(getGetterMethodName(property));
+    if (methodName != null) {
+      setValue(data, methodName, value);
+    }
+  }
+
+  @Override
+  public <T> Class<?> getPropertyType(final T data, final EdmProperty property) throws ODataException {
+    return getType(data, getGetterMethodName(property));
+  }
+
+  @Override
+  public <T> Object getMappingValue(final T data, final EdmMapping mapping) throws ODataException {
+    if (mapping != null && mapping.getMimeType() != null) {
+      return getValue(data, mapping.getMimeType());
+    }
+    return null;
+  }
+
+  @Override
+  public <T, V> void setMappingValue(T data, final EdmMapping mapping, final V value) throws ODataException {
+    if (mapping != null && mapping.getMimeType() != null) {
+      setValue(data, getSetterMethodName(mapping.getMimeType()), value);
+    }
+  }
+
+  private String getGetterMethodName(final EdmProperty property) throws EdmException {
+    final String prefix = isBooleanProperty(property) ? "is" : "get";
+    final String defaultMethodName = prefix + property.getName();
+    return property.getMapping() == null || property.getMapping().getInternalName() == null ?
+        defaultMethodName : property.getMapping().getInternalName();
+  }
+
+  private boolean isBooleanProperty(final EdmProperty property) throws EdmException {
+    return property.isSimple() 
+        && property.getType() == EdmSimpleTypeKind.Boolean.getEdmSimpleTypeInstance();
+  }
+
+  private String getSetterMethodName(final String getterMethodName) {
+    return getterMethodName.contains(".") ?
+        null : getterMethodName.replaceFirst("^is", "set").replaceFirst("^get", "set");
+  }
+
+  private <T> Object getValue(final T data, final String methodName) throws ODataNotFoundException {
+    Object dataObject = data;
+
+    for (final String method : methodName.split("\\.", -1)) {
+      if (dataObject != null) {
+        try {
+          dataObject = dataObject.getClass().getMethod(method).invoke(dataObject);
+        } catch (SecurityException e) {
+          throw new ODataNotFoundException(ODataHttpException.COMMON, e);
+        } catch (NoSuchMethodException e) {
+          throw new ODataNotFoundException(ODataHttpException.COMMON, e);
+        } catch (IllegalArgumentException e) {
+          throw new ODataNotFoundException(ODataHttpException.COMMON, e);
+        } catch (IllegalAccessException e) {
+          throw new ODataNotFoundException(ODataHttpException.COMMON, e);
+        } catch (InvocationTargetException e) {
+          throw new ODataNotFoundException(ODataHttpException.COMMON, e);
+        }
+      }
+    }
+
+    return dataObject;
+  }
+
+  private <T, V> void setValue(final T data, final String methodName, final V value)
+      throws ODataNotFoundException {
+    try {
+      boolean found = false;
+      for (final Method method : Arrays.asList(data.getClass().getMethods())) {
+        if (method.getName().equals(methodName)) {
+          found = true;
+          final Class<?> type = method.getParameterTypes()[0];
+          if (value == null) {
+            if (type.equals(byte.class) || type.equals(short.class) || type.equals(int.class)
+                || type.equals(long.class) || type.equals(char.class)) {
+              method.invoke(data, 0);
+            } else if (type.equals(float.class) || type.equals(double.class)) {
+              method.invoke(data, 0.0);
+            } else if (type.equals(boolean.class)) {
+              method.invoke(data, false);
+            } else {
+              method.invoke(data, value);
+            }
+          } else {
+            method.invoke(data, value);
+          }
+          break;
+        }
+      }
+      if (!found) {
+        throw new ODataNotFoundException(null);
+      }
+    } catch (SecurityException e) {
+      throw new ODataNotFoundException(null, e);
+    } catch (IllegalArgumentException e) {
+      throw new ODataNotFoundException(null, e);
+    } catch (IllegalAccessException e) {
+      throw new ODataNotFoundException(null, e);
+    } catch (InvocationTargetException e) {
+      throw new ODataNotFoundException(null, e);
+    }
+  }
+
+  private <T> Class<?> getType(final T data, final String methodName) throws ODataNotFoundException {
+    if (data == null) {
+      throw new ODataNotFoundException(ODataHttpException.COMMON);
+    }
+
+    Class<?> type = data.getClass();
+    for (final String method : methodName.split("\\.", -1)) {
+      try {
+        type = type.getMethod(method).getReturnType();
+        if (type.isPrimitive()) {
+          if (type == boolean.class) {
+            type = Boolean.class;
+          } else if (type == byte.class) {
+            type = Byte.class;
+          } else if (type == short.class) {
+            type = Short.class;
+          } else if (type == int.class) {
+            type = Integer.class;
+          } else if (type == long.class) {
+            type = Long.class;
+          } else if (type == float.class) {
+            type = Float.class;
+          } else if (type == double.class) {
+            type = Double.class;
+          }
+        }
+      } catch (final SecurityException e) {
+        throw new ODataNotFoundException(ODataHttpException.COMMON, e);
+      } catch (final NoSuchMethodException e) {
+        throw new ODataNotFoundException(ODataHttpException.COMMON, e);
+      }
+    }
+    return type;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/DataSourceHolder.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/DataSourceHolder.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/DataSourceHolder.java
new file mode 100644
index 0000000..cb5502b
--- /dev/null
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/DataSourceHolder.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.core.annotation.ds;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
+import org.apache.olingo.odata2.api.annotation.edm.ds.EntityCreate;
+import org.apache.olingo.odata2.api.annotation.edm.ds.EntityDataSource;
+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.uri.KeyPredicate;
+import org.apache.olingo.odata2.core.annotation.edm.AnnotationHelper;
+
+/**
+ *
+ */
+public final class DataSourceHolder {
+
+  private static final AnnotationHelper ANNOTATION_HELPER = new AnnotationHelper();
+  private static final Object[] EMPTY_ARRAY = new Object[0];
+  
+  private final String name;
+  private final Object dataSourceInstance;
+  private final Class<?> entityTypeClass;
+  private Method readMethod;
+  private Method createMethod;
+  private Method updateMethod;
+  private Method deleteMethod;
+  private Method readSetMethod;
+
+  public DataSourceHolder(Class<?> clz) {
+    EntityDataSource eds = clz.getAnnotation(EntityDataSource.class);
+    entityTypeClass = eds.entityType();
+    EdmEntityType entityType = entityTypeClass.getAnnotation(EdmEntityType.class);
+    if (entityType == null) {
+      throw new IllegalArgumentException("Missing EdmEntityType Annotation at class " + clz);
+    }
+
+    if (entityType.name().isEmpty()) {
+      name = ANNOTATION_HELPER.getCanonicalName(entityTypeClass);
+    } else {
+      name = entityType.name();
+    }
+    dataSourceInstance = createInstance(clz);
+    initMethods(clz);
+  }
+
+  private void initMethods(Class<?> clz) throws IllegalArgumentException, SecurityException {
+    Method[] methods = clz.getDeclaredMethods();
+    for (Method method : methods) {
+      EntityRead ec = method.getAnnotation(EntityRead.class);
+      if (ec != null) {
+        readMethod = method;
+      }
+      EntityCreate ep = method.getAnnotation(EntityCreate.class);
+      if (ep != null) {
+        createMethod = method;
+      }
+      EntityUpdate update = method.getAnnotation(EntityUpdate.class);
+      if (update != null) {
+        updateMethod = method;
+      }
+      EntityDelete delete = method.getAnnotation(EntityDelete.class);
+      if (delete != null) {
+        deleteMethod = method;
+      }
+      EntitySetRead readSet = method.getAnnotation(EntitySetRead.class);
+      if (readSet != null) {
+        readSetMethod = method;
+      }
+    }
+
+    validateMethods(clz);
+  }
+
+  private void validateMethods(Class<?> clz) throws IllegalArgumentException {
+    //
+    if (readMethod == null) {
+      throw new IllegalArgumentException("Missing " + EntityRead.class
+              + " annotation at " + EntityDataSource.class + " annotated class " + clz);
+    }
+    if (updateMethod == null) {
+      throw new IllegalArgumentException("Missing " + EntityUpdate.class
+              + " annotation at " + EntityDataSource.class + " annotated class " + clz);
+    }
+    if (createMethod == null) {
+      throw new IllegalArgumentException("Missing " + EntityCreate.class
+              + " annotation at " + EntityDataSource.class + " annotated class " + clz);
+    }
+    
+    if(readSetMethod != null) {
+      if(!Collection.class.isAssignableFrom(readSetMethod.getReturnType())) {
+        throw new IllegalArgumentException("Read set method must have a return type which is assignable to " 
+            + Collection.class + " but return type for annotated method " + readSetMethod + " is " 
+            + readSetMethod.getReturnType());
+      }
+    }
+  }
+
+  public Object readEntity(Object[] keyValues) {
+    if (readMethod.getParameterTypes().length != keyValues.length) {
+      throw new IllegalStateException("Wrong amount of key properties. Expected read keys = "
+              + Arrays.toString(readMethod.getParameterTypes()) + " given key predicates = " 
+              + Arrays.toString(keyValues));
+    }
+
+    return invoke(readMethod, keyValues);
+  }
+
+  public Object readEntity(List<KeyPredicate> keys) {
+    Object[] parameterKeys = mapParameterKeys(readMethod, keys);
+    return invoke(readMethod, parameterKeys);
+  }
+
+  private Object[] mapParameterKeys(Method method, List<KeyPredicate> keys) throws IllegalStateException {
+    if(method == null) {
+      return EMPTY_ARRAY;
+    }
+    Class<?>[] pTypes = method.getParameterTypes();
+    if (pTypes.length != keys.size()) {
+      throw new IllegalStateException("Wrong amount of key properties. Expected read keys = "
+              + Arrays.toString(pTypes) + " given key predicates = " + keys);
+    }
+    Object[] parameterKeys = new Object[pTypes.length];
+    int i = 0;
+    for (KeyPredicate keyPredicate : keys) {
+      if (matches(pTypes[i], keyPredicate)) {
+        parameterKeys[i] = keyPredicate.getLiteral();
+      }
+      i++;
+    }
+    return parameterKeys;
+  }
+
+  public Object createEntity(Object key) {
+    return invoke(createMethod, new Object[]{key});
+  }
+
+  public Object updateEntity(Object key) {
+    return invoke(updateMethod, new Object[]{key});
+  }
+
+  public Object deleteEntity(List<KeyPredicate> keys) {
+    Object[] parameterKeys = mapParameterKeys(deleteMethod, keys);
+    return invoke(deleteMethod, parameterKeys);
+  }
+
+  public Collection<?> readEntitySet() {
+    return (Collection<?>) invoke(readSetMethod, new Object[0]);
+  }
+
+  private Object invoke(Method m, Object[] objs) {
+    try {
+      return m.invoke(dataSourceInstance, objs);
+    } catch (Exception ex) {
+      return null;
+    }
+  }
+
+  public Object createEntityInstance() {
+    return createInstance(this.entityTypeClass);
+  }
+
+  private static Object createInstance(Class<?> clz) {
+    try {
+      return clz.newInstance();
+    } catch (Exception ex) {
+      return null;
+    }
+  }
+
+  public String getEntityName() {
+    return this.name;
+  }
+
+  public Class<?> getEntityTypeClass() {
+    return entityTypeClass;
+  }
+
+  @Override
+  public String toString() {
+    return "DataSourceHolder{" + "name=" + name + ", dataSourceInstance=" + dataSourceInstance + 
+            ", entityTypeClass=" + entityTypeClass + ", consumerMethod=" + readMethod + 
+            ", createMethod=" + createMethod + ", updateMethod=" + updateMethod + '}';
+  }
+
+  private boolean matches(Class<?> aClass, KeyPredicate type) {
+    return true;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/DataStore.java
----------------------------------------------------------------------
diff --git a/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/DataStore.java b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/DataStore.java
new file mode 100644
index 0000000..77eb47d
--- /dev/null
+++ b/odata2-edm-annotation/edm-annotation-core/src/main/java/org/apache/olingo/odata2/core/annotation/ds/DataStore.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.odata2.core.annotation.ds;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+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.core.annotation.edm.AnnotationHelper;
+import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
+
+/**
+ *
+ */
+public class DataStore<T> {
+
+  private static final AnnotationHelper ANNOTATION_HELPER = new AnnotationHelper();
+  private final List<T> dataStore;
+  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) {
+        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;
+  }
+
+  private DataStore(Class<T> clz) {
+    this(new ArrayList<T>(), clz);
+  }
+  
+  public Class<T> getDataTypeClass() {
+    return dataTypeClass;
+  }
+  
+  public T createInstance() {
+    try {
+      return dataTypeClass.newInstance();
+    } catch (InstantiationException e) {
+      throw new ODataRuntimeException("Unable to create instance of class '" + dataTypeClass + "'.", e);
+    } catch (IllegalAccessException e) {
+      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) {
+      if (objKeys.equals(getKeys(stored))) {
+        return stored;
+      }
+    }
+    return null;
+  }
+
+  @EntitySetRead
+  public Collection<T> read() {
+    return Collections.unmodifiableCollection(dataStore);
+  }
+
+  @EntityCreate
+  public T create(T object) {
+    createKeys(object);
+    dataStore.add(object);
+    return object;
+  }
+
+  @EntityUpdate
+  public T update(T object) {
+    T stored = read(object);
+    dataStore.remove(stored);
+    dataStore.add(object);
+    return object;
+  }
+
+  @EntityDelete
+  public T delete(T object) {
+    T stored = read(object);
+    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());
+    return keyList;
+  }
+  
+  private T createKeys(T object) {
+    List<Field> fields = ANNOTATION_HELPER.getAnnotatedFields(object, EdmKey.class);
+    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) {
+      return String.valueOf(idCounter++);
+    } else if(type == Integer.class || type == int.class) {
+      return Integer.valueOf(idCounter++);
+    } 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 + "').");
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bebf610/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 d4ef369..03cec0b 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
@@ -26,6 +26,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+
 import org.apache.olingo.odata2.api.annotation.edm.EdmComplexEntity;
 import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
 import org.apache.olingo.odata2.api.annotation.edm.EdmKey;