package org.jboss.axis.message;
import org.jboss.axis.AxisFault;
import org.jboss.axis.Constants;
import org.jboss.axis.description.FaultDesc;
import org.jboss.axis.description.OperationDesc;
import org.jboss.axis.encoding.DeserializationContext;
import org.jboss.axis.encoding.SerializationContext;
import org.jboss.axis.soap.SOAPConstants;
import org.jboss.axis.utils.Messages;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;
import javax.xml.namespace.QName;
import javax.xml.soap.DetailEntry;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFault;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
public class SOAPFaultImpl extends SOAPBodyElementAxisImpl implements SOAPFault
{
protected AxisFault fault;
protected String prefix;
private java.util.Locale locale;
public SOAPFaultImpl(String namespace, String localName, String prefix,
Attributes attrs, DeserializationContext context)
throws AxisFault
{
super(namespace, localName, prefix, attrs, context);
}
public SOAPFaultImpl(AxisFault fault)
{
this.fault = fault;
}
public void outputImpl(SerializationContext context)
throws IOException
{
SOAPConstants soapConstants = context.getMessageContext() == null ?
SOAPConstants.SOAP11_CONSTANTS :
context.getMessageContext().getSOAPConstants();
namespaceURI = soapConstants.getEnvelopeURI();
name = Constants.ELEM_FAULT;
context.registerPrefixForURI(prefix, soapConstants.getEnvelopeURI());
context.startElement(new QName(this.getNamespaceURI(),
this.getName()),
attributes);
if (fault instanceof AxisFault)
{
AxisFault axisFault = fault;
if (axisFault.getFaultCode() != null)
{
if (soapConstants == SOAPConstants.SOAP12_CONSTANTS)
{
String faultCode = context.qName2String(axisFault.getFaultCode());
context.startElement(Constants.QNAME_FAULTCODE_SOAP12, null);
context.startElement(Constants.QNAME_FAULTVALUE_SOAP12, null);
context.writeSafeString(faultCode);
context.endElement();
QName[] subcodes = axisFault.getFaultSubCodes();
if (subcodes != null)
{
for (int i = 0; i < subcodes.length; i++)
{
faultCode = context.qName2String(subcodes[i]);
context.startElement(Constants.QNAME_FAULTSUBCODE_SOAP12, null);
context.startElement(Constants.QNAME_FAULTVALUE_SOAP12, null);
context.writeSafeString(faultCode);
context.endElement();
}
for (int i = 0; i < subcodes.length; i++)
context.endElement();
}
context.endElement();
}
else
{
String faultCode = context.qName2String(axisFault.getFaultCode());
context.startElement(Constants.QNAME_FAULTCODE, null);
context.writeSafeString(faultCode);
context.endElement();
}
}
if (axisFault.getFaultString() != null)
{
if (soapConstants == SOAPConstants.SOAP12_CONSTANTS)
{
context.startElement(Constants.QNAME_FAULTREASON_SOAP12, null);
AttributesImpl attrs = new AttributesImpl();
attrs.addAttribute("http://www.w3.org/XML/1998/namespace", "lang", "xml:lang", "CDATA", "en");
context.startElement(Constants.QNAME_TEXT_SOAP12, attrs);
}
else
context.startElement(Constants.QNAME_FAULTSTRING, null);
context.writeSafeString(axisFault.getFaultString());
context.endElement();
if (soapConstants == SOAPConstants.SOAP12_CONSTANTS)
{
context.endElement();
}
}
if (axisFault.getFaultActor() != null)
{
if (soapConstants == SOAPConstants.SOAP12_CONSTANTS)
context.startElement(Constants.QNAME_FAULTROLE_SOAP12, null);
else
context.startElement(Constants.QNAME_FAULTACTOR, null);
context.writeSafeString(axisFault.getFaultActor());
context.endElement();
}
if (axisFault.getFaultNode() != null)
{
if (soapConstants == SOAPConstants.SOAP12_CONSTANTS)
{
context.startElement(Constants.QNAME_FAULTNODE_SOAP12, null);
context.writeSafeString(axisFault.getFaultNode());
context.endElement();
}
}
QName qname = getFaultQName(fault.getClass(), context);
if (qname == null && fault.detail != null)
{
Class detailClass = fault.detail.getClass();
qname = getFaultQName(detailClass, context);
}
if (qname == null)
{
qname = new QName("", "faultData");
}
if (axisFault.detail != null)
{
if (soapConstants == SOAPConstants.SOAP12_CONSTANTS)
context.startElement(Constants.QNAME_FAULTDETAIL_SOAP12, null);
else
context.startElement(Constants.QNAME_FAULTDETAILS, null);
axisFault.writeDetails(qname, context);
Element[] faultDetails = axisFault.getFaultDetails();
if (faultDetails != null)
{
for (int i = 0; i < faultDetails.length; i++)
{
context.writeDOMElement(faultDetails[i]);
}
}
context.endElement();
}
}
context.endElement();
}
private QName getFaultQName(Class cls, SerializationContext context)
{
FaultDesc faultDesc = getFaultDesc(cls, context);
if (faultDesc != null)
{
return faultDesc.getQName();
}
return null;
}
private QName getFaultXMLType(Class cls, SerializationContext context)
{
FaultDesc faultDesc = getFaultDesc(cls, context);
if (faultDesc != null)
{
return faultDesc.getXmlType();
}
return null;
}
private FaultDesc getFaultDesc(Class cls, SerializationContext context)
{
FaultDesc faultDesc = null;
if (!cls.equals(AxisFault.class))
{
if (context.getMessageContext() != null)
{
OperationDesc op = context.getMessageContext().getOperation();
if (op != null)
{
faultDesc = op.getFaultByClass(cls);
}
}
}
return faultDesc;
}
public AxisFault getFault
()
{
return fault;
}
public void setFault
(AxisFault
fault)
{
this.fault = fault;
}
public void setFaultCode
(String
faultCode) throws SOAPException
{
fault.setFaultCodeAsString(faultCode);
}
public String getFaultCode
()
{
return fault.getFaultCode().getLocalPart();
}
public void setFaultActor
(String
faultActor) throws SOAPException
{
fault.setFaultActor(faultActor);
}
public String getFaultActor
()
{
return fault.getFaultActor();
}
public void setFaultString
(String
faultString) throws SOAPException
{
fault.setFaultString(faultString);
}
public String getFaultString
()
{
return fault.getFaultString();
}
public javax.xml.soap.Detail getDetail
()
{
List children = this.getChildren();
if (children == null || children.size() <= 0)
return null;
for (int i = 0; i < children.size(); i++)
{
Object obj = children.get(i);
if (obj instanceof javax.xml.soap.Detail)
{
return (javax.xml.soap.Detail)obj;
}
}
return null;
}
public javax.xml.soap.Detail addDetail
() throws SOAPException
{
if (getDetail() != null)
{
throw new SOAPException(Messages.getMessage("valuePresent"));
}
DetailImpl detail = convertToDetail(fault);
addChildElement(detail);
return detail;
}
public void setFaultCode
(Name
faultCodeQName) throws SOAPException
{
String uri = faultCodeQName.getURI();
String local = faultCodeQName.getLocalName();
String prefix = faultCodeQName.getPrefix();
this.prefix = prefix;
QName qname = new QName(uri, local);
fault.setFaultCode(qname);
}
public Name getFaultCodeAsName
()
{
QName qname = fault.getFaultCode();
String uri = qname.getNamespaceURI();
String local = qname.getLocalPart();
return new NameImpl(local, prefix, uri);
}
public void setFaultString
(String
faultString, Locale
locale) throws SOAPException
{
fault.setFaultString(faultString);
this.locale = locale;
}
public Locale getFaultStringLocale
()
{
return locale;
}
private static DetailImpl convertToDetail
(AxisFault
fault)
throws SOAPException
{
DetailImpl detail = new DetailImpl(fault);
Element[] darray = fault.getFaultDetails();
for (int i = 0; i < darray.length; i++)
{
Element element = darray[i];
NameImpl name = new NameImpl(element.getLocalName(), element.getPrefix(), element.getNamespaceURI());
DetailEntry detailEntry = detail.addDetailEntry(name);
copyChildren(detailEntry, element);
}
return detail;
}
private static void copyChildren
(SOAPElement
soapElement, Element
domElement)
throws SOAPException
{
org.w3c.dom.NodeList nl = domElement.getChildNodes();
for (int j = 0; j < nl.getLength(); j++)
{
org.w3c.dom.Node childNode = nl.item(j);
if (childNode.getNodeType() == Node.TEXT_NODE)
{
soapElement.addTextNode(childNode.getNodeValue());
break; }
if (childNode.getNodeType() == Node.ELEMENT_NODE)
{
String uri = childNode.getNamespaceURI();
SOAPElement childSoapElement = null;
if (uri == null)
{
childSoapElement = soapElement.addChildElement(childNode.getLocalName
());
}
else
{
childSoapElement = soapElement.addChildElement(childNode.getLocalName(),
childNode.getPrefix(), uri);
}
copyChildren(childSoapElement, (Element)childNode);
}
}
}
}