diff options
Diffstat (limited to 'bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1204.java')
-rw-r--r-- | bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1204.java | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1204.java b/bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1204.java new file mode 100644 index 000000000..438a29022 --- /dev/null +++ b/bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1204.java @@ -0,0 +1,302 @@ +/******************************************************************************* + * 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.profile.validator.impl.envelope; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import javax.wsdl.Binding; +import javax.wsdl.BindingOperation; +import javax.wsdl.Message; +import javax.wsdl.Part; +import javax.wsdl.Types; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.UnknownExtensibilityElement; +import javax.xml.namespace.QName; + +import org.eclipse.wst.wsi.internal.WSIConstants; +import org.eclipse.wst.wsi.internal.WSIException; +import org.eclipse.wst.wsi.internal.analyzer.AssertionFailException; +import org.eclipse.wst.wsi.internal.analyzer.AssertionNotApplicableException; +import org.eclipse.wst.wsi.internal.analyzer.AssertionPassException; +import org.eclipse.wst.wsi.internal.log.MessageEntry; +import org.eclipse.wst.wsi.internal.profile.TestAssertion; +import org.eclipse.wst.wsi.internal.profile.validator.EntryContext; +import org.eclipse.wst.wsi.internal.profile.validator.impl.AssertionProcess; +import org.eclipse.wst.wsi.internal.profile.validator.impl.BaseMessageValidator; +import org.eclipse.wst.wsi.internal.report.AssertionResult; +import org.eclipse.wst.wsi.internal.util.HTTPUtils; +import org.eclipse.wst.wsi.internal.util.OperationSignature; +import org.eclipse.wst.wsi.internal.util.TypesRegistry; +import org.eclipse.wst.wsi.internal.xml.XMLUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + + +/** + * BP1204. + * The serialized array form in the message does not contain the + * soapenc:arrayType attribute. + * + */ +public class BP1204 extends AssertionProcess +{ + private final BaseMessageValidator validator; + + /** + * @param BaseMessageValidator + */ + public BP1204(BaseMessageValidator impl) + { + super(impl); + this.validator = impl; + } + + /** + * @see org.eclipse.wst.wsi.test.profile.validator.impl.BaseValidatorImpl.AssertionProcess#validate(TestAssertion, EntryContext) + */ + public AssertionResult validate( + TestAssertion testAssertion, + EntryContext entryContext) + throws WSIException + { + try + { + + if (this.validator.isOneWayResponse(entryContext)) + throw new AssertionNotApplicableException(); + + // Parse message + Document doc = + XMLUtils.parseXML(entryContext.getMessageEntry().getMessage()); + + if (this.validator.isFault(doc)) + { + throw new AssertionPassException(); + } + + // Parse request message + Document docRequest = + XMLUtils.parseXML(entryContext.getRequest().getMessage()); + + // get SOAPAction + String headers = entryContext.getRequest().getHTTPHeaders(); + String action = null; + if (headers != null) + action = (String) HTTPUtils.getHttpHeaderTokens(headers, ":").get("SOAPAction".toUpperCase()); + + Binding binding = validator.analyzerContext.getCandidateInfo().getBindings()[0]; + TypesRegistry registry = + new TypesRegistry( + this.validator.getWSDLDocument().getDefinitions(), + validator); + OperationSignature.OperationMatch match = + OperationSignature.matchOperation( + docRequest, + action, + binding, + registry); + + if (match == null) + throw new AssertionPassException(); + + BindingOperation bindingOperation = match.getOperation(); + + Message operationMessage = null; + if (MessageEntry + .TYPE_REQUEST + .equals(entryContext.getMessageEntry().getType()) + && (bindingOperation.getOperation().getInput() != null)) + { + operationMessage = + bindingOperation.getOperation().getInput().getMessage(); + } + else + { + if (MessageEntry + .TYPE_RESPONSE + .equals(entryContext.getMessageEntry().getType()) + && (bindingOperation.getOperation().getOutput() != null)) + { + operationMessage = + bindingOperation.getOperation().getOutput().getMessage(); + } + } + + if (operationMessage == null) + throw new AssertionPassException(); + + boolean isContainArray = false; + + Collection parts = operationMessage.getParts().values(); + for (Iterator iter = parts.iterator(); iter.hasNext();) + { + Part part = (Part) iter.next(); + + QName type = null; + + if (part.getTypeName() == null) + { + type = registry.getType(part.getElementName()); + } + else + { + type = part.getTypeName(); + } + + isContainArray = + registry.isExtendsArray(type) + || registry.isUsesWSDLArrayType(type) + || isArrayType(type); + if (isContainArray) + break; + } + + if (isContainArray) + { + // Gets body + NodeList soapBodyList = + doc.getElementsByTagNameNS( + WSIConstants.NS_URI_SOAP, + XMLUtils.SOAP_ELEM_BODY); + if (soapBodyList.getLength() == 0 || soapBodyList.getLength() > 1) + { + throw new AssertionFailException(); + } + + Element soapBodyElem = (Element) soapBodyList.item(0); + + NodeList soapBodyCildrenList = + soapBodyElem.getElementsByTagNameNS("*", "*"); + for (int indexChild = 0; + indexChild < soapBodyCildrenList.getLength(); + indexChild++) + { + Element elem = (Element) soapBodyCildrenList.item(indexChild); + if (elem + .hasAttributeNS( + WSIConstants.NS_URI_SOAP_ENCODING, + WSIConstants.ATTR_ARRAY_TYPE)) + { + throw new AssertionFailException(); + } + } + + throw new AssertionPassException(); + } + else + { + throw new AssertionPassException(); + } + + } + catch (AssertionNotApplicableException e) + { + result = AssertionResult.RESULT_NOT_APPLICABLE; + } + catch (AssertionFailException e) + { + result = AssertionResult.RESULT_FAILED; + failureDetail = + this.validator.createFailureDetail( + entryContext.getMessageEntry().getMessage(), + entryContext); + } + catch (AssertionPassException e) + { + result = AssertionResult.RESULT_PASSED; + } + catch (Exception e) + { + result = AssertionResult.RESULT_NOT_APPLICABLE; + } + + // Return assertion result + return validator.createAssertionResult(testAssertion, result, failureDetail); + } + + /** + * Checks whether type uses an array or not. + * @param type + * @return boolean + */ + private boolean isArrayType(QName type) + { + boolean arrayType = false; + + Element typeElement = getTypeElement(type); + if (typeElement != null) + { + NodeList list = + typeElement.getElementsByTagNameNS( + WSIConstants.NS_URI_XSD, + "sequence"); + if (list.getLength() > 0) + arrayType = true; + } + + return arrayType; + } + + /** + * Gets XML element defining the type. + * @param type + * @return Element + */ + private Element getTypeElement(QName type) + { + Types[] allTypes = validator.analyzerContext.getCandidateInfo().getTypes(); + for (int i = 0; allTypes != null && i < allTypes.length; i++) + { + Element typesElement = null; + if (allTypes[i] != null) + { + typesElement = allTypes[i].getDocumentationElement(); + if (typesElement == null) + { + List extList = allTypes[i].getExtensibilityElements(); + for (Iterator iter = extList.iterator(); iter.hasNext();) + { + ExtensibilityElement extElem = (ExtensibilityElement) iter.next(); + + if (extElem + .getElementType() + .equals(new QName(WSIConstants.NS_URI_XSD, "schema"))) + { + typesElement = + ((UnknownExtensibilityElement) extElem).getElement(); + break; + } + } + } + if (typesElement != null) + { + NodeList complexTypesList = + typesElement.getElementsByTagNameNS( + WSIConstants.NS_URI_XSD, + "complexType"); + for (int j = 0; j < complexTypesList.getLength(); j++) + { + Element typeElem = (Element) complexTypesList.item(j); + if (type.getLocalPart().equals(typeElem.getAttribute("name"))) + { + return typeElem; + } + } + + } + } + } + return null; + } +}
\ No newline at end of file |