blob: f3014821fbe51a870a375c0a7cfc7234d0d81fd7 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.olingo.odata2.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 org.apache.olingo.odata2.api.edm.Edm;
import org.apache.olingo.odata2.api.edm.EdmFacets;
import org.apache.olingo.odata2.api.edm.provider.AnnotationAttribute;
import org.apache.olingo.odata2.api.edm.provider.AnnotationElement;
import org.apache.olingo.odata2.api.edm.provider.Association;
import org.apache.olingo.odata2.api.edm.provider.AssociationEnd;
import org.apache.olingo.odata2.api.edm.provider.AssociationSet;
import org.apache.olingo.odata2.api.edm.provider.AssociationSetEnd;
import org.apache.olingo.odata2.api.edm.provider.ComplexProperty;
import org.apache.olingo.odata2.api.edm.provider.ComplexType;
import org.apache.olingo.odata2.api.edm.provider.CustomizableFeedMappings;
import org.apache.olingo.odata2.api.edm.provider.DataServices;
import org.apache.olingo.odata2.api.edm.provider.Documentation;
import org.apache.olingo.odata2.api.edm.provider.EntityContainer;
import org.apache.olingo.odata2.api.edm.provider.EntitySet;
import org.apache.olingo.odata2.api.edm.provider.EntityType;
import org.apache.olingo.odata2.api.edm.provider.FunctionImport;
import org.apache.olingo.odata2.api.edm.provider.FunctionImportParameter;
import org.apache.olingo.odata2.api.edm.provider.Key;
import org.apache.olingo.odata2.api.edm.provider.NavigationProperty;
import org.apache.olingo.odata2.api.edm.provider.OnDelete;
import org.apache.olingo.odata2.api.edm.provider.Property;
import org.apache.olingo.odata2.api.edm.provider.PropertyRef;
import org.apache.olingo.odata2.api.edm.provider.ReferentialConstraint;
import org.apache.olingo.odata2.api.edm.provider.ReferentialConstraintRole;
import org.apache.olingo.odata2.api.edm.provider.Schema;
import org.apache.olingo.odata2.api.edm.provider.SimpleProperty;
import org.apache.olingo.odata2.api.edm.provider.Using;
import org.apache.olingo.odata2.api.ep.EntityProviderException;
import org.apache.olingo.odata2.core.ep.EntityProviderProducerException;
import org.apache.olingo.odata2.core.ep.util.XmlMetadataConstants;
import org.apache.olingo.odata2.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, XmlMetadataConstants.EDM_DATA_SERVICES);
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08,
XmlMetadataConstants.EDM_DATA_SERVICE_VERSION, 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(XmlMetadataConstants.EDM_SCHEMA);
if (schema.getAlias() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_SCHEMA_ALIAS, schema.getAlias());
}
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_SCHEMA_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(XmlMetadataConstants.EDM_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(XmlMetadataConstants.EDM_ENTITY_TYPE);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, entityType.getName());
if (entityType.getBaseType() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_BASE_TYPE, entityType.getBaseType().toString());
}
if (entityType.isAbstract()) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_TYPE_ABSTRACT, "true");
}
if (entityType.isHasStream()) {
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08,
XmlMetadataConstants.M_ENTITY_TYPE_HAS_STREAM, "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(XmlMetadataConstants.EDM_ENTITY_TYPE_KEY);
writeAnnotationAttributes(key.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter);
Collection<PropertyRef> propertyRefs = entityType.getKey().getKeys();
for (PropertyRef propertyRef : propertyRefs) {
xmlStreamWriter.writeStartElement(XmlMetadataConstants.EDM_PROPERTY_REF);
writeAnnotationAttributes(propertyRef.getAnnotationAttributes(), predefinedNamespaces, null,
xmlStreamWriter);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_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(XmlMetadataConstants.EDM_NAVIGATION_PROPERTY);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, navigationProperty.getName());
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAVIGATION_RELATIONSHIP, navigationProperty
.getRelationship().toString());
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAVIGATION_FROM_ROLE, navigationProperty
.getFromRole());
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAVIGATION_TO_ROLE, 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(XmlMetadataConstants.EDM_COMPLEX_TYPE);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, complexType.getName());
if (complexType.getBaseType() != null) {
xmlStreamWriter
.writeAttribute(XmlMetadataConstants.EDM_BASE_TYPE, complexType.getBaseType().toString());
}
if (complexType.isAbstract()) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_TYPE_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(XmlMetadataConstants.EDM_ASSOCIATION);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_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(XmlMetadataConstants.EDM_ASSOCIATION_CONSTRAINT);
writeAnnotationAttributes(referentialConstraint.getAnnotationAttributes(), predefinedNamespaces, null,
xmlStreamWriter);
writeDocumentation(referentialConstraint.getDocumentation(), predefinedNamespaces, xmlStreamWriter);
ReferentialConstraintRole principal = referentialConstraint.getPrincipal();
xmlStreamWriter.writeStartElement(XmlMetadataConstants.EDM_ASSOCIATION_PRINCIPAL);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_ROLE, principal.getRole());
writeAnnotationAttributes(principal.getAnnotationAttributes(), predefinedNamespaces, null,
xmlStreamWriter);
for (PropertyRef propertyRef : principal.getPropertyRefs()) {
xmlStreamWriter.writeStartElement(XmlMetadataConstants.EDM_PROPERTY_REF);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, propertyRef.getName());
xmlStreamWriter.writeEndElement();
}
writeAnnotationElements(principal.getAnnotationElements(), predefinedNamespaces, xmlStreamWriter);
xmlStreamWriter.writeEndElement();
ReferentialConstraintRole dependent = referentialConstraint.getDependent();
xmlStreamWriter.writeStartElement(XmlMetadataConstants.EDM_ASSOCIATION_DEPENDENT);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_ROLE, dependent.getRole());
writeAnnotationAttributes(dependent.getAnnotationAttributes(), predefinedNamespaces, null,
xmlStreamWriter);
for (PropertyRef propertyRef : dependent.getPropertyRefs()) {
xmlStreamWriter.writeStartElement(XmlMetadataConstants.EDM_PROPERTY_REF);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_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(XmlMetadataConstants.EDM_ENTITY_CONTAINER);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, entityContainer.getName());
if (entityContainer.getExtendz() != null) {
xmlStreamWriter
.writeAttribute(XmlMetadataConstants.EDM_CONTAINER_EXTENDZ, entityContainer.getExtendz());
}
if (entityContainer.isDefaultEntityContainer()) {
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08,
XmlMetadataConstants.EDM_CONTAINER_IS_DEFAULT, "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(XmlMetadataConstants.EDM_ENTITY_SET);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, entitySet.getName());
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_ENTITY_TYPE, 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(XmlMetadataConstants.EDM_ASSOCIATION_SET);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, associationSet.getName());
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_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(XmlMetadataConstants.EDM_FUNCTION_IMPORT);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, functionImport.getName());
if (functionImport.getReturnType() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_FUNCTION_IMPORT_RETURN, functionImport
.getReturnType().toString());
}
if (functionImport.getEntitySet() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_ENTITY_SET, functionImport.getEntitySet());
}
if (functionImport.getHttpMethod() != null) {
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08,
XmlMetadataConstants.EDM_FUNCTION_IMPORT_HTTP_METHOD, 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(XmlMetadataConstants.EDM_FUNCTION_PARAMETER);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, functionImportParameter.getName());
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_TYPE, functionImportParameter.getType()
.getFullQualifiedName().toString());
if (functionImportParameter.getMode() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_FUNCTION_PARAMETER_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 EntityProviderProducerException(EntityProviderException.COMMON, e);
} catch (FactoryConfigurationError e) {
throw new EntityProviderProducerException(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,
XmlMetadataConstants.M_FC_KEEP_IN_CONTENT, customizableFeedMappings.getFcKeepInContent().toString()
.toLowerCase(Locale.ROOT));
}
if (customizableFeedMappings.getFcContentKind() != null) {
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, XmlMetadataConstants.M_FC_CONTENT_KIND,
customizableFeedMappings.getFcContentKind().toString());
}
if (customizableFeedMappings.getFcNsPrefix() != null) {
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, XmlMetadataConstants.M_FC_PREFIX,
customizableFeedMappings.getFcNsPrefix());
}
if (customizableFeedMappings.getFcNsUri() != null) {
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, XmlMetadataConstants.M_FC_NS_URI,
customizableFeedMappings.getFcNsUri());
}
if (customizableFeedMappings.getFcSourcePath() != null) {
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, XmlMetadataConstants.M_FC_SOURCE_PATH,
customizableFeedMappings.getFcSourcePath());
}
if (customizableFeedMappings.getFcTargetPath() != null) {
xmlStreamWriter.writeAttribute(Edm.PREFIX_M, Edm.NAMESPACE_M_2007_08, XmlMetadataConstants.M_FC_TARGET_PATH,
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(XmlMetadataConstants.EDM_PROPERTY);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_NAME, property.getName());
if (property instanceof SimpleProperty) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_TYPE, ((SimpleProperty) property).getType()
.getFullQualifiedName().toString());
} else if (property instanceof ComplexProperty) {
xmlStreamWriter
.writeAttribute(XmlMetadataConstants.EDM_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, XmlMetadataConstants.M_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(XmlMetadataConstants.EDM_PROPERTY_NULLABLE, facets.isNullable().toString()
.toLowerCase(Locale.ROOT));
}
if (facets.getDefaultValue() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_PROPERTY_DEFAULT_VALUE, facets.getDefaultValue());
}
if (facets.getMaxLength() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_PROPERTY_MAX_LENGTH, facets.getMaxLength().toString());
}
if (facets.isFixedLength() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_PROPERTY_FIXED_LENGTH, facets.isFixedLength()
.toString().toLowerCase(Locale.ROOT));
}
if (facets.getPrecision() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_PROPERTY_PRECISION, facets.getPrecision().toString());
}
if (facets.getScale() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_PROPERTY_SCALE, facets.getScale().toString());
}
if (facets.isUnicode() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_PROPERTY_UNICODE, facets.isUnicode().toString());
}
if (facets.getCollation() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_PROPERTY_COLLATION, facets.getCollation());
}
if (facets.getConcurrencyMode() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_PROPERTY_CONCURRENCY_MODE, facets.getConcurrencyMode()
.toString());
}
}
}
private static void writeAssociationEnd(final AssociationEnd end, final Map<String, String> predefinedNamespaces,
final XMLStreamWriter xmlStreamWriter) throws XMLStreamException {
xmlStreamWriter.writeStartElement(XmlMetadataConstants.EDM_ASSOCIATION_END);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_TYPE, end.getType().toString());
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_ASSOCIATION_MULTIPLICITY, end.getMultiplicity().toString());
if (end.getRole() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_ROLE, end.getRole());
}
writeAnnotationAttributes(end.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter);
writeDocumentation(end.getDocumentation(), predefinedNamespaces, xmlStreamWriter);
OnDelete onDelete = end.getOnDelete();
if (onDelete != null) {
xmlStreamWriter.writeStartElement(XmlMetadataConstants.EDM_ASSOCIATION_ONDELETE);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_ONDELETE_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(XmlMetadataConstants.EDM_ASSOCIATION_END);
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_ENTITY_SET, end.getEntitySet().toString());
if (end.getRole() != null) {
xmlStreamWriter.writeAttribute(XmlMetadataConstants.EDM_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(XmlMetadataConstants.DOCUMENTATION);
writeAnnotationAttributes(documentation.getAnnotationAttributes(), predefinedNamespaces, null, xmlStreamWriter);
if (documentation.getSummary() != null) {
xmlStreamWriter.writeStartElement(XmlMetadataConstants.SUMMARY);
xmlStreamWriter.writeCharacters(documentation.getSummary());
xmlStreamWriter.writeEndElement();
}
if (documentation.getLongDescription() != null) {
xmlStreamWriter.writeStartElement(XmlMetadataConstants.LONG_DESCRIPTION);
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();
}
}
}
}