}
public void handleMessage(SoapMessage message) throws Fault {
XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
Fault f = (Fault) message.getContent(Exception.class);
SoapFault fault = SoapFault.createFault(f, message.getVersion());
try {
Map<String, String> namespaces = fault.getNamespaces();
for (Map.Entry<String, String> e : namespaces.entrySet()) {
writer.writeNamespace(e.getKey(), e.getValue());
}
String ns = message.getVersion().getNamespace();
String defaultPrefix = writer.getPrefix(ns);
if (defaultPrefix == null) {
defaultPrefix = StaxUtils.getUniquePrefix(writer, ns, false);
writer.writeStartElement(defaultPrefix, "Fault", ns);
writer.writeNamespace(defaultPrefix, ns);
} else {
writer.writeStartElement(defaultPrefix, "Fault", ns);
}
writer.writeStartElement("faultcode");
String codeString = fault.getCodeString(getFaultCodePrefix(writer, fault.getFaultCode()),
defaultPrefix);
writer.writeCharacters(codeString);
writer.writeEndElement();
writer.writeStartElement("faultstring");
if (fault.getMessage() != null) {
writer.writeCharacters(fault.getMessage());
} else {
writer.writeCharacters("Fault occurred while processing.");
}
writer.writeEndElement();
String config = (String)message.getContextualProperty(
org.apache.cxf.message.Message.FAULT_STACKTRACE_ENABLED);
if (config != null && Boolean.valueOf(config).booleanValue() && fault.getCause() != null) {
StringBuilder sb = new StringBuilder();
for (StackTraceElement ste : fault.getCause().getStackTrace()) {
sb.append(ste.getClassName() + "!" + ste.getMethodName() + "!" + ste.getFileName()
+ "!" + ste.getLineNumber() + "\n");
}
Element detail = fault.getDetail();
if (detail == null) {
Document doc = XMLUtils.newDocument();
Element stackTrace = doc.createElementNS(Soap11.SOAP_NAMESPACE, Fault.STACKTRACE);
stackTrace.setTextContent(sb.toString());
detail = doc.createElementNS(Soap11.SOAP_NAMESPACE, "detail");
fault.setDetail(detail);
detail.appendChild(stackTrace);
} else {
Element stackTrace = detail.getOwnerDocument().createElementNS(
Soap11.SOAP_NAMESPACE, Fault.STACKTRACE);
stackTrace.setTextContent(sb.toString());
detail.appendChild(stackTrace);
}
}
if (fault.hasDetails()) {
Element detail = fault.getDetail();
writer.writeStartElement("detail");
Node node = detail.getFirstChild();
while (node != null) {
StaxUtils.writeNode(node, writer, true);
node = node.getNextSibling();
}
// Details
writer.writeEndElement();
}
if (fault.getRole() != null) {
writer.writeStartElement("faultactor");
writer.writeCharacters(fault.getRole());
writer.writeEndElement();
}
// Fault
writer.writeEndElement();