You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2015/04/04 19:05:16 UTC

[10/50] [abbrv] olingo-odata4 git commit: [OLINGO-575] Edm cleanup: Remove EdmAnnotationHelperImpl

[OLINGO-575] Edm cleanup: Remove EdmAnnotationHelperImpl


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/16b94eb4
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/16b94eb4
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/16b94eb4

Branch: refs/heads/OLINGO-549-ODataV4-JPA
Commit: 16b94eb47e3b9f0274fd9ec66e68b729b00d5a17
Parents: 4f33c70
Author: Michael Bolz <mi...@sap.com>
Authored: Fri Mar 27 13:41:03 2015 +0100
Committer: Michael Bolz <mi...@sap.com>
Committed: Fri Mar 27 13:45:00 2015 +0100

----------------------------------------------------------------------
 .../edm/provider/AbstractEdmAnnotatable.java    |  65 +++++++
 .../core/edm/provider/AbstractEdmBase.java      |  31 ++++
 .../edm/provider/AbstractEdmBindingTarget.java  | 127 +++++++++++++
 .../core/edm/provider/AbstractEdmNamed.java     |  38 ++++
 .../core/edm/provider/AbstractEdmOperation.java | 162 ++++++++++++++++
 .../provider/AbstractEdmOperationImport.java    |  77 ++++++++
 .../edm/provider/AbstractEdmStructuredType.java | 184 +++++++++++++++++++
 .../core/edm/provider/EdmActionImpl.java        |   4 +-
 .../core/edm/provider/EdmActionImportImpl.java  |   2 +-
 .../edm/provider/EdmAnnotationHelperImpl.java   |  67 -------
 .../core/edm/provider/EdmAnnotationImpl.java    |  18 +-
 .../core/edm/provider/EdmBindingTargetImpl.java | 141 --------------
 .../core/edm/provider/EdmComplexTypeImpl.java   |  19 +-
 .../core/edm/provider/EdmElementImpl.java       |  29 ---
 .../edm/provider/EdmEntityContainerImpl.java    |  21 +--
 .../core/edm/provider/EdmEntitySetImpl.java     |   2 +-
 .../core/edm/provider/EdmEntityTypeImpl.java    |  16 +-
 .../core/edm/provider/EdmEnumTypeImpl.java      |   6 +-
 .../core/edm/provider/EdmFunctionImpl.java      |   4 +-
 .../edm/provider/EdmFunctionImportImpl.java     |   2 +-
 .../core/edm/provider/EdmMemberImpl.java        |  21 +--
 .../commons/core/edm/provider/EdmNamedImpl.java |  39 ----
 .../edm/provider/EdmNavigationPropertyImpl.java |  19 +-
 .../core/edm/provider/EdmOperationImpl.java     | 176 ------------------
 .../edm/provider/EdmOperationImportImpl.java    |  93 ----------
 .../core/edm/provider/EdmParameterImpl.java     |  21 +--
 .../core/edm/provider/EdmPropertyImpl.java      |  21 +--
 .../provider/EdmReferentialConstraintImpl.java  |  19 +-
 .../core/edm/provider/EdmSingletonImpl.java     |   2 +-
 .../edm/provider/EdmStructuredTypeImpl.java     | 184 -------------------
 .../commons/core/edm/provider/EdmTermImpl.java  |  18 +-
 .../edm/provider/EdmTypeDefinitionImpl.java     |  22 +--
 .../commons/core/edm/provider/EdmTypeImpl.java  |   8 +-
 .../commons/core/edm/provider/EdmTypeInfo.java  |  26 +--
 .../core/edm/provider/AbstractEdmNamedTest.java |  59 ++++++
 .../core/edm/provider/EdmNamedImplTest.java     |  42 -----
 .../core/edm/provider/EdmTypeImplTest.java      |  19 +-
 37 files changed, 806 insertions(+), 998 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java
