blob: 507f983d3c6c28fdbfb87dd5aa06ce13ab00c8fc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002-2005 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 - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.wsi.internal.core.wsdl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.wsdl.Binding;
import javax.wsdl.Definition;
import javax.wsdl.PortType;
import javax.wsdl.Service;
import javax.wsdl.WSDLException;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.xml.WSDLReader;
import org.eclipse.wst.wsi.internal.core.wsdl.xsd.InlineSchemaValidator;
import org.eclipse.wst.wsi.internal.core.xml.XMLTags;
import org.eclipse.wst.wsi.internal.core.xml.XMLUtils;
import org.w3c.dom.Document;
/**
* This class provides a interface to a single WSDL document.
*
* @version 1.0.1
* @author Peter Brittenham (peterbr@us.ibm.com)
*/
public class WSDLDocument
{
/**
* WSDL document location.
*/
protected String fileName = null;
/**
* Definition element.
*/
protected Definition definitions = null;
/**
* WSDL element list with line and column numbers.
*/
protected WSDLElementList wsdlElementList = null;
/**
* Map of targetNamespaces to the corresponding org.apache.xerces.xs.XSModel of schema elements.
*/
private Map schemas = new HashMap();
/**
* List of schemas validation errors.
*/
private List schemasValidationErrors = new ArrayList();
/**
* Read WSDL document from the specified file.
* @param fileName WSDL document location.
* @throws WSDLException if problem reading WSDL document.
*/
public WSDLDocument(String fileName) throws WSDLException
{
this.fileName = fileName;
ClassLoader currentLoader = Thread.currentThread().getContextClassLoader();
try
{
Thread.currentThread().setContextClassLoader(WSDLDocument.class.getClassLoader());
// Get the WSDLReader
WSDLReader wsdlReader = new WSDLReaderImpl();
// Set features
wsdlReader.setFeature(com.ibm.wsdl.Constants.FEATURE_VERBOSE, false);
// DEBUG:
//wsdlReader.setFeature(com.ibm.wsdl.Constants.FEATURE_VERBOSE, true);
wsdlReader.setFeature(
com.ibm.wsdl.Constants.FEATURE_IMPORT_DOCUMENTS,
true);
// DEBUG:
//wsdlReader.setFeature(com.ibm.wsdl.Constants.FEATURE_IMPORT_DOCUMENTS,true);
// Parse the WSDL document
Document document = XMLUtils.parseXMLDocument(fileName);
this.definitions = wsdlReader.readWSDL(fileName, document);
// Since inline schema validator is used by several assertions, validate all
// schemas right after WSDL validation
validateSchemas();
// Get the line and column number references
this.wsdlElementList = ((WSDLReaderImpl) wsdlReader).getElementList();
// DEBUG:
//System.err.println(wsdlElementList.toString());
}
catch (Exception cce)
{
// Set element list to null
this.wsdlElementList = null;
}
finally
{
Thread.currentThread().setContextClassLoader(currentLoader);
}
}
/**
* Create WSDL document from existing Definition object.
*
* @param fileName WSDL document location.
* @param definitions Definition object.
*/
public WSDLDocument(String fileName, Definition definitions)
{
this.fileName = fileName;
this.definitions = definitions;
schemas.clear();
schemasValidationErrors.clear();
}
/**
* Get the WSDL document location.
* @return he WSDL document location.
*/
public String getLocation()
{
// Return the document location
return this.fileName;
}
/**
* Get the definition element of the WSDL document.
* @return the definition element
*/
public Definition getDefinitions()
{
// Return the definition element
return definitions;
}
/**
* Get all the portType elements from the WSDL document.
* @return the list of portType elements.
*/
public PortType[] getPortTypes()
{
// Generate an array of PortTypes from the PortType map for this Definition
return (PortType[]) definitions.getPortTypes().values().toArray(
new PortType[0]);
}
/**
* Get all the binding elements from the WSDL document.
* @return the list of binding elements.
*/
public Binding[] getBindings()
{
// Generate an array of Bindings from the Binding map for this Definition
return (Binding[]) definitions.getBindings().values().toArray(
new Binding[0]);
}
/**
* Get all the service elements from the WSDL document.
* @return the list of service elements.
*/
public Service[] getServices()
{
// Generate an array of Services from the Service map for this Definition
return (Service[]) definitions.getServices().values().toArray(
new Service[0]);
}
/* Return string representation of this object.
* @see java.lang.Object#toString()
*/
public String toString()
{
// Return string
return (definitions == null)
? "WSDL definition element not found."
: definitions.toString();
}
/**
* Get the element list.
* @return the element list.
*/
public WSDLElementList getElementList()
{
return this.wsdlElementList;
}
/**
* Returns a schemas map.
* @return a map of targetNamespace attribute values of the schema elements
* to the corresponding org.apache.xerces.xs.XSModel object of that schema.
*/
public Map getSchemas()
{
return schemas;
}
/**
* Returns a list of schemas validation errors caused by the validateSchemas() procedure.
* @return a list of schemas validation errors.
*/
public List getSchemasValidationErrors()
{
return schemasValidationErrors;
}
/**
* The method invokes the inline schema validator which validates every schema element of the WSDL.
*/
private void validateSchemas()
{
schemas.clear();
schemasValidationErrors.clear();
/* INLINE SCHEMA VALIDATOR */
if (definitions != null
&& definitions.getTypes() != null
&& definitions.getTypes().getExtensibilityElements() != null)
{
InlineSchemaValidator schemaValidator = new InlineSchemaValidator();
// Collecting schema's parent elements
List parents = new ArrayList(2);
parents.add(definitions.getTypes());
parents.add(definitions);
// Going through all the ExtensibilityElementS of wsdl:types
// since they are potential schemas
// See Java APIs for WSDL V1.0 (JSR110), section 4
Iterator i = this.definitions.getTypes().getExtensibilityElements().iterator();
while (i.hasNext())
{
ExtensibilityElement extEl = (ExtensibilityElement) i.next();
if (extEl.getElementType().equals(XMLTags.ELEM_XSD_SCHEMA))
{
Map map = null;
try
{
// Validating schema element
map = schemaValidator.validate(extEl, parents, fileName);
}
catch (Exception e)
{
// Adding an exception to the errors list
schemasValidationErrors.add(e.getMessage());
}
if (map != null)
{
// Adding returned XSModel to schemas map
schemas.putAll(map);
}
}
}
}
}
/**
* Command line interface.
* @param args from command line.
*/
public static void main(String[] args)
{
try
{
WSDLDocument wsdlDocument = new WSDLDocument(args[0]);
System.out.println(wsdlDocument.toString());
}
catch (Exception e)
{
e.toString();
e.printStackTrace();
}
System.exit(0);
}
}