blob: 571942e283980da4837ce8a91f4366bddd52c494 [file] [log] [blame]
/**
* Copyright (c) 2002-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 v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.mapping.xsd2ecore;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.emf.mapping.Mapping;
import org.eclipse.emf.mapping.MappingRoot;
import org.eclipse.emf.mapping.domain.PluginAdapterFactoryMappingDomain;
import org.eclipse.emf.mapping.provider.MappingItemProviderAdapterFactory;
import org.eclipse.xsd.ecore.MapBuilder.Mapper;
import org.eclipse.xsd.provider.XSDItemProviderAdapterFactory;
public class XSD2EcoreMapper implements Mapper
{
protected MappingRoot mappingRoot;
protected boolean topToBottom = true;
public XSD2EcoreMapper()
{
super();
}
public EObject getRoot()
{
return getMappingRoot();
}
public MappingRoot getMappingRoot()
{
if (mappingRoot == null)
{
mappingRoot = XSD2EcoreFactory.eINSTANCE.createXSD2EcoreMappingRoot();
AdapterFactory xsdAdapterFactory = new XSDItemProviderAdapterFactory();
AdapterFactory ecoreAdapterFactory = new EcoreItemProviderAdapterFactory();
AdapterFactory composedAdapterFactory =
new ComposedAdapterFactory
(new AdapterFactory[]
{
new ResourceItemProviderAdapterFactory(),
new MappingItemProviderAdapterFactory(),
new XSDItemProviderAdapterFactory(),
new EcoreItemProviderAdapterFactory()
});
mappingRoot.setDomain
(new PluginAdapterFactoryMappingDomain
(composedAdapterFactory,
xsdAdapterFactory,
ecoreAdapterFactory,
null,
null));
mappingRoot.setTopToBottom(topToBottom);
}
return mappingRoot;
}
public void map(Collection<? extends EObject> inputs, Collection<? extends EObject> outputs)
{
Mapping mapping =
topToBottom ?
getMappingRoot().createMapping(inputs, outputs) :
getMappingRoot().createMapping(outputs, inputs);
Mapping parent = mappingRoot.getParentMapping(mapping.getMappedObjects());
parent.getNested().add(mapping);
for (Iterator<Mapping> i = parent.getNested().iterator(); i.hasNext(); )
{
Mapping otherMapping = i.next();
if (otherMapping != mapping && mappingRoot.getParentMapping(otherMapping.getMappedObjects()) == mapping)
{
i.remove();
mapping.getNested().add(otherMapping);
}
}
}
public void addInput(EObject input)
{
if (input instanceof EPackage)
{
topToBottom = false;
}
getMappingRoot().getInputs().add(input);
}
public void addOutput(EObject output)
{
getMappingRoot().getOutputs().add(output);
}
}