diff options
Diffstat (limited to 'bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1302.java')
-rw-r--r-- | bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1302.java | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1302.java b/bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1302.java new file mode 100644 index 000000000..ffe6af623 --- /dev/null +++ b/bundles/org.eclipse.wst.wsi/wsitools/org/eclipse/wst/wsi/internal/profile/validator/impl/envelope/BP1302.java @@ -0,0 +1,181 @@ +/******************************************************************************* + * 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 org.eclipse.wst.wsi.internal.WSIException; +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.xml.XMLUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + + +/** + * BP1302. + * The soap:faultcode value in the soap:Fault element of the response + * message is not custom, and is one of: VersionMismatch, MustUnderstand, Client, Server. + */ +public class BP1302 extends AssertionProcess +{ + private final BaseMessageValidator validator; + + /** + * @param BaseMessageValidator + */ + public BP1302(BaseMessageValidator impl) + { + super(impl); + this.validator = impl; + } + + //SOAP fault code values should not be custom: only standard code qualifiers + //are used: VersionMismatch, MustUnderstand, Client, Server + public AssertionResult validate( + TestAssertion testAssertion, + EntryContext entryContext) + throws WSIException + { + + //String requestMessage = null; + String responseMessage = null; + + if (this.validator.isOneWayResponse(entryContext)) + { + result = AssertionResult.RESULT_NOT_APPLICABLE; + } + else + { + //Get the response message check the faultcode. + MessageEntry logEntryResponse = entryContext.getResponse(); + if (logEntryResponse != null) + { + responseMessage = logEntryResponse.getMessage(); + + Document targetDoc = XMLUtils.parseXML(responseMessage); + NodeList faultCodes = targetDoc.getElementsByTagName("faultcode"); + // targetDoc.getElementsByTagNameNS(WSIConstants.NS_URI_SOAP, "faultcode"); + + if (faultCodes.getLength() <= 0) + result = AssertionResult.RESULT_NOT_APPLICABLE; + //No faultcode + + for (int i = 0; i < faultCodes.getLength(); i++) + { + Node faultCodeElem = faultCodes.item(i); + //If the faultcode was MustUnderstand, check the value of + //the mustUnderstand attribute in the request. + if (faultCodeElem == null) + result = AssertionResult.RESULT_NOT_APPLICABLE; + else if (faultCodeElem.getNodeType() == Node.ELEMENT_NODE) + { + if (isValidFaultCode((Element) faultCodeElem)) + { + result = AssertionResult.RESULT_PASSED; + } + else + { + result = AssertionResult.RESULT_WARNING; + failureDetail = + this.validator.createFailureDetail(responseMessage, entryContext); + //failureDetail = + // "The faultcode value was : " + // + faultCodeElem.getFirstChild().getNodeValue().trim(); + } //End if (faultCode.equals...) + } + else + { + result = AssertionResult.RESULT_NOT_APPLICABLE; + } + } //End for + } //End if logEntryResponse!= null + } + + // Return assertion result + return validator.createAssertionResult(testAssertion, result, failureDetail); + } + + /** + * Check faultCode. + * @param faultCodeElem a faultcode. + * @return true if faultcode is valid. + */ + public boolean isValidFaultCode(Element faultCodeElem) + { + //A faultcode may or maynot have a prefix, if it does its namespace should be + //http://schemas.xmlsoap.org/soap/envelope which is the same as the faultcode element. + //If a prefix is present and it corresponds to a different namespace or is null + //then this returns false. The local part of the faultcode is then check to see + //if it is one of the permitted values. + if (faultCodeElem == null) + return true; + + String faultCode = faultCodeElem.getFirstChild().getNodeValue().trim(); + if (faultCode == null) + return false; + + // FIX: This is not correct, since this element can not be namespace qualified + String faultCodeElemPrefix = faultCodeElem.getParentNode().getPrefix(); + + // If this is not a QName then return false + int index; + String faultCodePrefix = null; + String faultCodeName = faultCode; + if ((index = faultCode.indexOf(':')) != -1) + { + faultCodePrefix = faultCode.substring(0, index); + faultCodeName = faultCode.substring(index + 1, faultCode.length()); + } + + if ((faultCodeElemPrefix != null && faultCodePrefix != null)) + { + if (faultCodePrefix.equals(faultCodeElemPrefix)) + { + if ((faultCodeName.equals("MustUnderstand") + || faultCodeName.equals("VersionMismatch") + || faultCodeName.equals("Client") + || faultCodeName.equals("Server"))) + /* REMOVE: + || faultCodeName.startsWith("MustUnderstand.") + || faultCodeName.startsWith("VersionMismatch.") + || faultCodeName.startsWith("Client.") + || faultCodeName.startsWith("Server."))) + */ + return true; + else + return false; + } + else + { + return true; + } + } + else + { + if (faultCodeName.equals("MustUnderstand") + || faultCodeName.equals("VersionMismatch") + || faultCodeName.equals("Client") + || faultCodeName.equals("Server") + || faultCodeName.startsWith("MustUnderstand.") + || faultCodeName.startsWith("VersionMismatch.") + || faultCodeName.startsWith("Client.") + || faultCodeName.startsWith("Server.")) + return true; + else + return false; + } + } +}
\ No newline at end of file |