blob: cdc2428525320a2b3abf1cc00876b2da94c0b418 [file] [log] [blame]
/**
* Copyright (c) 2002-2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.xsd.ecore;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.xsd.XSDAttributeDeclaration;
import org.eclipse.xsd.XSDAttributeGroupContent;
import org.eclipse.xsd.XSDAttributeGroupDefinition;
import org.eclipse.xsd.XSDAttributeUse;
import org.eclipse.xsd.XSDAttributeUseCategory;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDCompositor;
import org.eclipse.xsd.XSDConstraint;
import org.eclipse.xsd.XSDDerivationMethod;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDFactory;
import org.eclipse.xsd.XSDForm;
import org.eclipse.xsd.XSDImport;
import org.eclipse.xsd.XSDModelGroup;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDProcessContents;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDWildcard;
import org.eclipse.xsd.util.XSDConstants;
/**
* This class produces an XSDSchema given an Ecore EPackage.
* The XSDSchema is an XMI schema.
*/
public class EcoreXMISchemaBuilder extends EcoreXMLSchemaBuilder
{
protected static final String XMI_PREFIX = "xmi";
protected static final String XMI_URI = "http://www.omg.org/XMI";
protected static final String XMI_SCHEMA_LOCATION = "XMI.xsd";
public EcoreXMISchemaBuilder()
{
super();
}
public Collection<EObject> generate(EPackage ePackage, QNameMap qNameMap, boolean minimized, List<EClass> rootList, Map<?, ?> options)
{
minimizedXMI = minimized;
rootClasses = rootList;
if (options != null)
{
useEncodedAttributeStyle = Boolean.TRUE.equals(options.get(EcoreXMLSchemaBuilder.OPTION_USE_ENCODED_ATTRIBUTE_STYLE));
enforceLowerBound = Boolean.TRUE.equals(options.get(EcoreXMLSchemaBuilder.OPTION_TO_ENFORCE_LOWERBOUND));
}
if (rootList != null && !rootList.isEmpty())
{
for (EClass root : rootList)
{
if (root.getEPackage() != ePackage)
{
throw new IllegalArgumentException("Inappropriate root class " + root.getName());
}
}
}
return generate(ePackage, qNameMap);
}
@Override
public Collection<EObject> generate(EPackage ePackage, QNameMap qNameMap)
{
List<EObject> result = new ArrayList<EObject>(super.generate(ePackage, qNameMap));
result.add(1, createXMISchema());
return result;
}
protected XSDSchema createXMISchema()
{
XSDSchema xmiSchema = XSDFactory.eINSTANCE.createXSDSchema();
xmiSchema.setTargetNamespace(XMI_URI);
xmiSchema.setSchemaForSchemaQNamePrefix("xsd");
Map<String, String> namespaces = xmiSchema.getQNamePrefixToNamespaceMap();
namespaces.put(XMI_PREFIX, XMI_URI);
namespaces.put("xsd", XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);
// <xsd:attribute name="id" type="xsd:ID"/>
XSDAttributeDeclaration xmiIdAttribute = XSDFactory.eINSTANCE.createXSDAttributeDeclaration();
xmiIdAttribute.setName("id");
xmiIdAttribute.setTypeDefinition(xmiSchema.getSchemaForSchema().resolveSimpleTypeDefinition("ID"));
xmiSchema.getContents().add(xmiIdAttribute);
// <xsd:attributeGroup name="IdentityAttribs">
// <xsd:attribute name="label" type="xsd:string" use="optional" form="qualified"/>
// <xsd:attribute name="uuid" type="xsd:string" use="optional" form="qualified"/>
// </xsd:attributeGroup>
XSDAttributeGroupDefinition xmiIdentityAttribs = XSDFactory.eINSTANCE.createXSDAttributeGroupDefinition();
xmiIdentityAttribs.setName("IdentityAttribs");
List<XSDAttributeGroupContent> contents = xmiIdentityAttribs.getContents();
contents.add(createAttributeUse(xmiSchema, "label", "string", "optional", "qualified", null));
contents.add(createAttributeUse(xmiSchema, "uuid", "string", "optional", "qualified", null));
xmiSchema.getContents().add(xmiIdentityAttribs);
// <xsd:attributeGroup name="LinkAttribs">
// <xsd:attribute name="href" type="xsd:string" use="optional"/>
// <xsd:attribute name="idref" type="xsd:IDREF" use="optional" form="qualified"/>
// </xsd:attributeGroup>
XSDAttributeGroupDefinition xmiLinkAttribs = XSDFactory.eINSTANCE.createXSDAttributeGroupDefinition();
xmiLinkAttribs.setName("LinkAttribs");
contents = xmiLinkAttribs.getContents();
contents.add(createAttributeUse(xmiSchema, "href", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "idref", "IDREF", "optional", "qualified", null));
xmiSchema.getContents().add(xmiLinkAttribs);
// <xsd:attributeGroup name="ObjectAttribs">
// <xsd:attributeGroup ref="IdentityAttribs"/>
// <xsd:attributeGroup ref="LinkAttribs"/>
// <xsd:attribute name="version" type="xsd:string" use="optional" fixed="2.0" form="qualified"/>
// <xsd:attribute name="type" type="xsd:QName" use="optional" form="qualified"/>
// </xsd:attributeGroup>
XSDAttributeGroupDefinition xmiObjectAttribs = XSDFactory.eINSTANCE.createXSDAttributeGroupDefinition();
xmiObjectAttribs.setName("ObjectAttribs");
contents = xmiObjectAttribs.getContents();
contents.add(createAttributeGroupReference(xmiSchema, "IdentityAttribs"));
contents.add(createAttributeGroupReference(xmiSchema, "LinkAttribs"));
contents.add(createAttributeUse(xmiSchema, "version", "string", "optional", "qualified", "2.0"));
contents.add(createAttributeUse(xmiSchema, "type", "QName", "optional", "qualified", null));
xmiSchema.getContents().add(xmiObjectAttribs);
// <xsd:complexType name="XMI">
// <xsd:choice minOccurs="0" maxOccurs="unbounded">
// <xsd:any processContents="strict"/>
// </xsd:choice>
// <xsd:attribute ref="id"/>
// <xsd:attributeGroup ref="IdentityAttribs"/>
// <xsd:attributeGroup ref="LinkAttribs"/>
// <xsd:attribute name="type" type="xsd:QName" use="optional" form="qualified"/>
// <xsd:attribute name="version" type="xsd:string" use="required" fixed="2.0" form="qualified"/>
// </xsd:complexType>
XSDComplexTypeDefinition xmiComplexTypeDefinition = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
xmiComplexTypeDefinition.setName("XMI");
// choice model group
XSDParticle particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setMinOccurs(0);
particle.setMaxOccurs(-1);
XSDModelGroup modelGroup = createAnyModelGroup("strict");
particle.setContent(modelGroup);
xmiComplexTypeDefinition.setContent(particle);
contents = xmiComplexTypeDefinition.getAttributeContents();
contents.add(createAttributeGroupReference(xmiSchema, "IdentityAttribs"));
contents.add(createAttributeGroupReference(xmiSchema, "LinkAttribs"));
contents.add(createAttributeUse(xmiSchema, "type", "QName", "optional", "qualified", null));
contents.add(createAttributeUse(xmiSchema, "version", "string", "required", "qualified", "2.0"));
xmiSchema.getContents().add(xmiComplexTypeDefinition);
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "XMI", "XMI", false));
// <xsd:complexType name="PackageReference">
// <xsd:choice minOccurs="0" maxOccurs="unbounded">
// <xsd:element name="name" type="xsd:string"/>
// <xsd:element name="version" type="xsd:string"/>
// <xsd:element ref="Extension"/>
// </xsd:choice>
// <xsd:attribute ref="id"/>
// <xsd:attributeGroup ref="ObjectAttribs"/>
// <xsd:attribute name="name" type="xsd:string" use="optional"/>
// <xsd:attribute name="version" type="xsd:string" use="optional"/>
// </xsd:complexType>
XSDComplexTypeDefinition prComplexTypeDefinition = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
prComplexTypeDefinition.setName("PackageReference");
// choice model group
particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setMinOccurs(0);
particle.setMaxOccurs(-1);
modelGroup = XSDFactory.eINSTANCE.createXSDModelGroup();
modelGroup.setCompositor(XSDCompositor.CHOICE_LITERAL);
addElementDeclaration(xmiSchema, modelGroup, "name", "string");
addElementDeclaration(xmiSchema, modelGroup, "version", "string");
particle.setContent(modelGroup);
prComplexTypeDefinition.setContent(particle);
contents = prComplexTypeDefinition.getAttributeContents();
contents.add(createAttributeGroupReference(xmiSchema, "ObjectAttribs"));
contents.add(createAttributeUse(xmiSchema, "name", "string", "optional", null, null));
// EATM contents.add(createAttributeUse(xmiSchema, "version", "string", "optional", null, null));
xmiSchema.getContents().add(prComplexTypeDefinition);
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "PackageReference", "PackageReference", false));
// <xsd:complexType name="Model">
// <xsd:complexContent>
// <xsd:extension base="PackageReference"/>
// </xsd:complexContent>
// </xsd:complexType>
xmiSchema.getContents().add(createExtendedComplexTypeDefinition(xmiSchema, "Model", "PackageReference"));
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "Model", "Model", false));
// <xsd:complexType name="Import">
// <xsd:complexContent>
// <xsd:extension base="PackageReference"/>
// </xsd:complexContent>
// </xsd:complexType>
xmiSchema.getContents().add(createExtendedComplexTypeDefinition(xmiSchema, "Import", "PackageReference"));
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "Import", "Import", false));
// <xsd:complexType name="MetaModel">
// <xsd:complexContent>
// <xsd:extension base="PackageReference"/>
// </xsd:complexContent>
// </xsd:complexType>
xmiSchema.getContents().add(createExtendedComplexTypeDefinition(xmiSchema, "MetaModel", "PackageReference"));
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "MetaModel", "MetaModel", false));
// <xsd:complexType name="Documentation">
// <xsd:choice minOccurs="0" maxOccurs="unbounded">
// <xsd:element name="contact" type="xsd:string"/>
// <xsd:element name="exporter" type="xsd:string"/>
// <xsd:element name="exporterVersion" type="xsd:string"/>
// <xsd:element name="longDescription" type="xsd:string"/>
// <xsd:element name="shortDescription" type="xsd:string"/>
// <xsd:element name="notice" type="xsd:string"/>
// <xsd:element name="owner" type="xsd:string"/>
// <xsd:element ref="Extension"/>
// </xsd:choice>
// <xsd:attribute ref="id"/>
// <xsd:attributeGroup ref="ObjectAttribs"/>
// <xsd:attribute name="contact" type="xsd:string" use="optional"/>
// <xsd:attribute name="exporter" type="xsd:string" use="optional"/>
// <xsd:attribute name="exporterVersion" type="xsd:string" use="optional"/>
// <xsd:attribute name="longDescription" type="xsd:string" use="optional"/>
// <xsd:attribute name="shortDescription" type="xsd:string" use="optional"/>
// <xsd:attribute name="notice" type="xsd:string" use="optional"/>
// <xsd:attribute name="owner" type="xsd:string" use="optional"/>
// </xsd:complexType>
XSDComplexTypeDefinition documentationComplexType = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
documentationComplexType.setName("Documentation");
// choice model group
particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setMinOccurs(0);
particle.setMaxOccurs(-1);
modelGroup = XSDFactory.eINSTANCE.createXSDModelGroup();
modelGroup.setCompositor(XSDCompositor.CHOICE_LITERAL);
addElementDeclaration(xmiSchema, modelGroup, "contact", "string");
addElementDeclaration(xmiSchema, modelGroup, "exporter", "string");
addElementDeclaration(xmiSchema, modelGroup, "exporterVersion", "string");
addElementDeclaration(xmiSchema, modelGroup, "longDescription", "string");
addElementDeclaration(xmiSchema, modelGroup, "shortDescription", "string");
addElementDeclaration(xmiSchema, modelGroup, "notice", "string");
addElementDeclaration(xmiSchema, modelGroup, "owner", "string");
particle.setContent(modelGroup);
documentationComplexType.setContent(particle);
contents = documentationComplexType.getAttributeContents();
contents.add(createAttributeGroupReference(xmiSchema, "ObjectAttribs"));
contents.add(createAttributeUse(xmiSchema, "contact", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "exporter", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "exporterVersion", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "longDescription", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "shortDescription", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "notice", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "owner", "string", "optional", null, null));
xmiSchema.getContents().add(documentationComplexType);
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "Documentation", "Documentation", false));
// <xsd:complexType name="Extension">
// <xsd:choice minOccurs="0" maxOccurs="unbounded">
// <xsd:any processContents="lax"/>
// </xsd:choice>
// <xsd:attribute ref="id"/>
// <xsd:attributeGroup ref="ObjectAttribs"/>
// <xsd:attribute name="extender" type="xsd:string" use="optional"/>
// <xsd:attribute name="extenderID" type="xsd:string" use="optional"/>
// </xsd:complexType>
XSDComplexTypeDefinition extensionComplexType = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
extensionComplexType.setName("Extension");
// choice model group
particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setMinOccurs(0);
particle.setMaxOccurs(-1);
modelGroup = createAnyModelGroup("lax");
particle.setContent(modelGroup);
extensionComplexType.setContent(particle);
contents = extensionComplexType.getAttributeContents();
contents.add(createAttributeGroupReference(xmiSchema, "ObjectAttribs"));
contents.add(createAttributeUse(xmiSchema, "extender", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "extenderID", "string", "optional", null, null));
xmiSchema.getContents().add(extensionComplexType);
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "Extension", "Extension", false));
// <xsd:complexType name="Difference">
// <xsd:choice minOccurs="0" maxOccurs="unbounded">
// <xsd:element name="target">
// <xsd:complexType>
// <xsd:choice minOccurs="0" maxOccurs="unbounded">
// <xsd:any processContents="skip"/>
// </xsd:choice>
// <xsd:anyAttribute processContents="skip"/>
// </xsd:complexType>
// </xsd:element>
// <xsd:element name="difference" type="Difference"/>
// <xsd:element name="container" type="Difference"/>
// <xsd:element ref="Extension"/>
// </xsd:choice>
// <xsd:attribute ref="id"/>
// <xsd:attributeGroup ref="ObjectAttribs"/>
// <xsd:attribute name="target" type="xsd:IDREFS" use="optional"/>
// <xsd:attribute name="container" type="xsd:IDREFS" use="optional"/>
// </xsd:complexType>
XSDComplexTypeDefinition differenceComplexType = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
differenceComplexType.setName("Difference");
particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setMinOccurs(0);
particle.setMaxOccurs(-1);
modelGroup = XSDFactory.eINSTANCE.createXSDModelGroup();
modelGroup.setCompositor(XSDCompositor.CHOICE_LITERAL);
XSDParticle particle2 = XSDFactory.eINSTANCE.createXSDParticle();
XSDElementDeclaration target = XSDFactory.eINSTANCE.createXSDElementDeclaration();
target.setName("target");
XSDComplexTypeDefinition anonymous = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
XSDParticle particle3 = XSDFactory.eINSTANCE.createXSDParticle();
particle3.setMinOccurs(0);
particle3.setMaxOccurs(-1);
particle3.setContent(createAnyModelGroup("skip"));
anonymous.setContent(particle3);
anonymous.setAttributeWildcardContent(createAny("skip"));
target.setAnonymousTypeDefinition(anonymous);
particle2.setContent(target);
modelGroup.getContents().add(particle2);
addElementDeclaration(xmiSchema, modelGroup, "difference", "Difference", false);
addElementDeclaration(xmiSchema, modelGroup, "container", "Difference", false);
particle.setContent(modelGroup);
differenceComplexType.setContent(particle);
contents = differenceComplexType.getAttributeContents();
contents.add(createAttributeGroupReference(xmiSchema, "ObjectAttribs"));
contents.add(createAttributeUse(xmiSchema, "target", "IDREFS", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "container", "IDREFS", "optional", null, null));
xmiSchema.getContents().add(differenceComplexType);
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "Difference", "Difference", false));
// <xsd:complexType name="Add">
// <xsd:complexContent>
// <xsd:extension base="Difference">
// <xsd:attribute name="position" type="xsd:string" use="optional"/>
// <xsd:attribute name="addition" type="xsd:IDREFS" use="optional"/>
// </xsd:extension>
// </xsd:complexContent>
// </xsd:complexType>
XSDComplexTypeDefinition addComplexType = createExtendedComplexTypeDefinition(xmiSchema, "Add", "Difference");
contents = addComplexType.getAttributeContents();
contents.add(createAttributeUse(xmiSchema, "position", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "addition", "IDREFS", "optional", null, null));
xmiSchema.getContents().add(addComplexType);
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "Add", "Add", false));
// <xsd:complexType name="Replace">
// <xsd:complexContent>
// <xsd:extension base="Difference">
// <xsd:attribute name="position" type="xsd:string" use="optional"/>
// <xsd:attribute name="replacement" type="xsd:IDREFS" use="optional"/>
// </xsd:extension>
// </xsd:complexContent>
// </xsd:complexType>
XSDComplexTypeDefinition replaceComplexType = createExtendedComplexTypeDefinition(xmiSchema, "Replace", "Difference");
contents = replaceComplexType.getAttributeContents();
contents.add(createAttributeUse(xmiSchema, "position", "string", "optional", null, null));
contents.add(createAttributeUse(xmiSchema, "replacement", "IDREFS", "optional", null, null));
xmiSchema.getContents().add(replaceComplexType);
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "Replace", "Replace", false));
// <xsd:complexType name="Delete">
// <xsd:complexContent>
// <xsd:extension base="Difference"/>
// </xsd:complexContent>
// </xsd:complexType>
XSDComplexTypeDefinition deleteComplexType = createExtendedComplexTypeDefinition(xmiSchema, "Delete", "Difference");
xmiSchema.getContents().add(deleteComplexType);
xmiSchema.getContents().add(createElementDeclaration(xmiSchema, "Delete", "Delete", false));
// <xsd:complexType name="Any">
// <xsd:choice minOccurs="0" maxOccurs="unbounded">
// <xsd:any processContents="skip"/>
// </xsd:choice>
// <xsd:anyAttribute processContents="skip"/>
// </xsd:complexType>
XSDComplexTypeDefinition xmiAny = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
xmiAny.setName("Any");
particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setMinOccurs(0);
particle.setMaxOccurs(-1);
particle.setContent(createAnyModelGroup("skip"));
xmiAny.setContent(particle);
xmiAny.setAttributeWildcardContent(createAny("skip"));
xmiSchema.getContents().add(xmiAny);
return xmiSchema;
}
protected XSDModelGroup createAnyModelGroup(String processContents)
{
XSDModelGroup modelGroup = XSDFactory.eINSTANCE.createXSDModelGroup();
modelGroup.setCompositor(XSDCompositor.CHOICE_LITERAL);
XSDParticle particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setContent(createAny(processContents));
modelGroup.getContents().add(particle);
return modelGroup;
}
protected XSDWildcard createAny(String processContents)
{
XSDWildcard any = XSDFactory.eINSTANCE.createXSDWildcard();
if ("strict".equals(processContents))
{
any.setProcessContents(XSDProcessContents.STRICT_LITERAL);
}
else
if ("skip".equals(processContents))
{
any.setProcessContents(XSDProcessContents.SKIP_LITERAL);
}
else
if ("lax".equals(processContents))
{
any.setProcessContents(XSDProcessContents.LAX_LITERAL);
}
return any;
}
protected XSDComplexTypeDefinition createExtendedComplexTypeDefinition(XSDSchema schema, String name, String extension)
{
XSDComplexTypeDefinition complexType = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
complexType.setName(name);
complexType.setDerivationMethod(XSDDerivationMethod.EXTENSION_LITERAL);
complexType.setBaseTypeDefinition(schema.resolveTypeDefinition(extension));
return complexType;
}
protected XSDAttributeGroupDefinition createAttributeGroupReference(XSDSchema schema, String name)
{
XSDAttributeGroupDefinition reference = XSDFactory.eINSTANCE.createXSDAttributeGroupDefinition();
reference.setResolvedAttributeGroupDefinition(schema.resolveAttributeGroupDefinition(name));
return reference;
}
protected XSDElementDeclaration createElementDeclaration(XSDSchema schema, String name, String type, boolean schemaType)
{
XSDElementDeclaration elementDeclaration = XSDFactory.eINSTANCE.createXSDElementDeclaration();
elementDeclaration.setName(name);
if (schemaType)
{
elementDeclaration.setTypeDefinition(schema.getSchemaForSchema().resolveSimpleTypeDefinition(type));
}
else
{
elementDeclaration.setTypeDefinition(schema.resolveSimpleTypeDefinition(type));
}
return elementDeclaration;
}
protected void addElementDeclaration(XSDSchema schema, XSDModelGroup modelGroup, String name, String type)
{
addElementDeclaration(schema, modelGroup, name, type, true);
}
protected void addElementDeclaration(XSDSchema schema, XSDModelGroup modelGroup, String name, String type, boolean schemaType)
{
XSDParticle particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setContent(createElementDeclaration(schema, name, type, schemaType));
modelGroup.getContents().add(particle);
}
protected void addElementDeclarationReference(XSDSchema schema, XSDModelGroup modelGroup, String reference)
{
XSDParticle particle = XSDFactory.eINSTANCE.createXSDParticle();
XSDElementDeclaration elementDeclaration = XSDFactory.eINSTANCE.createXSDElementDeclaration();
elementDeclaration.setResolvedElementDeclaration(schema.resolveElementDeclaration(reference));
particle.setContent(elementDeclaration);
modelGroup.getContents().add(particle);
}
protected XSDAttributeUse createAttributeReference(XSDSchema schema, String name)
{
XSDAttributeDeclaration attributeDeclaration = XSDFactory.eINSTANCE.createXSDAttributeDeclaration();
attributeDeclaration.setResolvedAttributeDeclaration(schema.resolveAttributeDeclaration(name));
XSDAttributeUse attributeUse = XSDFactory.eINSTANCE.createXSDAttributeUse();
attributeUse.setContent(attributeDeclaration);
return attributeUse;
}
protected XSDAttributeUse createAttributeUse(XSDSchema schema, String name, String type, String use, String form, String fixed)
{
XSDAttributeDeclaration attributeDeclaration = XSDFactory.eINSTANCE.createXSDAttributeDeclaration();
attributeDeclaration.setName(name);
attributeDeclaration.setTypeDefinition(schema.getSchemaForSchema().resolveSimpleTypeDefinition(type));
if ("qualified".equals(form))
{
attributeDeclaration.setForm(XSDForm.QUALIFIED_LITERAL);
}
XSDAttributeUse attributeUse = XSDFactory.eINSTANCE.createXSDAttributeUse();
attributeUse.setContent(attributeDeclaration);
if ("optional".equals(use))
{
attributeUse.setUse(XSDAttributeUseCategory.OPTIONAL_LITERAL);
}
if ("required".equals(use))
{
attributeUse.setUse(XSDAttributeUseCategory.REQUIRED_LITERAL);
}
if (fixed != null)
{
attributeUse.setConstraint(XSDConstraint.FIXED_LITERAL);
attributeUse.setLexicalValue("2.0");
}
return attributeUse;
}
@Override
protected boolean makeClassElementDeclaration(EClass eClass)
{
// if rootList == null, then generate all classes
// if rootList.isEmpty, then generate no classes
// if rootList.contains(), then generate only those contained classes
return rootClasses == null || (!rootClasses.isEmpty() && rootClasses.contains(eClass));
}
@Override
protected XSDModelGroup createModelGroup(XSDComplexTypeDefinition xsdComplexTypeDefinition)
{
XSDModelGroup modelGroup = XSDFactory.eINSTANCE.createXSDModelGroup();
modelGroup.setCompositor(XSDCompositor.CHOICE_LITERAL);
XSDParticle particle = XSDFactory.eINSTANCE.createXSDParticle();
particle.setMinOccurs(0);
particle.setMaxOccurs(-1);
particle.setContent(modelGroup);
xsdComplexTypeDefinition.setContent(particle);
return modelGroup;
}
@Override
protected void setAttributeElementMultiplicity(EAttribute attribute, XSDParticle particle)
{
// Do nothing
}
@Override
protected void additionalProcessing(EClass eClass, XSDComplexTypeDefinition xsdComplexTypeDefinition)
{
if (eClass.getESuperTypes().size() == 0)
{
addXMIExtension(getModelGroup(xsdComplexTypeDefinition));
addXMIAttributes(xsdComplexTypeDefinition);
}
}
protected void addXMIExtension(XSDModelGroup modelGroup)
{
if (!minimizedXMI)
{
importXMI();
XSDParticle particle = XSDFactory.eINSTANCE.createXSDParticle();
XSDElementDeclaration xsdElementDeclaration = XSDFactory.eINSTANCE.createXSDElementDeclaration();
xsdElementDeclaration.setResolvedElementDeclaration(xsdElementDeclaration.resolveElementDeclaration(XMI_URI, "Extension"));
particle.setContent(xsdElementDeclaration);
modelGroup.getContents().add(particle);
}
}
protected void addXMIAttributes(XSDComplexTypeDefinition xsdComplexTypeDefinition)
{
if (!minimizedXMI)
{
importXMI();
XSDAttributeGroupDefinition objAttribs = XSDFactory.eINSTANCE.createXSDAttributeGroupDefinition();
objAttribs.setResolvedAttributeGroupDefinition(objAttribs.resolveAttributeGroupDefinition(XMI_URI, "ObjectAttribs"));
xsdComplexTypeDefinition.getAttributeContents().add(0, objAttribs);
}
else
{
if (!useEncodedAttributeStyle)
{
importXMI();
XSDAttributeGroupDefinition linkAttribs = XSDFactory.eINSTANCE.createXSDAttributeGroupDefinition();
linkAttribs.setResolvedAttributeGroupDefinition(linkAttribs.resolveAttributeGroupDefinition(XMI_URI, "LinkAttribs"));
xsdComplexTypeDefinition.getAttributeContents().add(0, linkAttribs);
}
}
if (!minimizedXMI)
{
importXMI();
XSDAttributeDeclaration attrDecl = XSDFactory.eINSTANCE.createXSDAttributeDeclaration();
attrDecl.setResolvedAttributeDeclaration(attrDecl.resolveAttributeDeclaration(XMI_URI, "id"));
XSDAttributeUse attrUse = XSDFactory.eINSTANCE.createXSDAttributeUse();
attrUse.setContent(attrDecl);
xsdComplexTypeDefinition.getAttributeContents().add(0, attrUse);
}
}
@Override
protected void setDefaultValue(EAttribute attribute, XSDAttributeDeclaration attrDecl)
{
// Do nothing
}
@Override
protected boolean makeReferenceElement(EReference reference)
{
return (reference.isContainment() && !reference.isContainer()) || !useEncodedAttributeStyle;
}
@Override
protected void setReferenceElementType(EReference reference, XSDElementDeclaration xsdElementDeclaration)
{
if (reference.getEType() != null)
{
super.setReferenceElementType(reference, xsdElementDeclaration);
}
else
{
importXMI();
xsdElementDeclaration.setTypeDefinition(xsdElementDeclaration.resolveSimpleTypeDefinition(XMI_URI, "Any"));
}
}
@Override
protected void setReferenceElementMultiplicity(EReference reference, XSDParticle particle)
{
// Do nothing
}
protected void importXMI()
{
Map<String, String> namespaces = this.xsdSchema.getQNamePrefixToNamespaceMap();
if (namespaces.put(XMI_PREFIX, XMI_URI) == null)
{
XSDImport xmiImport = XSDFactory.eINSTANCE.createXSDImport();
xmiImport.setNamespace(XMI_URI);
xmiImport.setSchemaLocation(EcorePackage.eNS_URI.equals(xsdSchema.getTargetNamespace()) ? XMI_SCHEMA_LOCATION : "platform:/plugin/org.eclipse.emf.ecore/model/" + XMI_SCHEMA_LOCATION);
this.xsdSchema.getContents().add(0, xmiImport);
}
}
}