org.opensaml.ws.soap.util.SOAPHelper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of openws Show documentation
Show all versions of openws Show documentation
The OpenWS library provides a growing set of tools to work with web services at a low level. These tools include
classes for creating and reading SOAP messages, transport-independent clients for connecting to web services,
and various transports for use with those clients.
/*
* Licensed to the University Corporation for Advanced Internet Development,
* Inc. (UCAID) under one or more contributor license agreements. See the
* NOTICE file distributed with this work for additional information regarding
* copyright ownership. The UCAID licenses this file to You under the Apache
* License, Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.opensaml.ws.soap.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import javax.xml.namespace.QName;
import org.opensaml.ws.message.MessageContext;
import org.opensaml.ws.soap.soap11.ActorBearing;
import org.opensaml.ws.soap.soap11.Detail;
import org.opensaml.ws.soap.soap11.EncodingStyleBearing;
import org.opensaml.ws.soap.soap11.Envelope;
import org.opensaml.ws.soap.soap11.Fault;
import org.opensaml.ws.soap.soap11.FaultActor;
import org.opensaml.ws.soap.soap11.FaultCode;
import org.opensaml.ws.soap.soap11.FaultString;
import org.opensaml.ws.soap.soap11.Header;
import org.opensaml.ws.soap.soap11.MustUnderstandBearing;
import org.opensaml.xml.AttributeExtensibleXMLObject;
import org.opensaml.xml.Configuration;
import org.opensaml.xml.XMLObject;
import org.opensaml.xml.XMLObjectBuilderFactory;
import org.opensaml.xml.schema.XSBooleanValue;
import org.opensaml.xml.util.AttributeMap;
import org.opensaml.xml.util.DatatypeHelper;
import org.opensaml.xml.util.LazyList;
import org.opensaml.xml.util.XMLHelper;
/**
* Helper methods for working with SOAP.
*/
public final class SOAPHelper {
/**
* Private constructor.
*/
private SOAPHelper() {
}
/**
* Adds a soap11:mustUnderstand
attribute to the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
* @param mustUnderstand whether mustUnderstand is true or false
*/
public static void addSOAP11MustUnderstandAttribute(XMLObject soapObject, boolean mustUnderstand) {
if (soapObject instanceof MustUnderstandBearing) {
((MustUnderstandBearing) soapObject).setSOAP11MustUnderstand(new XSBooleanValue(mustUnderstand, true));
} else if (soapObject instanceof AttributeExtensibleXMLObject) {
((AttributeExtensibleXMLObject) soapObject).getUnknownAttributes().put(
MustUnderstandBearing.SOAP11_MUST_UNDERSTAND_ATTR_NAME,
new XSBooleanValue(mustUnderstand, true).toString());
} else {
throw new IllegalArgumentException("Specified object was neither MustUnderBearing nor AttributeExtensible");
}
}
/**
* Get the soap11:mustUnderstand
attribute from a given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
*
* @return value of the mustUnderstand attribute, or false if not present
*/
public static boolean getSOAP11MustUnderstandAttribute(XMLObject soapObject) {
if (soapObject instanceof MustUnderstandBearing) {
XSBooleanValue value = ((MustUnderstandBearing) soapObject).isSOAP11MustUnderstandXSBoolean();
if (value != null) {
return value.getValue();
}
}
if (soapObject instanceof AttributeExtensibleXMLObject) {
String value = DatatypeHelper.safeTrimOrNullString(((AttributeExtensibleXMLObject) soapObject)
.getUnknownAttributes().get(MustUnderstandBearing.SOAP11_MUST_UNDERSTAND_ATTR_NAME));
return DatatypeHelper.safeEquals("1", value);
}
return false;
}
/**
* Adds a soap11:actor
attribute to the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
* @param actorURI the URI of the actor
*/
public static void addSOAP11ActorAttribute(XMLObject soapObject, String actorURI) {
if (soapObject instanceof ActorBearing) {
((ActorBearing) soapObject).setSOAP11Actor(actorURI);
} else if (soapObject instanceof AttributeExtensibleXMLObject) {
((AttributeExtensibleXMLObject) soapObject).getUnknownAttributes().put(ActorBearing.SOAP11_ACTOR_ATTR_NAME,
actorURI);
} else {
throw new IllegalArgumentException("Specified object was neither ActorBearing nor AttributeExtensible");
}
}
/**
* Gets the soap11:actor
attribute from a given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
*
* @return the value of the actor attribute, or null if not present
*/
public static String getSOAP11ActorAttribute(XMLObject soapObject) {
String value = null;
if (soapObject instanceof ActorBearing) {
value = DatatypeHelper.safeTrimOrNullString(((ActorBearing) soapObject).getSOAP11Actor());
if (value != null) {
return value;
}
}
if (soapObject instanceof AttributeExtensibleXMLObject) {
value = DatatypeHelper.safeTrimOrNullString(((AttributeExtensibleXMLObject) soapObject)
.getUnknownAttributes().get(ActorBearing.SOAP11_ACTOR_ATTR_NAME));
return value;
}
return null;
}
/**
* Adds a single encoding style to the given SOAP object. If an existing soap11:encodingStyle
attribute
* is present, the given style will be added to the existing list.
*
* @param soapObject the SOAP object to add the attribute to
* @param encodingStyle the encoding style to add
*/
public static void addSOAP11EncodingStyle(XMLObject soapObject, String encodingStyle) {
if (soapObject instanceof EncodingStyleBearing) {
EncodingStyleBearing esb = (EncodingStyleBearing) soapObject;
List list = esb.getSOAP11EncodingStyles();
if (list == null) {
list = new LazyList();
esb.setSOAP11EncodingStyles(list);
}
list.add(encodingStyle);
} else if (soapObject instanceof AttributeExtensibleXMLObject) {
AttributeMap am = ((AttributeExtensibleXMLObject) soapObject).getUnknownAttributes();
String list = am.get(EncodingStyleBearing.SOAP11_ENCODING_STYLE_ATTR_NAME);
if (list == null) {
list = encodingStyle;
} else {
list = list + " " + encodingStyle;
}
am.put(EncodingStyleBearing.SOAP11_ENCODING_STYLE_ATTR_NAME, list);
} else {
throw new IllegalArgumentException(
"Specified object was neither EncodingStyleBearing nor AttributeExtensible");
}
}
/**
* Adds a soap11:encodingStyle
attribute to the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
* @param encodingStyles the list of encoding styles to add
*/
public static void addSOAP11EncodingStyles(XMLObject soapObject, List encodingStyles) {
if (soapObject instanceof EncodingStyleBearing) {
((EncodingStyleBearing) soapObject).setSOAP11EncodingStyles(encodingStyles);
} else if (soapObject instanceof AttributeExtensibleXMLObject) {
((AttributeExtensibleXMLObject) soapObject).getUnknownAttributes().put(
EncodingStyleBearing.SOAP11_ENCODING_STYLE_ATTR_NAME,
DatatypeHelper.listToStringValue(encodingStyles, " "));
} else {
throw new IllegalArgumentException(
"Specified object was neither EncodingStyleBearing nor AttributeExtensible");
}
}
/**
* Gets the list value of the soap11:encodingStyle
attribute from the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
*
* @return the list of encoding styles, or null if not present
*/
public static List getSOAP11EncodingStyles(XMLObject soapObject) {
if (soapObject instanceof EncodingStyleBearing) {
List value = ((EncodingStyleBearing) soapObject).getSOAP11EncodingStyles();
if (value != null) {
return value;
}
}
if (soapObject instanceof AttributeExtensibleXMLObject) {
String value = DatatypeHelper.safeTrimOrNullString(((AttributeExtensibleXMLObject) soapObject)
.getUnknownAttributes().get(EncodingStyleBearing.SOAP11_ENCODING_STYLE_ATTR_NAME));
if (value != null) {
DatatypeHelper.stringToList(value, XMLHelper.LIST_DELIMITERS);
}
}
return null;
}
/**
* Adds the soap12:encodingStyle
attribute to the given soap object.
*
* @param soapObject object to which the encoding style attribute should be added
* @param style the encoding style
*/
public static void addSOAP12EncodingStyleAttribute(XMLObject soapObject, String style) {
if (soapObject instanceof org.opensaml.ws.soap.soap12.EncodingStyleBearing) {
((org.opensaml.ws.soap.soap12.EncodingStyleBearing) soapObject).setSOAP12EncodingStyle(style);
} else if (soapObject instanceof AttributeExtensibleXMLObject) {
((AttributeExtensibleXMLObject) soapObject).getUnknownAttributes().put(
org.opensaml.ws.soap.soap12.EncodingStyleBearing.SOAP12_ENCODING_STYLE_ATTR_NAME, style);
} else {
throw new IllegalArgumentException(
"Specified object was neither EncodingStyleBearing nor AttribtueExtensible");
}
}
/**
* Gets the soap12:encodingStyle
.
*
* @param soapObject the SOAP object which may contain the encoding style
*
* @return the encoding style or null if it is not set on the object
*/
public static String getSOAP12EncodingStyleAttribute(XMLObject soapObject) {
String style = null;
if (soapObject instanceof org.opensaml.ws.soap.soap12.EncodingStyleBearing) {
style = ((org.opensaml.ws.soap.soap12.EncodingStyleBearing) soapObject).getSOAP12EncodingStyle();
}
if (style == null && soapObject instanceof AttributeExtensibleXMLObject) {
style = DatatypeHelper.safeTrimOrNullString(((AttributeExtensibleXMLObject) soapObject)
.getUnknownAttributes().get(
org.opensaml.ws.soap.soap12.EncodingStyleBearing.SOAP12_ENCODING_STYLE_ATTR_NAME));
}
return style;
}
/**
* Adds a soap12:mustUnderstand
attribute to the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
* @param mustUnderstand whether mustUnderstand is true or false
*/
public static void addSOAP12MustUnderstandAttribute(XMLObject soapObject, boolean mustUnderstand) {
if (soapObject instanceof org.opensaml.ws.soap.soap12.MustUnderstandBearing) {
((org.opensaml.ws.soap.soap12.MustUnderstandBearing) soapObject)
.setSOAP12MustUnderstand(new XSBooleanValue(mustUnderstand, false));
} else if (soapObject instanceof AttributeExtensibleXMLObject) {
((AttributeExtensibleXMLObject) soapObject).getUnknownAttributes().put(
org.opensaml.ws.soap.soap12.MustUnderstandBearing.SOAP12_MUST_UNDERSTAND_ATTR_NAME,
new XSBooleanValue(mustUnderstand, false).toString());
} else {
throw new IllegalArgumentException("Specified object was neither MustUnderstandBearing nor AttributeExtensible");
}
}
/**
* Get the soap12:mustUnderstand
attribute from a given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
*
* @return value of the mustUnderstand attribute, or false if not present
*/
public static boolean getSOAP12MustUnderstandAttribute(XMLObject soapObject) {
if (soapObject instanceof org.opensaml.ws.soap.soap12.MustUnderstandBearing) {
XSBooleanValue value = ((org.opensaml.ws.soap.soap12.MustUnderstandBearing) soapObject)
.isSOAP12MustUnderstandXSBoolean();
if (value != null) {
return value.getValue();
}
}
if (soapObject instanceof AttributeExtensibleXMLObject) {
String value = DatatypeHelper.safeTrimOrNullString(((AttributeExtensibleXMLObject) soapObject)
.getUnknownAttributes().get(
org.opensaml.ws.soap.soap12.MustUnderstandBearing.SOAP12_MUST_UNDERSTAND_ATTR_NAME));
return DatatypeHelper.safeEquals("1", value) || DatatypeHelper.safeEquals("true", value);
}
return false;
}
/**
* Adds a soap12:relay
attribute to the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
* @param relay whether relay is true or false
*/
public static void addSOAP12RelayAttribute(XMLObject soapObject, boolean relay) {
if (soapObject instanceof org.opensaml.ws.soap.soap12.RelayBearing) {
((org.opensaml.ws.soap.soap12.RelayBearing) soapObject).setSOAP12Relay(new XSBooleanValue(relay, false));
} else if (soapObject instanceof AttributeExtensibleXMLObject) {
((AttributeExtensibleXMLObject) soapObject).getUnknownAttributes().put(
org.opensaml.ws.soap.soap12.RelayBearing.SOAP12_RELAY_ATTR_NAME,
new XSBooleanValue(relay, false).toString());
} else {
throw new IllegalArgumentException("Specified object was neither RelyBearing nor AttributeExtensible");
}
}
/**
* Get the soap12:relay
attribute from a given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
*
* @return value of the relay attribute, or false if not present
*/
public static boolean getSOAP12RelayAttribute(XMLObject soapObject) {
if (soapObject instanceof org.opensaml.ws.soap.soap12.RelayBearing) {
XSBooleanValue value = ((org.opensaml.ws.soap.soap12.RelayBearing) soapObject).isSOAP12RelayXSBoolean();
if (value != null) {
return value.getValue();
}
}
if (soapObject instanceof AttributeExtensibleXMLObject) {
String value = DatatypeHelper.safeTrimOrNullString(((AttributeExtensibleXMLObject) soapObject)
.getUnknownAttributes().get(org.opensaml.ws.soap.soap12.RelayBearing.SOAP12_RELAY_ATTR_LOCAL_NAME));
return DatatypeHelper.safeEquals("1", value) || DatatypeHelper.safeEquals("true", value);
}
return false;
}
/**
* Adds the soap12:role
attribute to the given soap object.
*
* @param soapObject object to which the rol attribute should be added
* @param role the role
*/
public static void addSOAP12RoleAttribute(XMLObject soapObject, String role) {
if (soapObject instanceof org.opensaml.ws.soap.soap12.RoleBearing) {
((org.opensaml.ws.soap.soap12.RoleBearing) soapObject).setSOAP12Role(role);
} else if (soapObject instanceof AttributeExtensibleXMLObject) {
((AttributeExtensibleXMLObject) soapObject).getUnknownAttributes().put(
org.opensaml.ws.soap.soap12.RoleBearing.SOAP12_ROLE_ATTR_NAME, role);
} else {
throw new IllegalArgumentException(
"Specified object was neither RoleBearing nor AttribtueExtensible");
}
}
/**
* Gets the soap12:role
.
*
* @param soapObject the SOAP object which may contain the role
*
* @return the role or null if it is not set on the object
*/
public static String getSOAP12RoleAttribute(XMLObject soapObject) {
String role = null;
if (soapObject instanceof org.opensaml.ws.soap.soap12.RoleBearing) {
role = ((org.opensaml.ws.soap.soap12.RoleBearing) soapObject).getSOAP12Role();
}
if (role == null && soapObject instanceof AttributeExtensibleXMLObject) {
role = DatatypeHelper.safeTrimOrNullString(((AttributeExtensibleXMLObject) soapObject)
.getUnknownAttributes().get(
org.opensaml.ws.soap.soap12.RoleBearing.SOAP12_ROLE_ATTR_LOCAL_NAME));
}
return role;
}
/**
* Adds a soap11:actor
attribute to the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
* @param actorURI the URI of the actor
*
* @deprecated use instead {@link #addSOAP11ActorAttribute(XMLObject, String)}.
*/
public static void addActorAttribute(XMLObject soapObject, String actorURI) {
addSOAP11ActorAttribute(soapObject, actorURI);
}
/**
* Adds a single encoding style to the given SOAP object. If an existing soap11:encodingStyle
attribute
* is present, the given style will be added to the existing list.
*
* @param soapObject the SOAP object to add the attribute to
* @param encodingStyle the encoding style to add
*
* @deprecated use instead {@link #addSOAP11EncodingStyle(XMLObject, String)}.
*/
public static void addEncodingStyle(XMLObject soapObject, String encodingStyle) {
addSOAP11EncodingStyle(soapObject, encodingStyle);
}
/**
* Adds a soap11:encodingStyle
attribute to the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
* @param encodingStyles the list of encoding styles to add
*
* @deprecated use instead {@link #addSOAP11EncodingStyles(XMLObject, List)}.
*/
public static void addEncodingStyles(XMLObject soapObject, List encodingStyles) {
addSOAP11EncodingStyles(soapObject, encodingStyles);
}
/**
* Adds a soap11:mustUnderstand
attribute to the given SOAP object.
*
* @param soapObject the SOAP object to add the attribute to
* @param mustUnderstand whether mustUnderstand is true or false
*
* @deprecated use instead {@link #addSOAP11MustUnderstandAttribute(XMLObject, boolean)}.
*/
public static void addMustUnderstandAttribute(XMLObject soapObject, boolean mustUnderstand) {
addSOAP11MustUnderstandAttribute(soapObject, mustUnderstand);
}
/**
* Add a header block to the SOAP envelope contained within the specified message context's
* {@link MessageContext#getOutboundMessage()}.
*
* @param messageContext the message context being processed
* @param headerBlock the header block to add
*/
public static void addHeaderBlock(MessageContext messageContext, XMLObject headerBlock) {
XMLObject outboundEnvelope = messageContext.getOutboundMessage();
if (outboundEnvelope == null) {
throw new IllegalArgumentException("Message context does not contain a SOAP envelope");
}
// SOAP 1.1 Envelope
if (outboundEnvelope instanceof Envelope) {
addSOAP11HeaderBlock((Envelope) outboundEnvelope, headerBlock);
}
//TODO SOAP 1.2 support when object providers are implemented
}
/**
* Add a header to the SOAP 1.1 Envelope.
*
* @param envelope the SOAP 1.1 envelope to process
* @param headerBlock the header to add
*/
public static void addSOAP11HeaderBlock(Envelope envelope, XMLObject headerBlock) {
Header envelopeHeader = envelope.getHeader();
if (envelopeHeader == null) {
envelopeHeader = (Header) Configuration.getBuilderFactory().getBuilder(Header.DEFAULT_ELEMENT_NAME)
.buildObject(Header.DEFAULT_ELEMENT_NAME);
envelope.setHeader(envelopeHeader);
}
envelopeHeader.getUnknownXMLObjects().add(headerBlock);
}
/**
* Get a header block from the SOAP envelope contained within the specified message context's
* {@link MessageContext#getInboundMessage()}.
*
* @param msgContext the message context being processed
* @param headerName the name of the header block to return
* @param targetNodes the explicitly specified SOAP node actors (1.1) or roles (1.2) for which the header is desired
* @param isFinalDestination true specifies that headers targeted for message final destination should be returned,
* false means they should not be returned
* @return the list of matching header blocks
*/
public static List getInboundHeaderBlock(MessageContext msgContext, QName headerName,
Set targetNodes, boolean isFinalDestination) {
XMLObject inboundEnvelope = msgContext.getInboundMessage();
if (inboundEnvelope == null) {
throw new IllegalArgumentException("Message context does not contain an inbound SOAP envelope");
}
// SOAP 1.1 Envelope
if (inboundEnvelope instanceof Envelope) {
return getSOAP11HeaderBlock((Envelope) inboundEnvelope, headerName, targetNodes, isFinalDestination);
}
//TODO SOAP 1.2 support when object providers are implemented
return Collections.emptyList();
}
/**
* Get a header block from the SOAP envelope contained within the specified message context's
* {@link MessageContext#getOutboundMessage()}.
*
* @param msgContext the message context being processed
* @param headerName the name of the header block to return
* @param targetNodes the explicitly specified SOAP node actors (1.1) or roles (1.2) for which the header is desired
* @param isFinalDestination true specifies that headers targeted for message final destination should be returned,
* false specifies they should not be returned
* @return the list of matching header blocks
*/
public static List getOutboundHeaderBlock(MessageContext msgContext, QName headerName,
Set targetNodes, boolean isFinalDestination) {
XMLObject outboundEnvelope = msgContext.getOutboundMessage();
if (outboundEnvelope == null) {
throw new IllegalArgumentException("Message context does not contain an outbound SOAP envelope");
}
// SOAP 1.1 Envelope
if (outboundEnvelope instanceof Envelope) {
return getSOAP11HeaderBlock((Envelope) outboundEnvelope, headerName, targetNodes, isFinalDestination);
}
//TODO SOAP 1.2 support when object providers are implemented
return Collections.emptyList();
}
/**
* Get a header block from the SOAP 1.1 envelope.
*
* @param envelope the SOAP 1.1 envelope to process
* @param headerName the name of the header block to return
* @param targetNodes the explicitly specified SOAP node actors for which the header is desired
* @param isFinalDestination true specifies that headers targeted for message final destination should be returned,
* false specifies they should not be returned
* @return the list of matching header blocks
*/
public static List getSOAP11HeaderBlock(Envelope envelope, QName headerName, Set targetNodes,
boolean isFinalDestination) {
Header envelopeHeader = envelope.getHeader();
if (envelopeHeader == null) {
return Collections.emptyList();
}
ArrayList headers = new ArrayList();
for (XMLObject header : envelopeHeader.getUnknownXMLObjects(headerName)) {
if (isSOAP11HeaderTargetedToNode(header, targetNodes, isFinalDestination)) {
headers.add(header);
}
}
return headers;
}
/**
* Evaluate whether the specified header block is targeted to a SOAP 1.1 node given the specified
* parameters.
*
* @param header the header to evaluate
* @param nodeActors the explicitly specified node actors for which the header is desired
* @param isFinalDestination true specifies that headers targeted for message final destination should be returned,
* false specifies they should not be returned
* @return the list of matching header blocks
*/
public static boolean isSOAP11HeaderTargetedToNode(XMLObject header, Set nodeActors,
boolean isFinalDestination) {
String headerActor = getSOAP11ActorAttribute(header);
if (headerActor == null) {
if (isFinalDestination) {
return true;
}
} else if (ActorBearing.SOAP11_ACTOR_NEXT.equals(headerActor)) {
return true;
} else if (nodeActors != null && nodeActors.contains(headerActor)) {
return true;
}
return false;
}
/**
* Determine whether the inbound message represented by the message context
* contains a SOAP Envelope.
*
* @param messageContext the current message context
* @return true if the inbound message contains a SOAP Envelope, false otherwise
*/
public static boolean isInboundSOAPMessage(MessageContext messageContext) {
XMLObject inboundMessage = messageContext.getInboundMessage();
if (inboundMessage == null) {
return false;
}
// SOAP 1.1 Envelope
if (inboundMessage instanceof Envelope) {
return true;
}
//TODO SOAP 1.2 support when object providers are implemented
return false;
}
/**
* Build a SOAP 1.1. Fault element.
*
* @param faultCode the 'faultcode' QName (required)
* @param faultString the 'faultstring' value (required)
* @param faultActor the 'faultactor' value (may be null)
* @param detailChildren the 'detail' child elements
* @param detailAttributes the 'detail' element attributes
* @return the new Fault element object
*/
public static Fault buildSOAP11Fault(QName faultCode, String faultString, String faultActor,
List detailChildren, Map detailAttributes) {
if (faultCode == null) {
throw new IllegalArgumentException("Argument for 'faultcode' may not be null");
}
if (faultString == null) {
throw new IllegalArgumentException("Argument for 'faultstring' may not be null");
}
XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory();
Fault faultObj = (Fault) builderFactory.getBuilder(Fault.DEFAULT_ELEMENT_NAME)
.buildObject(Fault.DEFAULT_ELEMENT_NAME);
FaultCode faultCodeObj = (FaultCode) builderFactory.getBuilder(FaultCode.DEFAULT_ELEMENT_NAME)
.buildObject(FaultCode.DEFAULT_ELEMENT_NAME);
FaultString faultStringObj = (FaultString) builderFactory.getBuilder(FaultString.DEFAULT_ELEMENT_NAME)
.buildObject(FaultString.DEFAULT_ELEMENT_NAME);
faultCodeObj.setValue(faultCode);
faultObj.setCode(faultCodeObj);
faultStringObj.setValue(faultString);
faultObj.setMessage(faultStringObj);
if (faultActor != null) {
FaultActor faultActorObj = (FaultActor) builderFactory.getBuilder(FaultActor.DEFAULT_ELEMENT_NAME)
.buildObject(FaultActor.DEFAULT_ELEMENT_NAME);
faultActorObj.setValue(faultActor);
faultObj.setActor(faultActorObj);
}
Detail detailObj = null;
if (detailChildren != null && !detailChildren.isEmpty()) {
detailObj = (Detail) builderFactory.getBuilder(Detail.DEFAULT_ELEMENT_NAME)
.buildObject(Detail.DEFAULT_ELEMENT_NAME);
for (XMLObject xo : detailChildren) {
if (xo != null) {
detailObj.getUnknownXMLObjects().add(xo);
}
}
}
if (detailAttributes != null && !detailAttributes.isEmpty()) {
if (detailObj == null) {
detailObj = (Detail) builderFactory.getBuilder(Detail.DEFAULT_ELEMENT_NAME)
.buildObject(Detail.DEFAULT_ELEMENT_NAME);
}
for (Entry entry : detailAttributes.entrySet()) {
if (entry.getKey() != null && entry.getValue() != null) {
detailObj.getUnknownAttributes().put(entry.getKey(), entry.getValue());
}
}
}
if (detailObj != null &&
(!detailObj.getUnknownXMLObjects().isEmpty() || !detailObj.getUnknownAttributes().isEmpty())) {
faultObj.setDetail(detailObj);
}
return faultObj;
}
}