private EdmEntityType readEntityType()

in odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializer.java [902:988]


  private EdmEntityType readEntityType(final XMLStreamReader reader,
      EdmImpl edm) throws XMLStreamException, EntityProviderException, EdmException {
    reader.require(XMLStreamConstants.START_ELEMENT, edmNamespace, XmlMetadataConstants.EDM_ENTITY_TYPE);
    EdmEntityTypeImpl entityType = new EdmEntityTypeImpl();
    List<EdmProperty> properties = new ArrayList<EdmProperty>();
    List<String> edmPropertyNames = new ArrayList<String>();
    List<EdmNavigationProperty> edmNavProperties = new ArrayList<EdmNavigationProperty>();
    List<EdmAnnotationElement> annotationElements = new ArrayList<EdmAnnotationElement>();
    List<String> edmNavigationPropertyNames = new ArrayList<String>();
    List<String> edmKeyPropertyNames = new ArrayList<String>();
    List<EdmProperty> edmKeyProperties = new ArrayList<EdmProperty>();
    EdmKeyImpl key = null;
    ((EdmNamedImpl) entityType).setName(reader.getAttributeValue(null, XmlMetadataConstants.EDM_NAME));
    entityType.setNamespace(currentNamespace);
    entityType.setEdm((EdmImpl) edm);
    String hasStream = reader.getAttributeValue(Edm.NAMESPACE_M_2007_08, XmlMetadataConstants.M_ENTITY_TYPE_HAS_STREAM);
    if (hasStream != null) {
      entityType.setHasStream("true".equalsIgnoreCase(hasStream));
    }

    if (reader.getAttributeValue(null, XmlMetadataConstants.EDM_TYPE_ABSTRACT) != null) {
      entityType.setAbstract("true".equalsIgnoreCase(reader.getAttributeValue(null,
          XmlMetadataConstants.EDM_TYPE_ABSTRACT)));
    }
    String baseType = reader.getAttributeValue(null, XmlMetadataConstants.EDM_BASE_TYPE);
    if (baseType != null) {
      FullQualifiedName fqName = extractFQName(baseType);
      entityType.setBaseType(fqName);
      //Populating base type map with child and parent for multiple inheritance
      entityBaseTypeMap.put(extractFQNameFromEntityType(entityType), fqName);
    }
    entityType.setCustomizableFeedMappings(readCustomizableFeedMappings(reader));
    EdmAnnotationsImpl annotations = new EdmAnnotationsImpl();
    annotations.setAnnotationAttributes(readAnnotationAttribute(reader));
    while (reader.hasNext()
        && !(reader.isEndElement() && edmNamespace.equals(reader.getNamespaceURI())
            && XmlMetadataConstants.EDM_ENTITY_TYPE.equals(reader.getLocalName()))) {
      reader.next();
      if (reader.isStartElement()) {
        currentHandledStartTagName = reader.getLocalName();
        if (XmlMetadataConstants.EDM_ENTITY_TYPE_KEY.equals(currentHandledStartTagName)) {
          key = readEntityTypeKey(reader);
        } else if (XmlMetadataConstants.EDM_PROPERTY.equals(currentHandledStartTagName)) {
          properties.add(readProperty(reader, edm));
        } else if (XmlMetadataConstants.EDM_NAVIGATION_PROPERTY.equals(currentHandledStartTagName)) {
          edmNavProperties.add(readNavigationProperty(reader, edm));
        } else {
          annotationElements.add(readAnnotationElement(reader));
        }
        extractNamespaces(reader);
      }
    }
    if (!annotationElements.isEmpty()) {
      annotations.setAnnotationElements(annotationElements);
    }
    
    for (EdmProperty property : properties) {
      edmPropertyNames.add(property.getName());
      if (key != null) {        
        for(EdmProperty keyProperty: key.getKeys()){
          if(property.getName().equals(keyProperty.getName())){
            edmKeyPropertyNames.add(keyProperty.getName());
            edmKeyProperties.add(property);
          }
        }
      }
    }
    for ( EdmNavigationProperty navigations : edmNavProperties){
      edmNavigationPropertyNames.add(navigations.getName());
    }

    entityType.setAnnotations(annotations);
    entityType.setEdmKeyProperties(edmKeyProperties);
    entityType.setNavigationProperties(edmNavProperties);
    entityType.setEdmNavigationPropertyNames(edmNavigationPropertyNames);    
    entityType.setEdmKeyPropertyNames(edmKeyPropertyNames);
    entityType.setProperties(properties);
    entityType.setEdmPropertyNames(edmPropertyNames);
    if (entityType.getName() != null) {
      FullQualifiedName fqName = new FullQualifiedName(currentNamespace, entityType.getName());
      entityTypesMap.put(fqName, entityType);
    } else {
      throw new EntityProviderException(EntityProviderException.MISSING_ATTRIBUTE.addContent("Name"));
    }

    return entityType;
  }