in impl/src/main/java/org/apache/tuscany/sdo/helper/BaseSDOXSDEcoreBuilder.java [1651:1769]
public void generate(XSDSchema xsdSchema)
{
this.rootSchema = xsdSchema;
if (xsdSchemas.add(xsdSchema))
{
addInput(xsdSchema);
validate(xsdSchema);
}
Collection visitedElementDeclarations = new ArrayList();
Collection elementDeclarations = new ArrayList(xsdSchema.getElementDeclarations());
Collection visitedAttributeDeclarations = new ArrayList();
Collection attributeDeclarations = new ArrayList(xsdSchema.getAttributeDeclarations());
Collection visitedTypeDefinitions = new ArrayList();
Collection typeDefinitions = new ArrayList(xsdSchema.getTypeDefinitions());
while (!elementDeclarations.isEmpty() || !attributeDeclarations.isEmpty() || !typeDefinitions.isEmpty())
{
for (Iterator i = elementDeclarations.iterator(); i.hasNext(); )
{
XSDElementDeclaration xsdElementDeclaration = (XSDElementDeclaration)i.next();
getEStructuralFeature(xsdElementDeclaration);
}
visitedElementDeclarations.addAll(elementDeclarations);
elementDeclarations = new ArrayList(xsdSchema.getElementDeclarations());
elementDeclarations.removeAll(visitedElementDeclarations);
for (Iterator i = attributeDeclarations.iterator(); i.hasNext(); )
{
XSDAttributeDeclaration xsdAttributeDeclaration = (XSDAttributeDeclaration)i.next();
if (!XSDConstants.isSchemaInstanceNamespace(xsdAttributeDeclaration.getTargetNamespace()))
{
getEStructuralFeature(xsdAttributeDeclaration);
}
}
visitedAttributeDeclarations.addAll(attributeDeclarations);
attributeDeclarations = new ArrayList(xsdSchema.getAttributeDeclarations());
attributeDeclarations.removeAll(visitedAttributeDeclarations);
for (Iterator i = typeDefinitions.iterator(); i.hasNext(); )
{
XSDTypeDefinition xsdTypeDefinition = (XSDTypeDefinition)i.next();
getEClassifier(xsdTypeDefinition);
}
visitedTypeDefinitions.addAll(typeDefinitions);
typeDefinitions = new ArrayList(xsdSchema.getTypeDefinitions());
typeDefinitions.removeAll(visitedTypeDefinitions);
}
resolveNameConflicts();
for (Iterator i = xsdSchemas.iterator(); i.hasNext(); )
{
XSDSchema generatedXSDSchema = (XSDSchema)i.next();
EPackage ePackage = (EPackage)targetNamespaceToEPackageMap.get(generatedXSDSchema.getTargetNamespace());
if (ePackage != null)
{
String packageName= getEcoreAttribute(generatedXSDSchema, "package");
if (packageName != null)
{
ePackage.setName(packageName);
}
String packageNsPrefix= getEcoreAttribute(generatedXSDSchema, "nsPrefix");
if (packageNsPrefix != null)
{
ePackage.setNsPrefix(packageNsPrefix);
}
}
}
for (Iterator i = eReferenceToOppositeNameMap.entrySet().iterator(); i.hasNext(); )
{
Map.Entry entry = (Map.Entry)i.next();
EReference eReference = (EReference)entry.getKey();
String opposite = (String)entry.getValue();
EClass oppositeEClass = eReference.getEReferenceType();
if (eReference.getEOpposite() == null)
{
EStructuralFeature eOppositeFeature = oppositeEClass.getEStructuralFeature(opposite);
// Match by XML name if this fails.
if (eOppositeFeature == null)
{
for (Iterator j = oppositeEClass.getEAllStructuralFeatures().iterator(); j.hasNext(); )
{
EStructuralFeature feature = (EStructuralFeature)j.next();
if (opposite.equals(extendedMetaData.getName(feature)))
{
eOppositeFeature = feature;
break;
}
}
}
if (eOppositeFeature instanceof EReference)
{
EReference eOpposite = (EReference)eOppositeFeature;
eOpposite.setEOpposite(eReference);
eReference.setEOpposite(eOpposite);
}
}
if (eReference.getEOpposite() == null && eReference.isContainment())
{
EReference eOpposite = ecoreFactory.createEReference();
eOpposite.setName(opposite);
eOpposite.setEType(eReference.getEContainingClass());
eOpposite.setLowerBound(0);
eOpposite.setEOpposite(eReference);
eReference.setEOpposite(eOpposite);
eOpposite.setTransient(true);
oppositeEClass.getEStructuralFeatures().add(eOpposite);
}
}
eReferenceToOppositeNameMap.clear();
}