/**
* 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.ecore.xmi.impl;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.common.CommonPlugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xmi.XMIPlugin;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.XMLLoad;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.xml.sax.helpers.DefaultHandler;
public class GenericXMLResourceImpl extends XMLResourceImpl
{
protected static final Class<?> xsdEcoreBuilderClass;
protected static final Constructor<?> xsdEcoreBuilderConstructor;
protected static final Method xsdEcoreBuilderGenerateResourcesMethod;
protected static final Map<?, ?> xsdEcoreBuilderOptions;
static
{
Class<?> theXSDEcoreBuilderClass = null;
Constructor<?> theXSDEcoreBuilderConstructor = null;
Method theXSDEcoreBuilderGenerateResourcesMethod = null;
try
{
theXSDEcoreBuilderClass = CommonPlugin.loadClass("org.eclipse.xsd", "org.eclipse.xsd.ecore.XSDEcoreBuilder");
theXSDEcoreBuilderConstructor = theXSDEcoreBuilderClass.getConstructor(new Class [] { ExtendedMetaData.class, Map.class });
theXSDEcoreBuilderGenerateResourcesMethod = theXSDEcoreBuilderClass.getMethod("generateResources", new Class [] { Collection.class });
}
catch (Exception exception)
{
XMIPlugin.INSTANCE.log(exception);
exception.printStackTrace();
}
xsdEcoreBuilderClass = theXSDEcoreBuilderClass;
xsdEcoreBuilderConstructor = theXSDEcoreBuilderConstructor;
xsdEcoreBuilderGenerateResourcesMethod = theXSDEcoreBuilderGenerateResourcesMethod;
Map<Object, Object> theXSDEcoreBuilderOptions = new HashMap<Object, Object>();
theXSDEcoreBuilderOptions.put("REUSE_REGISTERED_PACKAGES", Boolean.TRUE);
xsdEcoreBuilderOptions = Collections.unmodifiableMap(theXSDEcoreBuilderOptions);
}
public GenericXMLResourceImpl(URI uri)
{
super(uri);
}
protected static class GenericXMLLoadImpl extends XMLLoadImpl
{
protected GenericXMLLoadImpl(XMLHelper helper)
{
super(helper);
}
@Override
protected DefaultHandler makeDefaultHandler()
{
return new GenericSAXXMLHandler(resource, helper, options);
}
}
protected static class GenericSAXXMLHandler extends SAXXMLHandler
{
protected Object xsdEcoreBuilder;
protected Collection<? extends Resource> generatedResources;
protected GenericSAXXMLHandler(XMLResource xmlResource, XMLHelper helper, Map<?, ?> options)
{
super(xmlResource, helper, options);
}
@Override
protected void handleTopLocations(String prefix, String name)
{
if (urisToLocations != null && xsdEcoreBuilderConstructor != null && xsdEcoreBuilderGenerateResourcesMethod != null)
{
try
{
xsdEcoreBuilder = xsdEcoreBuilderConstructor.newInstance(new Object []{ extendedMetaData, xsdEcoreBuilderOptions });
@SuppressWarnings("unchecked") Collection<? extends Resource> newGeneratedResources =
(Collection<? extends Resource>)xsdEcoreBuilderGenerateResourcesMethod.invoke
(xsdEcoreBuilder, new Object []{ urisToLocations.values() });
generatedResources = newGeneratedResources;
// xmlResource.getResourceSet().getResources().addAll(generatedResources);
}
catch (Exception exception)
{
XMIPlugin.INSTANCE.log(exception);
}
}
// Ensure that anything can be handled, even if it's not recognized.
//
String namespaceURI = helper.getURI(prefix);
if (extendedMetaData.getPackage(namespaceURI) == null)
{
extendedMetaData.demandFeature(namespaceURI, name, true);
}
}
@Override
protected EPackage handleMissingPackage(String uriString)
{
return objects.isEmpty() ? extendedMetaData.demandPackage(uriString) : super.handleMissingPackage(uriString);
}
}
@Override
protected XMLLoad createXMLLoad()
{
return new GenericXMLLoadImpl(createXMLHelper());
}
}