blob: 47b452dc13124dc922f5dc68cd38aab085d52a58 [file] [log] [blame]
/*******************************************************************************
* 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.xsd;
import org.eclipse.xsd.*;
import javax.xml.namespace.QName;
import javax.wsdl.*;
import java.util.*;
public class WSDLPartsToXSDTypeMapper
{
private final char POUND = '#';
private Vector xsdSchemaList_;
private Hashtable partToXSDCache_;
public WSDLPartsToXSDTypeMapper() {
xsdSchemaList_ = new Vector();
partToXSDCache_ = new Hashtable();
}
public void addSchemas(Vector schemaList) {
for (int i=0;i<schemaList.size();i++) {
Object schema = schemaList.elementAt(i);
if (schema != null)
xsdSchemaList_.addElement(schema);
}
}
public XSDNamedComponent getXSDType(Part part, String id) {
XSDNamedComponent component = getXSDTypeFromCache(id);
if (component != null)
return component;
component = getXSDTypeFromSchema(part);
if (component != null)
addToCache(id, component);
return component;
}
public XSDNamedComponent getXSDTypeFromCache(String id) {
return (XSDNamedComponent)partToXSDCache_.get(id);
}
public XSDNamedComponent getXSDTypeFromSchema(Part part) {
boolean isElementDeclaration = (part.getTypeName() == null);
QName qName = isElementDeclaration ? part.getElementName() : part.getTypeName();
return getXSDTypeFromSchema(qName.getNamespaceURI(), qName.getLocalPart(), isElementDeclaration);
}
public XSDNamedComponent getXSDTypeFromSchema(String namespaceURI, String localName, boolean isElementDeclaration) {
for (int i = 0; i < xsdSchemaList_.size(); i++) {
XSDSchema xsdSchema = (XSDSchema)xsdSchemaList_.elementAt(i);
Vector components = new Vector();
if (isElementDeclaration)
components.addAll(xsdSchema.getElementDeclarations());
else
components.addAll(xsdSchema.getTypeDefinitions());
for (Iterator it = components.iterator(); it.hasNext(); ) {
XSDNamedComponent component = (XSDNamedComponent)it.next();
String compNSURI = component.getTargetNamespace();
String compLocalname = component.getName();
if (compNSURI != null && compLocalname != null && compNSURI.equals(namespaceURI) && compLocalname.equals(localName))
return component;
}
}
return null;
}
public XSDNamedComponent resolveXSDNamedComponent(XSDNamedComponent component)
{
if (component != null)
{
String uri = component.getURI();
String qname = component.getQName();
for (int i = 0; i < xsdSchemaList_.size(); i++)
{
XSDSchema xsdSchema = (XSDSchema)xsdSchemaList_.elementAt(i);
if (xsdSchema != null)
{
String targetNS = xsdSchema.getTargetNamespace();
if (targetNS != null && targetNS.equals(trimQName(uri, qname)))
{
XSDNamedComponent resolvedComponent = null;
if (component instanceof XSDTypeDefinition)
resolvedComponent = xsdSchema.resolveTypeDefinition(qname);
else if (component instanceof XSDElementDeclaration)
resolvedComponent = xsdSchema.resolveElementDeclaration(qname);
else if (component instanceof XSDModelGroupDefinition)
resolvedComponent = xsdSchema.resolveModelGroupDefinition(qname);
if (isComponentResolvable(resolvedComponent))
return resolvedComponent;
}
}
}
}
return null;
}
private String trimQName(String uri, String qname)
{
int index = uri.indexOf(qname);
if (index != -1)
{
String ns = uri.substring(0, index);
if (ns.charAt(index-1) == POUND)
return ns.substring(0, index-1);
else
return ns;
}
else
return uri;
}
private void addToCache(String id, XSDNamedComponent component) {
partToXSDCache_.put(id,component);
}
protected boolean isComponentResolvable(XSDComponent component)
{
if (component == null)
return false;
XSDSchema schema = component.getSchema();
if (schema == null)
return false;
if (schema.getTargetNamespace() == null)
return false;
return true;
}
}