/*******************************************************************************
 * Copyright (c) 2002, 2004 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 Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment;

import org.eclipse.wst.ws.internal.explorer.platform.wsdl.xsd.WSDLPartsToXSDTypeMapper;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDComponent;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDParticleContent;
import org.eclipse.xsd.XSDSimpleTypeDefinition;

public class XSDLiteralXMLEncodingToFragmentMapper extends XSDToFragmentMapper {
  private XSDSimpleTypeToFragmentMapper xsdSimpleMapper_;
  private XSDComplexTypeToFragmentMapper xsdComplexMapper_;
  private XSDElementDeclarationToFragmentMapper xsdElementMapper_;
  private XSDParticleToFragmentMapper xsdParticleMapper_;

  public XSDLiteralXMLEncodingToFragmentMapper(XSDToFragmentController controller, WSDLPartsToXSDTypeMapper wsdlToXSDMapper) {
    super(controller, wsdlToXSDMapper);
    xsdSimpleMapper_ = null;
    xsdComplexMapper_ = null;
    xsdElementMapper_ = null;
    xsdParticleMapper_= null;
  }

  private XSDSimpleTypeToFragmentMapper getXSDSimpleMapper() {
    if (xsdSimpleMapper_ == null)
      xsdSimpleMapper_ = new XSDSimpleTypeToFragmentMapper(getController(), getWSDLPartsToXSDTypeMapper());
    return xsdSimpleMapper_;
  }

  private XSDComplexTypeToFragmentMapper getXSDComplexMapper() {
    if (xsdComplexMapper_ == null)
      xsdComplexMapper_ = new XSDComplexTypeToFragmentMapper(getController(), getWSDLPartsToXSDTypeMapper());
    return xsdComplexMapper_;
  }

  private XSDElementDeclarationToFragmentMapper getXSDElementMapper() {
    if (xsdElementMapper_ == null)
      xsdElementMapper_ = new XSDElementDeclarationToFragmentMapper(getController(), getWSDLPartsToXSDTypeMapper());
    return xsdElementMapper_;
  }

  private XSDParticleToFragmentMapper getXSDParticleMapper() {
    if (xsdParticleMapper_ == null)
      xsdParticleMapper_ = new XSDParticleToFragmentMapper(getController(), getWSDLPartsToXSDTypeMapper());
    return xsdParticleMapper_;
  }

  public IXSDFragment getFragment(XSDToFragmentConfiguration config, String id, String name) {
    config = resolveXSDComponent(config);
    XSDComponent component = config.getXSDComponent();
    if (!isComponentResolvable(component))
      return getXSDDefaultFragment(config, id, name);
    else if (component instanceof XSDElementDeclaration)
      return getXSDElementMapper().getFragment(config, id, name);
    else if (component instanceof XSDSimpleTypeDefinition)
      return getXSDSimpleMapper().getFragment(config, id, name);
    else if (component instanceof XSDComplexTypeDefinition)
      return getXSDComplexMapper().getFragment(config, id, name);
    else if (component instanceof XSDParticle)
      return getXSDParticleMapper().getFragment(config, id, name);
    else if (component instanceof XSDParticleContent)
      return getXSDParticleMapper().getFragment(config, id, name);
    else
      return getXSDDefaultFragment(config, id, name);
  }
}
