/******************************************************************************* * Copyright 2013 SAP AG * * Licensed 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 com.sap.core.odata.core.ep.producer; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import com.sap.core.odata.api.edm.Edm; import com.sap.core.odata.api.edm.EdmFacets; import com.sap.core.odata.api.edm.provider.AnnotationAttribute; import com.sap.core.odata.api.edm.provider.AnnotationElement; import com.sap.core.odata.api.edm.provider.Association; import com.sap.core.odata.api.edm.provider.AssociationEnd; import com.sap.core.odata.api.edm.provider.AssociationSet; import com.sap.core.odata.api.edm.provider.AssociationSetEnd; import com.sap.core.odata.api.edm.provider.ComplexProperty; import com.sap.core.odata.api.edm.provider.ComplexType; import com.sap.core.odata.api.edm.provider.CustomizableFeedMappings; import com.sap.core.odata.api.edm.provider.DataServices; import com.sap.core.odata.api.edm.provider.Documentation; import com.sap.core.odata.api.edm.provider.EntityContainer; import com.sap.core.odata.api.edm.provider.EntitySet; import com.sap.core.odata.api.edm.provider.EntityType; import com.sap.core.odata.api.edm.provider.FunctionImport; import com.sap.core.odata.api.edm.provider.FunctionImportParameter; import com.sap.core.odata.api.edm.provider.Key; import com.sap.core.odata.api.edm.provider.NavigationProperty; import com.sap.core.odata.api.edm.provider.OnDelete; import com.sap.core.odata.api.edm.provider.Property; import com.sap.core.odata.api.edm.provider.PropertyRef; import com.sap.core.odata.api.edm.provider.ReferentialConstraint; import com.sap.core.odata.api.edm.provider.ReferentialConstraintRole; import com.sap.core.odata.api.edm.provider.Schema; import com.sap.core.odata.api.edm.provider.SimpleProperty; import com.sap.core.odata.api.edm.provider.Using; import com.sap.core.odata.api.ep.EntityProviderException; import com.sap.core.odata.core.exception.ODataRuntimeException; public class XmlMetadataProducer { public static void writeMetadata(final DataServices metadata, final XMLStreamWriter xmlStreamWriter, Map<String, String> predefinedNamespaces) throws EntityProviderException { try { xmlStreamWriter.writeStartDocument(); xmlStreamWriter.setPrefix(Edm.PREFIX_EDMX, Edm.NAMESPACE_EDMX_2007_06); xmlStreamWriter.setPrefix(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08); xmlStreamWriter.setDefaultNamespace(Edm.NAMESPACE_EDM_2008_09); xmlStreamWriter.writeStartElement(Edm.NAMESPACE_EDMX_2007_06, "Edmx"); xmlStreamWriter.writeAttribute("Version", "1.0"); xmlStreamWriter.writeNamespace(Edm.PREFIX_EDMX, Edm.NAMESPACE_EDMX_2007_06); xmlStreamWriter.writeStartElement(Edm.NAMESPACE_EDMX_2007_06, "DataServices"); xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "DataServiceVersion", metadata.getDataServiceVersion()); xmlStreamWriter.writeNamespace(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08); if (predefinedNamespaces != null) { for (Map.Entry<String, String> entry : predefinedNamespaces.entrySet()) { xmlStreamWriter.writeNamespace(entry.getKey(), entry.getValue()); } } else { predefinedNamespaces = new HashMap<String, String>(); } Collection<Schema> schemas = metadata.getSchemas(); if (schemas != null) { for (Schema schema : schemas) { xmlStreamWriter.writeStartElement("Schema"); if (schema.getAlias() != null) { xmlStreamWriter.writeAttribute("Alias", schema.getAlias()); } xmlStreamWriter.writeAttribute("Namespace", schema.getNamespace()); xmlStreamWriter.writeDefaultNamespace(Edm.NAMESPACE_EDM_2008_09); writeAnnotationAttributes(schema.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); Collection<Using> usings = schema.getUsings(); if (usings != null) { for (Using using : usings) { xmlStreamWriter.writeStartElement("Using"); xmlStreamWriter.writeAttribute("Namespace", using.getNamespace()); xmlStreamWriter.writeAttribute("Alias", using.getAlias()); writeAnnotationAttributes(using.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(using.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAnnotationElements(using.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } Collection<EntityType> entityTypes = schema.getEntityTypes(); if (entityTypes != null) { for (EntityType entityType : entityTypes) { xmlStreamWriter.writeStartElement("EntityType"); xmlStreamWriter.writeAttribute("Name", entityType.getName()); if (entityType.getBaseType() != null) { xmlStreamWriter.writeAttribute("BaseType", entityType.getBaseType().toString()); } if (entityType.isAbstract()) { xmlStreamWriter.writeAttribute("Abstract", "true"); } if (entityType.isHasStream()) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "HasStream", "true"); } writeCustomizableFeedMappings(entityType.getCustomizableFeedMappings(), xmlStreamWriter); writeAnnotationAttributes(entityType.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(entityType.getDocumentation(), predefinedNamespaces, xmlStreamWriter); Key key = entityType.getKey(); if (key != null) { xmlStreamWriter.writeStartElement("Key"); writeAnnotationAttributes(key.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); Collection<PropertyRef> propertyRefs = entityType.getKey().getKeys(); for (PropertyRef propertyRef : propertyRefs) { xmlStreamWriter.writeStartElement("PropertyRef"); writeAnnotationAttributes(propertyRef.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); xmlStreamWriter.writeAttribute("Name", propertyRef.getName()); writeAnnotationElements(propertyRef.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } writeAnnotationElements(key.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } Collection<Property> properties = entityType.getProperties(); if (properties != null) { writeProperties(properties, predefinedNamespaces, xmlStreamWriter); } Collection<NavigationProperty> navigationProperties = entityType.getNavigationProperties(); if (navigationProperties != null) { for (NavigationProperty navigationProperty : navigationProperties) { xmlStreamWriter.writeStartElement("NavigationProperty"); xmlStreamWriter.writeAttribute("Name", navigationProperty.getName()); xmlStreamWriter.writeAttribute("Relationship", navigationProperty.getRelationship().toString()); xmlStreamWriter.writeAttribute("FromRole", navigationProperty.getFromRole()); xmlStreamWriter.writeAttribute("ToRole", navigationProperty.getToRole()); writeAnnotationAttributes(navigationProperty.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(navigationProperty.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAnnotationElements(navigationProperty.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } writeAnnotationElements(entityType.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } Collection<ComplexType> complexTypes = schema.getComplexTypes(); if (complexTypes != null) { for (ComplexType complexType : complexTypes) { xmlStreamWriter.writeStartElement("ComplexType"); xmlStreamWriter.writeAttribute("Name", complexType.getName()); if (complexType.getBaseType() != null) { xmlStreamWriter.writeAttribute("BaseType", complexType.getBaseType().toString()); } if (complexType.isAbstract()) { xmlStreamWriter.writeAttribute("Abstract", "true"); } writeAnnotationAttributes(complexType.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(complexType.getDocumentation(), predefinedNamespaces, xmlStreamWriter); Collection<Property> properties = complexType.getProperties(); if (properties != null) { writeProperties(properties, predefinedNamespaces, xmlStreamWriter); } writeAnnotationElements(complexType.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } Collection<Association> associations = schema.getAssociations(); if (associations != null) { for (Association association : associations) { xmlStreamWriter.writeStartElement("Association"); xmlStreamWriter.writeAttribute("Name", association.getName()); writeAnnotationAttributes(association.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(association.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAssociationEnd(association.getEnd1(), predefinedNamespaces, xmlStreamWriter); writeAssociationEnd(association.getEnd2(), predefinedNamespaces, xmlStreamWriter); ReferentialConstraint referentialConstraint = association.getReferentialConstraint(); if (referentialConstraint != null) { xmlStreamWriter.writeStartElement("ReferentialConstraint"); writeAnnotationAttributes(referentialConstraint.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(referentialConstraint.getDocumentation(), predefinedNamespaces, xmlStreamWriter); ReferentialConstraintRole principal = referentialConstraint.getPrincipal(); xmlStreamWriter.writeStartElement("Principal"); xmlStreamWriter.writeAttribute("Role", principal.getRole()); writeAnnotationAttributes(principal.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); for (PropertyRef propertyRef : principal.getPropertyRefs()) { xmlStreamWriter.writeStartElement("PropertyRef"); xmlStreamWriter.writeAttribute("Name", propertyRef.getName()); xmlStreamWriter.writeEndElement(); } writeAnnotationElements(principal.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); ReferentialConstraintRole dependent = referentialConstraint.getDependent(); xmlStreamWriter.writeStartElement("Dependent"); xmlStreamWriter.writeAttribute("Role", dependent.getRole()); writeAnnotationAttributes(dependent.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); for (PropertyRef propertyRef : dependent.getPropertyRefs()) { xmlStreamWriter.writeStartElement("PropertyRef"); xmlStreamWriter.writeAttribute("Name", propertyRef.getName()); xmlStreamWriter.writeEndElement(); } writeAnnotationElements(dependent.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); writeAnnotationElements(referentialConstraint.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } writeAnnotationElements(association.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } Collection<EntityContainer> entityContainers = schema.getEntityContainers(); if (entityContainers != null) { for (EntityContainer entityContainer : entityContainers) { xmlStreamWriter.writeStartElement("EntityContainer"); xmlStreamWriter.writeAttribute("Name", entityContainer.getName()); if (entityContainer.getExtendz() != null) { xmlStreamWriter.writeAttribute("Extends", entityContainer.getExtendz()); } if (entityContainer.isDefaultEntityContainer()) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "IsDefaultEntityContainer", "true"); } writeAnnotationAttributes(entityContainer.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(entityContainer.getDocumentation(), predefinedNamespaces, xmlStreamWriter); Collection<EntitySet> entitySets = entityContainer.getEntitySets(); if (entitySets != null) { for (EntitySet entitySet : entitySets) { xmlStreamWriter.writeStartElement("EntitySet"); xmlStreamWriter.writeAttribute("Name", entitySet.getName()); xmlStreamWriter.writeAttribute("EntityType", entitySet.getEntityType().toString()); writeAnnotationAttributes(entitySet.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(entitySet.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAnnotationElements(entitySet.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } Collection<AssociationSet> associationSets = entityContainer.getAssociationSets(); if (associationSets != null) { for (AssociationSet associationSet : associationSets) { xmlStreamWriter.writeStartElement("AssociationSet"); xmlStreamWriter.writeAttribute("Name", associationSet.getName()); xmlStreamWriter.writeAttribute("Association", associationSet.getAssociation().toString()); writeAnnotationAttributes(associationSet.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(associationSet.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAssociationSetEnd(associationSet.getEnd1(), predefinedNamespaces, xmlStreamWriter); writeAssociationSetEnd(associationSet.getEnd2(), predefinedNamespaces, xmlStreamWriter); writeAnnotationElements(associationSet.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } Collection<FunctionImport> functionImports = entityContainer.getFunctionImports(); if (functionImports != null) { for (FunctionImport functionImport : functionImports) { xmlStreamWriter.writeStartElement("FunctionImport"); xmlStreamWriter.writeAttribute("Name", functionImport.getName()); if (functionImport.getReturnType() != null) { xmlStreamWriter.writeAttribute("ReturnType", functionImport.getReturnType().toString()); } if (functionImport.getEntitySet() != null) { xmlStreamWriter.writeAttribute("EntitySet", functionImport.getEntitySet()); } if (functionImport.getHttpMethod() != null) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "HttpMethod", functionImport.getHttpMethod()); } writeAnnotationAttributes(functionImport.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(functionImport.getDocumentation(), predefinedNamespaces, xmlStreamWriter); Collection<FunctionImportParameter> functionImportParameters = functionImport.getParameters(); if (functionImportParameters != null) { for (FunctionImportParameter functionImportParameter : functionImportParameters) { xmlStreamWriter.writeStartElement("Parameter"); xmlStreamWriter.writeAttribute("Name", functionImportParameter.getName()); xmlStreamWriter.writeAttribute("Type", functionImportParameter.getType().getFullQualifiedName().toString()); if (functionImportParameter.getMode() != null) { xmlStreamWriter.writeAttribute("Mode", functionImportParameter.getMode()); } writeFacets(xmlStreamWriter, functionImportParameter.getFacets()); writeAnnotationAttributes(functionImportParameter.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(functionImportParameter.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAnnotationElements(functionImportParameter.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } writeAnnotationElements(functionImport.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } writeAnnotationElements(entityContainer.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } writeAnnotationElements(schema.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } xmlStreamWriter.writeEndElement(); xmlStreamWriter.writeEndElement(); xmlStreamWriter.writeEndDocument(); xmlStreamWriter.flush(); } catch (XMLStreamException e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } catch (FactoryConfigurationError e) { throw new EntityProviderException(EntityProviderException.COMMON, e); } } private static void writeCustomizableFeedMappings(final CustomizableFeedMappings customizableFeedMappings, final XMLStreamWriter xmlStreamWriter) throws XMLStreamException { if (customizableFeedMappings != null) { if (customizableFeedMappings.getFcKeepInContent() != null) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "FC_KeepInContent", customizableFeedMappings.getFcKeepInContent().toString().toLowerCase(Locale.ROOT)); } if (customizableFeedMappings.getFcContentKind() != null) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "FC_ContentKind", customizableFeedMappings.getFcContentKind().toString()); } if (customizableFeedMappings.getFcNsPrefix() != null) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "FC_NsPrefix", customizableFeedMappings.getFcNsPrefix()); } if (customizableFeedMappings.getFcNsUri() != null) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "FC_NsUri", customizableFeedMappings.getFcNsUri()); } if (customizableFeedMappings.getFcSourcePath() != null) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "FC_SourcePath", customizableFeedMappings.getFcSourcePath()); } if (customizableFeedMappings.getFcTargetPath() != null) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "FC_TargetPath", customizableFeedMappings.getFcTargetPath().toString()); } } } private static void writeProperties(final Collection<Property> properties, final Map<String, String> predefinedNamespaces, final XMLStreamWriter xmlStreamWriter) throws XMLStreamException { for (Property property : properties) { xmlStreamWriter.writeStartElement("Property"); xmlStreamWriter.writeAttribute("Name", property.getName()); if (property instanceof SimpleProperty) { xmlStreamWriter.writeAttribute("Type", ((SimpleProperty) property).getType().getFullQualifiedName().toString()); } else if (property instanceof ComplexProperty) { xmlStreamWriter.writeAttribute("Type", ((ComplexProperty) property).getType().toString()); } else { throw new ODataRuntimeException(); } writeFacets(xmlStreamWriter, property.getFacets()); if (property.getMimeType() != null) { xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, "MimeType", property.getMimeType()); } writeCustomizableFeedMappings(property.getCustomizableFeedMappings(), xmlStreamWriter); writeAnnotationAttributes(property.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(property.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAnnotationElements(property.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } private static void writeFacets(final XMLStreamWriter xmlStreamWriter, final EdmFacets facets) throws XMLStreamException { if (facets != null) { if (facets.isNullable() != null) { xmlStreamWriter.writeAttribute("Nullable", facets.isNullable().toString().toLowerCase(Locale.ROOT)); } if (facets.getDefaultValue() != null) { xmlStreamWriter.writeAttribute("DefaultValue", facets.getDefaultValue()); } if (facets.getMaxLength() != null) { xmlStreamWriter.writeAttribute("MaxLength", facets.getMaxLength().toString()); } if (facets.isFixedLength() != null) { xmlStreamWriter.writeAttribute("FixedLength", facets.isFixedLength().toString().toLowerCase(Locale.ROOT)); } if (facets.getPrecision() != null) { xmlStreamWriter.writeAttribute("Precision", facets.getPrecision().toString()); } if (facets.getScale() != null) { xmlStreamWriter.writeAttribute("Scale", facets.getScale().toString()); } if (facets.isUnicode() != null) { xmlStreamWriter.writeAttribute("Unicode", facets.isUnicode().toString()); } if (facets.getCollation() != null) { xmlStreamWriter.writeAttribute("Collation", facets.getCollation()); } if (facets.getConcurrencyMode() != null) { xmlStreamWriter.writeAttribute("ConcurrencyMode", facets.getConcurrencyMode().toString()); } } } private static void writeAssociationEnd(final AssociationEnd end, final Map<String, String> predefinedNamespaces, final XMLStreamWriter xmlStreamWriter) throws XMLStreamException { xmlStreamWriter.writeStartElement("End"); xmlStreamWriter.writeAttribute("Type", end.getType().toString()); xmlStreamWriter.writeAttribute("Multiplicity", end.getMultiplicity().toString()); if (end.getRole() != null) { xmlStreamWriter.writeAttribute("Role", end.getRole()); } writeAnnotationAttributes(end.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(end.getDocumentation(), predefinedNamespaces, xmlStreamWriter); OnDelete onDelete = end.getOnDelete(); if (onDelete != null) { xmlStreamWriter.writeStartElement("OnDelete"); xmlStreamWriter.writeAttribute("Action", onDelete.getAction().toString()); writeAnnotationAttributes(onDelete.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(onDelete.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAnnotationElements(onDelete.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } writeAnnotationElements(end.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } private static void writeAssociationSetEnd(final AssociationSetEnd end, final Map<String, String> predefinedNamespaces, final XMLStreamWriter xmlStreamWriter) throws XMLStreamException { xmlStreamWriter.writeStartElement("End"); xmlStreamWriter.writeAttribute("EntitySet", end.getEntitySet().toString()); if (end.getRole() != null) { xmlStreamWriter.writeAttribute("Role", end.getRole()); } writeAnnotationAttributes(end.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); writeDocumentation(end.getDocumentation(), predefinedNamespaces, xmlStreamWriter); writeAnnotationElements(end.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } private static void writeDocumentation(final Documentation documentation, final Map<String, String> predefinedNamespaces, final XMLStreamWriter xmlStreamWriter) throws XMLStreamException { if (documentation != null) { xmlStreamWriter.writeStartElement("Documentation"); writeAnnotationAttributes(documentation.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter); xmlStreamWriter.writeStartElement("Summary"); xmlStreamWriter.writeCharacters(documentation.getSummary()); xmlStreamWriter.writeEndElement(); xmlStreamWriter.writeStartElement("LongDescription"); xmlStreamWriter.writeCharacters(documentation.getLongDescription()); xmlStreamWriter.writeEndElement(); writeAnnotationElements(documentation.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter); xmlStreamWriter.writeEndElement(); } } private static void writeAnnotationAttributes(final Collection<AnnotationAttribute> annotationAttributes, final Map<String, String> predefinedNamespaces, ArrayList<String> setNamespaces, final XMLStreamWriter xmlStreamWriter) throws XMLStreamException { if (annotationAttributes != null) { if (setNamespaces == null) { setNamespaces = new ArrayList<String>(); } for (AnnotationAttribute annotationAttribute : annotationAttributes) { if (annotationAttribute.getNamespace() != null) { xmlStreamWriter.writeAttribute(annotationAttribute.getPrefix(), annotationAttribute.getNamespace(), annotationAttribute.getName(), annotationAttribute.getText()); if (setNamespaces.contains(annotationAttribute.getNamespace()) == false && predefinedNamespaces.containsValue(annotationAttribute.getNamespace()) == false) { xmlStreamWriter.writeNamespace(annotationAttribute.getPrefix(), annotationAttribute.getNamespace()); setNamespaces.add(annotationAttribute.getNamespace()); } } else { xmlStreamWriter.writeAttribute(annotationAttribute.getName(), annotationAttribute.getText()); } } } } private static void writeAnnotationElements(final Collection<AnnotationElement> annotationElements, final Map<String, String> predefinedNamespaces, final XMLStreamWriter xmlStreamWriter) throws XMLStreamException { if (annotationElements != null) { for (AnnotationElement annotationElement : annotationElements) { ArrayList<String> setNamespaces = new ArrayList<String>(); if (annotationElement.getNamespace() != null) { if (annotationElement.getPrefix() != null) { xmlStreamWriter.writeStartElement(annotationElement.getPrefix(), annotationElement.getName(), annotationElement.getNamespace()); if (!predefinedNamespaces.containsValue(annotationElement.getNamespace())) { xmlStreamWriter.writeNamespace(annotationElement.getPrefix(), annotationElement.getNamespace()); setNamespaces.add(annotationElement.getNamespace()); } } else { xmlStreamWriter.writeStartElement("", annotationElement.getName(), annotationElement.getNamespace()); if (!predefinedNamespaces.containsValue(annotationElement.getNamespace())) { xmlStreamWriter.writeNamespace("", annotationElement.getNamespace()); setNamespaces.add(annotationElement.getNamespace()); } } } else { xmlStreamWriter.writeStartElement(annotationElement.getName()); } writeAnnotationAttributes(annotationElement.getAttributes(), predefinedNamespaces, setNamespaces, xmlStreamWriter); if (annotationElement.getChildElements() != null) { writeAnnotationElements(annotationElement.getChildElements(), predefinedNamespaces, xmlStreamWriter); } else { if (annotationElement.getText() != null) { xmlStreamWriter.writeCharacters(annotationElement.getText()); } } xmlStreamWriter.writeEndElement(); } } } }