/** * Copyright (c) 2005-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.emf.mapping.ecore2xml.util; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.ENamedElement; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.BasicExtendedMetaData; import org.eclipse.emf.ecore.util.ExtendedMetaData; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.mapping.ecore2xml.Ecore2XMLRegistry; /** * Maps XML elements to Ecore named elements based on registered Ecore2XML mappings. */ public class Ecore2XMLExtendedMetaData extends BasicExtendedMetaData { protected final Ecore2XMLRegistry ecore2xmlRegistry; protected final Map<String, XMLResource.XMLMap> xmlMaps = new HashMap<String, XMLResource.XMLMap>(); public Ecore2XMLExtendedMetaData() { this(Ecore2XMLRegistry.INSTANCE); } public Ecore2XMLExtendedMetaData(Ecore2XMLRegistry ecore2xmlRegistry) { this(EPackage.Registry.INSTANCE, ecore2xmlRegistry); } public Ecore2XMLExtendedMetaData(EPackage.Registry ePackageRegistry, Ecore2XMLRegistry ecore2xmlRegistry) { this(ANNOTATION_URI, ePackageRegistry, ecore2xmlRegistry); } public Ecore2XMLExtendedMetaData(String annotationURI, EPackage.Registry ePackageRegistry, Ecore2XMLRegistry ecore2xmlRegistry) { super(annotationURI, ePackageRegistry); extendedMetaDataHolderCache = new HashMap<EModelElement, Object>(); this.ecore2xmlRegistry = ecore2xmlRegistry; } protected XMLResource.XMLInfo getInfo(ENamedElement element) { XMLResource.XMLInfo xmlInfo = null; for (XMLResource.XMLMap xmlMap : xmlMaps.values()) { xmlInfo = xmlMap.getInfo(element); if (xmlInfo != null) { break; } } return xmlInfo; } protected EClassifier getClassifier(String namespaceURI, String name) { EClassifier classifier = null; for (XMLResource.XMLMap xmlMap : xmlMaps.values()) { classifier = xmlMap.getClassifier(namespaceURI, name); if (classifier != null) { break; } } return classifier; } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.util.ExtendedMetaData#getPackage(java.lang.String) */ @Override public EPackage getPackage(String namespace) { XMLResource.XMLMap xmlMap = ecore2xmlRegistry.getXMLMap(namespace); if (xmlMap != null) { xmlMaps.put(namespace, xmlMap); } return super.getPackage(namespace); } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.util.ExtendedMetaData#getName(org.eclipse.emf.ecore.EClassifier) */ @Override public String getName(EClassifier eClassifier) { XMLResource.XMLInfo xmlInfo = getInfo(eClassifier); if (xmlInfo != null) { return xmlInfo.getName(); } return super.getName(eClassifier); } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.util.ExtendedMetaData#getName(org.eclipse.emf.ecore.EStructuralFeature) */ @Override public String getName(EStructuralFeature eStructuralFeature) { XMLResource.XMLInfo xmlInfo = getInfo(eStructuralFeature); if (xmlInfo != null) { return xmlInfo.getName(); } return super.getName(eStructuralFeature); } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.util.ExtendedMetaData#getNamespace(org.eclipse.emf.ecore.EPackage) */ @Override public String getNamespace(EPackage ePackage) { XMLResource.XMLInfo xmlInfo = getInfo(ePackage); if (xmlInfo != null) { return xmlInfo.getTargetNamespace(); } return super.getNamespace(ePackage); } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.util.ExtendedMetaData#getType(org.eclipse.emf.ecore.EPackage, * java.lang.String) */ @Override public EClassifier getType(EPackage ePackage, String name) { EClassifier type = super.getType(ePackage, name); if (type == null) { type = getClassifier(ePackage.getNsURI(), name); } return type; } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.util.ExtendedMetaData#getFeatureKind(org.eclipse.emf.ecore.EStructuralFeature) */ @Override public int getFeatureKind(EStructuralFeature eStructuralFeature) { XMLResource.XMLInfo xmlInfo = getInfo(eStructuralFeature); if (xmlInfo != null) { switch (xmlInfo.getXMLRepresentation()) { case XMLResource.XMLInfo.ELEMENT: return ExtendedMetaData.ELEMENT_FEATURE; case XMLResource.XMLInfo.ATTRIBUTE: return ExtendedMetaData.ATTRIBUTE_FEATURE; } } return super.getFeatureKind(eStructuralFeature); } /* * (non-Javadoc) * * @see org.eclipse.emf.ecore.util.BasicExtendedMetaData#isFeatureKindSpecific() */ @Override protected boolean isFeatureKindSpecific() { return false; } }