blob: 7f4d6a0d1bcbb400905e6dc13bf7c70b5fe6d89b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2007 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
* yyyymmdd bug Email and other contact information
* -------- -------- -----------------------------------------------------------
* 20070404 181065 makandre@ca.ibm.com - Andrew Mak, WSE does not handle types referenced across inline schemas
*******************************************************************************/
package org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment;
import org.eclipse.wst.ws.internal.explorer.platform.wsdl.constants.FragmentConstants;
import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.impl.XSDElementFragment;
import org.eclipse.wst.ws.internal.explorer.platform.wsdl.xsd.WSDLPartsToXSDTypeMapper;
import org.eclipse.xsd.XSDComponent;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDTypeDefinition;
public class XSDElementDeclarationToFragmentMapper extends XSDToFragmentMapper {
public XSDElementDeclarationToFragmentMapper(XSDToFragmentController controller, WSDLPartsToXSDTypeMapper wsdlToXSDMapper) {
super(controller, wsdlToXSDMapper);
}
public IXSDFragment getFragment(XSDToFragmentConfiguration config, String id, String name) {
XSDElementDeclaration element = (XSDElementDeclaration)config.getXSDComponent();
if (element != null) {
XSDElementDeclaration resolvedElement = resolveXSDElementDeclaration(element);
XSDTypeDefinition typeDef = resolveXSDTypeDefinition(getXSDTypeDefinition(resolvedElement));
if (typeDef != null) {
int minOccurs = FragmentConstants.DEFAULT_MIN_OCCURS;
int maxOccurs = FragmentConstants.DEFAULT_MAX_OCCURS;
XSDConcreteComponent concreteComponent = element.getContainer();
if (concreteComponent != null && concreteComponent instanceof XSDParticle) {
XSDParticle particle = (XSDParticle)concreteComponent;
if (particle.isSetMinOccurs())
minOccurs = particle.getMinOccurs();
if (particle.isSetMaxOccurs())
maxOccurs = particle.getMaxOccurs();
}
config.setMinOccurs(minOccurs);
config.setMaxOccurs(maxOccurs);
IXSDElementFragment elementFrag = new XSDElementFragment(id, resolvedElement.getName(), config);
elementFrag.setXSDTypeDefinition(typeDef);
XSDToFragmentConfiguration elementTypeConfig = new XSDToFragmentConfiguration();
elementTypeConfig.setXSDComponent(typeDef);
elementTypeConfig.setMinOccurs(minOccurs);
elementTypeConfig.setMaxOccurs(maxOccurs);
elementTypeConfig.setStyle(config.getStyle());
elementTypeConfig.setPartEncoding(config.getPartEncoding());
elementTypeConfig.setWSDLPartName(config.getWSDLPartName());
IXSDFragment xsdFragment = getController().getFragment(elementTypeConfig, elementFrag.genID(), resolvedElement.getName());
elementFrag.setXSDDelegationFragment(xsdFragment);
return elementFrag;
}
}
return getXSDDefaultFragment(config, id, name);
}
private XSDElementDeclaration resolveXSDElementDeclaration(XSDElementDeclaration element) {
// port to org.eclipse.xsd
if (element.getResolvedElementDeclaration() != null)
{
XSDElementDeclaration resolvedElement = element.getResolvedElementDeclaration();
if (!isComponentResolvable(resolvedElement))
{
XSDComponent resolvedComponent = getWSDLPartsToXSDTypeMapper().resolveXSDNamedComponent(resolvedElement);
if (resolvedComponent != null && (resolvedComponent instanceof XSDElementDeclaration))
resolvedElement = (XSDElementDeclaration)resolvedComponent;
}
return resolvedElement;
}
else
return element;
}
private XSDTypeDefinition resolveXSDTypeDefinition(XSDTypeDefinition typeDef) {
if (!isComponentResolvable(typeDef)) {
XSDComponent resolvedComponent = getWSDLPartsToXSDTypeMapper().resolveXSDNamedComponent(typeDef);
if (resolvedComponent instanceof XSDTypeDefinition)
return (XSDTypeDefinition) resolvedComponent;
}
return typeDef;
}
private XSDTypeDefinition getXSDTypeDefinition(XSDElementDeclaration element) {
// port to org.eclipse.xsd
if (element.getTypeDefinition() != null)
return element.getTypeDefinition();
// port to org.eclipse.xsd
else if (element.getAnonymousTypeDefinition() != null)
return element.getAnonymousTypeDefinition();
else
return null;
}
}