| /** |
| * <copyright> |
| * </copyright> |
| * |
| * $Id: MetadataResourceImpl.java,v 1.12 2008/11/18 22:24:36 gkessler Exp $ |
| */ |
| package org.eclipse.jst.jsf.common.metadata.internal.util; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EPackage; |
| import org.eclipse.emf.ecore.xmi.PackageNotFoundException; |
| import org.eclipse.emf.ecore.xmi.XMLHelper; |
| import org.eclipse.emf.ecore.xmi.XMLLoad; |
| import org.eclipse.emf.ecore.xmi.XMLResource; |
| import org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler; |
| import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl; |
| import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl; |
| import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl; |
| import org.eclipse.jst.jsf.common.JSFCommonPlugin; |
| import org.eclipse.jst.jsf.common.metadata.Entity; |
| import org.eclipse.jst.jsf.common.metadata.MetadataPackage; |
| import org.eclipse.jst.jsf.common.metadata.Model; |
| import org.eclipse.jst.jsf.common.metadata.Trait; |
| import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider; |
| import org.xml.sax.helpers.DefaultHandler; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * The <b>Resource </b> associated with the package. |
| * <!-- end-user-doc --> |
| * @see org.eclipse.jst.jsf.common.metadata.internal.util.MetadataResourceFactoryImpl |
| * @generated NOT |
| */ |
| public class MetadataResourceImpl extends XMLResourceImpl implements XMLResource.ResourceHandler { |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public static final String copyright = "Oracle inc."; //$NON-NLS-1$ |
| |
| /** |
| * IMetaDataSourceModelProvider |
| */ |
| protected IMetaDataSourceModelProvider _provider; |
| /** |
| * Creates an instance of the resource. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @param uri the URI of the new resource. |
| * @generated |
| */ |
| public MetadataResourceImpl(URI uri) { |
| super(uri); |
| } |
| |
| /** |
| * Constructor |
| */ |
| public MetadataResourceImpl() { |
| super(); |
| } |
| |
| |
| /** |
| * Constructor |
| * @param provider |
| */ |
| public MetadataResourceImpl(IMetaDataSourceModelProvider provider){ |
| super(); |
| _provider = provider; |
| } |
| |
| /** |
| * @generated NOT |
| */ |
| protected XMLLoad createXMLLoad() { |
| return new MetadataXMLLoad(createXMLHelper()); |
| } |
| /** |
| * Override createXMLHelper so that MetadataPackage.eINSTANCE is used for the NoNamespace package |
| * @generated NOT |
| */ |
| protected XMLHelper createXMLHelper() { |
| return new XMLHelperImpl(){ |
| @Override |
| public EPackage getNoNamespacePackage() { |
| return MetadataPackage.eINSTANCE; |
| } |
| }; |
| } |
| |
| public void postLoad(XMLResource resource, InputStream inputStream, |
| Map options) |
| { |
| final List<EObject> resContents = resource.getContents(); |
| |
| if (resContents.size() > 0) |
| { |
| final Object aRoot = resContents.get(0); |
| if (aRoot instanceof Model) |
| { |
| setModelKeyInTraits((Model) aRoot, (Model) aRoot); |
| } |
| } |
| else |
| { |
| JSFCommonPlugin.log(IStatus.WARNING, |
| "No model loaded for "+getURI()); //$NON-NLS-1$ |
| } |
| } |
| |
| private void setModelKeyInTraits(Model root, Entity currentEntity) { |
| // TODO: does this have side effect that we care about? nothing is done with the return value |
| MetadataPackage.eINSTANCE.getTrait_SourceModelProvider(); |
| for (int i=0;i < currentEntity.getTraits().size();i++){ |
| ((Trait)currentEntity.getTraits().get(i)).setSourceModelProvider(_provider); |
| } |
| for (int j=0;j < currentEntity.getChildEntities().size();j++){ |
| setModelKeyInTraits(root,(Entity)currentEntity.getChildEntities().get(j)); |
| } |
| |
| if (currentEntity == root){ |
| for (int k=0;k < root.getEntityGroups().size();k++){ |
| setModelKeyInTraits(root,(Entity)root.getEntityGroups().get(k)); |
| } |
| } |
| } |
| |
| |
| public void postSave(XMLResource resource, OutputStream outputStream, |
| Map options) { |
| // do nothing |
| } |
| |
| public void preLoad(XMLResource resource, InputStream inputStream, |
| Map options) { |
| // do nothing |
| } |
| |
| public void preSave(XMLResource resource, OutputStream outputStream, |
| Map options) { |
| // do nothing |
| } |
| |
| /** |
| * Override the handleErrors() method so that resource will load gracefully, and errors reported later |
| * when appropriate |
| * |
| * @generated NOT |
| */ |
| private static class MetadataXMLLoad extends XMLLoadImpl { |
| |
| public MetadataXMLLoad(XMLHelper helper) { |
| super(helper); |
| } |
| |
| @Override |
| protected void handleErrors() throws IOException { |
| //by doing nothing here, this allows the list of non-fatal errors (res.getErrors()) to be returned |
| } |
| |
| @Override |
| protected DefaultHandler makeDefaultHandler() { |
| return new MetadataXMLHandler(resource, helper, options); |
| } |
| } |
| |
| /** |
| * Ensures that only EMF extension models registered with the EMF Package Registry are considered. |
| * @generated NOT |
| */ |
| private static class MetadataXMLHandler extends SAXXMLHandler { |
| |
| public MetadataXMLHandler(XMLResource xmiResource, XMLHelper helper, |
| Map<?, ?> options) { |
| super(xmiResource, helper, options); |
| } |
| |
| @Override |
| protected EPackage getPackageForURI(String uriString) { |
| //code taken from super and modified so that only package registry is considered |
| if (uriString == null) |
| { |
| return null; |
| } |
| |
| EPackage ePackage = packageRegistry.getEPackage(uriString); |
| |
| if (ePackage != null && ePackage.eIsProxy()) |
| { |
| ePackage = null; |
| } |
| |
| if (ePackage == null) |
| { |
| ePackage = handleMissingPackage(uriString); |
| } |
| |
| if (ePackage == null) |
| { |
| error |
| (new PackageNotFoundException |
| (uriString, |
| getLocation(), |
| getLineNumber(), |
| getColumnNumber())); |
| } |
| |
| return ePackage; |
| } |
| } |
| } //MetadataResourceImpl |