/**
 * 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);
  }
}
