Element subchild = DomUtil.getFirstChildElement(child);
if (subchild != null) {
details = new DOMSource(subchild);
subchild = DomUtil.getNextSiblingElement(subchild);
if (subchild != null) {
throw new SoapFault(SoapFault.RECEIVER, "Multiple elements are not supported in Detail");
}
}
child = DomUtil.getNextSiblingElement(child);
childname = DomUtil.getQName(child);
}
// Nothing should be left
if (childname != null) {
throw new SoapFault(SoapFault.SENDER, "Unexpected element: " + childname);
}
// Parse soap 1.2 faults
} else {
// Fault code
Element child = DomUtil.getFirstChildElement(element);
checkElementName(child, SoapConstants.SOAP_12_FAULTCODE);
Element subchild = DomUtil.getFirstChildElement(child);
checkElementName(subchild, SoapConstants.SOAP_12_FAULTVALUE);
code = DomUtil.createQName(subchild, DomUtil.getElementText(subchild));
if (!SoapConstants.SOAP_12_CODE_DATAENCODINGUNKNOWN.equals(code) &&
!SoapConstants.SOAP_12_CODE_MUSTUNDERSTAND.equals(code) &&
!SoapConstants.SOAP_12_CODE_RECEIVER.equals(code) &&
!SoapConstants.SOAP_12_CODE_SENDER.equals(code) &&
!SoapConstants.SOAP_12_CODE_VERSIONMISMATCH.equals(code)) {
throw new SoapFault(SoapFault.SENDER, "Unexpected fault code: " + code);
}
subchild = DomUtil.getNextSiblingElement(subchild);
if (subchild != null) {
checkElementName(subchild, SoapConstants.SOAP_12_FAULTSUBCODE);
Element subsubchild = DomUtil.getFirstChildElement(subchild);
checkElementName(subsubchild, SoapConstants.SOAP_12_FAULTVALUE);
subcode = DomUtil.createQName(subsubchild, DomUtil.getElementText(subsubchild));
subsubchild = DomUtil.getNextSiblingElement(subsubchild);
if (subsubchild != null) {
checkElementName(subsubchild, SoapConstants.SOAP_12_FAULTSUBCODE);
throw new SoapFault(SoapFault.RECEIVER, "Unsupported nested subcodes");
}
}
// Fault reason
child = DomUtil.getNextSiblingElement(child);
checkElementName(child, SoapConstants.SOAP_12_FAULTREASON);
subchild = DomUtil.getFirstChildElement(child);
checkElementName(subchild, SoapConstants.SOAP_12_FAULTTEXT);
reason = DomUtil.getElementText(subchild);
subchild = DomUtil.getNextSiblingElement(subchild);
if (subchild != null) {
throw new SoapFault(SoapFault.RECEIVER, "Unsupported multiple reasons");
}
// Fault node
child = DomUtil.getNextSiblingElement(child);
QName childname = DomUtil.getQName(child);
if (SoapConstants.SOAP_12_FAULTNODE.equals(childname)) {
node = URI.create(DomUtil.getElementText(child));
child = DomUtil.getNextSiblingElement(child);
childname = DomUtil.getQName(child);
}
// Fault role
if (SoapConstants.SOAP_12_FAULTROLE.equals(childname)) {
role = URI.create(DomUtil.getElementText(child));
child = DomUtil.getNextSiblingElement(child);
childname = DomUtil.getQName(child);
}
// Fault details
if (SoapConstants.SOAP_12_FAULTDETAIL.equals(childname)) {
subchild = DomUtil.getFirstChildElement(child);
if (subchild != null) {
details = new DOMSource(subchild);
subchild = DomUtil.getNextSiblingElement(subchild);
if (subchild != null) {
throw new SoapFault(SoapFault.RECEIVER, "Multiple elements are not supported in Detail");
}
}
child = DomUtil.getNextSiblingElement(child);
childname = DomUtil.getQName(child);
}
// Nothing should be left
if (childname != null) {
throw new SoapFault(SoapFault.SENDER, "Unexpected element: " + childname);
}
}
return new SoapFault(code, subcode, reason, node, role, details);
}