diff options
Diffstat (limited to 'bundles/org.eclipse.wst.wsi/wsicore/org/eclipse/wst/wsi/internal/core/profile/validator/impl/wsdl/WSDLValidatorImpl.java')
-rw-r--r-- | bundles/org.eclipse.wst.wsi/wsicore/org/eclipse/wst/wsi/internal/core/profile/validator/impl/wsdl/WSDLValidatorImpl.java | 2314 |
1 files changed, 0 insertions, 2314 deletions
diff --git a/bundles/org.eclipse.wst.wsi/wsicore/org/eclipse/wst/wsi/internal/core/profile/validator/impl/wsdl/WSDLValidatorImpl.java b/bundles/org.eclipse.wst.wsi/wsicore/org/eclipse/wst/wsi/internal/core/profile/validator/impl/wsdl/WSDLValidatorImpl.java deleted file mode 100644 index 0ecafd75f..000000000 --- a/bundles/org.eclipse.wst.wsi/wsicore/org/eclipse/wst/wsi/internal/core/profile/validator/impl/wsdl/WSDLValidatorImpl.java +++ /dev/null @@ -1,2314 +0,0 @@ -/******************************************************************************* - * 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.profile.validator.impl.wsdl; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; - -import javax.wsdl.Binding; -import javax.wsdl.BindingFault; -import javax.wsdl.BindingInput; -import javax.wsdl.BindingOperation; -import javax.wsdl.BindingOutput; -import javax.wsdl.Definition; -import javax.wsdl.Fault; -import javax.wsdl.Import; -import javax.wsdl.Message; -import javax.wsdl.Operation; -import javax.wsdl.Part; -import javax.wsdl.Port; -import javax.wsdl.PortType; -import javax.wsdl.Service; -import javax.wsdl.Types; -import javax.wsdl.extensions.ExtensibilityElement; -import javax.wsdl.extensions.UnknownExtensibilityElement; -import javax.wsdl.extensions.soap.SOAPBinding; -import javax.wsdl.extensions.soap.SOAPBody; -import javax.wsdl.extensions.soap.SOAPFault; -import javax.wsdl.extensions.soap.SOAPHeader; -import javax.wsdl.extensions.soap.SOAPHeaderFault; -import javax.wsdl.extensions.soap.SOAPOperation; -import javax.xml.namespace.QName; - -import org.eclipse.wst.wsi.internal.core.WSIConstants; -import org.eclipse.wst.wsi.internal.core.WSIException; -import org.eclipse.wst.wsi.internal.core.WSIRuntimeException; -import org.eclipse.wst.wsi.internal.core.analyzer.AnalyzerContext; -import org.eclipse.wst.wsi.internal.core.analyzer.AssertionFailException; -import org.eclipse.wst.wsi.internal.core.analyzer.CandidateInfo; -import org.eclipse.wst.wsi.internal.core.analyzer.ServiceReference; -import org.eclipse.wst.wsi.internal.core.analyzer.config.WSDLElement; -import org.eclipse.wst.wsi.internal.core.profile.ProfileArtifact; -import org.eclipse.wst.wsi.internal.core.profile.TestAssertion; -import org.eclipse.wst.wsi.internal.core.profile.validator.EntryContext; -import org.eclipse.wst.wsi.internal.core.profile.validator.WSDLValidator; -import org.eclipse.wst.wsi.internal.core.profile.validator.impl.BaseValidatorImpl; -import org.eclipse.wst.wsi.internal.core.report.Entry; -import org.eclipse.wst.wsi.internal.core.report.EntryContainer; -import org.eclipse.wst.wsi.internal.core.report.FailureDetail; -import org.eclipse.wst.wsi.internal.core.report.ReportArtifact; -import org.eclipse.wst.wsi.internal.core.report.Reporter; -import org.eclipse.wst.wsi.internal.core.util.EntryType; -import org.eclipse.wst.wsi.internal.core.wsdl.WSDLDocument; -import org.eclipse.wst.wsi.internal.core.wsdl.WSDLElementList; -import org.eclipse.wst.wsi.internal.core.wsdl.WSDLUtils; -import org.eclipse.wst.wsi.internal.core.xml.dom.ElementLocation; -import org.eclipse.wst.wsi.internal.core.xml.schema.TargetNamespaceProcessor; -import org.eclipse.wst.wsi.internal.core.xml.schema.XMLSchemaValidator; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - - -/** - * The WSDL validator will verify that the WSDL and associated XML schema definitions - * are in conformance with the profile. - * - * @version 1.0.1 - * @author Peter Brittenham (peterbr@us.ibm.com) - * @author Graham Turrell (gturrell@uk.ibm.com) - */ -public class WSDLValidatorImpl - extends BaseValidatorImpl - implements WSDLValidator -{ - /** - * WSDL URL. - */ - protected String wsdlURL; - - /** - * WSDL document. - */ - protected WSDLDocument wsdlDocument = null; - - /** - * Entry container map. - */ - protected HashMap containerMap = new HashMap(); - - /* (non-Javadoc) - * @see org.wsi.test.profile.validator.WSDLValidator#init(org.eclipse.wst.wsi.internal.core.analyzer.AnalyzerContext, org.wsi.test.profile.ProfileArtifact, org.wsi.test.report.ReportArtifact, java.lang.String, org.wsi.wsdl.WSDLDocument, org.wsi.test.report.Reporter) - */ - public void init( - AnalyzerContext analyzerContext, - ProfileArtifact profileArtifact, - ReportArtifact reportArtifact, - String wsdlURL, - WSDLDocument wsdlDocument, - Reporter reporter) - throws WSIException - { - // BaseValidatorImpl - super.init(analyzerContext, profileArtifact, reportArtifact, reporter); - this.wsdlDocument = wsdlDocument; - if (wsdlDocument != null) - this.wsdlURL = wsdlDocument.getLocation(); - - if (wsdlURL != null) - this.wsdlURL = wsdlURL; - } - - /* (non-Javadoc) - * @see org.wsi.test.profile.validator.WSDLValidator#validate() - */ - public WSDLDocument validate() throws WSIException - { - //WSDLDocument wsdlDocument = null; - Service service = null; - Port port = null; - Binding binding = null; - PortType portType = null; - Operation operation = null; - Message message = null; - - // it depricated after refactoring - // now the inner classes moved out from validator - //String classPrefix = this.getClass().getName() + "$"; - String classPrefix = this.getClass().getPackage().getName()+"."; - - try - { - // Validate the WSDL service description - if (this.wsdlDocument == null) - this.wsdlDocument = new WSDLDocument(wsdlURL); - } - - catch (Exception e) - { - // ADD: Certain exceptions should result in validation errors - - throw new WSIException(e.getMessage(), e); - } - - // Get the definition element - Definition definition = wsdlDocument.getDefinitions(); - - // Get service reference from analyzer context - ServiceReference serviceReference = analyzerContext.getServiceReference(); - - // Create normalized data about the service under test. - CandidateInfo candidate = new CandidateInfo(serviceReference, wsdlDocument); - - analyzerContext.setCandidateInfo(candidate); - - // Set prereq type to entry container - reporter.setPrereqType(Reporter.PREREQ_TYPE_ENTRY_CONTAINER); - - // always process Import, Definitions & Types assertions - // TEMP: - processDefinitionAssertions(classPrefix, candidate); - processTypesAssertions(classPrefix, candidate); - processImportAssertions(classPrefix, candidate); - - // Process the element hierarchy in the WSDL document starting with the one that was specified - // FIX: Element finding already completed by CandidateInfo constructor - so use that rather than retest here - - // --------------------------- - // wsdl:port - // --------------------------- - if (serviceReference.getWSDLElement().isPort()) - { - // Find the service element - if ((service = - definition.getService( - serviceReference.getWSDLElement().getParentElementQName())) - == null) - { - throw new WSIRuntimeException( - "Could not locate WSDL service: " - + serviceReference.getWSDLElement().getParentElementName()); - } - - // Find the port element - if ((port = service.getPort(serviceReference.getWSDLElement().getName())) - == null) - { - throw new WSIRuntimeException( - "Could not locate WSDL port: " - + serviceReference.getWSDLElement().getName()); - } - - // TEMP: Remove until there are port test assertions - //processPortAssertions(port, serviceReference, classPrefix, wsdlDocument); - - // Next, process the binding - if (((binding = port.getBinding()) == null) || (binding.isUndefined())) - { - //throw new WSIRuntimeException("Could not locate WSDL binding for port: " + port.getName()); - // Set missingInput for all binding, portType, operation and message test assertions - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_BINDING)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_PORTTYPE)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_OPERATION)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_MESSAGE)); - } - - else - { - processBindingAssertions( - binding, - serviceReference, - classPrefix, - wsdlDocument); - - // Next, process the portType - if (((portType = binding.getPortType()) == null) - || (portType.isUndefined())) - { - //throw new WSIRuntimeException("Could not locate WSDL portType for binding: " + binding.getQName().getLocalPart()); - // Set missingInput for all portType, operation and message test assertions - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_PORTTYPE)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_OPERATION)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_MESSAGE)); - } - - else - { - processMessageAssertions( - binding, - serviceReference, - classPrefix, - wsdlDocument); - processPortTypeAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - processOperationAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - processMessageAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - } - } - - } - - // --------------------------- - // wsdl:binding - // --------------------------- - else if (serviceReference.getWSDLElement().isBinding()) - { - WSDLElement wsdlElement = serviceReference.getWSDLElement(); - // Find the binding element - if (wsdlElement.getQName() != null - && wsdlElement.getQName().getLocalPart() != null - && wsdlElement.getQName().getLocalPart().length() > 0) - { - if (((binding = - definition.getBinding(serviceReference.getWSDLElement().getQName())) - == null) - || (binding.isUndefined())) - { - throw new WSIRuntimeException( - "Could not locate WSDL binding: " - + serviceReference.getWSDLElement().getName()); - } - - processBindingAssertions( - binding, - serviceReference, - classPrefix, - wsdlDocument); - processMessageAssertions( - binding, - serviceReference, - classPrefix, - wsdlDocument); - - // Next, process the portType - if (((portType = binding.getPortType()) == null) - || (portType.isUndefined())) - { - //throw new WSIRuntimeException("Could not locate WSDL PortType for Binding: " + binding.getQName().getLocalPart()); - - // Set missingInput for all portType, operation and message test assertions - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_PORTTYPE)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_OPERATION)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_MESSAGE)); - } - - else - { - processPortTypeAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - processOperationAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - - // Process each message within each operation of the portType associated with the binding - processMessageAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - } - } - - // There was a problem with the binding element specification. This can - // happen when a UDDI tModel did not have a valid binding reference. - else - { - // Set missingInput for all binding, portType, operation and message test assertions - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_BINDING)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_PORTTYPE)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_OPERATION)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_MESSAGE)); - } - } - - // --------------------------- - // wsdl:portType - // --------------------------- - else if (serviceReference.getWSDLElement().isPortType()) - { - // Find the PortType element - if (((portType = - definition.getPortType(serviceReference.getWSDLElement().getQName())) - == null) - || (portType.isUndefined())) - { - throw new WSIRuntimeException( - "Could not locate WSDL PortType: " - + serviceReference.getWSDLElement().getName()); - } - - // Set missingInput for all binding test assertions - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_BINDING)); - - processPortTypeAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - processOperationAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - - // Process each message within each operation of the portType - processMessageAssertions( - portType, - serviceReference, - classPrefix, - wsdlDocument); - } - - // --------------------------- - // wsdl:operation - // --------------------------- - else if (serviceReference.getWSDLElement().isOperation()) - { - // Find the operation - // get portType from config parent element - if (((portType = - definition.getPortType( - serviceReference.getWSDLElement().getParentElementQName())) - == null) - || (portType.isUndefined())) - { - throw new WSIRuntimeException( - "Could not locate WSDL portType: " - + serviceReference.getWSDLElement().getParentElementQName()); - } - - if (((operation = - getOperationFromPortType( - portType, - serviceReference.getWSDLElement().getName())) - == null) - || (operation.isUndefined())) - { - throw new WSIRuntimeException( - "Could not locate WSDL Operation: " - + serviceReference.getWSDLElement().getName() - + "in portType: " - + portType.getQName()); - } - - // Set missingInput for all binding and portType test assertions - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_BINDING)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_PORTTYPE)); - - processOperationAssertions( - operation, - portType, - serviceReference, - classPrefix, - wsdlDocument); - processMessageAssertions( - operation, - serviceReference, - classPrefix, - wsdlDocument); - } - - // --------------------------- - // wsdl:message - // --------------------------- - else if (serviceReference.getWSDLElement().isMessage()) - { - // Find the message - if (((message = - definition.getMessage(serviceReference.getWSDLElement().getQName())) - == null) - || (message.isUndefined())) - { - throw new WSIRuntimeException( - "Could not locate WSDL Message: " - + serviceReference.getWSDLElement().getName()); - } - - // Set missingInput for all binding, portType, and operation test assertions - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_BINDING)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_PORTTYPE)); - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_OPERATION)); - - processMessageAssertions( - message, - serviceReference, - classPrefix, - wsdlDocument); - } - - else - { - throw new WSIRuntimeException( - "The following WSDL type is not supported: " - + serviceReference.getWSDLElement().getType()); - } - - // Cleanup - cleanup(); - - // Return WSDL document - return this.wsdlDocument; - } - - /** - * Get entry container using the filename for WSDL document. - * @param filename a file name. - * @return entry container using the filename for WSDL document. - */ - protected EntryContainer getEntryContainer(String filename) - { - EntryContainer entryContainer = null; - - // If the entry container already exists, then use it - if ((entryContainer = (EntryContainer) containerMap.get(filename)) == null) - { - // Create new entry container - entryContainer = this.reporter.createEntryContainer(); - - // Set container id using the filename for the WSDL document - entryContainer.setId(filename); - - // Put the new entry container into the container map - containerMap.put(filename, entryContainer); - } - - return entryContainer; - } - - /** - * Get operation from port type. - * @param portType port type. - * @param operationName operation name. - * @return operation from port type. - */ - protected Operation getOperationFromPortType( - PortType portType, - String operationName) - { - // FIX: wsdl4j available method call below implies that only - // name+inputname+outputname uniquely defines operation - // Use this instead for now: - get the first operation we find... - Operation op = null; - if (portType.getOperations() != null) - { - Iterator opIt = portType.getOperations().iterator(); - - while (opIt.hasNext()) - { - op = (Operation) opIt.next(); - if (operationName.equals(op.getName())) - { - return op; - } - } - } - - return null; // no matching operation found - } - - /** - * Process definition assertions. - * @param classPrefix class prefix. - * @param candidate candidate. - * @throws WSIException if problems occur during processing. - */ - protected void processDefinitionAssertions( - String classPrefix, - CandidateInfo candidate) - throws WSIException - { - - Entry entry = null; - - Definition[] wsdlDefinitions = candidate.getDefinitions(); - - for (int i = 0; i < wsdlDefinitions.length; i++) - { - Definition definition = wsdlDefinitions[i]; - if (definition == null) - continue; - // Create entry - entry = this.reporter.getReport().createEntry(); - entry.setEntryType( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_DEFINITIONS)); - entry.setReferenceID(definition.getDocumentBaseURI()); - entry.setEntryDetail(definition); - - // Set entry container - entry.setEntryContainer( - getEntryContainer(definition.getDocumentBaseURI())); - - // Process all of the definition related test assertions - processAssertions( - classPrefix, - new EntryContext(entry, candidate.getWsdlDocument())); - // ADD: need to use here the specific document corresponding to the definition?? - - } - } - - /** - * Process types assertions. - * @param classPrefix class prefix. - * @param candidate candidate. - * @throws WSIException if problem occurs during processing - * type assertions. - */ - protected void processTypesAssertions( - String classPrefix, - CandidateInfo candidate) - throws WSIException - { - Entry entry = null; - - Types[] wsdlTypes = candidate.getTypes(); - Definition[] wsdlDefinitions = candidate.getDefinitions(); - - // If there are no types elements, then set all results to missingInput - if (wsdlTypes == null || wsdlTypes.length == 0) - { - // Set missingInput for all test assertions with this entry type - setMissingInput(EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_TYPES)); - } - - else - { - for (int i = 0; i < wsdlTypes.length; i++) - { - Types types = wsdlTypes[i]; - if (types == null) - { - // no Types element in i-th document - continue; - } - - // Create entry - entry = this.reporter.getReport().createEntry(); - entry.setEntryType( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_TYPES)); - entry.setReferenceID( - candidate.getDefinition(types).getDocumentBaseURI() + "-Types"); - entry.setEntryDetail(types); - - // Set entry container - entry.setEntryContainer( - getEntryContainer(wsdlDefinitions[i].getDocumentBaseURI())); - - // Process all of the Types related test assertions - processAssertions( - classPrefix, - new EntryContext(entry, candidate.getWsdlDocument())); - } - } - } - - /** - * Process import assertions. - * @param classPrefix class prefix. - * @param candidate candidate. - * @throws WSIException if problem occurs during processing - * import assertions. - */ - protected void processImportAssertions( - String classPrefix, - CandidateInfo candidate) - throws WSIException - { - - Entry entry = null; - - Import[] wsdlImports = candidate.getImports(); - - // If there are no import elements, then set all results to missingInput - if (wsdlImports == null || wsdlImports.length == 0) - { - // Set missingInput for all test assertions with this entry type - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_IMPORT)); - } - - else - { - for (int i = 0; i < wsdlImports.length; i++) - { - Import wsdlImport = wsdlImports[i]; - // Create entry - entry = this.reporter.getReport().createEntry(); - entry.setEntryType( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_IMPORT)); - entry.setReferenceID(wsdlImport.getNamespaceURI()); - entry.setEntryDetail(wsdlImport); - - // Set entry container - entry.setEntryContainer(getEntryContainer(wsdlImport.getLocationURI())); - - // Process all of the import related test assertions - processAssertions( - classPrefix, - new EntryContext(entry, candidate.getWsdlDocument())); - // ADD: need to use here the specific document corresponding to the import!! - } - } - } - - /** - * Process port assertions. - * @param port a port. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * port assertions. - */ - protected void processPortAssertions( - Port port, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - Entry entry = null; - - // Create entry - entry = this.reporter.getReport().createEntry(); - entry.setEntryType(EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_PORT)); - entry.setReferenceID(port.getName()); - entry.setParentElementName( - serviceReference.getWSDLElement().getParentElementName()); - entry.setEntryDetail(port); - - // Process assertions for this artifact against the target context - processAssertions(classPrefix, new EntryContext(entry, wsdlDocument)); - } - - /** - * Process binding assertions. - * @param binding binding. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * binding assertions. - */ - protected void processBindingAssertions( - Binding binding, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - Entry entry = null; - QName bindingQName = binding.getQName(); - - // Create entry - entry = this.reporter.getReport().createEntry(); - entry.setEntryType( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_BINDING)); - entry.setReferenceID(bindingQName.toString()); - entry.setEntryDetail(binding); - - // Set entry container - Definition definition = - analyzerContext.getCandidateInfo().getDefinition(binding); - entry.setEntryContainer( - getEntryContainer( - (definition == null ? null : definition.getDocumentBaseURI()))); - - // Process binding test assertions - processAssertions(classPrefix, new EntryContext(entry, wsdlDocument)); - } - - /** - * Process port type assertions. - * @param portType port type. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * port type assertions. - */ - protected void processPortTypeAssertions( - PortType portType, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - - Entry entry = null; - QName portTypeQName = portType.getQName(); - - // Create entry - entry = this.reporter.getReport().createEntry(); - entry.setEntryType( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_PORTTYPE)); - entry.setReferenceID(portTypeQName.toString()); - entry.setEntryDetail(portType); - - // Set entry container - Definition definition = - analyzerContext.getCandidateInfo().getDefinition(portType); - entry.setEntryContainer( - getEntryContainer( - (definition == null ? null : definition.getDocumentBaseURI()))); - - // Process test assertions - processAssertions(classPrefix, new EntryContext(entry, wsdlDocument)); - } - - /** - * Process operation assertions. - * @param operation an operation. - * @param portType port type. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * operation assertions. - */ - protected void processOperationAssertions( - Operation operation, - PortType portType, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - // qualify operation with service location from config. - Entry entry = null; - - // Create entry - entry = this.reporter.getReport().createEntry(); - entry.setEntryType( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_OPERATION)); - entry.setReferenceID(operation.getName()); - entry.setParentElementName(portType.getQName().getLocalPart()); - entry.setEntryDetail(operation); - - // Set entry container - Definition definition = - analyzerContext.getCandidateInfo().getDefinition(portType); - entry.setEntryContainer( - getEntryContainer( - (definition == null ? null : definition.getDocumentBaseURI()))); - - // Process test assertions - processAssertions(classPrefix, new EntryContext(entry, wsdlDocument)); - } - - /** - * Process operation assertions. - * @param portType port type. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * operation assertions. - */ - protected void processOperationAssertions( - PortType portType, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - // For each operation, - if (portType.getOperations() == null) - { - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_OPERATION)); - } - - else - { - Operation operation; - Iterator opIt = portType.getOperations().iterator(); - while (opIt.hasNext()) - { - operation = (Operation) opIt.next(); - if (operation == null || operation.isUndefined()) - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_OPERATION)); - else - processOperationAssertions( - operation, - portType, - serviceReference, - classPrefix, - wsdlDocument); - } - } - } - - /** - * Process message assertions. - * @param message a message. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * message assertions. - */ - protected void processMessageAssertions( - Message message, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - - Entry entry = null; - QName messageQName = message.getQName(); - - // Create entry - entry = this.reporter.getReport().createEntry(); - entry.setEntryType( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_MESSAGE)); - entry.setReferenceID(messageQName.toString()); - entry.setEntryDetail(message); - - // Set entry container - Definition definition = - analyzerContext.getCandidateInfo().getDefinition(message); - entry.setEntryContainer( - getEntryContainer( - (definition == null ? null : definition.getDocumentBaseURI()))); - - // Process binding test assertions - processAssertions(classPrefix, new EntryContext(entry, wsdlDocument)); - } - - /** - * Process message assertions. - * @param binding a binding. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * message assertions. - */ - protected void processMessageAssertions( - Binding binding, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - HashSet messageSet; - - if (binding.getBindingOperations() != null) - { // can do nothing if have no operations defined - messageSet = - WSDLUtils.findMessages(wsdlDocument.getDefinitions(), binding); - - // Process any messages that were found - if (messageSet.size() > 0) - { - Iterator messageIt = messageSet.iterator(); - while (messageIt.hasNext()) - { - Message message = (Message) messageIt.next(); - if (!message.isUndefined()) - processMessageAssertions( - message, - serviceReference, - classPrefix, - wsdlDocument); - } - } - } - } - - /** - * Process message assertions. - * @param portType port type. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * message assertions. - */ - protected void processMessageAssertions( - PortType portType, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - - HashSet messageSet = new HashSet(); - - if (portType.getOperations() != null) - { - // can do nothing if have no operations defined - - Iterator opIt = portType.getOperations().iterator(); - - while (opIt.hasNext()) - { - Operation op = (Operation) opIt.next(); - - // Since there is no guarantee that we have both and input and output message, - // check for its existence before adding it - if (op.getInput() != null && !op.getInput().getMessage().isUndefined()) - messageSet.add(op.getInput().getMessage()); - - if (op.getOutput() != null - && !op.getOutput().getMessage().isUndefined()) - messageSet.add(op.getOutput().getMessage()); - - // also messages from any Faults defined within the operation - if (op.getFaults() != null) - { - Iterator faultIt = op.getFaults().values().iterator(); - Message message; - while (faultIt.hasNext()) - { - message = ((Fault) faultIt.next()).getMessage(); - if (!message.isUndefined()) - messageSet.add(message); - } - } - } - - if (messageSet.size() == 0) - { - // Set all message test assertion results to missingInput - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_MESSAGE)); - } - - else - { - // now step through each derived Message - Iterator messageIt = messageSet.iterator(); - while (messageIt.hasNext()) - { - processMessageAssertions( - (Message) (messageIt.next()), - serviceReference, - classPrefix, - wsdlDocument); - } - } - } - } - - /** - * Process message assertions. - * @param op - operation. - * @param serviceReference service reference. - * @param classPrefix class prefix. - * @param wsdlDocument WSDL document. - * @throws WSIException if problem occurs during processing - * message assertions. - */ - protected void processMessageAssertions( - Operation op, - ServiceReference serviceReference, - String classPrefix, - WSDLDocument wsdlDocument) - throws WSIException - { - - HashSet messageSet = new HashSet(); - if (op.getInput() != null && !op.getInput().getMessage().isUndefined()) - messageSet.add(op.getInput().getMessage()); - - if (op.getOutput() != null && !op.getOutput().getMessage().isUndefined()) - messageSet.add(op.getOutput().getMessage()); - - // also messages from any Faults defined within the operation - Iterator faultIt = op.getFaults().values().iterator(); - Message message; - while (faultIt.hasNext()) - { - message = ((Fault) faultIt.next()).getMessage(); - if (!message.isUndefined()) - messageSet.add(message); - } - - if (messageSet.size() == 0) - { - // Set all message test assertion results to missingInput - setMissingInput( - EntryType.getEntryType(EntryType.TYPE_DESCRIPTION_MESSAGE)); - } - - else - { - // now step through each derived Message - Iterator messageIt = messageSet.iterator(); - while (messageIt.hasNext()) - { - processMessageAssertions( - (Message) (messageIt.next()), - serviceReference, - classPrefix, - wsdlDocument); - } - } - } - - /* (non-Javadoc) - * @see org.wsi.test.profile.validator.impl.BaseValidatorImpl#isPrimaryEntryTypeMatch(org.wsi.test.profile.TestAssertion, org.wsi.test.profile.validator.EntryContext) - */ - protected boolean isPrimaryEntryTypeMatch( - TestAssertion testAssertion, - EntryContext targetContext) - { - boolean match = false; - - // If the test assertion entry type matches the target context entry type, then contine - if (testAssertion - .getEntryTypeName() - .equals(targetContext.getEntry().getEntryType().getTypeName())) - { - match = true; - } - - return match; - } - - /* (non-Javadoc) - * @see org.wsi.test.profile.validator.impl.BaseValidatorImpl#isNotApplicable(org.wsi.test.profile.TestAssertion) - */ - protected boolean isNotApplicable(TestAssertion testAssertion) - { - boolean notApplicable = false; - - // ADD: - - return notApplicable; - } - - /** - * Method getSoapFaults. - * - * @param inBinding in binding. - * @return soap faults. - * @throws WSIException if problems occur while processing binding faults. - */ - protected SOAPFault[] getSoapFaults(Binding inBinding) throws WSIException - { - - Vector soapFaults = new Vector(); - - // Go through each bindingFault one at a time - BindingFault[] bindingFaults = getAllBindingFaults(inBinding); - for (int fault = 0; fault < bindingFaults.length; fault++) - { - SOAPFault soapFault = getSoapFault(bindingFaults[fault]); - if (soapFault != null) - { - soapFaults.add(soapFault); - } - } - - SOAPFault[] soapFaultArray = new SOAPFault[soapFaults.size()]; - soapFaults.copyInto(soapFaultArray); - - return soapFaultArray; - } - - /** - * Method getAllBindingFaults. - * - * @param inBinding binding. - * @return all binding faults. - * @throws WSIException if problems occur during processing. - */ - protected BindingFault[] getAllBindingFaults(Binding inBinding) - throws WSIException - { - - Vector faults = new Vector(); - - try - { - - Iterator bindingOperations = inBinding.getBindingOperations().iterator(); - - while (bindingOperations.hasNext()) - { - - try - { - BindingOperation bo = (BindingOperation) bindingOperations.next(); - Iterator bindingFaults = bo.getBindingFaults().values().iterator(); - while (bindingFaults.hasNext()) - { - - faults.add((BindingFault) bindingFaults.next()); - } - } - catch (NullPointerException e) - { - - } - } - } - catch (NullPointerException e) - { - // no binding operations in this binding - ignore & continue - } - - BindingFault[] faultArray = new BindingFault[faults.size()]; - faults.copyInto(faultArray); - - return faultArray; - } - - /** - * Method getWSDLFaults. - * - * @param bindingFault a binding fault. - * @return WSDL faults. - * @throws WSIException if problems occur during processing. - */ - protected SOAPFault getSoapFault(BindingFault bindingFault) - throws WSIException - { - - SOAPFault soapFault = null; - try - { - Iterator faultExtensibles = - bindingFault.getExtensibilityElements().iterator(); - - while (faultExtensibles.hasNext() && soapFault == null) - { - try - { - soapFault = (SOAPFault) faultExtensibles.next(); - } - catch (ClassCastException e) - { // ignore everything but SOAP Fault elements. - } - } - } - catch (NullPointerException e) - { - } - - return soapFault; - } - - /** - * Method getSoapHeader. - * - * @param inBinding a binding. - * @return SOAP headers. - * @throws WSIException if problems occur during processing. - */ - protected SOAPHeader[] getSoapHeaders(Binding inBinding) throws WSIException - { - // Get all bindings - Binding[] bindingList = new Binding[1]; - bindingList[0] = inBinding; - - Vector soapHeaderList = new Vector(); - - // Go through each binding one at a time - for (int binding = 0; binding < bindingList.length; binding++) - { - try - { - // get the list of binding Operations - BindingOperation[] bindingOperations = - (BindingOperation[]) bindingList[binding] - .getBindingOperations() - .toArray( - new BindingOperation[0]); - - // get references to the extensible elements within the <input> and <output> elements of this binding <operation>. - for (int bo = 0; bo < bindingOperations.length; bo++) - { - - // Iterate over all input/output extensibles, looking for <SOAP:Body> elements. - try - { - BindingInput bindingInput = bindingOperations[bo].getBindingInput(); - BindingOutput bindingOutput = - bindingOperations[bo].getBindingOutput(); - - Iterator extElements = - bindingInput.getExtensibilityElements().iterator(); - while (extElements.hasNext()) - { - try - { - soapHeaderList.add((SOAPHeader) extElements.next()); - } - catch (ClassCastException e) - { // ignore everything but SOAP Header. - } - } - - extElements = bindingOutput.getExtensibilityElements().iterator(); - while (extElements.hasNext()) - { - try - { - soapHeaderList.add((SOAPHeader) extElements.next()); - } - catch (ClassCastException e) - { // ignore everything but SOAP Header. - } - } - } - catch (NullPointerException e) - { // no extensibility elements for <input> or <output> - ignore : not checking this here. - } - } - } - catch (NullPointerException e) - { - // no binding operations in this binding - ignore & continue - } - } - - SOAPHeader[] soapHeaderArray = new SOAPHeader[soapHeaderList.size()]; - soapHeaderList.copyInto(soapHeaderArray); - - return soapHeaderArray; - } - - /** - * Method getSoapHeaderFaults. - * - * WSDLDocument getter method - maybe better off in class WSDLDocument... - * - * @param inBinding a binding. - * @return SOAP header faults. - * @throws WSIException if problems occur during processing. - */ - protected SOAPHeaderFault[] getSoapHeaderFaults(Binding inBinding) - throws WSIException - { - Vector soapHeaderFaultList = new Vector(); - - // Get the list of SOAP headers - SOAPHeader[] soapHeaderArray = getSoapHeaders(inBinding); - - // Go through the list and get the header faults - List list = null; - for (int header = 0; header < soapHeaderArray.length; header++) - { - // Get list for this header - if ((list = soapHeaderArray[header].getSOAPHeaderFaults()) != null) - { - // Add to primary list - soapHeaderFaultList.addAll(list); - } - } - - SOAPHeaderFault[] soapHeaderFaultArray = - new SOAPHeaderFault[soapHeaderFaultList.size()]; - soapHeaderFaultList.copyInto(soapHeaderFaultArray); - - return soapHeaderFaultArray; - } - - /** - * Method getSoapBodies. - * - * WSDLDocument getter method - maybe better off in class WSDLDocument... - * - * @param inBinding a binding. - * @return SOAP bodies. - * @throws WSIException if if problems occur during processing. - */ - protected SOAPBody[] getSoapBodies(Binding inBinding) throws WSIException - { - // REMOVE: Get all bindings - //Binding[] bindingList = wsdlDocument.getBindings(); - Binding[] bindingList = new Binding[1]; - bindingList[0] = inBinding; - - Vector soapBodies = new Vector(); - - // Go through each binding one at a time - for (int binding = 0; binding < bindingList.length; binding++) - { - // get the list of binding Operations - BindingOperation[] bindingOperations = - (BindingOperation[]) bindingList[binding] - .getBindingOperations() - .toArray( - new BindingOperation[0]); - - // get references to the extensible elements within the <input> and <output> elements of this binding <operation>. - for (int bo = 0; bo < bindingOperations.length; bo++) - { - - // Iterate over all input/output extensibles, looking for <SOAP:Body> elements. - try - { - Iterator inputExtensibles = - bindingOperations[bo] - .getBindingInput() - .getExtensibilityElements() - .iterator(); - while (inputExtensibles.hasNext()) - { - try - { - soapBodies.add((SOAPBody) inputExtensibles.next()); - } - catch (ClassCastException e) - { // ignore everything but SOAP Body elements. - } - } - } - catch (NullPointerException e) - { // no extensibility elements for <input> - ignore : not checking this here. - } - - try - { - Iterator outputExtensibles = - bindingOperations[bo] - .getBindingOutput() - .getExtensibilityElements() - .iterator(); - while (outputExtensibles.hasNext()) - { - try - { - soapBodies.add((SOAPBody) outputExtensibles.next()); - } - catch (ClassCastException e) - { // ignore everything but SOAP Body elements. - } - } - } - catch (NullPointerException e) - { // no extensibility elements for <output>. - } - } - } - - SOAPBody[] soapBodyArray = new SOAPBody[soapBodies.size()]; - soapBodies.copyInto(soapBodyArray); - - return soapBodyArray; - } - - /** - * Method getSoapBody. - * - * @param bindingInput a BindingInput object. - * @return body. - * @throws WSIException if problems occur during processing. - */ - protected SOAPBody getSoapBody(BindingInput bindingInput) throws WSIException - { - - SOAPBody soapBody = null; - - Iterator extensibles = bindingInput.getExtensibilityElements().iterator(); - while (extensibles.hasNext()) - { - Object extensible = extensibles.next(); - if (extensible instanceof SOAPBody) - { - soapBody = (SOAPBody) extensible; - break; - } - } - return soapBody; - } - - /** - * Method getSoapBody. - * - * @param bindingOutput a BindingOutput object. - * @return SOAP body. - * @throws WSIException if problems occur during processing. - */ - protected SOAPBody getSoapBody(BindingOutput bindingOutput) - throws WSIException - { - - SOAPBody soapBody = null; - - Iterator extensibles = bindingOutput.getExtensibilityElements().iterator(); - while (extensibles.hasNext()) - { - Object extensible = extensibles.next(); - if (extensible instanceof SOAPBody) - { - soapBody = (SOAPBody) extensible; - break; - } - } - return soapBody; - } - - /** - * Get schema used. - * @param def definition. - * @return Schema used. - * @throws AssertionFailException if problem getting WSDL defintions - * namespace. - */ - protected String getSchemaUsed(Definition def) throws AssertionFailException - { - String schemaUsed = ""; - - try - { - // Need to read the file directly, since WSDL4J always puts in the default WSDL namespace - Document document = parseXMLDocumentURL(def.getDocumentBaseURI(), null); - - if (document != null) - { - // Get the root element - Element element = document.getDocumentElement(); - - // Get the namespace for this element - if (element != null) - schemaUsed = element.getNamespaceURI(); - } - } - - catch (WSIException we) - { - throw new AssertionFailException("problem getting WSDL defintions namespace"); - } - - /* - // Get the default namespace - String schemaUsed = def.getNamespace(""); - - // If the default was set, then process it to get the namespace - if (schemaUsed == null) { - // do it the hard way (still better than another DOM parse)... - //WSDLWriter w = new WSDLWriterImpl(); - try { - WSDLWriter w = WSDLFactory.newInstance().newWSDLWriter(); - Document doc = w.getDocument(def); - Element e = doc.getDocumentElement(); - schemaUsed = e.getNamespaceURI(); - } - catch (NullPointerException e) { - throw new AssertionFailException("problem getting WSDL defintions namespace"); - } - catch (WSDLException e) { - throw new AssertionFailException("problem getting document defintion"); - } - } - */ - - return schemaUsed; - } - - /** - * Method getSoapBinding. - * - * Get the SOAP binding for a Binding. - * - * @param binding a binding. - * @return a SOAP binding. - * @throws WSIException if problems occur during processing. - */ - public static SOAPBinding getSoapBinding(Binding binding) throws WSIException - { - SOAPBinding soapBinding = null; - - // Get the list of extensibility elements - List exElements = binding.getExtensibilityElements(); - if (exElements != null) - { - Iterator iterator = binding.getExtensibilityElements().iterator(); - - // Check for <soap:binding> element - while ((iterator.hasNext()) && (soapBinding == null)) - { - try - { - soapBinding = (SOAPBinding) iterator.next(); - } - catch (ClassCastException e) - { // ignore everything but SOAP Binding element - } - } - } - - return soapBinding; - } - - /** - * Create XML schema validator. This is done here because some compilers do not allow - * the documentList field to be accessed from within an inner class. - * @param documentBaseURI the base URL. - * @return newly created XML schema validator. - */ - protected XMLSchemaValidator createXMLSchemaValidator(String documentBaseURI) - { - // Create XML schema validator - return new XMLSchemaValidator(documentBaseURI); - } - - /** - * Search xsd schema or xsd import from node. If node is xsd import it's loading schema. - * @param definition a Definition object. - * @return a list of schema target namespaces. - * @throws WSIException if problem during processing method. - */ - protected List getSchemaTargetNamespaceList(Definition definition) - throws WSIException - { - List list = null, nextList = null; - - // Get list of extension elements within the types element - Types types = null; - if ((types = definition.getTypes()) != null) - { - Iterator iterator = types.getExtensibilityElements().iterator(); - - ExtensibilityElement extElement = null; - while (iterator.hasNext()) - { - // Get next ext. element - extElement = (ExtensibilityElement) iterator.next(); - // If this is an unknown ext. element, then see if it is a schema element - TargetNamespaceProcessor tnsProcessor = null; - if (extElement instanceof UnknownExtensibilityElement) - { - tnsProcessor = new TargetNamespaceProcessor(definition.getDocumentBaseURI()); - - - if ((nextList = - tnsProcessor.processAllSchema( - ((UnknownExtensibilityElement) extElement).getElement())) - != null) - if (list == null) - list = new Vector(); - list.addAll(nextList); - } - } - } - - return list; - } - /** - * Search xsd schema or xsd import from node. If node is xsd import it's loading schema. - * @param definition a Definition object. - * @return a list of schema target namespaces. - * @throws WSIException if problem during processing method. - */ - protected List getSchemaNamespaceList(Definition definition) - throws WSIException - { - List list = new Vector(); - - // Always add current document targetNamespace - List targetNamespaceList = getSchemaTargetNamespaceList(definition); - - if ((targetNamespaceList != null) && !targetNamespaceList.isEmpty()) - list.addAll(targetNamespaceList); - - // Get list of imported WSDL documents - Map importMap = definition.getImports(); - - Import imp; - - // Add each imports targetNamespace to the list - if (importMap != null && !importMap.isEmpty()) - { - Iterator values = importMap.values().iterator(); - List importList; - while (values.hasNext()) - { - importList = (List) values.next(); - Iterator imports = importList.iterator(); - while (imports.hasNext()) - { - imp = (Import) imports.next(); - if (imp != null && imp.getDefinition() != null) - list.addAll(getSchemaNamespaceList(imp.getDefinition())); - } - } - } - - return list; - } - - /** - * Build list of WSDL targetNamespaces. - * @param definition a Definition object. - * @return list of WSDL targetNamespaces. - */ - protected List getWSDLTargetNamespaceList(Definition definition) - { - List list = new Vector(); - - // Always add current document targetNamespace - if (definition.getTargetNamespace() != null) - list.add(definition.getTargetNamespace()); - - // Get list of imported WSDL documents - Map importMap = definition.getImports(); - - Import imp; - - // Add each imports targetNamespace to the list - if (importMap != null && !importMap.isEmpty()) - { - Iterator values = importMap.values().iterator(); - List importList; - while (values.hasNext()) - { - importList = (List) values.next(); - Iterator imports = importList.iterator(); - while (imports.hasNext()) - { - imp = (Import) imports.next(); - if (imp != null && imp.getDefinition() != null) - list.addAll(getWSDLTargetNamespaceList(imp.getDefinition())); - // list.add(imp.getDefinition().getTargetNamespace()); - } - } - } - - return list; - } - - protected class BindingMatch - { - private Binding binding; - private BindingOperation bindingOperation; - private SOAPBinding soapBinding; - //private Vector bindingArgs; // set of BindingInputs and BindingOutputs - private BindingInput bindingInput; - private BindingOutput bindingOutput; - - // ADD: need to include BindingFault support... - public BindingMatch( - Binding b, - BindingOperation bo, - SOAPBinding sb, - BindingInput bin, - BindingOutput bout) - { - binding = b; - bindingOperation = bo; - soapBinding = sb; - //bindingArgs = new Vector(); - //if (bin != null) { bindingArgs.add(bin); } - //if (bout != null) { bindingArgs.add(bout); } - bindingInput = bin; - bindingOutput = bout; - } - - public BindingMatch( - Binding b, - BindingOperation bo, - SOAPBinding sb, - BindingInput bin) - { - this(b, bo, sb, bin, null); - } - - public BindingMatch( - Binding b, - BindingOperation bo, - SOAPBinding sb, - BindingOutput bout) - { - this(b, bo, sb, null, bout); - } - - /** - * Returns the soapBinding. - * @return SOAPBinding - */ - public SOAPBinding getSoapBinding() - { - return soapBinding; - } - - /** - * Returns the bindingOperation. - * @return BindingOperation - */ - public BindingOperation getBindingOperation() - { - return bindingOperation; - } - - /** - * Returns the bindingInput. - * @return BindingInput - */ - public BindingInput getBindingInput() - { - return bindingInput; - } - - /** - * Returns the bindingOutput. - * @return BindingOutput - */ - public BindingOutput getBindingOutput() - { - return bindingOutput; - } - - public boolean hasBindingInput() - { - return (this.bindingInput != null); - } - - public boolean hasBindingOutput() - { - return (this.bindingOutput != null); - } - - /** - * Returns the binding. - * @return Binding - */ - public Binding getBinding() - { - return binding; - } - - } - - /** - * Get binding matches. - * @param binding a binding. - * @param soapBindingStyle soap binding style. - * @param soapBodyUse soap body use. - * @return binding matches. - * @throws WSIException if problems occur during processing. - */ - public BindingMatch[] getBindingMatches( - Binding binding, - String soapBindingStyle, - String soapBodyUse) - throws WSIException - { - - Vector bindingMatches = new Vector(); - - // Check binding - SOAPBinding soapBinding = getSoapBinding(binding); - - // check that the soap:binding for this WSDL binding is the specified style - // ADD: check for null pointer - if (soapBinding != null) - { - String defaultStyle = soapBinding.getStyle(); - - if (defaultStyle == null) - { - defaultStyle = WSIConstants.ATTRVAL_SOAP_BIND_STYLE_DOC; - } - - // Get the set of operations for this WSDL binding - List bindingOpsList = binding.getBindingOperations(); - if (bindingOpsList != null) - { - Iterator bindingOps = bindingOpsList.iterator(); - // for each binding operation: - while (bindingOps.hasNext()) - { - BindingOperation bindingOp = (BindingOperation) bindingOps.next(); - - SOAPOperation soapOp = getSoapOperation(bindingOp); - - if ((soapOp == null && defaultStyle.equals(soapBindingStyle)) - || (soapOp != null - && soapOp.getStyle() == null - && defaultStyle.equals(soapBindingStyle)) - || (soapOp != null - && soapOp.getStyle() != null - && soapOp.getStyle().equals(soapBindingStyle))) - { - // check binding input & output - BindingInput bInput = bindingOp.getBindingInput(); - if (bInput != null) - { - SOAPBody inputSoapBody = getSoapBody(bInput); - if (inputSoapBody == null - || (inputSoapBody.getUse() != null - && !inputSoapBody.getUse().equals(soapBodyUse))) - { - bInput = null; - } - } - - BindingOutput bOutput = bindingOp.getBindingOutput(); - if (bOutput != null) - { - SOAPBody outputSoapBody = getSoapBody(bOutput); - - if (outputSoapBody == null - || (outputSoapBody.getUse() != null - && !outputSoapBody.getUse().equals(soapBodyUse))) - { - bOutput = null; - } - } - - if ((bOutput != null) || (bInput != null)) - { - // we have a match, add to the vector - bindingMatches.add( - new BindingMatch( - binding, - bindingOp, - soapBinding, - bInput, - bOutput)); - } - } - } - } - } - - BindingMatch[] BindingMatchArray = new BindingMatch[bindingMatches.size()]; - bindingMatches.copyInto(BindingMatchArray); - return BindingMatchArray; - } - - /** - * Method getSoapOperation. - * - * @param bindingOperation a binding operation. - * @return a soap operation. - * @throws WSIException if problems while processing. - */ - public static SOAPOperation getSoapOperation(BindingOperation bindingOperation) - throws WSIException - { - - if (bindingOperation.getExtensibilityElements() == null) - { - return null; - } - - Iterator extensibles = - bindingOperation.getExtensibilityElements().iterator(); - while (extensibles.hasNext()) - { - Object extensible = extensibles.next(); - if (extensible instanceof SOAPOperation) - { - return (SOAPOperation) extensible; - } - } - return null; - } - - /* - * Returns an array of SOAPOperations corresponding to the wsdl:binding supplied. - */ - protected HashMap getSoapOperations(Binding binding) throws WSIException - { - HashMap soapOperationList = new HashMap(); - - if (binding.getBindingOperations() == null) - { - return null; - } - - //Vector soapOpVector = new Vector(); - - // Get the list of binding operations - Iterator operations = binding.getBindingOperations().iterator(); - - // Check each binding operation to see if it has a soap operation element - BindingOperation bindingOperation = null; - while (operations.hasNext()) - { - bindingOperation = (BindingOperation) operations.next(); - Iterator extensibles = - bindingOperation.getExtensibilityElements().iterator(); - while (extensibles.hasNext()) - { - Object extensible = extensibles.next(); - if (extensible instanceof SOAPOperation) - { - soapOperationList.put(extensible, bindingOperation.getName()); - } - } - } - - //return (SOAPOperation[])soapOpVector.toArray(new SOAPOperation[] {}); - return soapOperationList; - } - - /** - * Check part attributes. - * @param bindingMatch an array of BindingMatch objects. - * @param inOrOut a String object. - * @param attrib attribute. - * @return a boolean. - * @throws AssertionFailException if the part is not compliant. - */ - // GT - rework this method with a better way of parameterizing the getters required for the invocation. - protected boolean checkPartAttributes( - BindingMatch[] bindingMatch, - String inOrOut, - String attrib) - throws AssertionFailException - { - - if (!(inOrOut.equals("useInput") || inOrOut.equals("useOutput")) - || !(attrib.equals("useType") || attrib.equals("useElement"))) - { - // invalid argument value supplied by calling method - "internal error" - return false; - } - - for (int i = 0; i < bindingMatch.length; i++) - { - BindingMatch nextMatch = bindingMatch[i]; - - // check the associated parts - Message msg; - Map parts; - Iterator partIteration; - - BindingOperation bindingOp = nextMatch.getBindingOperation(); - if (bindingOp == null) - { - continue; // no Binding Operation for some reason - } - - Operation op = bindingOp.getOperation(); - - /* ADD: handle soap:faults in similar way - try { - // check faults - remarkably similar.... (need to retain operation id for failuredetail msg) - if (nextMatch.hasBindingFault()) { - - msg = op.getFault().getMessage(); - parts = msg.getParts(); - - //check that each part has an element attribute - partIteration = parts.values().iterator(); - while (partIteration.hasNext()) { - Part part = (Part)partIteration.next(); - if (part.getElementName() == null) { - throw new AssertionFailException("OPERATION: " + op + "MESSAGE: " + msg); - } - } - } - } - catch (NullPointerException n) { - // no parts found - this qualifies an assertion failure - throw new AssertionFailException(n.getMessage()); - } - */ - - try - { - - QName attributeName; - - //GT: Do we need to check BindingInput / Output here ?? - - if (inOrOut.equals("useInput")) - { - if (op.getInput() == null || !nextMatch.hasBindingInput()) - { - // No Input so nothing to check - continue; - } - - msg = op.getInput().getMessage(); - - } - else - { // Looking for Output - if (op.getOutput() == null || !nextMatch.hasBindingOutput()) - { - // No Output so nothing to check - continue; - } - - msg = op.getOutput().getMessage(); - } - - if (msg == null) - { - continue; // nothing to check from this Binding Match (?) - } - - // Get the list of parts - parts = msg.getParts(); - - // If there is a parts attribute, then only process those parts - List partsNameList = null; - if ((partsNameList = getPartsList(nextMatch, inOrOut)) != null) - { - Vector partsList = new Vector(); - Iterator partsNameIterator = partsNameList.iterator(); - while (partsNameIterator.hasNext()) - { - partsList.add(parts.get((String) partsNameIterator.next())); - } - partIteration = partsList.iterator(); - } - - // Otherwise use the complete list of parts - else - { - partIteration = parts.values().iterator(); - } - - //check that each part has an element or type attribute - while (partIteration.hasNext()) - { - Part part = (Part) partIteration.next(); - if (attrib.equals("useElement")) - { - attributeName = part.getElementName(); - } - else - { // "useType" - attributeName = part.getTypeName(); - } - - if (attributeName == null) - { - throw new AssertionFailException( - "Name of operation that failed: " - + op.getName() - + "\n" - + op.toString() - + "\n" - + "\nName of message that failed: " - + msg.getQName() - + "\n" - + msg.toString()); - } - } - } - catch (NullPointerException n) - { - // no parts found - this qualifies an assertion failure - throw new AssertionFailException(n.toString()); - } - } - return true; // tests successful - } - - /** - * Get parts list from a soapbind:body element. - */ - private List getPartsList(BindingMatch bindingMatch, String type) - { - List partsList = null; - Iterator iterator = null; - - BindingOperation bindingOp; - - try - { - // Get the binding operation - bindingOp = bindingMatch.getBindingOperation(); - - // Determine if the binding operation contains a soapbind:body with a parts attribute - if (type.equals("useInput")) - { - iterator = - bindingOp.getBindingInput().getExtensibilityElements().iterator(); - } - else - { - iterator = - bindingOp.getBindingOutput().getExtensibilityElements().iterator(); - } - } - catch (NullPointerException e) - { - return null; - // either no binding operation, binding input/output, or SOAP element - } - - // Determine if the binding operation contains a soapbind:body with a parts attribute - while ((iterator.hasNext()) && (partsList == null)) - { - try - { - SOAPBody soapBody = (SOAPBody) iterator.next(); - partsList = soapBody.getParts(); - } - catch (ClassCastException cce) - { // not a SOAPBody extensibility element so ignore - } - } - - return partsList; - } - - /** - * Get element location. - * @param wsdlDocument WSDL document. - * @param wsdlElement WSDL element. - * @return element location. - */ - protected ElementLocation getElementLocation( - WSDLDocument wsdlDocument, - Object wsdlElement) - { - ElementLocation elementLocation = null; - WSDLElementList wsdlElementList; - - if ((wsdlElementList = wsdlDocument.getElementList()) != null) - { - elementLocation = wsdlElementList.getElementLocation(wsdlElement); - } - - return elementLocation; - } - - /** - * Create failure detail. - * @param message a message. - * @param entryContext entry context. - * @return failure detail. - */ - protected FailureDetail createFailureDetail( - String message, - EntryContext entryContext) - { - return createFailureDetail( - message, - entryContext, - entryContext.getEntry().getEntryDetail()); - } - - /** - * Create failure detail. - * @param message a message. - * @param entryContext entry context. - * @param wsdlElement WSDL element. - * @return failure detail. - */ - protected FailureDetail createFailureDetail( - String message, - EntryContext entryContext, - Object wsdlElement) - { - FailureDetail failureDetail = reporter.createFailureDetail(); - failureDetail.setFailureMessage(message); - failureDetail.setElementLocation( - getElementLocation(entryContext.getWSDLDocument(), wsdlElement)); - return failureDetail; - } - - /** - * SOAPBody, SOAPFault, SOAPHeader and SOAPHeaderFault class - * interfaces have compatible getUse() and getNamespaceURI() - * methods, but wsdl4j does not declare them at the parent interface. - * Therefore use reflection to access these common methods. - * - * @param extElement extensibility element. - * @return true if namespace is found in SOAP literal. - * @throws NoSuchMethodException if this method cannot be found. - * @throws InvocationTargetException if problems occur in an invoked method or constructor - * @throws IllegalAccessException if there is am attempt to load a - * class that it does not have access to. - */ - protected boolean namespaceFoundInSoapLiteral(ExtensibilityElement extElement) - throws NoSuchMethodException, InvocationTargetException, IllegalAccessException - { - Class c = extElement.getClass(); - Method getUseMethod = c.getMethod("getUse", new Class[0]); - Method getNamespaceURIMethod = c.getMethod("getNamespaceURI", new Class[0]); - - // (use attribute is mandatory but the null case is checked for since a missing use is not - // checked with this TA. If its missing its invalid but we don't know whether we have doc-lit). - if (getUseMethod.invoke(extElement, null) == null - || !getUseMethod.invoke(extElement, null).equals( - WSIConstants.ATTRVAL_SOAP_BODY_USE_LIT)) - { - return false; - } - - // return true if namespace found - boolean namespaceFound = - (getNamespaceURIMethod.invoke(extElement, null) != null); - - // return true if namespace found - return namespaceFound; - - } - - /** - * Verify extensibility element uses literal. - * @param extensible - extensibility element - * @return boolean - * @throws NoSuchMethodException if this method cannot be found. - * @throws InvocationTargetException if problems occur in an invoked method or constructor - * @throws IllegalAccessException if there is am attempt to load a - * class that it does not have access to. - */ - protected boolean isLiteral(ExtensibilityElement extensible) - throws NoSuchMethodException, InvocationTargetException, IllegalAccessException - { - - Class c = extensible.getClass(); - Method getUseMethod = c.getMethod("getUse", new Class[0]); - - // (use attribute is mandatory but the null case is checked for since a missing use is not - // checked with this TA. If its missing its invalid but we don't know whether we have doc-lit). - if (getUseMethod.invoke(extensible, null) == null - || !getUseMethod.invoke(extensible, null).equals( - WSIConstants.ATTRVAL_SOAP_BODY_USE_LIT)) - { - return false; - } - - // return true if shown to have use="literal" - return true; - - } -} |