/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.support.wsa; import com.eviware.soapui.SoapUI; import com.eviware.soapui.config.AnonymousTypeConfig; import com.eviware.soapui.config.MustUnderstandTypeConfig; import com.eviware.soapui.config.WsaVersionTypeConfig; import com.eviware.soapui.impl.wsdl.WsdlOperation; import com.eviware.soapui.impl.wsdl.mock.WsdlMockRequest; import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse; import com.eviware.soapui.impl.wsdl.submit.transports.http.ExtendedHttpMethod; import com.eviware.soapui.impl.wsdl.support.soap.SoapUtils; import com.eviware.soapui.impl.wsdl.support.soap.SoapVersion; import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlUtils; import com.eviware.soapui.model.propertyexpansion.PropertyExpander; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext; import com.eviware.soapui.settings.WsaSettings; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.xml.XmlUtils; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import java.io.IOException; import java.util.ArrayList; import java.util.UUID; /** * WS Addressing-related utility-methods.. * <p/> * ws-a Action element is created according to rules specified at {@link} * http://www.w3.org/TR/2007/REC-ws-addr-metadata-20070904/#actioninwsdl {@link} * http://www.w3.org/TR/2006/WD-ws-addr-wsdl-20060216/#actioninwsdl for * explicitly using soap action check Global WS-A settings Soap action * overides... * * @author dragica.soldo */ public class WsaUtils { public static final String WS_A_NAMESPACE_200508 = "http://www.w3.org/2005/08/addressing"; public static final String WS_A_NAMESPACE_200408 = "http://schemas.xmlsoap.org/ws/2004/08/addressing"; /* * see http://www.w3.org/TR/2006/WD-ws-addr-wsdl-20060216/#actioninwsdl */ public static final String WS_A_NAMESPACE_200602 = "http://www.w3.org/2006/02/addressing/wsdl"; public static final String WS_A_NAMESPACE_200605 = "http://www.w3.org/2006/05/addressing/wsdl"; /* * see http://www.w3.org/TR/2007/REC-ws-addr-metadata-20070904/#actioninwsdl */ public static final String WS_A_NAMESPACE_200705 = "http://www.w3.org/2007/05/addressing/metadata"; public static final String[] wsaNamespaces = {WS_A_NAMESPACE_200705, WS_A_NAMESPACE_200508, WS_A_NAMESPACE_200408, WS_A_NAMESPACE_200605, WS_A_NAMESPACE_200602}; SoapVersion soapVersion; WsdlOperation operation; WsaBuilder builder; XmlObject xmlContentObject; // element to add every property to Element envelopeElement; String wsaVersionNameSpace; String wsaPrefix = null; String wsaVersionNamespaceOld = null; String anonymousType; String anonymousAddress; String noneAddress; String relationshipTypeReply; // used for mock response relates to if request.messageId not specified String unspecifiedMessage; String content; // needed for checking if ws-a already applied before XmlObject xmlHeaderObject; ArrayList<Node> headerWsaElementList; private final PropertyExpansionContext context; public WsaUtils(String content, SoapVersion soapVersion, WsdlOperation operation, PropertyExpansionContext context) { this.soapVersion = soapVersion; this.operation = operation; this.content = content; this.context = context; try { // xmlContentObject = XmlObject.Factory.parse( content ); xmlContentObject = XmlUtils.createXmlObject(content); } catch (Exception e) { SoapUI.logError(e); } } private Element getHeader(WsaContainer wsaContainer) throws XmlException { // version="2005/08" is default wsaVersionNameSpace = WS_A_NAMESPACE_200508; if (wsaContainer.getWsaConfig().getVersion().equals(WsaVersionTypeConfig.X_200408.toString())) { wsaVersionNameSpace = WS_A_NAMESPACE_200408; } anonymousAddress = wsaVersionNameSpace + "/anonymous"; noneAddress = wsaVersionNameSpace + "/none"; relationshipTypeReply = wsaVersionNameSpace + "/reply"; unspecifiedMessage = wsaVersionNameSpace + "/unspecified"; anonymousType = wsaContainer.getOperation().getAnonymous(); // if optional at operation level, check policy specification on // interface // level if (anonymousType.equals(AnonymousTypeConfig.OPTIONAL.toString())) { anonymousType = wsaContainer.getOperation().getInterface().getAnonymous(); } Element header = (Element) SoapUtils.getHeaderElement(xmlContentObject, soapVersion, true).getDomNode(); wsaPrefix = XmlUtils.findPrefixForNamespace(header, WsaUtils.WS_A_NAMESPACE_200508); if (wsaPrefix != null) { wsaVersionNamespaceOld = WsaUtils.WS_A_NAMESPACE_200508; } else { wsaPrefix = XmlUtils.findPrefixForNamespace(header, WsaUtils.WS_A_NAMESPACE_200408); if (wsaPrefix != null) { wsaVersionNamespaceOld = WsaUtils.WS_A_NAMESPACE_200408; } else { wsaPrefix = XmlUtils.findPrefixForNamespace(header, WsaUtils.WS_A_NAMESPACE_200508); if (wsaPrefix != null) { wsaVersionNamespaceOld = WsaUtils.WS_A_NAMESPACE_200508; } else { wsaPrefix = XmlUtils.findPrefixForNamespace(header, WsaUtils.WS_A_NAMESPACE_200408); if (wsaPrefix != null) { wsaVersionNamespaceOld = WsaUtils.WS_A_NAMESPACE_200408; } else { wsaPrefix = "wsa"; } } } } XmlObject[] envelope = xmlContentObject.selectChildren(soapVersion.getEnvelopeQName()); envelopeElement = (Element) envelope[0].getDomNode(); Boolean mustUnderstand = null; if (wsaContainer.getWsaConfig().getMustUnderstand().equals(MustUnderstandTypeConfig.FALSE.toString())) { mustUnderstand = false; } else if (wsaContainer.getWsaConfig().getMustUnderstand().equals(MustUnderstandTypeConfig.TRUE.toString())) { mustUnderstand = true; } builder = new WsaBuilder(wsaVersionNameSpace, mustUnderstand); return header; } private Node getWsaProperty(Element header, String elementLocalName) { NodeList elmList = header.getElementsByTagName(elementLocalName); // NodeList elmList = header.getElementsByTagNameNS(namespaceURI, // localName); Node elm = null; if (elmList.getLength() > 0) { elm = elmList.item(0); } return elm; } private Element removeWsaProperty(boolean overrideExisting, Element header, String elementLocalName) { if (overrideExisting) { NodeList elmList = header.getElementsByTagName(elementLocalName); Node elm = null; if (elmList.getLength() > 0) { elm = elmList.item(0); } if (elm != null) { header.removeChild(elm); } } return header; } /** * Processing ws-a property * * @param header - header element to add wsa to * @param override - indicates if existing parameters should be overriden with new * values * @param elementLocalName - property string to add, for instance: any:Action, or * any:ReplyTo * @param wsaPropValue - wsa property value, inserted in input box, or default * generated * @param address - indicates if property is an endpoint reference, i.e. if it has * <address> tag inside itself * @param refParamsContent - the content of ReferenceParameters for specific endpoint * reference, null if property is an absolute IRI */ private Element processWsaProperty(Element header, boolean override, String elementLocalName, String wsaPropValue, boolean address, String refParamsContent) { boolean existsWsa = getWsaProperty(header, elementLocalName) != null ? true : false; if (override) { if (existsWsa) { header = removeWsaProperty(override, header, elementLocalName); } if (address) { header.appendChild(builder.createWsaAddressChildElement(elementLocalName, envelopeElement, wsaPropValue, refParamsContent)); } else { header.appendChild(builder.createWsaChildElement(elementLocalName, envelopeElement, wsaPropValue)); } } else if (!existsWsa) { if (address) { header.appendChild(builder.createWsaAddressChildElement(elementLocalName, envelopeElement, wsaPropValue, refParamsContent)); } else { header.appendChild(builder.createWsaChildElement(elementLocalName, envelopeElement, wsaPropValue)); } } return header; } private Element processWsaProperty(Element header, boolean override, String elementLocalName, String wsaPropValue, boolean address) { return processWsaProperty(header, override, elementLocalName, wsaPropValue, address, null); } private Element processWsaRelatesToProperty(Element header, boolean override, String elementLocalName, String relationshipType, String relatesTo) { boolean existsWsa = getWsaProperty(header, elementLocalName) != null ? true : false; if (override) { if (existsWsa) { header = removeWsaProperty(override, header, elementLocalName); } header.appendChild(builder.createRelatesToElement(wsaPrefix + ":RelatesTo", envelopeElement, relationshipType, relatesTo)); } else if (!existsWsa) { header.appendChild(builder.createRelatesToElement(wsaPrefix + ":RelatesTo", envelopeElement, relationshipType, relatesTo)); } return header; } public String removeWSAddressing(WsaContainer wsaContainer) { try { Element header = getHeader(wsaContainer); NodeList headerProps = XmlUtils.getChildElements(header); for (int i = 0; i < headerProps.getLength(); i++) { Node headerChild = headerProps.item(i); if (headerChild.getNamespaceURI().equals(wsaVersionNameSpace)) { header.removeChild(headerChild); } } content = xmlContentObject.xmlText(); } catch (XmlException e) { SoapUI.logError(e); } return content; } public String addWSAddressingRequest(WsaContainer wsaContainer) { return addWSAddressingRequest(wsaContainer, null); } public String addWSAddressingRequest(WsaContainer wsaContainer, ExtendedHttpMethod httpMethod) { return createNewWSAddressingRequest(wsaContainer, httpMethod, SoapUI.getSettings().getBoolean(WsaSettings.OVERRIDE_EXISTING_HEADERS)); } private String createNewWSAddressingRequest(WsaContainer wsaContainer, ExtendedHttpMethod httpMethod, boolean override) { try { Element header = getHeader(wsaContainer); if (override || wsaVersionNamespaceOld == null) { header.setAttribute("xmlns:" + wsaPrefix, wsaVersionNameSpace); } String action = null; if (wsaContainer.getWsaConfig().isAddDefaultAction()) { action = WsdlUtils.getDefaultWsaAction(wsaContainer.getOperation(), false); } else { action = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getAction()); } if (!StringUtils.isNullOrEmpty(action)) { header = processWsaProperty(header, override, wsaPrefix + ":Action", action, false); } String replyTo = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getReplyTo()); String replyToRefParams = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig() .getReplyToRefParams()); if (AnonymousTypeConfig.REQUIRED.toString().equals(anonymousType)) // TODO check if WsaSettings.USE_DEFAULT_REPLYTO is needed // considering // anonymous added // && // SoapUI.getSettings().getBoolean(WsaSettings.USE_DEFAULT_REPLYTO)) { header = processWsaProperty(header, override, wsaPrefix + ":ReplyTo", anonymousAddress, true, replyToRefParams); } else if (!StringUtils.isNullOrEmpty(replyTo)) { if (!(AnonymousTypeConfig.PROHIBITED.toString().equals(anonymousType) && isAnonymousAddress(replyTo, wsaVersionNameSpace))) { header = processWsaProperty(header, override, wsaPrefix + ":ReplyTo", replyTo, true, replyToRefParams); } } // TODO removed option for the purpose of wstf testing(echo 1.6 for // instance needs to have faultTo and no replyTo) // see how to handle this if needed (commented by Dragica 20.10.08.) // else if (operation.isRequestResponse()) // { // //for request-response replyTo is mandatory, set it to none if // anonymous prohibited // if // (!AnonymousTypeConfig.PROHIBITED.toString().equals(anonymousType)) // { // header = processWsaProperty(header, override, wsaPrefix + // ":ReplyTo", anonymousAddress, true, replyToRefParams); // } else { // header = processWsaProperty(header, override, wsaPrefix + // ":ReplyTo", noneAddress, true, replyToRefParams); // } // } String from = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getFrom()); if (!StringUtils.isNullOrEmpty(from)) { header = processWsaProperty(header, override, wsaPrefix + ":From", from, true); } String faultTo = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getFaultTo()); String faultToRefParams = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig() .getFaultToRefParams()); if (!StringUtils.isNullOrEmpty(faultTo)) { header = processWsaProperty(header, override, wsaPrefix + ":FaultTo", faultTo, true, faultToRefParams); } String relatesTo = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getRelatesTo()); String relationshipType = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig() .getRelationshipType()); if (!StringUtils.isNullOrEmpty(relationshipType) && !StringUtils.isNullOrEmpty(relatesTo)) { header = processWsaRelatesToProperty(header, override, wsaPrefix + ":RelatesTo", relationshipType, relatesTo); } if (wsaContainer.getWsaConfig().isGenerateMessageId()) { String generatedMessageId = "uuid:" + UUID.randomUUID().toString(); header = processWsaProperty(header, override, wsaPrefix + ":MessageID", generatedMessageId, false); } else { String msgId = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getMessageID()); if (!StringUtils.isNullOrEmpty(msgId)) { header = processWsaProperty(header, override, wsaPrefix + ":MessageID", msgId, false); } } if (httpMethod != null && wsaContainer.getWsaConfig().isAddDefaultTo()) { String defaultTo = httpMethod.getURI().toString(); header = processWsaProperty(header, override, wsaPrefix + ":To", defaultTo, false); } else { String to = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getTo()); if (!StringUtils.isNullOrEmpty(to)) { header = processWsaProperty(header, override, wsaPrefix + ":To", to, false); } } content = xmlContentObject.xmlText(); } catch (Exception e) { SoapUI.logError(e); } return content; } /** * Adds ws-a headers to mock response from editor-menu in this case there is * no request included and only values from ws-a inspector, if any, are used * * @param wsaContainer * @return */ public String addWSAddressingMockResponse(WsaContainer wsaContainer) { return addWSAddressingMockResponse(wsaContainer, null); } public String addWSAddressingMockResponse(WsaContainer wsaContainer, WsdlMockRequest request) { return createWSAddressingMockResponse(wsaContainer, request, SoapUI.getSettings().getBoolean(WsaSettings.OVERRIDE_EXISTING_HEADERS)); } private String createWSAddressingMockResponse(WsaContainer wsaContainer, WsdlMockRequest request, boolean override) { try { Element header = getHeader(wsaContainer); if (override || wsaVersionNamespaceOld == null) { header.setAttribute("xmlns:" + wsaPrefix, wsaVersionNameSpace); } String action = null; if (wsaContainer.getWsaConfig().isAddDefaultAction()) { action = WsdlUtils.getDefaultWsaAction(wsaContainer.getOperation(), true); } else { action = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getAction()); } if (!StringUtils.isNullOrEmpty(action)) { header = processWsaProperty(header, override, wsaPrefix + ":Action", action, false); } if (AnonymousTypeConfig.REQUIRED.toString().equals(anonymousType)) { header = processWsaProperty(header, override, wsaPrefix + ":ReplyTo", anonymousAddress, true); } else { String replyTo = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getReplyTo()); String replyToRefParams = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig() .getReplyToRefParams()); if (!StringUtils.isNullOrEmpty(replyTo)) { header = processWsaProperty(header, override, wsaPrefix + ":ReplyTo", replyTo, true, replyToRefParams); } } Element requestHeader = null; if (request != null) { XmlObject requestXmlObject = request.getRequestXmlObject(); String requestWsaVersionNameSpace = WsaValidator.getWsaVersion(requestXmlObject, request.getSoapVersion()); requestHeader = (Element) SoapUtils.getHeaderElement(requestXmlObject, request.getSoapVersion(), true) .getDomNode(); // request.messageId = mockResponse.relatesTo so get it Element msgNode = XmlUtils.getFirstChildElementNS(requestHeader, requestWsaVersionNameSpace, "MessageID"); String requestMessageId = null; if (msgNode != null) { requestMessageId = XmlUtils.getElementText(msgNode); } String from = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getFrom()); if (!StringUtils.isNullOrEmpty(from)) { header = processWsaProperty(header, override, wsaPrefix + ":From", from, true); } String faultTo = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getFaultTo()); String faultToRefParams = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig() .getFaultToRefParams()); if (!StringUtils.isNullOrEmpty(faultTo)) { header = processWsaProperty(header, override, wsaPrefix + ":FaultTo", faultTo, true, faultToRefParams); } String relationshipType = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig() .getRelationshipType()); if (!StringUtils.isNullOrEmpty(relationshipType)) { if (!StringUtils.isNullOrEmpty(requestMessageId)) { header = processWsaRelatesToProperty(header, override, wsaPrefix + ":RelatesTo", relationshipType, requestMessageId); } else if (SoapUI.getSettings().getBoolean(WsaSettings.USE_DEFAULT_RELATES_TO)) { // if request.messageId not specified use // unspecifiedMessage header = processWsaRelatesToProperty(header, override, wsaPrefix + ":RelatesTo", relationshipType, unspecifiedMessage); } } else if (wsaContainer instanceof WsdlMockResponse) { if (SoapUI.getSettings().getBoolean(WsaSettings.USE_DEFAULT_RELATIONSHIP_TYPE)) { if (!StringUtils.isNullOrEmpty(requestMessageId)) { header = processWsaRelatesToProperty(header, override, wsaPrefix + ":RelatesTo", relationshipTypeReply, requestMessageId); } else if (SoapUI.getSettings().getBoolean(WsaSettings.USE_DEFAULT_RELATES_TO)) { // if request.messageId not specified use // unspecifiedMessage header = processWsaRelatesToProperty(header, override, wsaPrefix + ":RelatesTo", relationshipTypeReply, unspecifiedMessage); } } } // request.replyTo = mockResponse.to so get it Element replyToNode = XmlUtils .getFirstChildElementNS(requestHeader, requestWsaVersionNameSpace, "ReplyTo"); String requestReplyToValue = null; if (replyToNode != null) { Element replyToAddresseNode = XmlUtils.getFirstChildElementNS(replyToNode, requestWsaVersionNameSpace, "Address"); if (replyToAddresseNode != null) { requestReplyToValue = XmlUtils.getElementText(replyToAddresseNode); } } String to = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getTo()); if (!StringUtils.isNullOrEmpty(to)) { if (!(AnonymousTypeConfig.PROHIBITED.toString().equals(anonymousType) && isAnonymousAddress(to, wsaVersionNameSpace))) { header = processWsaProperty(header, override, wsaPrefix + ":To", to, false); } } else { // if to not specified but wsa:to mandatory get default // value if (!StringUtils.isNullOrEmpty(requestReplyToValue)) { // if anonymous prohibited than default anonymous should // not // be added if (!(AnonymousTypeConfig.PROHIBITED.toString().equals(anonymousType) && isAnonymousAddress( requestReplyToValue, wsaVersionNameSpace))) { header = processWsaProperty(header, override, wsaPrefix + ":To", requestReplyToValue, false); } } } } else { String to = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getTo()); if (!StringUtils.isNullOrEmpty(to)) { // header = removeWsaProperty(override, header, wsaPrefix + // ":To"); // header.appendChild(builder.createWsaAddressChildElement(wsaPrefix // + ":To", envelopeElement, to)); header = processWsaProperty(header, override, wsaPrefix + ":To", to, false); } String relationshipType = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig() .getRelationshipType()); String relatesTo = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getRelatesTo()); if (!StringUtils.isNullOrEmpty(relationshipType) && !StringUtils.isNullOrEmpty(relatesTo)) { header = processWsaRelatesToProperty(header, override, wsaPrefix + ":RelatesTo", relationshipType, relatesTo); } else if (wsaContainer instanceof WsdlMockResponse) { if (SoapUI.getSettings().getBoolean(WsaSettings.USE_DEFAULT_RELATIONSHIP_TYPE)) { if (!StringUtils.isNullOrEmpty(relatesTo)) { header = processWsaRelatesToProperty(header, override, wsaPrefix + ":RelatesTo", relationshipTypeReply, relatesTo); } else if (SoapUI.getSettings().getBoolean(WsaSettings.USE_DEFAULT_RELATES_TO)) { header = processWsaRelatesToProperty(header, override, wsaPrefix + ":RelatesTo", relationshipTypeReply, unspecifiedMessage); } } } } if (wsaContainer.getWsaConfig().isGenerateMessageId()) { String generatedMessageId = "uuid:" + UUID.randomUUID().toString(); header = processWsaProperty(header, override, wsaPrefix + ":MessageID", generatedMessageId, false); } else { String msgId = PropertyExpander.expandProperties(context, wsaContainer.getWsaConfig().getMessageID()); if (!StringUtils.isNullOrEmpty(msgId)) { header = processWsaProperty(header, override, wsaPrefix + ":MessageID", msgId, false); } } content = xmlContentObject.xmlText(); } catch (XmlException e) { SoapUI.logError(e); } return content; } public class WsaBuilder { private final String wsaVersionNameSpace; private final Boolean mustUnderstand; public WsaBuilder(String wsaVersionNameSpace, Boolean mustUnderstand) { // TODO Auto-generated constructor stub this.wsaVersionNameSpace = wsaVersionNameSpace; this.mustUnderstand = mustUnderstand; } public Element createWsaChildElement(String elementName, Element addToElement, String wsaProperty) { Element wsaElm = addToElement.getOwnerDocument().createElementNS(wsaVersionNameSpace, elementName); Text txtElm = addToElement.getOwnerDocument().createTextNode(wsaProperty); if (mustUnderstand != null) { wsaElm.setAttributeNS(soapVersion.getEnvelopeNamespace(), "mustUnderstand", mustUnderstand ? "1" : "0"); } wsaElm.appendChild(txtElm); return wsaElm; } public Element createWsaAddressChildElement(String elementName, Element addToElement, String wsaProperty, String refParamsContent) { Document document = addToElement.getOwnerDocument(); Element wsAddressElm = document.createElementNS(wsaVersionNameSpace, wsaPrefix + ":Address"); Element wsaElm = document.createElementNS(wsaVersionNameSpace, elementName); Text propertyContent = document.createTextNode(wsaProperty); if (mustUnderstand != null) { wsaElm.setAttributeNS(soapVersion.getEnvelopeNamespace(), "mustUnderstand", mustUnderstand ? "1" : "0"); } wsAddressElm.appendChild(propertyContent); wsaElm.appendChild(wsAddressElm); try { if (refParamsContent != null) { // Text propertyRefParamsContent = // document.createTextNode(refParamsContent); Element refParamsElm = document .createElementNS(wsaVersionNameSpace, wsaPrefix + ":ReferenceParameters"); refParamsContent = "<dummy>" + refParamsContent + "</dummy>"; Node xx = document.importNode(XmlUtils.parseXml(refParamsContent).getDocumentElement(), true); NodeList xxList = xx.getChildNodes(); // refParamsElm.appendChild(propertyRefParamsContent); for (int i = 0; i < xxList.getLength(); i++) { refParamsElm.appendChild(xxList.item(i)); } wsaElm.appendChild(refParamsElm); } } catch (DOMException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return wsaElm; } public Element createRelatesToElement(String elementName, Element addToElement, String relationshipType, String relatesTo) { Element wsaElm = addToElement.getOwnerDocument().createElementNS(wsaVersionNameSpace, elementName); wsaElm.setAttribute("RelationshipType", relationshipType); Text txtElm = addToElement.getOwnerDocument().createTextNode(relatesTo); if (mustUnderstand != null) { wsaElm.setAttributeNS(soapVersion.getEnvelopeNamespace(), "mustUnderstand", mustUnderstand ? "1" : "0"); } wsaElm.appendChild(txtElm); return wsaElm; } } public static boolean isAnonymousAddress(String address, String wsaVersionNamespace) { return (address.equals(wsaVersionNamespace + "/anonymous")) ? true : false; } public static boolean isNoneAddress(String address, String wsaVersionNamespace) { return (address.equals(wsaVersionNamespace + "/none")) ? true : false; } public static String getNamespace(String Version) { if (Version.equals(WsaVersionTypeConfig.X_200408.toString())) { return WS_A_NAMESPACE_200408; } return WS_A_NAMESPACE_200508; } }