You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by tb...@apache.org on 2013/12/20 16:18:07 UTC

[05/12] [OLINGO-83] Refactoring of 'annotation-processor-*' modules

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/3bd59050/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
----------------------------------------------------------------------
diff --git a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
deleted file mode 100644
index e35e128..0000000
--- a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/core/annotation/edm/AnnotationEdmProvider.java
+++ /dev/null
@@ -1,769 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- ******************************************************************************/
-package org.apache.olingo.odata2.core.annotation.edm;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.olingo.odata2.api.annotation.edm.EdmComplexType;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet;
-import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType;
-import org.apache.olingo.odata2.api.annotation.edm.EdmKey;
-import org.apache.olingo.odata2.api.annotation.edm.EdmMediaResourceContent;
-import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty;
-import org.apache.olingo.odata2.api.annotation.edm.EdmProperty;
-import org.apache.olingo.odata2.api.annotation.edm.EdmType;
-import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
-import org.apache.olingo.odata2.api.edm.FullQualifiedName;
-import org.apache.olingo.odata2.api.edm.provider.AnnotationAttribute;
-import org.apache.olingo.odata2.api.edm.provider.AnnotationElement;
-import org.apache.olingo.odata2.api.edm.provider.Association;
-import org.apache.olingo.odata2.api.edm.provider.AssociationEnd;
-import org.apache.olingo.odata2.api.edm.provider.AssociationSet;
-import org.apache.olingo.odata2.api.edm.provider.AssociationSetEnd;
-import org.apache.olingo.odata2.api.edm.provider.ComplexProperty;
-import org.apache.olingo.odata2.api.edm.provider.ComplexType;
-import org.apache.olingo.odata2.api.edm.provider.EdmProvider;
-import org.apache.olingo.odata2.api.edm.provider.EntityContainer;
-import org.apache.olingo.odata2.api.edm.provider.EntityContainerInfo;
-import org.apache.olingo.odata2.api.edm.provider.EntitySet;
-import org.apache.olingo.odata2.api.edm.provider.EntityType;
-import org.apache.olingo.odata2.api.edm.provider.FunctionImport;
-import org.apache.olingo.odata2.api.edm.provider.Key;
-import org.apache.olingo.odata2.api.edm.provider.NavigationProperty;
-import org.apache.olingo.odata2.api.edm.provider.Property;
-import org.apache.olingo.odata2.api.edm.provider.PropertyRef;
-import org.apache.olingo.odata2.api.edm.provider.Schema;
-import org.apache.olingo.odata2.api.edm.provider.SimpleProperty;
-import org.apache.olingo.odata2.api.edm.provider.Using;
-import org.apache.olingo.odata2.api.exception.ODataException;
-import org.apache.olingo.odata2.core.annotation.util.AnnotationHelper;
-import org.apache.olingo.odata2.core.annotation.util.ClassHelper;
-import org.apache.olingo.odata2.core.exception.ODataRuntimeException;
-
-/**
- * Provider for the entity data model used in the reference scenario
- * 
- */
-public class AnnotationEdmProvider extends EdmProvider {
-
-  private static final AnnotationHelper ANNOTATION_HELPER = new AnnotationHelper();
-
-  private final List<Class<?>> annotatedClasses;
-  private final Map<String, EntityContainer> name2Container = new HashMap<String, EntityContainer>();
-  private final Map<String, ContainerBuilder> containerName2ContainerBuilder = new HashMap<String, ContainerBuilder>();
-  private final Map<String, Schema> namespace2Schema = new HashMap<String, Schema>();
-  private EntityContainer defaultContainer;
-
-  public AnnotationEdmProvider(final Collection<Class<?>> annotatedClasses) {
-
-    this.annotatedClasses = new ArrayList<Class<?>>(annotatedClasses.size());
-    for (Class<?> aClass : annotatedClasses) {
-      if (ANNOTATION_HELPER.isEdmAnnotated(aClass)) {
-        this.annotatedClasses.add(aClass);
-      }
-    }
-
-    init();
-  }
-
-  public AnnotationEdmProvider(final String packageToScan) {
-    annotatedClasses = ClassHelper.loadClasses(packageToScan, new ClassHelper.ClassValidator() {
-      @Override
-      public boolean isClassValid(final Class<?> c) {
-        return ANNOTATION_HELPER.isEdmAnnotated(c);
-      }
-    });
-
-    init();
-  }
-
-  private void init() {
-    for (Class<?> aClass : annotatedClasses) {
-      updateSchema(aClass);
-      handleEntityContainer(aClass);
-    }
-
-    finish();
-  }
-
-  @Override
-  public Association getAssociation(final FullQualifiedName edmFQName) throws ODataException {
-    Schema schema = namespace2Schema.get(edmFQName.getNamespace());
-    if (schema != null) {
-      List<Association> associations = schema.getAssociations();
-      for (Association association : associations) {
-        if (association.getName().equals(edmFQName.getName())) {
-          return association;
-        }
-      }
-    }
-    return null;
-  }
-
-  @Override
-  public AssociationSet getAssociationSet(final String entityContainer, final FullQualifiedName association,
-      final String sourceEntitySetName, final String sourceEntitySetRole) throws ODataException {
-    EntityContainer container = name2Container.get(entityContainer);
-    if (container != null) {
-      List<AssociationSet> associations = container.getAssociationSets();
-      for (AssociationSet associationSet : associations) {
-        if (associationSet.getAssociation().equals(association)) {
-          final AssociationSetEnd endOne = associationSet.getEnd1();
-          if (endOne.getRole().equals(sourceEntitySetRole)
-              && endOne.getEntitySet().equals(sourceEntitySetName)) {
-            return associationSet;
-          }
-          final AssociationSetEnd endTwo = associationSet.getEnd2();
-          if (endTwo.getRole().equals(sourceEntitySetRole)
-              && endTwo.getEntitySet().equals(sourceEntitySetName)) {
-            return associationSet;
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  @Override
-  public ComplexType getComplexType(final FullQualifiedName edmFQName) throws ODataException {
-    Schema schema = namespace2Schema.get(edmFQName.getNamespace());
-    if (schema != null) {
-      List<ComplexType> complexTypes = schema.getComplexTypes();
-      for (ComplexType complexType : complexTypes) {
-        if (complexType.getName().equals(edmFQName.getName())) {
-          return complexType;
-        }
-      }
-    }
-    return null;
-  }
-
-  @Override
-  public EntityContainerInfo getEntityContainerInfo(final String name) throws ODataException {
-    EntityContainer container = name2Container.get(name);
-    if (container == null) {
-      // use default container (if set)
-      container = defaultContainer;
-    }
-    if (container != null) {
-      EntityContainerInfo info = new EntityContainerInfo();
-      info.setName(container.getName());
-      info.setDefaultEntityContainer(container.isDefaultEntityContainer());
-      info.setExtendz(container.getExtendz());
-      info.setAnnotationAttributes(container.getAnnotationAttributes());
-      info.setAnnotationElements(container.getAnnotationElements());
-
-      return info;
-    }
-
-    return null;
-  }
-
-  @Override
-  public EntitySet getEntitySet(final String entityContainer, final String name) throws ODataException {
-    EntityContainer container = name2Container.get(entityContainer);
-    if (container != null) {
-      List<EntitySet> entitySets = container.getEntitySets();
-      for (EntitySet entitySet : entitySets) {
-        if (entitySet.getName().equals(name)) {
-          return entitySet;
-        }
-      }
-    }
-
-    return null;
-  }
-
-  @Override
-  public EntityType getEntityType(final FullQualifiedName edmFQName) throws ODataException {
-    Schema schema = namespace2Schema.get(edmFQName.getNamespace());
-    if (schema != null) {
-      List<EntityType> complexTypes = schema.getEntityTypes();
-      for (EntityType complexType : complexTypes) {
-        if (complexType.getName().equals(edmFQName.getName())) {
-          return complexType;
-        }
-      }
-    }
-    return null;
-  }
-
-  @Override
-  public FunctionImport getFunctionImport(final String entityContainer, final String name) throws ODataException {
-    EntityContainer container = name2Container.get(entityContainer);
-    if (container != null) {
-      List<FunctionImport> functionImports = container.getFunctionImports();
-      for (FunctionImport functionImport : functionImports) {
-        if (functionImport.getName().equals(name)) {
-          return functionImport;
-        }
-      }
-    }
-    return null;
-  }
-
-  @Override
-  public List<Schema> getSchemas() throws ODataException {
-    return new ArrayList<Schema>(namespace2Schema.values());
-  }
-
-  //
-  //
-  //
-  private Map<String, SchemaBuilder> namespace2SchemaBuilder = new HashMap<String, SchemaBuilder>();
-
-  private void updateSchema(final Class<?> aClass) {
-    EdmEntityType et = aClass.getAnnotation(EdmEntityType.class);
-    if (et != null) {
-      updateSchema(aClass, et);
-    }
-    EdmComplexType ect = aClass.getAnnotation(EdmComplexType.class);
-    if (ect != null) {
-      updateSchema(aClass, ect);
-    }
-  }
-
-  private void updateSchema(final Class<?> aClass, final EdmEntityType et) {
-    SchemaBuilder b = getSchemaBuilder(et.namespace(), aClass);
-    TypeBuilder typeBuilder = TypeBuilder.init(et, aClass);
-    b.addEntityType(typeBuilder.buildEntityType());
-    b.addAssociations(typeBuilder.buildAssociations());
-  }
-
-  private SchemaBuilder getSchemaBuilder(final String namespace, final Class<?> aClass) {
-    String usedNamespace = namespace;
-    if (usedNamespace.isEmpty()) {
-      usedNamespace = ANNOTATION_HELPER.getCanonicalNamespace(aClass);
-    }
-    SchemaBuilder builder = namespace2SchemaBuilder.get(usedNamespace);
-    if (builder == null) {
-      builder = SchemaBuilder.init(usedNamespace);
-      namespace2SchemaBuilder.put(usedNamespace, builder);
-    }
-    return builder;
-  }
-
-  private void updateSchema(final Class<?> aClass, final EdmComplexType et) {
-    SchemaBuilder b = getSchemaBuilder(et.namespace(), aClass);
-    TypeBuilder typeBuilder = TypeBuilder.init(et, aClass);
-    b.addComplexType(typeBuilder.buildComplexType());
-  }
-
-  private void handleEntityContainer(final Class<?> aClass) {
-    EdmEntityType entityType = aClass.getAnnotation(EdmEntityType.class);
-    if (entityType != null) {
-      FullQualifiedName typeName = createFqnForEntityType(aClass, entityType);
-      String containerName = ANNOTATION_HELPER.extractContainerName(aClass);
-      ContainerBuilder builder = containerName2ContainerBuilder.get(containerName);
-      if (builder == null) {
-        builder = ContainerBuilder.init(typeName.getNamespace(), containerName);
-        containerName2ContainerBuilder.put(containerName, builder);
-      }
-      EdmEntitySet entitySet = aClass.getAnnotation(EdmEntitySet.class);
-      if (entitySet != null) {
-        builder.addEntitySet(createEntitySet(typeName, aClass));
-      }
-    }
-  }
-
-  private EntitySet createEntitySet(final FullQualifiedName typeName, final Class<?> entitySetClass) {
-    String entitySetName = ANNOTATION_HELPER.extractEntitySetName(entitySetClass);
-    return new EntitySet().setName(entitySetName).setEntityType(typeName);
-  }
-
-  private FullQualifiedName createFqnForEntityType(final Class<?> annotatedClass, final EdmEntityType entityType) {
-    return ANNOTATION_HELPER.extractEntityTypeFqn(annotatedClass);
-  }
-
-  private void finish() {
-    //
-    Collection<ContainerBuilder> containers = containerName2ContainerBuilder.values();
-    for (ContainerBuilder containerBuilder : containers) {
-      SchemaBuilder schemaBuilder = namespace2SchemaBuilder.get(containerBuilder.getNamespace());
-      containerBuilder.addAssociationSets(schemaBuilder.name2Associations.values());
-      final EntityContainer container = containerBuilder.build();
-      schemaBuilder.addEntityContainer(container);
-      name2Container.put(container.getName(), container);
-      if (container.isDefaultEntityContainer()) {
-        defaultContainer = container;
-      }
-    }
-    //
-    Collection<SchemaBuilder> schemaBuilders = namespace2SchemaBuilder.values();
-    for (SchemaBuilder schemaBuilder : schemaBuilders) {
-      final Schema schema = schemaBuilder.build();
-      namespace2Schema.put(schema.getNamespace(), schema);
-    }
-  }
-
-  //
-  //
-  //
-  static class TypeBuilder {
-
-    final private String namespace;
-    final private String name;
-    private boolean isAbstract = false;
-    private boolean isMediaResource = false;
-    private FullQualifiedName baseEntityType = null;
-    private final List<PropertyRef> keyProperties = new ArrayList<PropertyRef>();
-    private final List<Property> properties = new ArrayList<Property>();
-    private final List<NavigationProperty> navProperties = new ArrayList<NavigationProperty>();
-    private final List<Association> associations = new ArrayList<Association>();
-
-    public TypeBuilder(final FullQualifiedName fqn) {
-      namespace = fqn.getNamespace();
-      name = fqn.getName();
-    }
-
-    public static TypeBuilder init(final EdmEntityType entity, final Class<?> aClass) {
-      return new TypeBuilder(ANNOTATION_HELPER.extractEntityTypeFqn(entity, aClass)).withClass(aClass);
-    }
-
-    public static TypeBuilder init(final EdmComplexType entity, final Class<?> aClass) {
-      return new TypeBuilder(ANNOTATION_HELPER.extractComplexTypeFqn(entity, aClass)).withClass(aClass);
-    }
-
-    private TypeBuilder withClass(final Class<?> aClass) {
-      baseEntityType = createBaseEntityFqn(aClass);
-
-      if (Modifier.isAbstract(aClass.getModifiers())) {
-        isAbstract = true;
-      }
-
-      Field[] fields = aClass.getDeclaredFields();
-      for (Field field : fields) {
-        EdmProperty ep = field.getAnnotation(EdmProperty.class);
-        if (ep != null) {
-          properties.add(createProperty(ep, field, namespace));
-          EdmKey eti = field.getAnnotation(EdmKey.class);
-          if (eti != null) {
-            keyProperties.add(createKeyProperty(ep, field));
-          }
-        }
-        EdmNavigationProperty enp = field.getAnnotation(EdmNavigationProperty.class);
-        if (enp != null) {
-          final NavigationProperty navProperty = createNavigationProperty(namespace, enp, field);
-          navProperties.add(navProperty);
-          Association association = createAssociation(field, navProperty);
-          associations.add(association);
-        }
-        EdmMediaResourceContent emrc = field.getAnnotation(EdmMediaResourceContent.class);
-        if (emrc != null) {
-          isMediaResource = true;
-        }
-      }
-
-      return this;
-    }
-
-    public TypeBuilder addProperty(final PropertyRef property) {
-      keyProperties.add(property);
-      return this;
-    }
-
-    public TypeBuilder addProperty(final Property property) {
-      properties.add(property);
-      return this;
-    }
-
-    public TypeBuilder addNavigationProperty(final NavigationProperty property) {
-      navProperties.add(property);
-      return this;
-    }
-
-    public TypeBuilder setAbstract(final boolean isAbstract) {
-      this.isAbstract = isAbstract;
-      return this;
-    }
-
-    public ComplexType buildComplexType() {
-      ComplexType complexType = new ComplexType();
-      if (baseEntityType != null) {
-        complexType.setBaseType(baseEntityType);
-      }
-      return complexType.setName(name).setProperties(properties);
-    }
-
-    public EntityType buildEntityType() {
-      EntityType entityType = new EntityType();
-      if (baseEntityType != null) {
-        entityType.setBaseType(baseEntityType);
-      }
-      if (!keyProperties.isEmpty()) {
-        entityType.setKey(new Key().setKeys(keyProperties));
-      }
-      if (!navProperties.isEmpty()) {
-        entityType.setNavigationProperties(navProperties);
-      }
-      return entityType.setName(name)
-          .setAbstract(isAbstract)
-          .setHasStream(isMediaResource)
-          .setProperties(properties);
-    }
-
-    public Collection<Association> buildAssociations() {
-      return Collections.unmodifiableCollection(associations);
-    }
-
-    private PropertyRef createKeyProperty(final EdmProperty et, final Field field) {
-      PropertyRef keyProperty = new PropertyRef();
-      String entityName = et.name();
-      if (entityName.isEmpty()) {
-        entityName = getCanonicalName(field);
-      }
-      return keyProperty.setName(entityName);
-    }
-
-    private Property createProperty(final EdmProperty ep, final Field field, final String defaultNamespace) {
-      if (isAnnotatedEntity(field.getType())) {
-        return createComplexProperty(field, defaultNamespace);
-      } else {
-        return createSimpleProperty(ep, field);
-      }
-    }
-
-    private Property createSimpleProperty(final EdmProperty ep, final Field field) {
-      SimpleProperty sp = new SimpleProperty();
-      String entityName = ANNOTATION_HELPER.getPropertyName(field);
-      sp.setName(entityName);
-      //
-      EdmType type = ep.type();
-      if (type == EdmType.NULL) {
-        type = getEdmType(field.getType());
-      }
-      sp.setType(ANNOTATION_HELPER.mapTypeKind(type));
-
-      return sp;
-    }
-
-    private Property createComplexProperty(final Field field, final String defaultNamespace) {
-      ComplexProperty cp = new ComplexProperty();
-      // settings from property
-      String entityName = ANNOTATION_HELPER.getPropertyName(field);
-      cp.setName(entityName);
-
-      // settings from related complex entity
-      EdmComplexType ece = field.getType().getAnnotation(EdmComplexType.class);
-      String complexEntityNamespace = ece.namespace();
-      if (complexEntityNamespace.isEmpty()) {
-        complexEntityNamespace = defaultNamespace;
-      }
-      cp.setType(new FullQualifiedName(complexEntityNamespace, ece.name()));
-
-      return cp;
-    }
-
-    private NavigationProperty createNavigationProperty(final String namespace, final EdmNavigationProperty enp,
-        final Field field) {
-      NavigationProperty navProp = new NavigationProperty();
-      navProp.setName(ANNOTATION_HELPER.getPropertyName(field));
-      String fromRole = ANNOTATION_HELPER.extractFromRoleName(enp, field);
-      navProp.setFromRole(fromRole);
-
-      String toRole = ANNOTATION_HELPER.extractToRoleName(enp, field);
-      navProp.setToRole(toRole);
-
-      String relationshipName = ANNOTATION_HELPER.extractRelationshipName(enp, field);
-      navProp.setRelationship(new FullQualifiedName(namespace, relationshipName));
-
-      return navProp;
-    }
-
-//    private EdmSimpleTypeKind getEdmSimpleType(Class<?> type) {
-//      if (type == String.class) {
-//        return EdmType.String;
-//      } else if (type == boolean.class || type == Boolean.class) {
-//        return EdmType.Boolean;
-//      } else if (type == byte.class || type == Byte.class) {
-//        return EdmType.SByte;
-//      } else if (type == short.class || type == Short.class) {
-//        return EdmType.Int16;
-//      } else if (type == int.class || type == Integer.class) {
-//        return EdmType.Int32;
-//      } else if (type == long.class || type == Long.class) {
-//        return EdmType.Int64;
-//      } else if (type == double.class || type == Double.class) {
-//        return EdmType.Double;
-//      } else if (type == float.class || type == Float.class) {
-//        return EdmType.Single;
-//      } else if (type == BigInteger.class || type == BigDecimal.class) {
-//        return EdmType.Decimal;
-//      } else if (type == Byte[].class || type == byte[].class) {
-//        return EdmType.Binary;
-//      } else if (type == Date.class) {
-//        return EdmType.DateTime;
-//      } else if (type == Calendar.class) {
-//        return EdmType.DateTimeOffset;
-//      } else if (type == UUID.class) {
-//        return EdmType.Guid;
-//      } else {
-//        throw new UnsupportedOperationException("Not yet supported type '" + type + "'.");
-//      }
-//    }
-
-    private EdmType getEdmType(final Class<?> type) {
-      if (type == String.class) {
-        return EdmType.STRING;
-      } else if (type == boolean.class || type == Boolean.class) {
-        return EdmType.BOOLEAN;
-      } else if (type == byte.class || type == Byte.class) {
-        return EdmType.SBYTE;
-      } else if (type == short.class || type == Short.class) {
-        return EdmType.INT16;
-      } else if (type == int.class || type == Integer.class) {
-        return EdmType.INT32;
-      } else if (type == long.class || type == Long.class) {
-        return EdmType.INT64;
-      } else if (type == double.class || type == Double.class) {
-        return EdmType.DOUBLE;
-      } else if (type == float.class || type == Float.class) {
-        return EdmType.SINGLE;
-      } else if (type == BigInteger.class || type == BigDecimal.class) {
-        return EdmType.DECIMAL;
-      } else if (type == Byte[].class || type == byte[].class) {
-        return EdmType.BINARY;
-      } else if (type == Date.class) {
-        return EdmType.DATE_TIME;
-      } else if (type == Calendar.class) {
-        return EdmType.DATE_TIME_OFFSET;
-      } else if (type == UUID.class) {
-        return EdmType.GUID;
-      } else {
-        throw new UnsupportedOperationException("Not yet supported type '" + type + "'.");
-      }
-    }
-
-    private Class<?> checkForBaseEntityClass(final Class<?> aClass) {
-      Class<?> superClass = aClass.getSuperclass();
-      if (superClass == Object.class) {
-        return null;
-      } else {
-        EdmEntityType edmEntity = superClass.getAnnotation(EdmEntityType.class);
-        if (edmEntity == null) {
-          return checkForBaseEntityClass(superClass);
-        } else {
-          return superClass;
-        }
-      }
-    }
-
-    private FullQualifiedName createBaseEntityFqn(final Class<?> aClass) {
-      Class<?> baseEntityClass = checkForBaseEntityClass(aClass);
-      if (baseEntityClass == null) {
-        return null;
-      }
-      return ANNOTATION_HELPER.extractEntityTypeFqn(baseEntityClass);
-    }
-
-    private Association createAssociation(final Field field, final NavigationProperty navProperty) {
-      Association association = new Association();
-      EdmNavigationProperty navigation = field.getAnnotation(EdmNavigationProperty.class);
-
-      AssociationEnd fromEnd = new AssociationEnd();
-      fromEnd.setRole(navProperty.getFromRole());
-      String typeName = ANNOTATION_HELPER.extractEntityTypeName(field.getDeclaringClass());
-      fromEnd.setType(new FullQualifiedName(namespace, typeName));
-      fromEnd.setMultiplicity(EdmMultiplicity.ONE);
-      association.setEnd1(fromEnd);
-
-      AssociationEnd toEnd = new AssociationEnd();
-      toEnd.setRole(navProperty.getToRole());
-      String toTypeName = ANNOTATION_HELPER.extractEntitTypeName(navigation, field);
-      toEnd.setType(new FullQualifiedName(namespace, toTypeName));
-      toEnd.setMultiplicity(ANNOTATION_HELPER.getMultiplicity(navigation, field));
-      association.setEnd2(toEnd);
-
-      String associationName = navProperty.getRelationship().getName();
-      association.setName(associationName);
-      return association;
-    }
-
-    private String getCanonicalName(final Field field) {
-      return ANNOTATION_HELPER.getCanonicalName(field);
-    }
-
-    private boolean isAnnotatedEntity(final Class<?> clazz) {
-      return ANNOTATION_HELPER.isEdmTypeAnnotated(clazz);
-    }
-  }
-
-  static class SchemaBuilder {
-
-    final private String namespace;
-    // private String alias;
-    private final List<Using> usings = new ArrayList<Using>();
-    private final List<EntityType> entityTypes = new ArrayList<EntityType>();
-    private final List<ComplexType> complexTypes = new ArrayList<ComplexType>();
-    private final Map<String, Association> name2Associations = new HashMap<String, Association>();
-    private final List<EntityContainer> entityContainers = new ArrayList<EntityContainer>();
-    private final List<AnnotationAttribute> annotationAttributes = new ArrayList<AnnotationAttribute>();
-    private final List<AnnotationElement> annotationElements = new ArrayList<AnnotationElement>();
-
-    private SchemaBuilder(final String namespace) {
-      this.namespace = namespace;
-    }
-
-    public static SchemaBuilder init(final String namespace) {
-      return new SchemaBuilder(namespace);
-    }
-
-    public SchemaBuilder addEntityType(final EntityType type) {
-      entityTypes.add(type);
-      return this;
-    }
-
-    public SchemaBuilder addEntityContainer(final EntityContainer container) {
-      entityContainers.add(container);
-      return this;
-    }
-
-    public SchemaBuilder addComplexType(final ComplexType createEntityType) {
-      complexTypes.add(createEntityType);
-      return this;
-    }
-
-    public void addAssociations(final Collection<Association> associations) {
-      for (Association association : associations) {
-        final String relationshipName = association.getName();
-        if (name2Associations.containsKey(relationshipName)) {
-          association = mergeAssociations(name2Associations.get(relationshipName), association);
-        }
-        name2Associations.put(relationshipName, association);
-      }
-    }
-
-    private Association mergeAssociations(final Association associationOne, final Association associationTwo) {
-      AssociationEnd oneEnd1 = associationOne.getEnd1();
-      AssociationEnd oneEnd2 = associationOne.getEnd2();
-      AssociationEnd twoEnd1 = associationTwo.getEnd1();
-      AssociationEnd twoEnd2 = associationTwo.getEnd2();
-      AssociationEnd[] oneEnds = new AssociationEnd[] { oneEnd1, oneEnd2 };
-
-      for (AssociationEnd associationEnd : oneEnds) {
-        if (associationEnd.getRole().equals(twoEnd1.getRole())) {
-          if (twoEnd1.getMultiplicity() == EdmMultiplicity.MANY) {
-            associationEnd.setMultiplicity(EdmMultiplicity.MANY);
-          }
-        } else if (associationEnd.getRole().equals(twoEnd2.getRole())) {
-          if (twoEnd2.getMultiplicity() == EdmMultiplicity.MANY) {
-            associationEnd.setMultiplicity(EdmMultiplicity.MANY);
-          }
-        }
-      }
-
-      return associationOne;
-    }
-
-    public Schema build() {
-      Schema s = new Schema();
-      s.setUsings(usings);
-      s.setEntityTypes(entityTypes);
-      s.setComplexTypes(complexTypes);
-      s.setAssociations(new ArrayList<Association>(name2Associations.values()));
-      s.setEntityContainers(entityContainers);
-      s.setAnnotationAttributes(annotationAttributes);
-      s.setAnnotationElements(annotationElements);
-      s.setNamespace(namespace);
-      return s;
-    }
-  }
-
-  private static class ContainerBuilder {
-
-    final private String name;
-    final private String namespace;
-    private boolean defaultContainer = true;
-    private final List<EntitySet> entitySets = new ArrayList<EntitySet>();
-    private final List<AssociationSet> associationSets = new ArrayList<AssociationSet>();
-    private final List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
-
-    // private Documentation documentation;
-
-    private ContainerBuilder(final String namespace, final String containerName) {
-      this.namespace = namespace;
-      name = containerName;
-    }
-
-    public String getNamespace() {
-      return namespace;
-    }
-
-    public static ContainerBuilder init(final String namespace, final String containerName) {
-      return new ContainerBuilder(namespace, containerName);
-    }
-
-    public ContainerBuilder addEntitySet(final EntitySet entitySet) {
-      entitySets.add(entitySet);
-      return this;
-    }
-
-    public void addAssociationSets(final Collection<Association> associations) {
-      for (Association association : associations) {
-        AssociationSet as = new AssociationSet();
-        as.setName(association.getName());
-        FullQualifiedName asAssociationFqn = new FullQualifiedName(namespace, association.getName());
-        as.setAssociation(asAssociationFqn);
-
-        AssociationSetEnd asEnd1 = new AssociationSetEnd();
-        asEnd1.setEntitySet(getEntitySetName(association.getEnd1()));
-        asEnd1.setRole(association.getEnd1().getRole());
-        as.setEnd1(asEnd1);
-
-        AssociationSetEnd asEnd2 = new AssociationSetEnd();
-        asEnd2.setEntitySet(getEntitySetName(association.getEnd2()));
-        asEnd2.setRole(association.getEnd2().getRole());
-        as.setEnd2(asEnd2);
-
-        associationSets.add(as);
-      }
-    }
-
-    public EntityContainer build() {
-      EntityContainer ec = new EntityContainer();
-      ec.setName(name);
-      ec.setDefaultEntityContainer(defaultContainer);
-      ec.setEntitySets(entitySets);
-      ec.setAssociationSets(associationSets);
-      ec.setFunctionImports(functionImports);
-      return ec;
-    }
-
-    private String getEntitySetName(final AssociationEnd end) {
-      for (EntitySet entitySet : entitySets) {
-        if (entitySet.getEntityType().equals(end.getType())) {
-          return entitySet.getName();
-        }
-      }
-      throw new ODataRuntimeException("No entity set found for " + end.getType());
-    }
-  }
-}