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/03/30 15:15:14 UTC

olingo-odata4 git commit: [OLINGO-575] Finish Edm Refactoring

Repository: olingo-odata4
Updated Branches:
  refs/heads/master af1417b3c -> 62f100148


[OLINGO-575] Finish Edm Refactoring


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

Branch: refs/heads/master
Commit: 62f100148a9dd8c7389c0ced8e9dd08e8f687515
Parents: af1417b
Author: Christian Amend <ch...@apache.org>
Authored: Mon Mar 30 15:14:40 2015 +0200
Committer: Christian Amend <ch...@apache.org>
Committed: Mon Mar 30 15:14:40 2015 +0200

----------------------------------------------------------------------
 .../olingo/ext/pojogen/AbstractPOJOGenMojo.java |  53 +++---
 .../ext/pojogen/NavPropertyBindingDetails.java  |  51 +++---
 .../org/apache/olingo/commons/api/edm/Edm.java  |   9 +
 .../olingo/commons/api/edm/EdmSchema.java       |  18 --
 .../olingo/commons/core/edm/AbstractEdm.java    | 166 +++++++++----------
 .../core/edm/provider/EdmAnnotationsImpl.java   |  38 +++--
 .../core/edm/provider/EdmProviderImpl.java      |   6 +-
 .../core/edm/provider/EdmSchemaImpl.java        | 126 +++++++-------
 8 files changed, 225 insertions(+), 242 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/62f10014/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java b/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java