new file mode 100644
index 0000000..d36c3a2
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmAnnotatable.java
@@ -0,0 +1,65 @@
+/*
+ * 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.commons.core.edm.provider;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotatable;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmTerm;
+import org.apache.olingo.commons.api.edm.provider.Annotatable;
+import org.apache.olingo.commons.api.edm.provider.Annotation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class AbstractEdmAnnotatable extends AbstractEdmBase implements EdmAnnotatable {
+
+  private final Annotatable annotatable;
+  private List<EdmAnnotation> annotations;
+
+  public AbstractEdmAnnotatable(final Edm edm, final Annotatable annotatable) {
+    super(edm);
+    this.annotatable = annotatable;
+  }
+
+  @Override
+  public EdmAnnotation getAnnotation(final EdmTerm term) {
+    EdmAnnotation result = null;
+    for (EdmAnnotation annotation : getAnnotations()) {
+      if (term.getFullQualifiedName().equals(annotation.getTerm().getFullQualifiedName())) {
+        result = annotation;
+      }
+    }
+
+    return result;
+  }
+
+  @Override
+  public List<EdmAnnotation> getAnnotations() {
+    if (annotations == null) {
+      annotations = new ArrayList<EdmAnnotation>();
+      if(annotatable != null) {
+        for (Annotation annotation : annotatable.getAnnotations()) {
+          annotations.add(new EdmAnnotationImpl(edm, annotation));
+        }
+      }
+    }
+    return annotations;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBase.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBase.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBase.java
new file mode 100644
index 0000000..e6d3c6a
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBase.java
@@ -0,0 +1,31 @@
+/*
+ * 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.commons.core.edm.provider;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotatable;
+
+public abstract class AbstractEdmBase implements EdmAnnotatable {
+
+  protected final Edm edm;
+
+  public AbstractEdmBase(final Edm edm) {
+    this.edm = edm;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java
new file mode 100644
index 0000000..61bba66
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmBindingTarget.java
@@ -0,0 +1,127 @@
+/*
+ * 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.commons.core.edm.provider;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmBindingTarget;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.Target;
+import org.apache.olingo.commons.api.edm.provider.BindingTarget;
+import org.apache.olingo.commons.api.edm.provider.NavigationPropertyBinding;
+
+public abstract class AbstractEdmBindingTarget extends AbstractEdmNamed implements EdmBindingTarget {
+
+  private final BindingTarget target;
+  private final EdmEntityContainer container;
+
+  private List<EdmNavigationPropertyBinding> navigationPropertyBindings;
+
+  public AbstractEdmBindingTarget(final Edm edm, final EdmEntityContainer container, final BindingTarget target) {
+    super(edm, target.getName(), target);
+    this.container = container;
+    this.target = target;
+  }
+
+  @Override
+  public List<EdmNavigationPropertyBinding> getNavigationPropertyBindings() {
+    if (navigationPropertyBindings == null) {
+      List<NavigationPropertyBinding> providerBindings = target.getNavigationPropertyBindings();
+      navigationPropertyBindings = new ArrayList<EdmNavigationPropertyBinding>();
+      if (providerBindings != null) {
+        for (NavigationPropertyBinding binding : providerBindings) {
+          navigationPropertyBindings.add(new EdmNavigationPropertyBindingImpl(binding.getPath(), binding.getTarget()));
+        }
+      }
+    }
+    return navigationPropertyBindings;
+  }
+
+  @Override
+  public EdmEntityContainer getEntityContainer() {
+    return container;
+  }
+
+  @Override
+  public EdmEntityType getEntityType() {
+    final EdmEntityType entityType = edm.getEntityType(target.getTypeFQN());
+    if (entityType == null) {
+      throw new EdmException("Can´t find entity type: " + target.getTypeFQN() + " for entity set or singleton: "
+          + getName());
+    }
+    return entityType;
+  }
+
+  @Override
+  public FullQualifiedName getAnnotationsTargetFQN() {
+    return container.getFullQualifiedName();
+  }
+
+  @Override
+  public String getAnnotationsTargetPath() {
+    return getName();
+  }
+
+  @Override
+  public EdmBindingTarget getRelatedBindingTarget(final String path) {
+    if (path == null) {
+      return null;
+    }
+    EdmBindingTarget bindingTarget = null;
+    boolean found = false;
+    for (final Iterator<EdmNavigationPropertyBinding> itor = getNavigationPropertyBindings().iterator(); itor.hasNext()
+        && !found;) {
+
+      final EdmNavigationPropertyBinding binding = itor.next();
+      if (path.startsWith(binding.getPath())) {
+        final Target edmTarget = new Target.Builder(binding.getTarget(), container).build();
+
+        final EdmEntityContainer entityContainer = edm.getEntityContainer(edmTarget.getEntityContainer());
+        if (entityContainer == null) {
+          throw new EdmException("Cannot find entity container with name: " + edmTarget.getEntityContainer());
+        }
+        try {
+          bindingTarget = entityContainer.getEntitySet(edmTarget.getTargetName());
+
+          if (bindingTarget == null) {
+            throw new EdmException("Cannot find EntitySet " + edmTarget.getTargetName());
+          }
+        } catch (EdmException e) {
+          // try with singletons ...
+          bindingTarget = entityContainer.getSingleton(edmTarget.getTargetName());
+
+          if (bindingTarget == null) {
+            throw new EdmException("Cannot find Singleton " + edmTarget.getTargetName());
+          }
+        } finally {
+          found = bindingTarget != null;
+        }
+      }
+    }
+
+    return bindingTarget;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmNamed.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmNamed.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmNamed.java
new file mode 100644
index 0000000..8835bc5
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmNamed.java
@@ -0,0 +1,38 @@
+/*
+ * 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.commons.core.edm.provider;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmNamed;
+import org.apache.olingo.commons.api.edm.provider.Annotatable;
+
+public abstract class AbstractEdmNamed extends AbstractEdmAnnotatable implements EdmNamed {
+
+  private final String name;
+
+  public AbstractEdmNamed(final Edm edm, final String name, final Annotatable annotatable) {
+    super(edm, annotatable);
+    this.name = name;
+  }
+
+  @Override
+  public String getName() {
+    return name;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java
new file mode 100644
index 0000000..788a974
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperation.java
@@ -0,0 +1,162 @@
+/*
+ * 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.commons.core.edm.provider;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmBindingTarget;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmOperation;
+import org.apache.olingo.commons.api.edm.EdmParameter;
+import org.apache.olingo.commons.api.edm.EdmReturnType;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
+import org.apache.olingo.commons.api.edm.provider.Operation;
+import org.apache.olingo.commons.api.edm.provider.Parameter;
+
+public abstract class AbstractEdmOperation extends EdmTypeImpl implements EdmOperation {
+
+  protected final Operation operation;
+  private final Map<String, EdmParameter> parameters = new LinkedHashMap<String, EdmParameter>();
+  private String entitySetPath;
+  private boolean isBound;
+  private EdmReturnType returnType;
+  private List<String> parameterNames;
+
+  protected static <T extends AbstractEdmOperation> T getInstance(final T instance) {
+    final List<Parameter> providerParameters = instance.operation.getParameters();
+    if (providerParameters != null) {
+      final List<EdmParameter> _parameters = new ArrayList<EdmParameter>(providerParameters.size());
+      for (Parameter parameter : providerParameters) {
+        _parameters.add(new EdmParameterImpl(instance.edm, parameter));
+      }
+      instance.setParameters(_parameters);
+    }
+
+    final String entitySetPath = instance.operation.getEntitySetPath();
+    if (entitySetPath != null) {
+      instance.setEntitySetPath(entitySetPath);
+    }
+
+    instance.setIsBound(instance.operation.isBound());
+
+    if (instance.operation.getReturnType() != null) {
+      instance.setReturnType(new EdmReturnTypeImpl(instance.edm, instance.operation.getReturnType()));
+    }
+
+    return instance;
+  }
+
+  protected AbstractEdmOperation(final Edm edm, final FullQualifiedName name, final Operation operation,
+                                 final EdmTypeKind kind) {
+
+    super(edm, name, kind, operation);
+    this.operation = operation;
+  }
+  
+  protected void setParameters(final List<EdmParameter> _parameters) {
+    for (EdmParameter parameter : _parameters) {
+      parameters.put(parameter.getName(), parameter);
+    }
+  }
+
+  protected void setEntitySetPath(final String entitySetPath) {
+    this.entitySetPath = entitySetPath;
+  }
+
+  protected void setIsBound(final boolean isBound) {
+    this.isBound = isBound;
+  }
+
+  protected void setReturnType(final EdmReturnType returnType) {
+    this.returnType = returnType;
+  }
+
+  @Override
+  public EdmParameter getParameter(final String name) {
+    return parameters.get(name);
+  }
+
+  @Override
+  public List<String> getParameterNames() {
+    if (parameterNames == null) {
+      parameterNames = new ArrayList<String>(parameters.size());
+      for (String parameterName : parameters.keySet()) {
+        parameterNames.add(parameterName);
+      }
+    }
+    return parameterNames;
+  }
+
+  @Override
+  public EdmEntitySet getReturnedEntitySet(final EdmEntitySet bindingParameterEntitySet) {
+    EdmEntitySet returnedEntitySet = null;
+    if (bindingParameterEntitySet != null && entitySetPath != null) {
+      final EdmBindingTarget relatedBindingTarget = bindingParameterEntitySet.getRelatedBindingTarget(entitySetPath);
+      if (relatedBindingTarget == null) {
+        throw new EdmException("Cannot find entity set with path: " + entitySetPath);
+      }
+      if (relatedBindingTarget instanceof EdmEntitySet) {
+        returnedEntitySet = (EdmEntitySet) relatedBindingTarget;
+      } else {
+        throw new EdmException("BindingTarget with name: " + relatedBindingTarget.getName()
+            + " must be an entity set");
+      }
+    }
+    return returnedEntitySet;
+  }
+
+  @Override
+  public EdmReturnType getReturnType() {
+    return returnType;
+  }
+
+  @Override
+  public boolean isBound() {
+    return isBound;
+  }
+
+  @Override
+  public FullQualifiedName getBindingParameterTypeFqn() {
+    if (isBound()) {
+      Parameter bindingParameter = operation.getParameters().get(0);
+      return bindingParameter.getTypeFQN();
+    }
+    return null;
+  }
+
+  @Override
+  public Boolean isBindingParameterTypeCollection() {
+    if (isBound()) {
+      Parameter bindingParameter = operation.getParameters().get(0);
+      return bindingParameter.isCollection();
+    }
+    return null;
+  }
+
+  @Override
+  public String getEntitySetPath(){
+    return operation.getEntitySetPath();
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperationImport.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperationImport.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperationImport.java
new file mode 100644
index 0000000..82c3465
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmOperationImport.java
@@ -0,0 +1,77 @@
+/*
+ * 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.commons.core.edm.provider;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmOperationImport;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.Target;
+import org.apache.olingo.commons.api.edm.provider.OperationImport;
+
+public abstract class AbstractEdmOperationImport extends AbstractEdmNamed implements EdmOperationImport {
+
+  protected final EdmEntityContainer container;
+  private final Target entitySet;
+  private EdmEntitySet returnedEntitySet;
+
+  public AbstractEdmOperationImport(final Edm edm, final EdmEntityContainer container,
+                                    final OperationImport operationImport) {
+    super(edm, operationImport.getName(), operationImport);
+    this.container = container;
+    this.entitySet = new Target.Builder(operationImport.getEntitySet(), container).build();
+  }
+
+  @Override
+  public FullQualifiedName getFullQualifiedName() {
+    return new FullQualifiedName(container.getNamespace(), getName());
+  }
+
+  @Override
+  public EdmEntitySet getReturnedEntitySet() {
+    if (entitySet != null && returnedEntitySet == null) {
+      EdmEntityContainer entityContainer = edm.getEntityContainer(entitySet.getEntityContainer());
+      if (entityContainer == null) {
+        throw new EdmException("Can´t find entity container with name: " + entitySet.getEntityContainer());
+      }
+      returnedEntitySet = entityContainer.getEntitySet(entitySet.getTargetName());
+      if (returnedEntitySet == null) {
+        throw new EdmException("Can´t find entity set with name: " + entitySet.getTargetName());
+      }
+    }
+    return returnedEntitySet;
+  }
+
+  @Override
+  public EdmEntityContainer getEntityContainer() {
+    return container;
+  }
+
+  @Override
+  public FullQualifiedName getAnnotationsTargetFQN() {
+    return container.getFullQualifiedName();
+  }
+
+  @Override
+  public String getAnnotationsTargetPath() {
+    return getName();
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java
new file mode 100644
index 0000000..1d773ea
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/AbstractEdmStructuredType.java
@@ -0,0 +1,184 @@
+/*
+ * 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.commons.core.edm.provider;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmElement;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
+import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.EdmStructuredType;
+import org.apache.olingo.commons.api.edm.EdmType;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
+import org.apache.olingo.commons.api.edm.provider.NavigationProperty;
+import org.apache.olingo.commons.api.edm.provider.Property;
+import org.apache.olingo.commons.api.edm.provider.StructuralType;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public abstract class AbstractEdmStructuredType extends EdmTypeImpl implements EdmStructuredType {
+
+  protected EdmStructuredType baseType;
+  protected FullQualifiedName baseTypeName;
+
+  private List<String> propertyNames;
+  private List<String> navigationPropertyNames;
+  private Map<String, EdmProperty> properties;
+  private Map<String, EdmNavigationProperty> navigationProperties;
+  private final StructuralType structuredType;
+
+  public AbstractEdmStructuredType(
+          final Edm edm,
+          final FullQualifiedName typeName,
+          final EdmTypeKind kind,
+          final StructuralType structuredType) {
+
+    super(edm, typeName, kind, structuredType);
+    this.baseTypeName = structuredType.getBaseTypeFQN();
+    this.structuredType = structuredType;
+  }
+
+  protected abstract EdmStructuredType buildBaseType(FullQualifiedName baseTypeName);
+
+  protected abstract void checkBaseType();
+
+  @Override
+  public List<String> getPropertyNames() {
+    if (propertyNames == null) {
+      propertyNames = new ArrayList<String>();
+      checkBaseType();
+      if (baseType != null) {
+        propertyNames.addAll(baseType.getPropertyNames());
+      }
+      propertyNames.addAll(getProperties().keySet());
+    }
+    return propertyNames;
+  }
+
+  @Override
+  public List<String> getNavigationPropertyNames() {
+    if (navigationPropertyNames == null) {
+      navigationPropertyNames = new ArrayList<String>();
+      checkBaseType();
+      if (baseType != null) {
+        navigationPropertyNames.addAll(baseType.getNavigationPropertyNames());
+      }
+      navigationPropertyNames.addAll(getNavigationProperties().keySet());
+    }
+    return navigationPropertyNames;
+  }
+
+  @Override
+  public EdmElement getProperty(final String name) {
+    EdmElement property = getStructuralProperty(name);
+    if (property == null) {
+      property = getNavigationProperty(name);
+    }
+    return property;
+  }
+
+  @Override
+  public EdmProperty getStructuralProperty(final String name) {
+    EdmProperty property = null;
+    checkBaseType();
+    if (baseType != null) {
+      property = baseType.getStructuralProperty(name);
+    }
+    if (property == null) {
+      property = getProperties().get(name);
+    }
+    return property;
+  }
+
+  @Override
+  public EdmNavigationProperty getNavigationProperty(final String name) {
+    EdmNavigationProperty property = null;
+    checkBaseType();
+    if (baseType != null) {
+      property = baseType.getNavigationProperty(name);
+    }
+    if (property == null) {
+      property = getNavigationProperties().get(name);
+    }
+    return property;
+  }
+
+  @Override
+  public boolean compatibleTo(final EdmType targetType) {
+    EdmStructuredType sourceType = this;
+    if (targetType == null) {
+      throw new EdmException("Target type must not be null");
+    }
+    while (!sourceType.getName().equals(targetType.getName())
+        || !sourceType.getNamespace().equals(targetType.getNamespace())) {
+
+      sourceType = sourceType.getBaseType();
+      if (sourceType == null) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  @Override
+  public String getAnnotationsTargetPath() {
+    return null;
+  }
+
+  @Override
+  public FullQualifiedName getAnnotationsTargetFQN() {
+    return getFullQualifiedName();
+  }
+
+  public Map<String, EdmProperty> getProperties() {
+    if (properties == null) {
+      properties = new LinkedHashMap<String, EdmProperty>();
+        for (Property property : structuredType.getProperties()) {
+          properties.put(property.getName(), new EdmPropertyImpl(edm, typeName, property));
+      }
+    }
+    return properties;
+  }
+
+  public Map<String, EdmNavigationProperty> getNavigationProperties() {
+    if (navigationProperties == null) {
+      navigationProperties = new LinkedHashMap<String, EdmNavigationProperty>();
+      if (structuredType.getNavigationProperties() != null) {
+        for (NavigationProperty navigationProperty : structuredType.getNavigationProperties()) {
+          navigationProperties.put(navigationProperty.getName(),
+                  new EdmNavigationPropertyImpl(edm, typeName, navigationProperty));
+        }
+      }
+    }
+    return navigationProperties;
+  }
+
+  public boolean isOpenType() {
+    return structuredType.isOpenType();
+  }
+
+  public boolean isAbstract() {
+    return structuredType.isAbstract();
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImpl.java
index 292f234..822ebc8 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImpl.java
@@ -24,10 +24,10 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
 import org.apache.olingo.commons.api.edm.provider.Action;
 
-public class EdmActionImpl extends EdmOperationImpl implements EdmAction {
+public class EdmActionImpl extends AbstractEdmOperation implements EdmAction {
 
   public static EdmActionImpl getInstance(final Edm edm, final FullQualifiedName name, final Action action) {
-    return EdmOperationImpl.getInstance(new EdmActionImpl(edm, name, action));
+    return AbstractEdmOperation.getInstance(new EdmActionImpl(edm, name, action));
   }
 
   private EdmActionImpl(final Edm edm, final FullQualifiedName name, final Action action) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImportImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImportImpl.java
index 5d9c68a..7d93e9a 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImportImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmActionImportImpl.java
@@ -24,7 +24,7 @@ import org.apache.olingo.commons.api.edm.EdmActionImport;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.provider.ActionImport;
 
-public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmActionImport {
+public class EdmActionImportImpl extends AbstractEdmOperationImport implements EdmActionImport {
 
   private final ActionImport actionImport;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationHelperImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationHelperImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationHelperImpl.java
deleted file mode 100644
index e4b9d9b..0000000
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationHelperImpl.java
+++ /dev/null
@@ -1,67 +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.commons.core.edm.provider;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotatable;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
-import org.apache.olingo.commons.api.edm.EdmTerm;
-import org.apache.olingo.commons.api.edm.provider.Annotatable;
-import org.apache.olingo.commons.api.edm.provider.Annotation;
-
-public class EdmAnnotationHelperImpl implements EdmAnnotatable {
-
-  private final Edm edm;
-
-  private final Annotatable annotatable;
-
-  private List<EdmAnnotation> annotations;
-
-  public EdmAnnotationHelperImpl(final Edm edm, final Annotatable annotatable) {
-    this.edm = edm;
-    this.annotatable = annotatable;
-  }
-
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    EdmAnnotation result = null;
-    for (EdmAnnotation annotation : getAnnotations()) {
-      if (term.getFullQualifiedName().equals(annotation.getTerm().getFullQualifiedName())) {
-        result = annotation;
-      }
-    }
-
-    return result;
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    if (annotations == null) {
-      annotations = new ArrayList<EdmAnnotation>();
-      for (Annotation annotation : annotatable.getAnnotations()) {
-        annotations.add(new EdmAnnotationImpl(edm, annotation));
-      }
-    }
-    return annotations;
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationImpl.java
index 60eb0b4..07523e6 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationImpl.java
@@ -60,18 +60,15 @@ import org.apache.olingo.commons.core.edm.annotation.EdmPropertyValueImpl;
 import org.apache.olingo.commons.core.edm.annotation.EdmRecordImpl;
 import org.apache.olingo.commons.core.edm.annotation.EdmUrlRefImpl;
 
-public class EdmAnnotationImpl implements EdmAnnotation {
+public class EdmAnnotationImpl extends AbstractEdmAnnotatable implements EdmAnnotation {
 
-  private final Edm edm;
   private final Annotation annotation;
-  private final EdmAnnotationHelperImpl helper;
   private EdmTerm term;
   private EdmAnnotationExpression expression;
 
   public EdmAnnotationImpl(final Edm edm, final Annotation annotation) {
-    this.edm = edm;
+    super(edm, annotation);
     this.annotation = annotation;
-    this.helper = new EdmAnnotationHelperImpl(edm, annotation);
   }
 
   @Override
@@ -225,15 +222,4 @@ public class EdmAnnotationImpl implements EdmAnnotation {
     }
     return expression;
   }
-
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmBindingTargetImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmBindingTargetImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmBindingTargetImpl.java
deleted file mode 100644
index b4b035f..0000000
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmBindingTargetImpl.java
+++ /dev/null
@@ -1,141 +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.commons.core.edm.provider;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
-import org.apache.olingo.commons.api.edm.EdmBindingTarget;
-import org.apache.olingo.commons.api.edm.EdmEntityContainer;
-import org.apache.olingo.commons.api.edm.EdmEntityType;
-import org.apache.olingo.commons.api.edm.EdmException;
-import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
-import org.apache.olingo.commons.api.edm.EdmTerm;
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.api.edm.Target;
-import org.apache.olingo.commons.api.edm.provider.BindingTarget;
-import org.apache.olingo.commons.api.edm.provider.NavigationPropertyBinding;
-
-public abstract class EdmBindingTargetImpl extends EdmNamedImpl implements EdmBindingTarget {
-
-  private final BindingTarget target;
-  private final EdmAnnotationHelperImpl helper;
-  private final EdmEntityContainer container;
-
-  private List<EdmNavigationPropertyBinding> navigationPropertyBindings;
-
-  public EdmBindingTargetImpl(final Edm edm, final EdmEntityContainer container, final BindingTarget target) {
-    super(edm, target.getName());
-    this.container = container;
-    this.target = target;
-    this.helper = new EdmAnnotationHelperImpl(edm, target);
-  }
-
-  @Override
-  public List<EdmNavigationPropertyBinding> getNavigationPropertyBindings() {
-    if (navigationPropertyBindings == null) {
-      List<NavigationPropertyBinding> providerBindings = target.getNavigationPropertyBindings();
-      navigationPropertyBindings = new ArrayList<EdmNavigationPropertyBinding>();
-      if (providerBindings != null) {
-        for (NavigationPropertyBinding binding : providerBindings) {
-          navigationPropertyBindings.add(new EdmNavigationPropertyBindingImpl(binding.getPath(), binding.getTarget()));
-        }
-      }
-    }
-    return navigationPropertyBindings;
-  }
-
-  @Override
-  public EdmEntityContainer getEntityContainer() {
-    return container;
-  }
-
-  @Override
-  public EdmEntityType getEntityType() {
-    final EdmEntityType entityType = edm.getEntityType(target.getTypeFQN());
-    if (entityType == null) {
-      throw new EdmException("Can´t find entity type: " + target.getTypeFQN() + " for entity set or singleton: "
-          + getName());
-    }
-    return entityType;
-  }
-
-  @Override
-  public FullQualifiedName getAnnotationsTargetFQN() {
-    return container.getFullQualifiedName();
-  }
-
-  @Override
-  public String getAnnotationsTargetPath() {
-    return getName();
-  }
-
-  @Override
-  public EdmBindingTarget getRelatedBindingTarget(final String path) {
-    if (path == null) {
-      return null;
-    }
-    EdmBindingTarget bindingTarget = null;
-    boolean found = false;
-    for (final Iterator<EdmNavigationPropertyBinding> itor = getNavigationPropertyBindings().iterator(); itor.hasNext()
-        && !found;) {
-
-      final EdmNavigationPropertyBinding binding = itor.next();
-      if (path.startsWith(binding.getPath())) {
-        final Target edmTarget = new Target.Builder(binding.getTarget(), container).build();
-
-        final EdmEntityContainer entityContainer = edm.getEntityContainer(edmTarget.getEntityContainer());
-        if (entityContainer == null) {
-          throw new EdmException("Cannot find entity container with name: " + edmTarget.getEntityContainer());
-        }
-        try {
-          bindingTarget = entityContainer.getEntitySet(edmTarget.getTargetName());
-
-          if (bindingTarget == null) {
-            throw new EdmException("Cannot find EntitySet " + edmTarget.getTargetName());
-          }
-        } catch (EdmException e) {
-          // try with singletons ...
-          bindingTarget = entityContainer.getSingleton(edmTarget.getTargetName());
-
-          if (bindingTarget == null) {
-            throw new EdmException("Cannot find Singleton " + edmTarget.getTargetName());
-          }
-        } finally {
-          found = bindingTarget != null;
-        }
-      }
-    }
-
-    return bindingTarget;
-  }
-
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmComplexTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmComplexTypeImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmComplexTypeImpl.java
index 16ba237..4949d24 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmComplexTypeImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmComplexTypeImpl.java
@@ -18,21 +18,15 @@
  */
 package org.apache.olingo.commons.core.edm.provider;
 
