private Entity entity()

in lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/xml/ODataXmlDeserializer.java [472:592]


  private Entity entity(final XMLEventReader reader, final StartElement start, final EdmEntityType edmEntityType)
      throws XMLStreamException, EdmPrimitiveTypeException, DeserializerException {
    Entity entity = null;
    EdmEntityType resolvedType = edmEntityType;
    if (entryRefQName.equals(start.getName())) {
      entity = entityRef(start);
    } else if (Constants.QNAME_ATOM_ELEM_ENTRY.equals(start.getName())) {
      entity = new Entity();
      final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE);
      if (xmlBase != null) {
        entity.setBaseURI(URI.create(xmlBase.getValue()));
      }

      final Attribute etag = start.getAttributeByName(etagQName);
      if (etag != null) {
        entity.setETag(etag.getValue());
      }

      boolean foundEndEntry = false;
      while (reader.hasNext() && !foundEndEntry) {
        final XMLEvent event = reader.nextEvent();

        if (event.isStartElement()) {
          if (Constants.QNAME_ATOM_ELEM_ID.equals(event.asStartElement().getName())) {
            common(reader, event.asStartElement(), entity, "id");
          } else if (Constants.QNAME_ATOM_ELEM_CATEGORY.equals(event.asStartElement().getName())) {
            final Attribute term = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATOM_ATTR_TERM));
            if (term != null) {
              String type = new EdmTypeInfo.Builder().setTypeExpression(term.getValue()).build().internal();
              entity.setType(type);
              resolvedType = (EdmEntityType)getDerivedType(edmEntityType, type);
            }
          } else if (Constants.QNAME_ATOM_ELEM_LINK.equals(event.asStartElement().getName())) {
            final Link link = new Link();
            final Attribute rel = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_REL));
            if (rel != null) {
              link.setRel(rel.getValue());
            }
            final Attribute title = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_TITLE));
            if (title != null) {
              link.setTitle(title.getValue());
            }
            final Attribute href = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_HREF));
            if (href != null) {
              link.setBindingLink(href.getValue());
            }
            final Attribute linktype = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_TYPE));
            if (linktype != null) {
              link.setType(linktype.getValue());
            }
            if (Constants.SELF_LINK_REL.equals(link.getRel())) {
              entity.setSelfLink(link);
            } else if (Constants.EDIT_LINK_REL.equals(link.getRel())) {
              entity.setEditLink(link);
            } else if (Constants.EDITMEDIA_LINK_REL.equals(link.getRel())) {
              final Attribute mediaETag = event.asStartElement().getAttributeByName(etagQName);
              if (mediaETag != null) {
                entity.setMediaETag(mediaETag.getValue());
              }
            } else if (link.getRel().startsWith(Constants.NS_NAVIGATION_LINK_REL)) {
              inline(reader, event.asStartElement(), link, resolvedType);
              if (link.getInlineEntity() == null && link.getInlineEntitySet() == null) {
                entity.getNavigationBindings().add(link);
              } else {
                if (link.getInlineEntitySet() != null) {
                  List<String> bindings = new ArrayList<String>();
                  List<Entity> entities = link.getInlineEntitySet().getEntities();

                  for (Entity inlineEntity : entities) {
                    // check if this is reference
                    if (inlineEntity.getId() != null && inlineEntity.getProperties().isEmpty()) {
                      bindings.add(inlineEntity.getId().toASCIIString());
                    }
                  }
                  if (!bindings.isEmpty()) {
                    link.setInlineEntitySet(null);
                    link.setBindingLinks(bindings);
                    entity.getNavigationBindings().add(link);
                  } else {
                    entity.getNavigationLinks().add(link);
                  }
                } else {
                  // add link
                  entity.getNavigationLinks().add(link);
                }
              }
            } else if (link.getRel().startsWith(Constants.NS_ASSOCIATION_LINK_REL)) {
              entity.getAssociationLinks().add(link);
            } else if (link.getRel().startsWith(Constants.NS_MEDIA_EDIT_LINK_REL) ||
                link.getRel().startsWith(Constants.NS_MEDIA_READ_LINK_REL)) {
              final Attribute metag = event.asStartElement().getAttributeByName(etagQName);
              if (metag != null) {
                link.setMediaETag(metag.getValue());
              }
              entity.getMediaEditLinks().add(link);
            }
          } else if (Constants.QNAME_ATOM_ELEM_CONTENT.equals(event.asStartElement().getName())) {
            final Attribute contenttype = event.asStartElement()
                .getAttributeByName(QName.valueOf(Constants.ATTR_TYPE));
            if (contenttype == null || ContentType.APPLICATION_XML.toContentTypeString()
                .equals(contenttype.getValue())) {
              properties(reader, skipBeforeFirstStartElement(reader), entity, resolvedType);
            } else {
              entity.setMediaContentType(contenttype.getValue());
              final Attribute src = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATOM_ATTR_SRC));
              if (src != null) {
                entity.setMediaContentSource(URI.create(src.getValue()));
              }
            }
          } else if (propertiesQName.equals(event.asStartElement().getName())) {
            properties(reader, event.asStartElement(), entity, resolvedType);
          }
        }

        if (event.isEndElement() && start.getName().equals(event.asEndElement().getName())) {
          foundEndEntry = true;
        }
      }
    }
    return entity;
  }