public void append( final XMLStreamWriter writer, final EntityInfoAggregator eia, final Map<String, Object> data, final boolean isRootElement, final boolean isFeedPart) throws EntityProviderException { try { writer.writeStartElement(FormatXml.ATOM_ENTRY); if (isRootElement) { writer.writeDefaultNamespace(Edm.NAMESPACE_ATOM_2005); writer.writeNamespace(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08); writer.writeNamespace(Edm.PREFIX_D, Edm.NAMESPACE_D_2007_08); } if (!isFeedPart) { writer.writeAttribute( Edm.PREFIX_XML, Edm.NAMESPACE_XML_1998, "base", properties.getServiceRoot().toASCIIString()); } etag = createETag(eia, data); if (etag != null) { writer.writeAttribute(Edm.NAMESPACE_M_2007_08, FormatXml.M_ETAG, etag); } // write all atom infos (mandatory and optional) appendAtomMandatoryParts(writer, eia, data); appendAtomOptionalParts(writer, eia, data); if (eia.getEntityType().hasStream()) { // write all links appendAtomEditLink(writer, eia, data); appendAtomContentLink(writer, eia, data, properties.getMediaResourceMimeType()); appendAtomNavigationLinks(writer, eia, data); // write properties/content appendCustomProperties(writer, eia, data); appendAtomContentPart(writer, eia, data, properties.getMediaResourceMimeType()); appendProperties(writer, eia, data); } else { // write all links appendAtomEditLink(writer, eia, data); appendAtomNavigationLinks(writer, eia, data); // write properties/content appendCustomProperties(writer, eia, data); writer.writeStartElement(FormatXml.ATOM_CONTENT); writer.writeAttribute(FormatXml.ATOM_TYPE, ContentType.APPLICATION_XML.toString()); appendProperties(writer, eia, data); writer.writeEndElement(); } writer.writeEndElement(); writer.flush(); } catch (Exception e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } }
private void appendAtomMandatoryParts( final XMLStreamWriter writer, final EntityInfoAggregator eia, final Map<String, Object> data) throws EntityProviderException { try { writer.writeStartElement(FormatXml.ATOM_ID); location = properties.getServiceRoot().toASCIIString() + createSelfLink(eia, data, null); writer.writeCharacters(location); writer.writeEndElement(); writer.writeStartElement(FormatXml.ATOM_TITLE); writer.writeAttribute(FormatXml.ATOM_TYPE, FormatXml.ATOM_TEXT); EntityPropertyInfo titleInfo = eia.getTargetPathInfo(EdmTargetPath.SYNDICATION_TITLE); if (titleInfo != null) { EdmSimpleType st = (EdmSimpleType) titleInfo.getType(); Object object = data.get(titleInfo.getName()); String title = st.valueToString(object, EdmLiteralKind.DEFAULT, titleInfo.getFacets()); if (title != null) { writer.writeCharacters(title); } } else { writer.writeCharacters(eia.getEntitySetName()); } writer.writeEndElement(); writer.writeStartElement(FormatXml.ATOM_UPDATED); writer.writeCharacters(getUpdatedString(eia, data)); writer.writeEndElement(); } catch (XMLStreamException e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } catch (EdmSimpleTypeException e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } }
private void appendInlineFeed( final XMLStreamWriter writer, final String navigationPropertyName, final EntityInfoAggregator eia, final Map<String, Object> data, final String self) throws EntityProviderException, XMLStreamException, EdmException, URISyntaxException { if (eia.getExpandedNavigationPropertyNames().contains(navigationPropertyName)) { if (properties.getCallbacks() != null && properties.getCallbacks().containsKey(navigationPropertyName)) { writer.writeStartElement(Edm.NAMESPACE_M_2007_08, FormatXml.M_INLINE); EdmNavigationProperty navProp = (EdmNavigationProperty) eia.getEntityType().getProperty(navigationPropertyName); WriteFeedCallbackContext context = new WriteFeedCallbackContext(); context.setSourceEntitySet(eia.getEntitySet()); context.setNavigationProperty(navProp); context.setEntryData(data); ExpandSelectTreeNode subNode = properties.getExpandSelectTree().getLinks().get(navigationPropertyName); context.setCurrentExpandSelectTreeNode(subNode); context.setSelfLink(new URI(self)); ODataCallback callback = properties.getCallbacks().get(navigationPropertyName); if (callback == null) { throw new EntityProviderException(EntityProviderException.EXPANDNOTSUPPORTED); } WriteFeedCallbackResult result = null; try { result = ((OnWriteFeedContent) callback).retrieveFeedResult(context); } catch (ODataApplicationException e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } List<Map<String, Object>> inlineData = result.getFeedData(); EntityProviderWriteProperties inlineProperties = result.getInlineProperties(); EdmEntitySet inlineEntitySet = eia.getEntitySet().getRelatedEntitySet(navProp); AtomFeedProducer inlineFeedProducer = new AtomFeedProducer(inlineProperties); EntityInfoAggregator inlineEia = EntityInfoAggregator.create(inlineEntitySet, inlineProperties.getExpandSelectTree()); inlineFeedProducer.append(writer, inlineEia, inlineData, true); writer.writeEndElement(); } } }
private void appendInlineEntry( final XMLStreamWriter writer, final String navigationPropertyName, final EntityInfoAggregator eia, final Map<String, Object> data) throws EntityProviderException { try { if (eia.getExpandedNavigationPropertyNames().contains(navigationPropertyName)) { if (properties.getCallbacks() != null && properties.getCallbacks().containsKey(navigationPropertyName)) { writer.writeStartElement(Edm.NAMESPACE_M_2007_08, FormatXml.M_INLINE); EdmNavigationProperty navProp = (EdmNavigationProperty) eia.getEntityType().getProperty(navigationPropertyName); WriteEntryCallbackContext context = new WriteEntryCallbackContext(); context.setSourceEntitySet(eia.getEntitySet()); context.setNavigationProperty(navProp); context.setEntryData(data); ExpandSelectTreeNode subNode = properties.getExpandSelectTree().getLinks().get(navigationPropertyName); context.setCurrentExpandSelectTreeNode(subNode); ODataCallback callback = properties.getCallbacks().get(navigationPropertyName); WriteEntryCallbackResult result = ((OnWriteEntryContent) callback).retrieveEntryResult(context); Map<String, Object> inlineData = result.getEntryData(); if (inlineData != null) { EntityProviderWriteProperties inlineProperties = result.getInlineProperties(); EdmEntitySet inlineEntitySet = eia.getEntitySet().getRelatedEntitySet(navProp); AtomEntryEntityProducer inlineProducer = new AtomEntryEntityProducer(inlineProperties); EntityInfoAggregator inlineEia = EntityInfoAggregator.create( inlineEntitySet, inlineProperties.getExpandSelectTree()); inlineProducer.append(writer, inlineEia, inlineData, false, false); } writer.writeEndElement(); } } } catch (Exception e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } }
public void append( final Writer writer, final EntityInfoAggregator entityInfo, final Map<String, Object> data, final boolean isRootElement) throws EntityProviderException { final EdmEntityType type = entityInfo.getEntityType(); try { jsonStreamWriter = new JsonStreamWriter(writer); if (isRootElement) { jsonStreamWriter.beginObject(); jsonStreamWriter.name(FormatJson.D); } jsonStreamWriter.beginObject(); jsonStreamWriter.name(FormatJson.METADATA); jsonStreamWriter.beginObject(); final String self = AtomEntryEntityProducer.createSelfLink(entityInfo, data, null); location = properties.getServiceRoot().toASCIIString() + self; jsonStreamWriter.namedStringValue(FormatJson.ID, location); jsonStreamWriter.separator(); jsonStreamWriter.namedStringValue(FormatJson.URI, location); jsonStreamWriter.separator(); jsonStreamWriter.namedStringValueRaw( FormatJson.TYPE, type.getNamespace() + Edm.DELIMITER + type.getName()); eTag = AtomEntryEntityProducer.createETag(entityInfo, data); if (eTag != null) { jsonStreamWriter.separator(); jsonStreamWriter.namedStringValue(FormatJson.ETAG, eTag); } if (type.hasStream()) { jsonStreamWriter.separator(); jsonStreamWriter.namedStringValueRaw( FormatJson.CONTENT_TYPE, properties.getMediaResourceMimeType() == null ? type.getMapping() == null || type.getMapping().getMimeType() == null ? HttpContentType.APPLICATION_OCTET_STREAM : data.get(type.getMapping().getMimeType()).toString() : properties.getMediaResourceMimeType()); jsonStreamWriter.separator(); jsonStreamWriter.namedStringValue(FormatJson.MEDIA_SRC, self + "/$value"); jsonStreamWriter.separator(); jsonStreamWriter.namedStringValue(FormatJson.EDIT_MEDIA, location + "/$value"); } jsonStreamWriter.endObject(); for (final String propertyName : type.getPropertyNames()) { if (entityInfo.getSelectedPropertyNames().contains(propertyName)) { jsonStreamWriter.separator(); jsonStreamWriter.name(propertyName); JsonPropertyEntityProducer.appendPropertyValue( jsonStreamWriter, entityInfo.getPropertyInfo(propertyName), data.get(propertyName)); } } for (final String navigationPropertyName : type.getNavigationPropertyNames()) { if (entityInfo.getSelectedNavigationPropertyNames().contains(navigationPropertyName)) { jsonStreamWriter.separator(); jsonStreamWriter.name(navigationPropertyName); if (entityInfo.getExpandedNavigationPropertyNames().contains(navigationPropertyName)) { if (properties.getCallbacks() != null && properties.getCallbacks().containsKey(navigationPropertyName)) { final EdmNavigationProperty navigationProperty = (EdmNavigationProperty) type.getProperty(navigationPropertyName); final boolean isFeed = navigationProperty.getMultiplicity() == EdmMultiplicity.MANY; final EdmEntitySet entitySet = entityInfo.getEntitySet(); final EdmEntitySet inlineEntitySet = entitySet.getRelatedEntitySet(navigationProperty); WriteCallbackContext context = isFeed ? new WriteFeedCallbackContext() : new WriteEntryCallbackContext(); context.setSourceEntitySet(entitySet); context.setNavigationProperty(navigationProperty); context.setEntryData(data); context.setCurrentExpandSelectTreeNode( properties.getExpandSelectTree().getLinks().get(navigationPropertyName)); ODataCallback callback = properties.getCallbacks().get(navigationPropertyName); try { if (isFeed) { final WriteFeedCallbackResult result = ((OnWriteFeedContent) callback) .retrieveFeedResult((WriteFeedCallbackContext) context); List<Map<String, Object>> inlineData = result.getFeedData(); if (inlineData != null) { final EntityProviderWriteProperties inlineProperties = result.getInlineProperties(); final EntityInfoAggregator inlineEntityInfo = EntityInfoAggregator.create( inlineEntitySet, inlineProperties.getExpandSelectTree()); new JsonFeedEntityProducer(inlineProperties) .append(writer, inlineEntityInfo, inlineData, false); } } else { final WriteEntryCallbackResult result = ((OnWriteEntryContent) callback) .retrieveEntryResult((WriteEntryCallbackContext) context); Map<String, Object> inlineData = result.getEntryData(); if (inlineData != null) { final EntityProviderWriteProperties inlineProperties = result.getInlineProperties(); final EntityInfoAggregator inlineEntityInfo = EntityInfoAggregator.create( inlineEntitySet, inlineProperties.getExpandSelectTree()); new JsonEntryEntityProducer(inlineProperties) .append(writer, inlineEntityInfo, inlineData, false); } } } catch (final ODataApplicationException e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } } else { throw new EntityProviderException( EntityProviderException.EXPANDNOTSUPPORTED.addContent(navigationPropertyName)); } } else { jsonStreamWriter.beginObject(); jsonStreamWriter.name(FormatJson.DEFERRED); JsonLinkEntityProducer.appendUri( jsonStreamWriter, location + "/" + Encoder.encode(navigationPropertyName)); jsonStreamWriter.endObject(); } } } jsonStreamWriter.endObject(); if (isRootElement) { jsonStreamWriter.endObject(); } } catch (final IOException e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } catch (final EdmException e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } }
public AtomEntryEntityProducer(final EntityProviderWriteProperties properties) throws EntityProviderException { this.properties = properties == null ? EntityProviderWriteProperties.serviceRoot(null).build() : properties; }