index 5caeafb..9321c64 100644
--- a/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java
+++ b/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java
@@ -1,18 +1,18 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -112,12 +112,12 @@ public abstract class AbstractPOJOGenMojo extends AbstractMojo {
 
   protected File mkPkgDir(final String path) {
     return StringUtils.isBlank(basePackage)
-            ? mkdir(path)
-            : mkdir(basePackage.replace('.', File.separatorChar) + File.separator + path);
+        ? mkdir(path)
+        : mkdir(basePackage.replace('.', File.separatorChar) + File.separator + path);
   }
 
   protected void writeFile(final String name, final File path, final VelocityContext ctx, final Template template,
-          final boolean append) throws MojoExecutionException {
+      final boolean append) throws MojoExecutionException {
 
     if (!path.exists()) {
       throw new IllegalArgumentException("Invalid base path '" + path.getAbsolutePath() + "'");
@@ -152,30 +152,30 @@ public abstract class AbstractPOJOGenMojo extends AbstractMojo {
   }
 
   protected void parseObj(final File base, final String pkg, final String name, final String out)
-          throws MojoExecutionException {
+      throws MojoExecutionException {
 
-    parseObj(base, false, pkg, name, out, Collections.<String, Object>emptyMap());
+    parseObj(base, false, pkg, name, out, Collections.<String, Object> emptyMap());
   }
 
   protected void parseObj(
-          final File base,
-          final String pkg,
-          final String name,
-          final String out,
-          final Map<String, Object> objs)
-          throws MojoExecutionException {
+      final File base,
+      final String pkg,
+      final String name,
+      final String out,
+      final Map<String, Object> objs)
+      throws MojoExecutionException {
 
     parseObj(base, false, pkg, name, out, objs);
   }
 
   protected void parseObj(
-          final File base,
-          final boolean append,
-          final String pkg,
-          final String name,
-          final String out,
-          final Map<String, Object> objs)
-          throws MojoExecutionException {
+      final File base,
+      final boolean append,
+      final String pkg,
+      final String name,
+      final String out,
+      final Map<String, Object> objs)
+      throws MojoExecutionException {
 
     final VelocityContext ctx = newContext();
     ctx.put("package", pkg);
@@ -351,7 +351,8 @@ public abstract class AbstractPOJOGenMojo extends AbstractMojo {
         }
 
         // write container and top entity sets into the base package
-        for (EdmEntityContainer container : schema.getEntityContainers()) {
+        EdmEntityContainer container = schema.getEntityContainer();
+        if(container != null){
           objs.clear();
           objs.put("container", container);
           objs.put("namespace", schema.getNamespace());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/62f10014/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/NavPropertyBindingDetails.java
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/NavPropertyBindingDetails.java b/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/NavPropertyBindingDetails.java
index 48bf288..75f2105 100644
--- a/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/NavPropertyBindingDetails.java
+++ b/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/NavPropertyBindingDetails.java
@@ -60,21 +60,19 @@ public class NavPropertyBindingDetails {
   }
 
   private EdmBindingTarget getNavigationBindingDetails(final EdmStructuredType type) {
-    for (EdmSchema sc : edm.getSchemas()) {
-      for (EdmEntityContainer c : sc.getEntityContainers()) {
-        for (EdmEntitySet es : c.getEntitySets()) {
-          if (es.getEntityType().getFullQualifiedName().equals(type.getFullQualifiedName())) {
-            return es;
-          }
+    EdmEntityContainer c = edm.getEntityContainer();
+    if (c != null) {
+      for (EdmEntitySet es : c.getEntitySets()) {
+        if (es.getEntityType().getFullQualifiedName().equals(type.getFullQualifiedName())) {
+          return es;
         }
+      }
 
-        for (EdmSingleton s : c.getSingletons()) {
-          if (s.getEntityType().getFullQualifiedName().equals(type.getFullQualifiedName())) {
-            return s;
-          }
+      for (EdmSingleton s : c.getSingletons()) {
+        if (s.getEntityType().getFullQualifiedName().equals(type.getFullQualifiedName())) {
+          return s;
         }
       }
-
     }
 
     throw new IllegalStateException("EntitySet for '" + type.getName() + "' not found");
@@ -83,26 +81,25 @@ public class NavPropertyBindingDetails {
   private EdmBindingTarget getNavigationBindingDetails(
       final EdmStructuredType sourceType, final EdmNavigationProperty property) {
 
-    for (EdmSchema sc : edm.getSchemas()) {
-      for (EdmEntityContainer c : sc.getEntityContainers()) {
-        for (EdmEntitySet es : c.getEntitySets()) {
-          if (es.getEntityType().getFullQualifiedName().equals(sourceType.getFullQualifiedName())) {
-            for (EdmNavigationPropertyBinding binding : es.getNavigationPropertyBindings()) {
-              if (binding.getPath().equals(property.getName())
-                  || binding.getPath().endsWith("/" + property.getName())) {
-                return es.getRelatedBindingTarget(binding.getPath());
-              }
+    EdmEntityContainer c = edm.getEntityContainer();
+    if (c != null) {
+      for (EdmEntitySet es : c.getEntitySets()) {
+        if (es.getEntityType().getFullQualifiedName().equals(sourceType.getFullQualifiedName())) {
+          for (EdmNavigationPropertyBinding binding : es.getNavigationPropertyBindings()) {
+            if (binding.getPath().equals(property.getName())
+                || binding.getPath().endsWith("/" + property.getName())) {
+              return es.getRelatedBindingTarget(binding.getPath());
             }
           }
         }
+      }
 
-        for (EdmSingleton s : c.getSingletons()) {
-          if (s.getEntityType().getFullQualifiedName().equals(sourceType.getFullQualifiedName())) {
-            for (EdmNavigationPropertyBinding binding : s.getNavigationPropertyBindings()) {
-              if (binding.getPath().equals(property.getName())
-                  || binding.getPath().endsWith("/" + property.getName())) {
-                return s.getRelatedBindingTarget(binding.getPath());
-              }
+      for (EdmSingleton s : c.getSingletons()) {
+        if (s.getEntityType().getFullQualifiedName().equals(sourceType.getFullQualifiedName())) {
+          for (EdmNavigationPropertyBinding binding : s.getNavigationPropertyBindings()) {
+            if (binding.getPath().equals(property.getName())
+                || binding.getPath().endsWith("/" + property.getName())) {
+              return s.getRelatedBindingTarget(binding.getPath());
             }
           }
         }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/62f10014/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
index 8790afb..7b9376a 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
@@ -43,6 +43,15 @@ public interface Edm {
   EdmSchema getSchema(String namespace);
 
   /**
+   * Get main entity container.
+   * <br/>
+   * See {@link EdmEntityContainer} for more information.
+   * 
+   * @return {@link EdmEntityContainer}
+   */
+  EdmEntityContainer getEntityContainer();
+  
+  /**
    * Get entity container by full qualified name.
    * <br/>
    * See {@link EdmEntityContainer} for more information.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/62f10014/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmSchema.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmSchema.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmSchema.java
index 1f4667c..837514e 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmSchema.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmSchema.java
@@ -80,22 +80,4 @@ public interface EdmSchema extends EdmAnnotatable {
    */
   EdmEntityContainer getEntityContainer();
 
-  /**
-   * Returns the list of entity containers for this schema.
-   * <br/>
-   * According to CSDL specifications, this method will always return a singleton list for OData 4.0, containing the
-   * same container as returned by {@link #getEntityContainer()}.
-   * 
-   * @return the list of entity containers for this schema; singleton list for OData 4.0
-   */
-  List<EdmEntityContainer> getEntityContainers();
-
-  /**
-   * Returns the entity container for the given name, or null if not found.
-   * 
-   * @param name entity container full qualified name
-   * @return the entity container for the given name, or null if not found
-   */
-  EdmEntityContainer getEntityContainer(FullQualifiedName name);
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/62f10014/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
index bc0b304..e865aa6 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
@@ -79,13 +79,17 @@ public abstract class AbstractEdm implements Edm {
 
   @Override
   public List<EdmSchema> getSchemas() {
-    initSchemas();
+    if (schemaList == null) {
+      initSchemas();
+    }
     return schemaList;
   }
 
   @Override
   public EdmSchema getSchema(final String namespace) {
-    initSchemas();
+    if (schemas == null) {
+      initSchemas();
+    }
 
     EdmSchema schema = schemas.get(namespace);
     if (schema == null) {
@@ -99,94 +103,20 @@ public abstract class AbstractEdm implements Edm {
   }
 
   private void initSchemas() {
+    aliasToNamespaceInfo = new HashMap<String, String>();
+    schemas = createSchemas();
     if (schemas == null) {
-      schemas = createSchemas();
-      if (schemas != null) {
-        schemaList = Collections.unmodifiableList(new ArrayList<EdmSchema>(schemas.values()));
-        aliasToNamespaceInfo = new HashMap<String, String>();
-        for (EdmSchema schema : schemas.values()) {
-          final String namespace = schema.getNamespace();
-
-          if (schema.getAlias() != null) {
-            aliasToNamespaceInfo.put(schema.getAlias(), namespace);
-          }
-
-          final List<EdmEnumType> localEnumTypes = schema.getEnumTypes();
-          if (localEnumTypes != null) {
-            for (EdmEnumType enumType : localEnumTypes) {
-              enumTypes.put(new FullQualifiedName(namespace, enumType.getName()), enumType);
-            }
-          }
-
-          final List<EdmTypeDefinition> localTypeDefinitions = schema.getTypeDefinitions();
-          if (localTypeDefinitions != null) {
-            for (EdmTypeDefinition typeDef : localTypeDefinitions) {
-              typeDefinitions.put(new FullQualifiedName(namespace, typeDef.getName()), typeDef);
-            }
-          }
-
-          final List<EdmComplexType> localComplexTypes = schema.getComplexTypes();
-          if (localComplexTypes != null) {
-            for (EdmComplexType complexType : localComplexTypes) {
-              complexTypes.put(new FullQualifiedName(namespace, complexType.getName()), complexType);
-            }
-          }
-
-          List<EdmEntityType> localEntityTypes = schema.getEntityTypes();
-          if (localEntityTypes != null) {
-            for (EdmEntityType entityType : localEntityTypes) {
-              entityTypes.put(new FullQualifiedName(namespace, entityType.getName()), entityType);
-            }
-          }
-
-          final List<EdmAction> localActions = schema.getActions();
-          if (localActions != null) {
-            for (EdmAction action : localActions) {
-              final FullQualifiedName name = new FullQualifiedName(namespace, action.getName());
-              if (action.isBound()) {
-                final ActionMapKey key = new ActionMapKey(name,
-                    action.getBindingParameterTypeFqn(), action.isBindingParameterTypeCollection());
-                boundActions.put(key, action);
-              } else {
-                unboundActions.put(name, action);
-              }
-            }
-          }
-
-          final List<EdmFunction> localFunctions = schema.getFunctions();
-          if (localFunctions != null) {
-            for (EdmFunction function : localFunctions) {
-              final FullQualifiedName name = new FullQualifiedName(namespace, function.getName());
-              final FunctionMapKey key = new FunctionMapKey(name,
-                  function.getBindingParameterTypeFqn(), function.isBindingParameterTypeCollection(),
-                  function.getParameterNames());
-
-              if (function.isBound()) {
-                boundFunctions.put(key, function);
-              } else {
-                if (!unboundFunctionsByName.containsKey(name)) {
-                  unboundFunctionsByName.put(name, new ArrayList<EdmFunction>());
-                }
-                unboundFunctionsByName.get(name).add(function);
-
-                unboundFunctionsByKey.put(key, function);
-              }
-            }
-          }
-
-          final EdmEntityContainer entityContainer = schema.getEntityContainer();
-          if (entityContainer != null) {
-            entityContainers.put(new FullQualifiedName(namespace, entityContainer.getName()), entityContainer);
-            if (!entityContainers.containsKey(null)) {
-              entityContainers.put(null, entityContainer);
-            }
-          }
-        }
-      }
+      schemas = Collections.emptyMap();
     }
+    schemaList = Collections.unmodifiableList(new ArrayList<EdmSchema>(schemas.values()));
   }
 
   @Override
+  public EdmEntityContainer getEntityContainer() {
+    return getEntityContainer(null);
+  }
+  
+  @Override
   public EdmEntityContainer getEntityContainer(final FullQualifiedName namespaceOrAliasFQN) {
     final FullQualifiedName fqn = resolvePossibleAlias(namespaceOrAliasFQN);
     EdmEntityContainer container = entityContainers.get(fqn);
@@ -419,16 +349,43 @@ public abstract class AbstractEdm implements Edm {
 
   protected abstract Map<String, String> createAliasToNamespaceInfo();
 
+  public void cacheAliasNamespaceInfo(String alias, String namespace) {
+    if (aliasToNamespaceInfo == null) {
+      aliasToNamespaceInfo = new HashMap<String, String>();
+    }
+    aliasToNamespaceInfo.put(alias, namespace);
+  }
+
   protected abstract EdmEntityContainer createEntityContainer(FullQualifiedName containerName);
 
+  public void cacheEntityContainer(FullQualifiedName containerFQN, EdmEntityContainer container) {
+    entityContainers.put(containerFQN, container);
+  }
+
   protected abstract EdmEnumType createEnumType(FullQualifiedName enumName);
 
+  public void cacheEnumType(FullQualifiedName enumName, EdmEnumType enumType) {
+    enumTypes.put(enumName, enumType);
+  }
+
   protected abstract EdmTypeDefinition createTypeDefinition(FullQualifiedName typeDefinitionName);
 
+  public void cacheTypeDefinition(FullQualifiedName typeDefName, EdmTypeDefinition typeDef) {
+    typeDefinitions.put(typeDefName, typeDef);
+  }
+
   protected abstract EdmEntityType createEntityType(FullQualifiedName entityTypeName);
 
+  public void cacheEntityType(FullQualifiedName entityTypeName, EdmEntityType entityType) {
+    entityTypes.put(entityTypeName, entityType);
+  }
+
   protected abstract EdmComplexType createComplexType(FullQualifiedName complexTypeName);
 
+  public void cacheComplexType(FullQualifiedName compelxTypeName, EdmComplexType complexType) {
+    complexTypes.put(compelxTypeName, complexType);
+  }
+
   protected abstract EdmAction createUnboundAction(FullQualifiedName actionName);
 
   protected abstract List<EdmFunction> createUnboundFunctions(FullQualifiedName functionName);
@@ -443,9 +400,48 @@ public abstract class AbstractEdm implements Edm {
       FullQualifiedName bindingParameterTypeName, Boolean isBindingParameterCollection,
       List<String> parameterNames);
 
+  public void cacheFunction(FullQualifiedName functionName, EdmFunction function) {
+    final FunctionMapKey key = new FunctionMapKey(functionName,
+        function.getBindingParameterTypeFqn(), function.isBindingParameterTypeCollection(),
+        function.getParameterNames());
+
+    if (function.isBound()) {
+      boundFunctions.put(key, function);
+    } else {
+      if (!unboundFunctionsByName.containsKey(functionName)) {
+        unboundFunctionsByName.put(functionName, new ArrayList<EdmFunction>());
+      }
+      unboundFunctionsByName.get(functionName).add(function);
+
+      unboundFunctionsByKey.put(key, function);
+    }
+  }
+
+  public void cacheAction(FullQualifiedName actionName, EdmAction action) {
+    if (action.isBound()) {
+      final ActionMapKey key = new ActionMapKey(actionName,
+          action.getBindingParameterTypeFqn(), action.isBindingParameterTypeCollection());
+      boundActions.put(key, action);
+    } else {
+      unboundActions.put(actionName, action);
+    }
+  }
+
   protected abstract EdmTerm createTerm(FullQualifiedName termName);
+  
+  public void cacheTerm(FullQualifiedName termName, EdmTerm term) {
+    terms.put(termName, term);
+  }
 
   protected abstract EdmAnnotations createAnnotationGroup(FullQualifiedName targetName);
+ 
+  public void cacheAnnotationGroup(FullQualifiedName annotationsGroupName, EdmAnnotations annotationsGroup) {
+    annotationGroups.put(annotationsGroupName, annotationsGroup);
+  }
 
   protected abstract List<EdmAnnotation> createAnnotations(FullQualifiedName annotatedName);
+  
+//  public void cacheAnnotation(FullQualifiedName annotationsGroupName, EdmAnnotations annotationsGroup) {
+//    annotationGroups.put(annotationsGroupName, annotationsGroup);
+//  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/62f10014/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java
index a779bf1..4de911c 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmAnnotationsImpl.java
@@ -1,18 +1,18 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -54,8 +54,8 @@ public class EdmAnnotationsImpl implements EdmAnnotations {
     EdmAnnotationsTarget _target = null;
     if (structured != null) {
       _target = path == null
-              ? structured
-              : structured.getStructuralProperty(path);
+          ? structured
+          : structured.getStructuralProperty(path);
       if (_target == null) {
         _target = structured.getNavigationProperty(path);
       }
@@ -67,8 +67,8 @@ public class EdmAnnotationsImpl implements EdmAnnotations {
     EdmAnnotationsTarget _target = null;
     if (enumType != null) {
       _target = path == null
-              ? enumType
-              : enumType.getMember(path);
+          ? enumType
+          : enumType.getMember(path);
     }
     return _target;
   }
@@ -80,23 +80,25 @@ public class EdmAnnotationsImpl implements EdmAnnotations {
       final FullQualifiedName base = new FullQualifiedName(splitted[0]);
       final String path = splitted.length > 1 ? splitted[1] : null;
 
-      final EdmEntityContainer baseEntityContainer = schema.getEntityContainer(base);
-      
-      target = baseEntityContainer == null? null: baseEntityContainer.getActionImport(path);
+      final EdmEntityContainer baseEntityContainer = schema.getEntityContainer();
+
+      target = baseEntityContainer == null ? null : baseEntityContainer.getActionImport(path);
       if (target == null) {
         target = getTarget(edm.getComplexType(base), path);
         if (target == null) {
-          target = baseEntityContainer;
+          if(baseEntityContainer != null && baseEntityContainer.getFullQualifiedName().equals(base)){
+            target = baseEntityContainer;
+          }
           if (target == null) {
-            target = baseEntityContainer == null? null: baseEntityContainer.getEntitySet(path);
+            target = baseEntityContainer == null ? null : baseEntityContainer.getEntitySet(path);
             if (target == null) {
               target = getTarget(edm.getEntityType(base), path);
               if (target == null) {
                 target = getTarget(edm.getEnumType(base), path);
                 if (target == null) {
-                  target = baseEntityContainer == null? null: baseEntityContainer.getFunctionImport(path);
+                  target = baseEntityContainer == null ? null : baseEntityContainer.getFunctionImport(path);
                   if (target == null) {
-                    target = baseEntityContainer == null? null: baseEntityContainer.getSingleton(path);
+                    target = baseEntityContainer == null ? null : baseEntityContainer.getSingleton(path);
                     if (target == null) {
                       target = edm.getTerm(base);
                       if (target == null) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/62f10014/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java
index 3da0536..daa0e87 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmProviderImpl.java
@@ -317,11 +317,11 @@ public class EdmProviderImpl extends AbstractEdm {
   @Override
   protected Map<String, EdmSchema> createSchemas() {
     try {
-      final Map<String, EdmSchema> _schemas = new LinkedHashMap<String, EdmSchema>();
+      final Map<String, EdmSchema> providerSchemas = new LinkedHashMap<String, EdmSchema>();
       for (Schema schema : provider.getSchemas()) {
-        _schemas.put(schema.getNamespace(), new EdmSchemaImpl(this, provider, schema));
+        providerSchemas.put(schema.getNamespace(), new EdmSchemaImpl(this, provider, schema));
       }
-      return _schemas;
+      return providerSchemas;
     } catch (ODataException e) {
       throw new EdmException(e);
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/62f10014/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java
index 7e09b2d..ea44dc6 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmSchemaImpl.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmAction;
 import org.apache.olingo.commons.api.edm.EdmAnnotation;
 import org.apache.olingo.commons.api.edm.EdmAnnotations;
@@ -50,7 +49,7 @@ import org.apache.olingo.commons.api.edm.provider.TypeDefinition;
 public class EdmSchemaImpl implements EdmSchema {
 
   private final Schema schema;
-  private final Edm edm;
+  private final EdmProviderImpl edm;
   private final EdmProvider provider;
 
   protected final String namespace;
@@ -66,115 +65,81 @@ public class EdmSchemaImpl implements EdmSchema {
   private List<EdmAnnotation> annotations;
   private EdmEntityContainer entityContainer;
 
-  public EdmSchemaImpl(final Edm edm, final EdmProvider provider, final Schema schema) {
+  public EdmSchemaImpl(final EdmProviderImpl edm, final EdmProvider provider, final Schema schema) {
     this.edm = edm;
     this.provider = provider;
     this.schema = schema;
     this.namespace = schema.getNamespace();
     this.alias = schema.getAlias();
+
+    if (alias != null) {
+      edm.cacheAliasNamespaceInfo(alias, namespace);
+    }
+
+    enumTypes = createEnumTypes();
+    typeDefinitions = createTypeDefinitions();
+    entityTypes = createEntityTypes();
+    complexTypes = createComplexTypes();
+    actions = createActions();
+    functions = createFunctions();
+    entityContainer = createEntityContainer();
+    annotationGroups = createAnnotationGroups();
+    annotations = createAnnotations();
+    terms = createTerms();
+
   }
 
   @Override
   public List<EdmEnumType> getEnumTypes() {
-    if (enumTypes == null) {
-      enumTypes = createEnumTypes();
-    }
     return Collections.unmodifiableList(enumTypes);
   }
 
   @Override
   public List<EdmEntityType> getEntityTypes() {
-    if (entityTypes == null) {
-      entityTypes = createEntityTypes();
-    }
     return Collections.unmodifiableList(entityTypes);
   }
 
   @Override
   public List<EdmComplexType> getComplexTypes() {
-    if (complexTypes == null) {
-      complexTypes = createComplexTypes();
-    }
     return Collections.unmodifiableList(complexTypes);
   }
 
   @Override
   public List<EdmAction> getActions() {
-    if (actions == null) {
-      actions = createActions();
-    }
     return Collections.unmodifiableList(actions);
   }
 
   @Override
   public List<EdmFunction> getFunctions() {
-    if (functions == null) {
-      functions = createFunctions();
-    }
     return Collections.unmodifiableList(functions);
   }
 
   @Override
   public List<EdmTypeDefinition> getTypeDefinitions() {
-    if (typeDefinitions == null) {
-      typeDefinitions = createTypeDefinitions();
-    }
     return Collections.unmodifiableList(typeDefinitions);
   }
 
   @Override
   public List<EdmTerm> getTerms() {
-    if (terms == null) {
-      terms = createTerms();
-    }
     return Collections.unmodifiableList(terms);
   }
 
   @Override
   public List<EdmAnnotations> getAnnotationGroups() {
-    if (annotationGroups == null) {
-      annotationGroups = createAnnotationGroups();
-    }
     return Collections.unmodifiableList(annotationGroups);
   }
 
   @Override
   public List<EdmAnnotation> getAnnotations() {
-    if (annotations == null) {
-      annotations = createAnnotations();
-    }
     return Collections.unmodifiableList(annotations);
   }
 
   @Override
   public EdmEntityContainer getEntityContainer() {
-    if (entityContainer == null) {
-      entityContainer = createEntityContainer();
-    }
     return entityContainer;
   }
 
   @Override
-  public List<EdmEntityContainer> getEntityContainers() {
-    if (getEntityContainer() == null) {
-      return Collections.<EdmEntityContainer> emptyList();
-    } else {
-      return Collections.unmodifiableList(Collections.singletonList(getEntityContainer()));
-    }
-  }
-
-  @Override
-  public EdmEntityContainer getEntityContainer(final FullQualifiedName name) {
-    return getEntityContainer() == null
-        ? null
-        : name == null
-            ? getEntityContainer()
-            : name.equals(getEntityContainer().getFullQualifiedName())
-                ? getEntityContainer()
-                : null;
-  }
-
-  @Override
   public String getNamespace() {
     return namespace;
   }
@@ -187,7 +152,10 @@ public class EdmSchemaImpl implements EdmSchema {
   protected EdmEntityContainer createEntityContainer() {
     if (schema.getEntityContainer() != null) {
       FullQualifiedName containerFQN = new FullQualifiedName(namespace, schema.getEntityContainer().getName());
-      return new EdmEntityContainerImpl(edm, provider, containerFQN, schema.getEntityContainer());
+      EdmEntityContainer impl = new EdmEntityContainerImpl(edm, provider, containerFQN, schema.getEntityContainer());
+      edm.cacheEntityContainer(containerFQN, impl);
+      edm.cacheEntityContainer(null, impl);
+      return impl;
     }
     return null;
   }
@@ -197,7 +165,10 @@ public class EdmSchemaImpl implements EdmSchema {
     final List<TypeDefinition> providerTypeDefinitions = schema.getTypeDefinitions();
     if (providerTypeDefinitions != null) {
       for (TypeDefinition def : providerTypeDefinitions) {
-        typeDefinitions.add(new EdmTypeDefinitionImpl(edm, new FullQualifiedName(namespace, def.getName()), def));
+        FullQualifiedName typeDefName = new FullQualifiedName(namespace, def.getName());
+        EdmTypeDefinitionImpl typeDefImpl = new EdmTypeDefinitionImpl(edm, typeDefName, def);
+        typeDefinitions.add(typeDefImpl);
+        edm.cacheTypeDefinition(typeDefName, typeDefImpl);
       }
     }
     return typeDefinitions;
@@ -208,7 +179,10 @@ public class EdmSchemaImpl implements EdmSchema {
     final List<EnumType> providerEnumTypes = schema.getEnumTypes();
     if (providerEnumTypes != null) {
       for (EnumType enumType : providerEnumTypes) {
-        enumTypes.add(new EdmEnumTypeImpl(edm, new FullQualifiedName(namespace, enumType.getName()), enumType));
+        FullQualifiedName enumName = new FullQualifiedName(namespace, enumType.getName());
+        EdmEnumType enumTypeImpl = new EdmEnumTypeImpl(edm, enumName, enumType);
+        enumTypes.add(enumTypeImpl);
+        edm.cacheEnumType(enumName, enumTypeImpl);
       }
     }
     return enumTypes;
@@ -219,8 +193,10 @@ public class EdmSchemaImpl implements EdmSchema {
     final List<EntityType> providerEntityTypes = schema.getEntityTypes();
     if (providerEntityTypes != null) {
       for (EntityType entityType : providerEntityTypes) {
-        entityTypes.add(new EdmEntityTypeImpl(edm, new FullQualifiedName(namespace, entityType.getName()),
-            entityType));
+        FullQualifiedName entityTypeName = new FullQualifiedName(namespace, entityType.getName());
+        EdmEntityTypeImpl entityTypeImpl = new EdmEntityTypeImpl(edm, entityTypeName, entityType);
+        entityTypes.add(entityTypeImpl);
+        edm.cacheEntityType(entityTypeName, entityTypeImpl);
       }
     }
     return entityTypes;
@@ -231,8 +207,10 @@ public class EdmSchemaImpl implements EdmSchema {
     final List<ComplexType> providerComplexTypes = schema.getComplexTypes();
     if (providerComplexTypes != null) {
       for (ComplexType complexType : providerComplexTypes) {
-        complexTypes.add(new EdmComplexTypeImpl(edm, new FullQualifiedName(namespace, complexType.getName()),
-            complexType));
+        FullQualifiedName comlexTypeName = new FullQualifiedName(namespace, complexType.getName());
+        EdmComplexTypeImpl complexTypeImpl = new EdmComplexTypeImpl(edm, comlexTypeName, complexType);
+        complexTypes.add(complexTypeImpl);
+        edm.cacheComplexType(comlexTypeName, complexTypeImpl);
       }
     }
     return complexTypes;
@@ -243,7 +221,10 @@ public class EdmSchemaImpl implements EdmSchema {
     final List<Action> providerActions = schema.getActions();
     if (providerActions != null) {
       for (Action action : providerActions) {
-        actions.add(new EdmActionImpl(edm, new FullQualifiedName(namespace, action.getName()), action));
+        FullQualifiedName actionName = new FullQualifiedName(namespace, action.getName());
+        EdmActionImpl edmActionImpl = new EdmActionImpl(edm, actionName, action);
+        actions.add(edmActionImpl);
+        edm.cacheAction(actionName, edmActionImpl);
       }
     }
     return actions;
@@ -254,7 +235,10 @@ public class EdmSchemaImpl implements EdmSchema {
     final List<Function> providerFunctions = schema.getFunctions();
     if (providerFunctions != null) {
       for (Function function : providerFunctions) {
-        functions.add(new EdmFunctionImpl(edm, new FullQualifiedName(namespace, function.getName()), function));
+        FullQualifiedName functionName = new FullQualifiedName(namespace, function.getName());
+        EdmFunctionImpl functionImpl = new EdmFunctionImpl(edm, functionName, function);
+        functions.add(functionImpl);
+        edm.cacheFunction(functionName, functionImpl);
       }
     }
     return functions;
@@ -265,7 +249,10 @@ public class EdmSchemaImpl implements EdmSchema {
     final List<Term> providerTerms = schema.getTerms();
     if (providerTerms != null) {
       for (Term term : providerTerms) {
-        terms.add(new EdmTermImpl(edm, getNamespace(), term));
+        FullQualifiedName termName = new FullQualifiedName(namespace, term.getName());
+        EdmTermImpl termImpl = new EdmTermImpl(edm, getNamespace(), term);
+        terms.add(termImpl);
+        edm.cacheTerm(termName, termImpl);
       }
     }
     return terms;
@@ -277,7 +264,15 @@ public class EdmSchemaImpl implements EdmSchema {
         schema.getAnnotationGroups();
     if (providerAnnotations != null) {
       for (Annotations annotationGroup : providerAnnotations) {
-        annotationGroups.add(new EdmAnnotationsImpl(edm, this, annotationGroup));
+        FullQualifiedName annotationsGroupName;
+        if (annotationGroup.getTarget().contains(".")) {
+          annotationsGroupName = new FullQualifiedName(annotationGroup.getTarget());
+        } else {
+          annotationsGroupName = new FullQualifiedName(namespace, annotationGroup.getTarget());
+        }
+        EdmAnnotationsImpl annotationsImpl = new EdmAnnotationsImpl(edm, this, annotationGroup);
+        annotationGroups.add(annotationsImpl);
+        edm.cacheAnnotationGroup(annotationsGroupName, annotationsImpl);
       }
     }
     return annotationGroups;
@@ -289,7 +284,8 @@ public class EdmSchemaImpl implements EdmSchema {
         schema.getAnnotations();
     if (providerAnnotations != null) {
       for (Annotation annotation : providerAnnotations) {
-        annotations.add(new EdmAnnotationImpl(edm, annotation));
+        EdmAnnotationImpl annotationImpl = new EdmAnnotationImpl(edm, annotation);
+        annotations.add(annotationImpl);
       }
     }
     return annotations;