blob: 88c714f8bfb19890f6bfacb34db221edd5e64dd8 [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.tuscany.sdo.helper;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
/**
* A BasicExtendedMetaData that uses a supplied (SDO) ecore factory to create properties and types.
*/
public class BaseSDOExtendedMetaDataImpl extends BasicExtendedMetaData
{
protected EcoreFactory ecoreFactory = EcoreFactory.eINSTANCE;
protected DemandMetaData demandMetaData = new DemandMetaData();
public static class DemandMetaData {
EClassifier getEObject() { return EcorePackage.eINSTANCE.getEObject(); }
EClassifier getAnyType() { return XMLTypePackage.eINSTANCE.getAnyType(); }
EClassifier getAnySimpleType() { return XMLTypePackage.eINSTANCE.getAnySimpleType(); }
EClassifier getXMLTypeDocumentRoot() { return XMLTypePackage.eINSTANCE.getXMLTypeDocumentRoot(); }
}
public BaseSDOExtendedMetaDataImpl(EPackage.Registry registry)
{
super(registry);
}
public EPackage demandPackage(String namespace)
{
EPackage ePackage = demandRegistry.getEPackage(namespace);
if (ePackage == null)
{
ePackage = ecoreFactory.createEPackage();
ePackage.setNsURI(namespace);
setQualified(ePackage, namespace != null);
if (namespace != null)
{
ePackage.setNsPrefix
(namespace.equals(ExtendedMetaData.XMLNS_URI) ?
namespace.equals(ExtendedMetaData.XML_URI) ?
"xml" :
"xmlns" :
computePrefix(namespace));
}
demandRegistry.put(namespace, ePackage);
// demandDocumentRoot(ePackage);
EClass documentRootEClass = ecoreFactory.createEClass();
documentRootEClass.getESuperTypes().add(demandMetaData.getXMLTypeDocumentRoot());
documentRootEClass.setName("DocumentRoot");
ePackage.getEClassifiers().add(documentRootEClass);
setDocumentRoot(documentRootEClass);
}
return ePackage;
}
public EClassifier demandType(String namespace, String name)
{
EPackage ePackage = demandPackage(namespace);
EClassifier eClassifier = getType(ePackage, name);
if (eClassifier != null)
{
return eClassifier;
}
else
{
EClass eClass = ecoreFactory.createEClass();
eClass.setName(name);
eClass.getESuperTypes().add(demandMetaData.getAnyType());
setContentKind(eClass, MIXED_CONTENT);
ePackage.getEClassifiers().add(eClass);
return eClass;
}
}
public EStructuralFeature demandFeature(String namespace, String name, boolean isElement, boolean isReference)
{
EPackage ePackage = demandPackage(namespace);
EClass documentRootEClass = getDocumentRoot(ePackage);
EStructuralFeature eStructuralFeature =
isElement ?
getLocalElement(documentRootEClass, namespace, name) :
getLocalAttribute(documentRootEClass, namespace, name);
if (eStructuralFeature != null)
{
return eStructuralFeature;
}
else
{
if (isReference)
{
EReference eReference = ecoreFactory.createEReference();
eReference.setContainment(isElement);
eReference.setEType(demandMetaData.getEObject());
eReference.setName(name);
eReference.setDerived(true);
eReference.setTransient(true);
eReference.setVolatile(true);
documentRootEClass.getEStructuralFeatures().add(eReference);
setFeatureKind(eReference, isElement ? ELEMENT_FEATURE : ATTRIBUTE_FEATURE);
setNamespace(eReference, namespace);
// Mark the bound as unspecified so that it won't be considered many
// but can nevertheless be recognized as being unspecified and perhaps still be treat as many.
//
if (isElement)
{
eReference.setUpperBound(ETypedElement.UNSPECIFIED_MULTIPLICITY);
}
return eReference;
}
else
{
EAttribute eAttribute = ecoreFactory.createEAttribute();
eAttribute.setName(name);
eAttribute.setEType(demandMetaData.getAnySimpleType());
eAttribute.setDerived(true);
eAttribute.setTransient(true);
eAttribute.setVolatile(true);
documentRootEClass.getEStructuralFeatures().add(eAttribute);
setFeatureKind(eAttribute, isElement ? ELEMENT_FEATURE : ATTRIBUTE_FEATURE);
setNamespace(eAttribute, namespace);
// Mark the bound as unspecified so that it won't be considered many
// but can nevertheless be recognized as being unspecified and perhaps still be treat as many.
//
if (isElement)
{
eAttribute.setUpperBound(ETypedElement.UNSPECIFIED_MULTIPLICITY);
}
return eAttribute;
}
}
}
}