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;
}