blob: 2db23d2b8218b9e394c2ba9a1be8535d65db9f1c [file] [log] [blame]
/**
* <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