/** * * 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 java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import org.apache.tuscany.sdo.SDOExtendedMetaData; import org.apache.tuscany.sdo.impl.SDOFactoryImpl.SDOEcoreFactory; import org.apache.tuscany.sdo.model.ModelFactory; import org.apache.tuscany.sdo.model.impl.ModelFactoryImpl; import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EPackage.Registry; /** * TODO make demand() methods synchronous? */ public class SDOExtendedMetaDataImpl extends BaseSDOExtendedMetaDataImpl implements SDOExtendedMetaData { public SDOExtendedMetaDataImpl() { this(HelperContextImpl.getBuiltInModelRegistry()); } public SDOExtendedMetaDataImpl(Registry registry) { super(registry); ecoreFactory = new SDOEcoreFactory(); demandMetaData = new SDODemandMetaData(); } public static class SDODemandMetaData extends DemandMetaData { EClassifier getEObject() { return (EClassifier)((ModelFactoryImpl)ModelFactory.INSTANCE).getDataObject(); } EClassifier getAnySimpleType() { return (EClassifier)((ModelFactoryImpl)ModelFactory.INSTANCE).getObject(); } } public EPackage getPackage(String namespace) { if ("".equals(namespace)) namespace = null; //FB EPackage result = registry.getEPackage(namespace); return result == null ? super.getPackage(namespace) : result; } /** * Returns the listing of alias names as specified by the sdo:aliasNames * property. */ public List getAliasNames(EModelElement modelElement) { EAnnotation eAnnotation = getAnnotation(modelElement, false); List list = null; if (eAnnotation != null) { String aliasNames = (String)eAnnotation.getDetails().get("aliasNames"); if (aliasNames != null) { list = new ArrayList(); StringTokenizer st = new StringTokenizer(aliasNames, " "); while (st.hasMoreTokens()) { String t = st.nextToken(); list.add(t); } } } return list; } public void setAliasNames(EModelElement modelElement, List aliasNames) { if (aliasNames == null || aliasNames.isEmpty()) { setAliasNames(modelElement, (String)null); } else { StringBuffer buf = new StringBuffer(); for (int n = 0; n < aliasNames.size(); n++) { String name = (String) aliasNames.get(n); buf.append(name); buf.append(" "); } setAliasNames(modelElement, buf.toString()); } } /** * Adds an alias name per sdo:aliasName */ public void setAliasNames(EModelElement modelElement, String aliasNames) { EAnnotation eAnnotation = getAnnotation(modelElement, true); eAnnotation.getDetails().put("aliasNames", aliasNames); } public EPackage.Registry getRegistry() { return registry; } boolean featureNamespaceMatchingLax = true; public void setFeatureNamespaceMatchingLax(boolean b) { featureNamespaceMatchingLax = b; } protected boolean isFeatureNamespaceMatchingLax() { return featureNamespaceMatchingLax; } /* * (non-Javadoc) * * Eagerly pre-cache the "holder"s for static packages. * * @see org.eclipse.emf.ecore.util.BasicExtendedMetaData#putPackage(java.lang.String, * org.eclipse.emf.ecore.EPackage) */ public void putPackage(String namespace, EPackage ePackage) { for (Iterator iterator = ePackage.eAllContents(); iterator.hasNext();) { Object object = iterator.next(); if (object instanceof EClassifier) { this.getName((EClassifier) object); } else if (object instanceof EStructuralFeature) { this.getName((EStructuralFeature) object); } } super.putPackage(namespace, ePackage); } /****************************************************************************************************** * Following methods, getLocalAttribute & getLocalElement, ARE TEMPORARY COPIES FROM THE BASE CLASS. * One line (the last line)in each method is changed to support lax namespace matching. * DO NOT EDIT THESE METHODS. THEY WILL BE REMOVED WHEN WE MOVE TO EMF 2.3, WHICH FIXES THE PROBLEM. ******************************************************************************************************/ public EStructuralFeature getLocalAttribute(EClass eClass, String namespace, String name) { EStructuralFeature result = null; if (isFeatureKindSpecific()) { List allAttributes = getAllAttributes(eClass); for (int i = 0, size = allAttributes.size(); i < size; ++i) { EStructuralFeature eStructuralFeature = (EStructuralFeature) allAttributes.get(i); if (name.equals(getName(eStructuralFeature))) { String featureNamespace = getNamespace(eStructuralFeature); if (namespace == null) { if (featureNamespace == null) { return eStructuralFeature; } else if (result == null) { result = eStructuralFeature; } } else if (namespace.equals(featureNamespace)) { return eStructuralFeature; } else if (featureNamespace == null && result == null) { result = eStructuralFeature; } } } } else { for (int i = 0, size = eClass.getFeatureCount(); i < size; ++i) { EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(i); switch (getFeatureKind(eStructuralFeature)) { case UNSPECIFIED_FEATURE: case ATTRIBUTE_FEATURE: { if (name.equals(getName(eStructuralFeature))) { String featureNamespace = getNamespace(eStructuralFeature); if (namespace == null) { if (featureNamespace == null) { return eStructuralFeature; } else if (result == null) { result = eStructuralFeature; } } else if (namespace.equals(featureNamespace)) { return eStructuralFeature; } else if (featureNamespace == null && result == null) { result = eStructuralFeature; } } break; } } } } return isFeatureNamespaceMatchingLax() ? result : null; } protected EStructuralFeature getLocalElement(EClass eClass, String namespace, String name) { EStructuralFeature result = null; if (isFeatureKindSpecific()) { List allElements = getAllElements(eClass); for (int i = 0, size = allElements.size(); i < size; ++i) { EStructuralFeature eStructuralFeature = (EStructuralFeature) allElements.get(i); if (name.equals(getName(eStructuralFeature))) { String featureNamespace = getNamespace(eStructuralFeature); if (namespace == null) { if (featureNamespace == null) { return eStructuralFeature; } else if (result == null) { result = eStructuralFeature; } } else if (namespace.equals(featureNamespace)) { return eStructuralFeature; } else if (featureNamespace == null && result == null) { result = eStructuralFeature; } } } } else { for (int i = 0, size = eClass.getFeatureCount(); i < size; ++i) { EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(i); switch (getFeatureKind(eStructuralFeature)) { case UNSPECIFIED_FEATURE: case ELEMENT_FEATURE: { if (name.equals(getName(eStructuralFeature))) { String featureNamespace = getNamespace(eStructuralFeature); if (namespace == null) { if (featureNamespace == null) { return eStructuralFeature; } else if (result == null) { result = eStructuralFeature; } } else if (namespace.equals(featureNamespace)) { return eStructuralFeature; } else if (featureNamespace == null && result == null) { result = eStructuralFeature; } } break; } } } } return isFeatureNamespaceMatchingLax() ? result : null; } }