-import java.util.List;
-
 import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmComplexType;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmStructuredType;
-import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
 import org.apache.olingo.commons.api.edm.provider.ComplexType;
 
-public class EdmComplexTypeImpl extends EdmStructuredTypeImpl implements EdmComplexType {
-
-  private EdmAnnotationHelperImpl annotationHelper;
+public class EdmComplexTypeImpl extends AbstractEdmStructuredType implements EdmComplexType {
 
   public static EdmComplexTypeImpl getInstance(
       final Edm edm, final FullQualifiedName name, final ComplexType complexType) {
@@ -41,20 +35,9 @@ public class EdmComplexTypeImpl extends EdmStructuredTypeImpl implements EdmComp
 
   private EdmComplexTypeImpl(final Edm edm, final FullQualifiedName name, final ComplexType complexType) {
     super(edm, name, EdmTypeKind.COMPLEX, complexType);
-    this.annotationHelper = new EdmAnnotationHelperImpl(edm, complexType);
   }
 
   @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return annotationHelper == null ? null : annotationHelper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return annotationHelper == null ? null : annotationHelper.getAnnotations();
-  }
-  
-  @Override
   protected EdmStructuredType buildBaseType(final FullQualifiedName baseTypeName) {
     EdmComplexType baseType = null;
     if (baseTypeName != null) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmElementImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmElementImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmElementImpl.java
deleted file mode 100644
index 686e45d..0000000
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmElementImpl.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.commons.core.edm.provider;
-
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmElement;
-
-public abstract class EdmElementImpl extends EdmNamedImpl implements EdmElement {
-
-  public EdmElementImpl(final Edm edm, final String name) {
-    super(edm, name);
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
index 5d3eef3..bcca96a 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
@@ -19,7 +19,6 @@
 package org.apache.olingo.commons.core.edm.provider;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -27,13 +26,11 @@ import java.util.Map;
 import org.apache.olingo.commons.api.ODataException;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmActionImport;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
 import org.apache.olingo.commons.api.edm.EdmSingleton;
-import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.provider.ActionImport;
 import org.apache.olingo.commons.api.edm.provider.EdmProvider;
@@ -43,11 +40,10 @@ import org.apache.olingo.commons.api.edm.provider.EntitySet;
 import org.apache.olingo.commons.api.edm.provider.FunctionImport;
 import org.apache.olingo.commons.api.edm.provider.Singleton;
 
-public class EdmEntityContainerImpl extends EdmNamedImpl implements EdmEntityContainer {
+public class EdmEntityContainerImpl extends AbstractEdmNamed implements EdmEntityContainer {
 
   private final EdmProvider provider;
   private EntityContainer container;
-  private EdmAnnotationHelperImpl helper;
 
   protected final FullQualifiedName entityContainerName;
   private final FullQualifiedName parentContainerName;
@@ -66,7 +62,7 @@ public class EdmEntityContainerImpl extends EdmNamedImpl implements EdmEntityCon
 
   public EdmEntityContainerImpl(final Edm edm, final EdmProvider provider, 
       final EntityContainerInfo entityContainerInfo) {
-    super(edm, entityContainerInfo.getContainerName().getName());
+    super(edm, entityContainerInfo.getContainerName().getName(), null);
     this.provider = provider;
     this.entityContainerName = entityContainerInfo.getContainerName();
     this.parentContainerName = entityContainerInfo.getExtendsContainer();
@@ -74,12 +70,11 @@ public class EdmEntityContainerImpl extends EdmNamedImpl implements EdmEntityCon
 
   public EdmEntityContainerImpl(final Edm edm, final EdmProvider provider, final FullQualifiedName containerFQN,
       final EntityContainer entityContainer) {
-    super(edm, containerFQN.getName());
+    super(edm, containerFQN.getName(), entityContainer);
     this.provider = provider;
     container = entityContainer;
     this.entityContainerName = containerFQN;
     this.parentContainerName = entityContainer.getExtendsContainerFQN();
-    this.helper = new EdmAnnotationHelperImpl(edm, entityContainer);
   }
 
   @Override
@@ -326,14 +321,4 @@ public class EdmEntityContainerImpl extends EdmNamedImpl implements EdmEntityCon
   public TargetType getAnnotationsTargetType() {
     return TargetType.EntityContainer;
   }
-
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper == null ? null : helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper == null ? Collections.<EdmAnnotation> emptyList() : helper.getAnnotations();
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntitySetImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntitySetImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntitySetImpl.java
index d69f6fe..867b82c 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntitySetImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntitySetImpl.java
@@ -23,7 +23,7 @@ import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
 import org.apache.olingo.commons.api.edm.provider.EntitySet;
 
-public class EdmEntitySetImpl extends EdmBindingTargetImpl implements EdmEntitySet {
+public class EdmEntitySetImpl extends AbstractEdmBindingTarget implements EdmEntitySet {
 
   private EntitySet entitySet;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java
index 84445aa..cdb51f5 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityTypeImpl.java
@@ -24,22 +24,19 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
 import org.apache.olingo.commons.api.edm.EdmStructuredType;
-import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
 import org.apache.olingo.commons.api.edm.provider.EntityType;
 import org.apache.olingo.commons.api.edm.provider.PropertyRef;
 
-public class EdmEntityTypeImpl extends EdmStructuredTypeImpl implements EdmEntityType {
+public class EdmEntityTypeImpl extends AbstractEdmStructuredType implements EdmEntityType {
 
   private EntityType entityType;
   private boolean baseTypeChecked = false;
-  private EdmAnnotationHelperImpl annotationHelper;
   private final boolean hasStream;
   protected EdmEntityType entityBaseType;
   private final List<String> keyPredicateNames = new ArrayList<String>();
@@ -56,7 +53,6 @@ public class EdmEntityTypeImpl extends EdmStructuredTypeImpl implements EdmEntit
     super(edm, name, EdmTypeKind.ENTITY, entityType);
     this.entityType = entityType;
     hasStream = entityType.hasStream();
-    this.annotationHelper = new EdmAnnotationHelperImpl(edm, entityType);
   }
 
   @Override
@@ -151,14 +147,4 @@ public class EdmEntityTypeImpl extends EdmStructuredTypeImpl implements EdmEntit
   public TargetType getAnnotationsTargetType() {
     return TargetType.EntityType;
   }
-  
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return annotationHelper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return annotationHelper.getAnnotations();
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java
index df09c3c..af56e38 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEnumTypeImpl.java
@@ -42,13 +42,13 @@ import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
 public class EdmEnumTypeImpl extends EdmTypeImpl implements EdmEnumType {
 
   private static final Set<EdmPrimitiveTypeKind> VALID_UNDERLYING_TYPES = new HashSet<EdmPrimitiveTypeKind>();
-  {
+  static {
     VALID_UNDERLYING_TYPES.add(EdmPrimitiveTypeKind.Byte);
     VALID_UNDERLYING_TYPES.add(EdmPrimitiveTypeKind.SByte);
     VALID_UNDERLYING_TYPES.add(EdmPrimitiveTypeKind.Int16);
     VALID_UNDERLYING_TYPES.add(EdmPrimitiveTypeKind.Int32);
     VALID_UNDERLYING_TYPES.add(EdmPrimitiveTypeKind.Int64);
-  };
+  }
 
   private final EdmPrimitiveType underlyingType;
   private final EnumType enumType;
@@ -58,7 +58,7 @@ public class EdmEnumTypeImpl extends EdmTypeImpl implements EdmEnumType {
   private LinkedHashMap<String, EdmMember> membersMap;
 
   public EdmEnumTypeImpl(final Edm edm, final FullQualifiedName enumName, final EnumType enumType) {
-    super(edm, enumName, EdmTypeKind.ENUM);
+    super(edm, enumName, EdmTypeKind.ENUM, enumType);
 
     if (enumType.getUnderlyingType() == null) {
       underlyingType = EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int32);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImpl.java
index 4a29d83..0279a78 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImpl.java
@@ -26,12 +26,12 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
 import org.apache.olingo.commons.api.edm.provider.Function;
 
-public class EdmFunctionImpl extends EdmOperationImpl implements EdmFunction {
+public class EdmFunctionImpl extends AbstractEdmOperation implements EdmFunction {
 
   private final Function function;
 
   public static EdmFunctionImpl getInstance(final Edm edm, final FullQualifiedName name, final Function function) {
-    return EdmOperationImpl.getInstance(new EdmFunctionImpl(edm, name, function));
+    return AbstractEdmOperation.getInstance(new EdmFunctionImpl(edm, name, function));
   }
 
   private EdmFunctionImpl(final Edm edm, final FullQualifiedName name, final Function function) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImportImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImportImpl.java
index ead3116..b2e2397 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImportImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmFunctionImportImpl.java
@@ -27,7 +27,7 @@ import org.apache.olingo.commons.api.edm.EdmFunctionImport;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.provider.FunctionImport;
 
-public class EdmFunctionImportImpl extends EdmOperationImportImpl implements EdmFunctionImport {
+public class EdmFunctionImportImpl extends AbstractEdmOperationImport implements EdmFunctionImport {
 
   private final FunctionImport functionImport;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmMemberImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmMemberImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmMemberImpl.java
index a7d1366..b3a6f1e 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmMemberImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmMemberImpl.java
@@ -18,26 +18,20 @@
  */
 package org.apache.olingo.commons.core.edm.provider;
 
-import java.util.List;
-
 import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmMember;
-import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.provider.EnumMember;
 
-public class EdmMemberImpl extends EdmNamedImpl implements EdmMember {
+public class EdmMemberImpl extends AbstractEdmNamed implements EdmMember {
 
-  private final EdmAnnotationHelperImpl helper;
   private final FullQualifiedName enumFQN;
   private final EnumMember member;
 
   public EdmMemberImpl(final Edm edm, final FullQualifiedName enumFQN, final EnumMember member) {
-    super(edm, member.getName());
+    super(edm, member.getName(), member);
     this.enumFQN = enumFQN;
     this.member = member;
-    this.helper = new EdmAnnotationHelperImpl(edm, member);
   }
   
   @Override
@@ -59,15 +53,4 @@ public class EdmMemberImpl extends EdmNamedImpl implements EdmMember {
   public String getValue() {
     return member.getValue();
   }
-
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNamedImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNamedImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNamedImpl.java
deleted file mode 100644
index 93e7583..0000000
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNamedImpl.java
+++ /dev/null
@@ -1,39 +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.commons.core.edm.provider;
-
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmNamed;
-
-public abstract class EdmNamedImpl implements EdmNamed {
-
-  protected final Edm edm;
-
-  private final String name;
-
-  public EdmNamedImpl(final Edm edm, final String name) {
-    this.edm = edm;
-    this.name = name;
-  }
-
-  @Override
-  public String getName() {
-    return name;
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java
index e72a98e..db75e0c 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmNavigationPropertyImpl.java
@@ -22,32 +22,29 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmElement;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
 import org.apache.olingo.commons.api.edm.EdmStructuredType;
-import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.provider.NavigationProperty;
 import org.apache.olingo.commons.api.edm.provider.ReferentialConstraint;
 
-public class EdmNavigationPropertyImpl extends EdmElementImpl implements EdmNavigationProperty {
+public class EdmNavigationPropertyImpl extends AbstractEdmNamed implements EdmElement, EdmNavigationProperty {
 
   private final FullQualifiedName structuredTypeName;
   private final NavigationProperty navigationProperty;
-  private final EdmAnnotationHelperImpl helper;
   private List<EdmReferentialConstraint> referentialConstraints;
   private EdmEntityType typeImpl;
   private EdmNavigationProperty partnerNavigationProperty;
 
   public EdmNavigationPropertyImpl(
       final Edm edm, final FullQualifiedName structuredTypeName, final NavigationProperty navigationProperty) {
-    super(edm, navigationProperty.getName());
+    super(edm, navigationProperty.getName(), navigationProperty);
     this.structuredTypeName = structuredTypeName;
     this.navigationProperty = navigationProperty;
-    this.helper = new EdmAnnotationHelperImpl(edm, navigationProperty);
   }
 
   @Override
@@ -139,14 +136,4 @@ public class EdmNavigationPropertyImpl extends EdmElementImpl implements EdmNavi
   public FullQualifiedName getAnnotationsTargetFQN() {
     return structuredTypeName;
   }
-
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java
deleted file mode 100644
index 217c732..0000000
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImpl.java
+++ /dev/null
@@ -1,176 +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.commons.core.edm.provider;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
-import org.apache.olingo.commons.api.edm.EdmBindingTarget;
-import org.apache.olingo.commons.api.edm.EdmEntitySet;
-import org.apache.olingo.commons.api.edm.EdmException;
-import org.apache.olingo.commons.api.edm.EdmOperation;
-import org.apache.olingo.commons.api.edm.EdmParameter;
-import org.apache.olingo.commons.api.edm.EdmReturnType;
-import org.apache.olingo.commons.api.edm.EdmTerm;
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
-import org.apache.olingo.commons.api.edm.provider.Operation;
-import org.apache.olingo.commons.api.edm.provider.Parameter;
-
-public abstract class EdmOperationImpl extends EdmTypeImpl implements EdmOperation {
-
-  protected final Operation operation;
-  protected final EdmAnnotationHelperImpl helper;
-  private final Map<String, EdmParameter> parameters = new LinkedHashMap<String, EdmParameter>();
-  private String entitySetPath;
-  private boolean isBound;
-  private EdmReturnType returnType;
-  private List<String> parameterNames;
-
-  protected static <T extends EdmOperationImpl> T getInstance(final T instance) {
-    final List<Parameter> providerParameters = instance.operation.getParameters();
-    if (providerParameters != null) {
-      final List<EdmParameter> _parameters = new ArrayList<EdmParameter>(providerParameters.size());
-      for (Parameter parameter : providerParameters) {
-        _parameters.add(new EdmParameterImpl(instance.edm, parameter));
-      }
-      instance.setParameters(_parameters);
-    }
-
-    final String entitySetPath = instance.operation.getEntitySetPath();
-    if (entitySetPath != null) {
-      instance.setEntitySetPath(entitySetPath);
-    }
-
-    instance.setIsBound(instance.operation.isBound());
-
-    if (instance.operation.getReturnType() != null) {
-      instance.setReturnType(new EdmReturnTypeImpl(instance.edm, instance.operation.getReturnType()));
-    }
-
-    return instance;
-  }
-
-  protected EdmOperationImpl(final Edm edm, final FullQualifiedName name, final Operation operation,
-      final EdmTypeKind kind) {
-
-    super(edm, name, kind);
-    this.operation = operation;
-    this.helper = new EdmAnnotationHelperImpl(edm, operation);
-  }
-  
-  protected void setParameters(final List<EdmParameter> _parameters) {
-    for (EdmParameter parameter : _parameters) {
-      parameters.put(parameter.getName(), parameter);
-    }
-  }
-
-  protected void setEntitySetPath(final String entitySetPath) {
-    this.entitySetPath = entitySetPath;
-  }
-
-  protected void setIsBound(final boolean isBound) {
-    this.isBound = isBound;
-  }
-
-  protected void setReturnType(final EdmReturnType returnType) {
-    this.returnType = returnType;
-  }
-
-  @Override
-  public EdmParameter getParameter(final String name) {
-    return parameters.get(name);
-  }
-
-  @Override
-  public List<String> getParameterNames() {
-    if (parameterNames == null) {
-      parameterNames = new ArrayList<String>(parameters.size());
-      for (String parameterName : parameters.keySet()) {
-        parameterNames.add(parameterName);
-      }
-    }
-    return parameterNames;
-  }
-
-  @Override
-  public EdmEntitySet getReturnedEntitySet(final EdmEntitySet bindingParameterEntitySet) {
-    EdmEntitySet returnedEntitySet = null;
-    if (bindingParameterEntitySet != null && entitySetPath != null) {
-      final EdmBindingTarget relatedBindingTarget = bindingParameterEntitySet.getRelatedBindingTarget(entitySetPath);
-      if (relatedBindingTarget == null) {
-        throw new EdmException("Cannot find entity set with path: " + entitySetPath);
-      }
-      if (relatedBindingTarget instanceof EdmEntitySet) {
-        returnedEntitySet = (EdmEntitySet) relatedBindingTarget;
-      } else {
-        throw new EdmException("BindingTarget with name: " + relatedBindingTarget.getName()
-            + " must be an entity set");
-      }
-    }
-    return returnedEntitySet;
-  }
-
-  @Override
-  public EdmReturnType getReturnType() {
-    return returnType;
-  }
-
-  @Override
-  public boolean isBound() {
-    return isBound;
-  }
-
-  @Override
-  public FullQualifiedName getBindingParameterTypeFqn() {
-    if (isBound()) {
-      Parameter bindingParameter = operation.getParameters().get(0);
-      return bindingParameter.getTypeFQN();
-    }
-    return null;
-  }
-
-  @Override
-  public Boolean isBindingParameterTypeCollection() {
-    if (isBound()) {
-      Parameter bindingParameter = operation.getParameters().get(0);
-      return bindingParameter.isCollection();
-    }
-    return null;
-  }
-
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
-  
-  @Override
-  public String getEntitySetPath(){
-    return operation.getEntitySetPath();
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java
deleted file mode 100644
index 3ace167..0000000
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmOperationImportImpl.java
+++ /dev/null
@@ -1,93 +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.commons.core.edm.provider;
-
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
-import org.apache.olingo.commons.api.edm.EdmEntityContainer;
-import org.apache.olingo.commons.api.edm.EdmEntitySet;
-import org.apache.olingo.commons.api.edm.EdmException;
-import org.apache.olingo.commons.api.edm.EdmOperationImport;
-import org.apache.olingo.commons.api.edm.EdmTerm;
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.api.edm.Target;
-import org.apache.olingo.commons.api.edm.provider.OperationImport;
-
-public abstract class EdmOperationImportImpl extends EdmNamedImpl implements EdmOperationImport {
-
-  protected final EdmEntityContainer container;
-  private final Target entitySet;
-  private EdmEntitySet returnedEntitySet;
-  private final EdmAnnotationHelperImpl helper;
-
-  public EdmOperationImportImpl(final Edm edm, final EdmEntityContainer container,
-      final OperationImport operationImport) {
-    super(edm, operationImport.getName());
-    this.container = container;
-    this.helper = new EdmAnnotationHelperImpl(edm, operationImport);
-    this.entitySet = new Target.Builder(operationImport.getEntitySet(), container).build();
-  }
-
-  @Override
-  public FullQualifiedName getFullQualifiedName() {
-    return new FullQualifiedName(container.getNamespace(), getName());
-  }
-
-  @Override
-  public EdmEntitySet getReturnedEntitySet() {
-    if (entitySet != null && returnedEntitySet == null) {
-      EdmEntityContainer entityContainer = edm.getEntityContainer(entitySet.getEntityContainer());
-      if (entityContainer == null) {
-        throw new EdmException("Can´t find entity container with name: " + entitySet.getEntityContainer());
-      }
-      returnedEntitySet = entityContainer.getEntitySet(entitySet.getTargetName());
-      if (returnedEntitySet == null) {
-        throw new EdmException("Can´t find entity set with name: " + entitySet.getTargetName());
-      }
-    }
-    return returnedEntitySet;
-  }
-
-  @Override
-  public EdmEntityContainer getEntityContainer() {
-    return container;
-  }
-
-  @Override
-  public FullQualifiedName getAnnotationsTargetFQN() {
-    return container.getFullQualifiedName();
-  }
-
-  @Override
-  public String getAnnotationsTargetPath() {
-    return getName();
-  }
-
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java
index 157a779..0973185 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmParameterImpl.java
@@ -18,29 +18,24 @@
  */
 package org.apache.olingo.commons.core.edm.provider;
 
-import java.util.List;
-
 import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmElement;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmMapping;
 import org.apache.olingo.commons.api.edm.EdmParameter;
-import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.EdmType;
 import org.apache.olingo.commons.api.edm.geo.SRID;
 import org.apache.olingo.commons.api.edm.provider.Parameter;
 
-public class EdmParameterImpl extends EdmElementImpl implements EdmParameter {
+public class EdmParameterImpl extends AbstractEdmNamed implements EdmParameter, EdmElement {
 
   private final Parameter parameter;
-  private final EdmAnnotationHelperImpl helper;
   private final EdmTypeInfo typeInfo;
   private EdmType typeImpl;
 
   public EdmParameterImpl(final Edm edm, final Parameter parameter) {
-    super(edm, parameter.getName());
+    super(edm, parameter.getName(), parameter);
     this.parameter = parameter;
-    this.helper = new EdmAnnotationHelperImpl(edm, parameter);
     this.typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(parameter.getType()).build();
   }
 
@@ -80,16 +75,6 @@ public class EdmParameterImpl extends EdmElementImpl implements EdmParameter {
   }
 
   @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
-  
-  @Override
   public EdmType getType() {
     if (typeImpl == null) {
       typeImpl = typeInfo.getType();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java
index 973640e..14c3faf 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmPropertyImpl.java
@@ -18,34 +18,29 @@
  */
 package org.apache.olingo.commons.core.edm.provider;
 
-import java.util.List;
-
 import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmElement;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmMapping;
 import org.apache.olingo.commons.api.edm.EdmProperty;
-import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.EdmType;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.geo.SRID;
 import org.apache.olingo.commons.api.edm.provider.Property;
 
-public class EdmPropertyImpl extends EdmElementImpl implements EdmProperty {
+public class EdmPropertyImpl extends AbstractEdmNamed implements EdmProperty, EdmElement {
 
   private final FullQualifiedName structuredTypeName;
   private final Property property;
   private final EdmTypeInfo typeInfo;
-  private EdmAnnotationHelperImpl helper;
   private EdmType propertyType;
 
   public EdmPropertyImpl(final Edm edm, final FullQualifiedName structuredTypeName, final Property property) {
-    super(edm, property.getName());
+    super(edm, property.getName(), property);
 
     this.structuredTypeName = structuredTypeName;
     this.property = property;
     typeInfo = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(property.getType().toString()).build();
-    this.helper = new EdmAnnotationHelperImpl(edm, property);
   }
 
   @Override
@@ -126,16 +121,6 @@ public class EdmPropertyImpl extends EdmElementImpl implements EdmProperty {
   }
 
   @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
-
-  @Override
   public boolean isPrimitive() {
     return typeInfo.isPrimitiveType();
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java
index 4a8d7d8..ac38d20 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmReferentialConstraintImpl.java
@@ -18,22 +18,17 @@
  */
 package org.apache.olingo.commons.core.edm.provider;
 
-import java.util.List;
-
 import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
-import org.apache.olingo.commons.api.edm.EdmTerm;
 import org.apache.olingo.commons.api.edm.provider.ReferentialConstraint;
 
-public class EdmReferentialConstraintImpl implements EdmReferentialConstraint {
+public class EdmReferentialConstraintImpl extends AbstractEdmAnnotatable implements EdmReferentialConstraint {
 
-  private final EdmAnnotationHelperImpl helper;
   private final ReferentialConstraint constraint;
   
   public EdmReferentialConstraintImpl(final Edm edm, final ReferentialConstraint constraint) {
+    super(edm, constraint);
     this.constraint = constraint;
-    this.helper = new EdmAnnotationHelperImpl(edm, constraint);
   }
 
   @Override
@@ -45,14 +40,4 @@ public class EdmReferentialConstraintImpl implements EdmReferentialConstraint {
   public String getReferencedPropertyName() {
     return constraint.getReferencedProperty();
   }
-  
-  @Override
-  public EdmAnnotation getAnnotation(final EdmTerm term) {
-    return helper.getAnnotation(term);
-  }
-
-  @Override
-  public List<EdmAnnotation> getAnnotations() {
-    return helper.getAnnotations();
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/16b94eb4/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSingletonImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSingletonImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSingletonImpl.java
index ca953dc..764a6c6 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSingletonImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSingletonImpl.java
@@ -23,7 +23,7 @@ import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmSingleton;
 import org.apache.olingo.commons.api.edm.provider.Singleton;
 
-public class EdmSingletonImpl extends EdmBindingTargetImpl implements EdmSingleton {
+public class EdmSingletonImpl extends AbstractEdmBindingTarget implements EdmSingleton {
 
   public EdmSingletonImpl(final Edm edm, final EdmEntityContainer container, final Singleton singleton) {
     super(edm, container, singleton);