/**
* 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.util;
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.resource.Resource;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xmi.EcoreBuilder;
/**
* Default implementation of XML Schema to Ecore builder.
*/
public class DefaultEcoreBuilder implements EcoreBuilder
{
protected static final Class<?> XSD_ECORE_BUILDER_CLASS;
protected static final Constructor<?> XSD_ECORE_BUILDER_CONSTRUCTOR;
protected static final Method XSD_ECORE_BUILDER_GENERATE_RESOURCES_METHOD;
protected static final Map<?, ?> XSD_ECORE_BUILDER_OPTIONS;
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 (Throwable exception)
{
// Assume the class isn't available.
}
XSD_ECORE_BUILDER_CLASS = theXSDEcoreBuilderClass;
XSD_ECORE_BUILDER_CONSTRUCTOR = theXSDEcoreBuilderConstructor;
XSD_ECORE_BUILDER_GENERATE_RESOURCES_METHOD = theXSDEcoreBuilderGenerateResourcesMethod;
Map<Object, Object> theXSDEcoreBuilderOptions = new HashMap<Object, Object>();
theXSDEcoreBuilderOptions.put("REUSE_REGISTERED_PACKAGES", Boolean.TRUE);
XSD_ECORE_BUILDER_OPTIONS = Collections.unmodifiableMap(theXSDEcoreBuilderOptions);
}
protected ExtendedMetaData extendedMetaData;
public DefaultEcoreBuilder(ExtendedMetaData extendedMetaData)
{
this.extendedMetaData = extendedMetaData;
}
public void setExtendedMetaData(ExtendedMetaData extendedMetaData)
{
this.extendedMetaData = extendedMetaData;
}
public Collection<? extends Resource> generate(URI uri) throws Exception
{
return generate(Collections.singleton(uri));
}
public Collection<? extends Resource> generate(Map<String, URI> targetNamespaceToURI) throws Exception
{
if (targetNamespaceToURI != null && XSD_ECORE_BUILDER_CONSTRUCTOR != null && XSD_ECORE_BUILDER_GENERATE_RESOURCES_METHOD != null)
{
Object ecoreBuilder = XSD_ECORE_BUILDER_CONSTRUCTOR.newInstance(new Object [] { extendedMetaData, XSD_ECORE_BUILDER_OPTIONS });
@SuppressWarnings("unchecked") Collection<? extends Resource> result = (Collection<? extends Resource>)
XSD_ECORE_BUILDER_GENERATE_RESOURCES_METHOD.invoke(ecoreBuilder, new Object [] { targetNamespaceToURI.values() });
return result;
}
return Collections.emptyList();
}
public Collection<? extends Resource> generate(Collection<URI> uris) throws Exception
{
if (uris != null && XSD_ECORE_BUILDER_CONSTRUCTOR != null && XSD_ECORE_BUILDER_GENERATE_RESOURCES_METHOD != null)
{
Object ecoreBuilder = XSD_ECORE_BUILDER_CONSTRUCTOR.newInstance(new Object [] { extendedMetaData, XSD_ECORE_BUILDER_OPTIONS });
@SuppressWarnings("unchecked") Collection<? extends Resource> result = (Collection<? extends Resource>)
XSD_ECORE_BUILDER_GENERATE_RESOURCES_METHOD.invoke(ecoreBuilder, new Object [] { uris });
return result;
}
return Collections.emptyList();
}
}