/** * * 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; } } } }