blob: 63acd565ab2c290fddcf9052c08f5d33dd22db6c [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.profile.validator.impl.envelope;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.log.MessageEntry;
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.impl.AssertionProcess;
import org.eclipse.wst.wsi.internal.core.profile.validator.impl.BaseMessageValidator;
import org.eclipse.wst.wsi.internal.core.report.AssertionResult;
import org.eclipse.wst.wsi.internal.core.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;
}
}
}