/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved * * The contents of this file are subject to the terms * of the Common Development and Distribution License * (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at * https://opensso.dev.java.net/public/CDDLv1.0.html or * opensso/legal/CDDLv1.0.txt * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at opensso/legal/CDDLv1.0.txt. * If applicable, add the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * $Id: DSTClient.java,v 1.5 2008/12/16 01:48:32 exu Exp $ * */ package com.sun.identity.liberty.ws.dst; import com.sun.identity.liberty.ws.security.SecurityAssertion; import com.sun.identity.liberty.ws.common.wsse.BinarySecurityToken; import com.sun.identity.liberty.ws.disco.EncryptedResourceID; import com.sun.identity.liberty.ws.disco.ResourceOffering; import com.sun.identity.liberty.ws.disco.ServiceInstance; import com.sun.identity.liberty.ws.disco.Description; import com.sun.identity.liberty.ws.disco.ResourceID; import com.sun.identity.liberty.ws.soapbinding.Message; import com.sun.identity.liberty.ws.soapbinding.Client; import com.sun.identity.liberty.ws.soapbinding.ProviderHeader; import com.sun.identity.liberty.ws.soapbinding.SOAPFaultException; import com.sun.identity.liberty.ws.soapbinding.SOAPBindingException; import java.util.List; import java.util.ArrayList; import java.util.Iterator; import org.w3c.dom.Element; import com.sun.identity.liberty.ws.security.SecurityTokenManagerClient; import com.sun.identity.liberty.ws.interaction.InteractionRedirectException; import com.sun.identity.liberty.ws.interaction.InteractionException; import com.sun.identity.liberty.ws.interaction.InteractionManager; import com.sun.identity.liberty.ws.soapbinding.ServiceInstanceUpdateHeader; import com.sun.identity.liberty.ws.soapbinding.SOAPBindingConstants; import com.sun.identity.liberty.ws.soapbinding.Utils; import com.sun.identity.shared.configuration.SystemPropertiesManager; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * The class DSTClient provides methods for Liberty * Data Service Template. * * @supported.all.api */ public class DSTClient { private String resourceID = null; private EncryptedResourceID encryptedResourceID = null; private String soapURI = null; private String certAlias = null; private SecurityAssertion assertion = null; private BinarySecurityToken token = null; private boolean isEncryptedResourceID = false; // default to anonymous private int securityProfile = Message.ANONYMOUS; private String soapAction = null; private String serviceType = null; private HttpServletRequest httpRequest = null; private HttpServletResponse httpResponse = null; private boolean clientAuthEnabled = false; private String providerID = null; private ServiceInstanceUpdateHeader serviceInstanceUpdateHeader = null; private String wsfVersion = Utils.getDefaultWSFVersion(); /** * Constructor * The constructor connects to Data Service without WSS token * @param soapURI URI of the SOAP end point for this Data service * instance * @param providerID ID of service provider. */ public DSTClient(String soapURI, String providerID) { this.soapURI = soapURI; this.providerID = providerID; this.securityProfile = Message.ANONYMOUS; } /** * Constructor * The constructor connects to Data Service using WSS * SAML Token * @param assertion WSS SAML Token * @param soapURI URI of the SOAP end point for this data * service instance * @param providerID ID of service provider. */ public DSTClient (SecurityAssertion assertion, String soapURI, String providerID) { this.assertion = assertion; this.soapURI = soapURI; this.providerID = providerID; if(assertion != null && assertion.isBearer()) { this.securityProfile = Message.BEARER_TOKEN; } else { this.securityProfile = Message.SAML_TOKEN; } } /** * Constructor * The constructor connects to the data Service using WSS X509 * Token. * * @param token WSS X.509 Certificate Token * @param soapURI URI of the SOAP end point for this Data * service instance * @param providerID ID of service provider. */ public DSTClient(BinarySecurityToken token, String soapURI, String providerID) { this.token = token; this.soapURI = soapURI; this.securityProfile = Message.X509_TOKEN; this.providerID = providerID; } /** * Constructor * The constructor connects to Data Service without WSS token, * the HttpServletRequest and HttpServletResponse * object of the current request agent will be used for resource owner * interactions if needed. * * @param soapURI URI of the SOAP end point for this Data * service instance * @param providerID ID of service provider. * @param httpRequest HttpServletRequest object of current * user agent request. * @param httpResponse HttpServletResponse object of current * user agent request. */ public DSTClient(String soapURI, String providerID, HttpServletRequest httpRequest, HttpServletResponse httpResponse) { this.soapURI = soapURI; this.securityProfile = Message.ANONYMOUS; this.httpRequest = httpRequest; this.httpResponse = httpResponse; this.providerID = providerID; } /** * Constructor * The constructor connects to Data Service with WSS * SAML token, the HttpServletRequest and * HttpServletResponse object of the current request * agent will be used for resource owner interactions if needed. * @param assertion WSS SAML Token. * @param soapURI URI of the SOAP end point for this Data service instance. * @param providerID ID of service provider. * @param httpRequest HttpServletRequest object of current * user agent request. * @param httpResponse HttpServletResponse object of current * user agent request. */ public DSTClient(SecurityAssertion assertion, String soapURI, String providerID, HttpServletRequest httpRequest, HttpServletResponse httpResponse) { this.httpRequest = httpRequest; this.httpResponse = httpResponse; this.assertion = assertion; this.soapURI = soapURI; this.securityProfile = Message.SAML_TOKEN; this.providerID = providerID; } /** * Constructor * The constructor connects to Data Service with WSS * SAML token, the HttpServletRequest and * HttpServletResponse object of the current request * agent will be used for resource owner interactions if needed. * @param token WSS X.509 Certificate Token * @param soapURI URI of the SOAP end point for this Data * service instance * @param providerID ID of service provider. * @param httpRequest HttpServletRequest object of current * user agent request. * @param httpResponse HttpServletResponse object of current * user agent. */ public DSTClient(BinarySecurityToken token, String soapURI, String providerID, HttpServletRequest httpRequest, HttpServletResponse httpResponse) { this.token = token; this.soapURI = soapURI; this.securityProfile = Message.X509_TOKEN; this.httpRequest = httpRequest; this.httpResponse = httpResponse; this.providerID = providerID; } /** * Contructor * Creates a data service template client instance. * Connects to data Service specified by the resource offering. * resourceID, security mechanism and SOAP endpoint defined * in the ResourceOffering will be used. * * @param resourceOffering resource offering for this * discovery service instance * @param providerID ID of this service provider. * @param credential Credential of WSC * @param httpRequest HttpServletRequest object of current * user agent request. * @param httpResponse HttpServletResponse object of current * user agent. * @exception DSTException if the resourceOffering is not valid */ public DSTClient( ResourceOffering resourceOffering, String providerID, Object credential, HttpServletRequest httpRequest, HttpServletResponse httpResponse ) throws DSTException { if(resourceOffering == null) { DSTUtils.debug.error("DSTClient: resource offering is null"); throw new DSTException( DSTUtils.bundle.getString("nullInputParams")); } parseResourceOffering(resourceOffering); if(securityProfile == Message.X509_TOKEN) { generateBinarySecurityToken(credential); } this.httpRequest = httpRequest; this.httpResponse = httpResponse; this.providerID = providerID; } /** * Constructor * Creates a data service template client instance. * Connects to data Service specified by the resource offering. * resourceID, security mechanism and SOAP endpoint defined * in the ResourceOffering will be used. * * @param resourceOffering resource offering for this * discovery service instance * @param providerID ID of this service provider. * @param credential Credential of WSC * @exception DSTException if the resourceOffering is not valid */ public DSTClient(ResourceOffering resourceOffering, String providerID, Object credential) throws DSTException { if(resourceOffering == null) { DSTUtils.debug.error("DSTClient: resource offering is null"); throw new DSTException(DSTUtils.bundle.getString("nullInputParams")); } parseResourceOffering(resourceOffering); if(securityProfile == Message.X509_TOKEN) { generateBinarySecurityToken(credential); } this.providerID = providerID; } /** * Parses the given discovery resource offering for the Data service. * @param offering ResourceOffering * @exception DSTException. */ private void parseResourceOffering(ResourceOffering offering) throws DSTException { //Try for the encrypted resource offering first; encryptedResourceID = offering.getEncryptedResourceID(); if(encryptedResourceID != null) { isEncryptedResourceID = true; } else { ResourceID resID = offering.getResourceID(); if(resID == null) { DSTUtils.debug.error("DSTClient:parseResourceOffering: " + "No ResourceID"); throw new DSTException(DSTUtils.bundle.getString("noResourceID")); } resourceID = resID.getResourceID(); } ServiceInstance serviceInstance = offering.getServiceInstance(); // providerID = serviceInstance.getProviderID(); if(serviceInstance == null) { DSTUtils.debug.error("DSTClient:parseResourceOffering: " + "No service instance."); throw new DSTException( DSTUtils.bundle.getString("noServiceInstance")); } serviceType = serviceInstance.getServiceType(); if(serviceType == null) { DSTUtils.debug.error("DSTClient:parseResourceOffering: " + "service type is null."); throw new DSTException(DSTUtils.bundle.getString("noServiceType")); } List descriptions = serviceInstance.getDescription(); if(descriptions == null || descriptions.isEmpty()) { DSTUtils.debug.error("DSTClient:parseResourceOffering: " + "descriptions are null."); throw new DSTException(DSTUtils.bundle.getString("noDescriptions")); } // A service instance can have mutiple descriptions. In this case, // we will try to use a valid description. Iterator iter = descriptions.iterator(); while(iter.hasNext()) { Description description = (Description)iter.next(); soapAction = description.getSoapAction(); soapURI = description.getEndpoint(); if(soapURI == null || soapURI.length() == 0) { continue; } List secMechIDs = description.getSecurityMechID(); if(secMechIDs == null || secMechIDs.isEmpty()) { continue; } boolean foundProfile = false; int size = secMechIDs.size(); for(int i=0; i < size; i++) { String secProfile = (String)secMechIDs.get(i); secProfile = secProfile.trim(); if(secProfile.equals(Message.NULL_NULL) || secProfile.equals(Message.TLS_NULL) || secProfile.equals(Message.CLIENT_TLS_NULL)) { securityProfile = Message.ANONYMOUS; if(secProfile.equals(Message.CLIENT_TLS_NULL)) { clientAuthEnabled = true; } foundProfile = true; break; } else if(secProfile.equals(Message.NULL_X509) || secProfile.equals(Message.TLS_X509) || secProfile.equals(Message.CLIENT_TLS_X509) || secProfile.equals(Message.NULL_X509_WSF11) || secProfile.equals(Message.TLS_X509_WSF11) || secProfile.equals(Message.CLIENT_TLS_X509_WSF11)) { securityProfile = Message.X509_TOKEN; if (secProfile.equals(Message.NULL_X509) || secProfile.equals(Message.TLS_X509) || secProfile.equals(Message.CLIENT_TLS_X509)) { wsfVersion = SOAPBindingConstants.WSF_10_VERSION; } else { wsfVersion = SOAPBindingConstants.WSF_11_VERSION; } securityProfile = Message.X509_TOKEN; if (secProfile.equals(Message.CLIENT_TLS_X509) || secProfile.equals(Message.CLIENT_TLS_X509_WSF11)) { clientAuthEnabled = true; } foundProfile = true; break; } else if(secProfile.equals(Message.NULL_SAML) || secProfile.equals(Message.TLS_SAML) || secProfile.equals(Message.CLIENT_TLS_SAML) || secProfile.equals(Message.NULL_SAML_WSF11) || secProfile.equals(Message.TLS_SAML_WSF11) || secProfile.equals(Message.CLIENT_TLS_SAML_WSF11)) { securityProfile = Message.SAML_TOKEN; if (secProfile.equals(Message.NULL_SAML) || secProfile.equals(Message.TLS_SAML) || secProfile.equals(Message.CLIENT_TLS_SAML)) { wsfVersion = SOAPBindingConstants.WSF_10_VERSION; } else { wsfVersion = SOAPBindingConstants.WSF_11_VERSION; } if (secProfile.equals(Message.CLIENT_TLS_SAML) || secProfile.equals(Message.CLIENT_TLS_SAML_WSF11)) { clientAuthEnabled = true; } foundProfile = true; break; } else if(secProfile.equals(Message.NULL_BEARER) || secProfile.equals(Message.TLS_BEARER) || secProfile.equals(Message.CLIENT_TLS_BEARER) || secProfile.equals(Message.NULL_BEARER_WSF11) || secProfile.equals(Message.TLS_BEARER_WSF11) || secProfile.equals(Message.CLIENT_TLS_BEARER_WSF11)) { securityProfile = Message.BEARER_TOKEN; if (secProfile.equals(Message.NULL_BEARER) || secProfile.equals(Message.TLS_BEARER) || secProfile.equals(Message.CLIENT_TLS_BEARER)) { wsfVersion = SOAPBindingConstants.WSF_10_VERSION; } else { wsfVersion = SOAPBindingConstants.WSF_11_VERSION; } if (secProfile.equals(Message.CLIENT_TLS_BEARER) || secProfile.equals(Message.CLIENT_TLS_BEARER_WSF11)) { clientAuthEnabled = true; } foundProfile = true; break; } } if(foundProfile) { break; } } if(soapURI == null) { DSTUtils.debug.error("DSTClient:parseResourceOffering: " + "SOAP Endpoint or security profile is null"); throw new DSTException( DSTUtils.bundle.getString("invalidResourceOffering")); } if(DSTUtils.debug.messageEnabled()) { DSTUtils.debug.message("DSTClient.parseResourceOffering:" + "soapURI = " + soapURI + "soapAction = " + soapAction + "securityProfile = " + securityProfile); } } /** * Generates X509 security token for the WSC. * @param credential Credential of WSC * @exception DSTException */ private void generateBinarySecurityToken(Object credential) throws DSTException { try { SecurityTokenManagerClient manager = new SecurityTokenManagerClient(credential); if (certAlias == null) { certAlias = SystemPropertiesManager.get( "com.sun.identity.liberty.ws.wsc.certalias"); } manager.setCertAlias(certAlias); token = manager.getX509CertificateToken(); token.setWSFVersion(wsfVersion); } catch (Exception e) { DSTUtils.debug.error("DSTClient:generateBinarySecurityToken:" + "Error in generating binary security token.", e); throw new DSTException(e); } } /** * Sets the resource ID to be accessed * @param resourceID resource ID String */ public void setResourceID(String resourceID) { this.resourceID = resourceID; isEncryptedResourceID = false; } /** * Sets the encrypted resource ID to be accessed * @param encResourceID encrypted resource ID */ public void setResourceID(EncryptedResourceID encResourceID) { this.encryptedResourceID = encResourceID; isEncryptedResourceID = true; } /** * Sets the provider ID. * @param providerID Provider ID. */ public void setProviderID(String providerID) { this.providerID = providerID; } /** * Sets the alias for the client certificate if the connection is TLS/SSL * with client authentication. * * @param certAlias certificate alias name */ public void setClientCert(String certAlias) { this.certAlias = certAlias; } /** * Sets SOAP Action such as query or modify * @param action action for this soap request */ public void setSOAPAction(String action) { this.soapAction = action; } /** * Sets the client authentication. * * @param value true value to enable client authentication. */ public void setClientAuth(boolean value) { this.clientAuthEnabled = value; } /** * Sets the SOAP Endpoint. * @param endpoint SOAP Endpoint. */ public void setSOAPEndPoint(String endpoint) { this.soapURI = endpoint; } /** * Sets the Security Assertion. * @param secAssertion Security Assertion. */ public void setSecurityAssertion(SecurityAssertion secAssertion) { this.assertion = secAssertion; } /** * Sets the binary security token. * @param binaryToken Binary Security Token. */ public void setBinarySecurityToken(BinarySecurityToken binaryToken) { this.token = binaryToken; } /** * Sets the security mechanism. * @param secMech security mechanism. */ public void setSecurityMech(String secMech) { if(secMech == null || secMech.endsWith("null")) { securityProfile = Message.ANONYMOUS; } else if(secMech.endsWith("X509")) { securityProfile = Message.X509_TOKEN; } else if(secMech.endsWith("SAML")) { securityProfile = Message.SAML_TOKEN; } else if(secMech.endsWith("Bearer")) { securityProfile = Message.BEARER_TOKEN; } } /** * Gets data for the specified query items. * @param items list of DSTQueryItem object * @return List of DSTData objects which have one-to-one * correspondence to the list of query items. If no response for * one of the query item, the corresponding return * DSTData object will be null. * @exception DSTException if error occurs when trying to get data * @exception InteractionRedirectException if user agent is redirected to * Web Service Provider (WSP) for resource owner * interactions */ public java.util.List getData(java.util.List items) throws DSTException, InteractionRedirectException { DSTUtils.debug.message("DSTClient:getData:Init"); if(items == null || items.size() == 0) { DSTUtils.debug.error("DSTUtils.getData:Query items are null."); throw new DSTException(DSTUtils.bundle.getString("nullInputParams")); } DSTQuery dstQuery = null; if(isEncryptedResourceID) { dstQuery = new DSTQuery(encryptedResourceID, items, null); } else { dstQuery = new DSTQuery(resourceID, items, null); } List query = new ArrayList(); query.add(DSTUtils.parseXML(dstQuery.toString(true, true))); List response = sendMessage(query); if(response == null || response.size() == 0) { DSTUtils.debug.message("DSTClient:getData: response is null"); return null; } DSTQueryResponse queryResponse = new DSTQueryResponse((Element)response.get(0)); return queryResponse.getData(); } /** * Gets QueryResponse for the specified query. * @param query DSTQuery object. * @return DSTDQueryResponse Object. * @exception DSTException if error occurs when trying to get data * @exception InteractionRedirectException if user agent is redirected to * Web Service Provider (WSP) for resource owner * interactions */ public DSTQueryResponse query(DSTQuery query) throws DSTException, InteractionRedirectException { DSTUtils.debug.message("DSTClient:query:Init"); if(query == null) { DSTUtils.debug.message("DSTClient:query:null value"); throw new DSTException(DSTUtils.bundle.getString("nullInputParams")); } List request = new ArrayList(); request.add(DSTUtils.parseXML(query.toString(true, true))); List response = sendMessage(request); Element queryResponse = (Element)response.get(0); return new DSTQueryResponse(queryResponse); } /** * Gets response for a list of DST Modifications. * @param items List of DSTModification objects. * @return DSTModifyResponse. * @exception DSTException if error occurs when trying to modify data * @exception InteractionRedirectException if user agent is redirected to * Web Service Provider (WSP) for resource owner * interactions. */ public DSTModifyResponse modify(java.util.List items) throws DSTException, InteractionRedirectException { DSTUtils.debug.message("DSTClient:modify:init:"); if(items == null) { DSTUtils.debug.message("DSTClient:modify:null values"); throw new DSTException(DSTUtils.bundle.getString("nullInputParams")); } DSTModify modify = null; if(isEncryptedResourceID) { modify = new DSTModify(encryptedResourceID, items, null); } else { modify = new DSTModify(resourceID, items, null); } List request = new ArrayList(); request.add(DSTUtils.parseXML(modify.toString(true, true))); List response = sendMessage(request); if(response == null || response.size() == 0) { DSTUtils.debug.message("DSTClient:modify: response is null"); return null; } return new DSTModifyResponse((Element)response.get(0)); } /** * Gets modify response for the specified modify. * @param modify DSTModify object. * @return DSTModifyResponse object. * @exception DSTException if error occurs when trying to modify data * @exception InteractionRedirectException if user agent is redirected to * Web Service Provider (WSP) for resource owner * interactions */ public DSTModifyResponse modify(DSTModify modify) throws DSTException, InteractionRedirectException { DSTUtils.debug.message("DSTClient:modify:init"); if(modify == null) { DSTUtils.debug.message("DSTClient:modify:null values"); throw new DSTException(DSTUtils.bundle.getString("nullInputParams")); } List request = new ArrayList(); request.add(DSTUtils.parseXML(modify.toString(true, true))); List response = sendMessage(request); return new DSTModifyResponse((Element)response.get(0)); } /** * Gets query responses for a list of DST queries * @param queries list of DSTQuery objects * @return List of DSTQueryResponse objects, corresponding * to each DSTQuery object. * @exception DSTException if error occurs when trying to get data * @exception InteractionRedirectException if interaction is required. */ public java.util.List getQueryResponse(java.util.List queries) throws DSTException, InteractionRedirectException { DSTUtils.debug.message("DSTClient.getQueryResponse:Init"); if(queries == null || queries.size() == 0) { DSTUtils.debug.error("DSTClient.getQueryResponse:null values"); throw new DSTException(DSTUtils.bundle.getString("nullInputParams")); } Iterator iter = queries.iterator(); List requests = new ArrayList(); while(iter.hasNext()) { DSTQuery query = (DSTQuery)iter.next(); requests.add(DSTUtils.parseXML(query.toString(true, true))); } List responses = sendMessage(requests); if(responses == null || responses.size() == 0) { DSTUtils.debug.error("DSTClient.getQueryResponse:null responses"); throw new DSTException(DSTUtils.bundle.getString("nullResponse")); } List queryResponses = new ArrayList(); Iterator iter1 = responses.iterator(); while(iter1.hasNext()) { queryResponses.add(new DSTQueryResponse((Element)iter1.next())); } return queryResponses; } /** * Performs a list of modifications specified by a list of * DSTModify objects (possible on different resource ID). * * @param modifies list of DSTModify objects specifying * resource and modifications to be made. * @return List of DSTModifyResponse object corresponding * to each DSTModify. * @exception DSTException if error occurs when trying to modify data * @exception InteractionRedirectException if interaction is required. */ public java.util.List getModifyResponse(java.util.List modifies) throws DSTException , InteractionRedirectException { DSTUtils.debug.message("DSTClient.getModifyResponse:Init"); if(modifies == null || modifies.size() == 0) { DSTUtils.debug.error("DSTClient.getModifyResponse:null values"); throw new DSTException(DSTUtils.bundle.getString("nullInputParams")); } Iterator iter = modifies.iterator(); List requests = new ArrayList(); while(iter.hasNext()) { DSTModify modify = (DSTModify)iter.next(); requests.add(DSTUtils.parseXML(modify.toString(true, true))); } List responses = sendMessage(requests); if(responses == null || responses.size() == 0) { DSTUtils.debug.error("DSTClient.getModifyResponse:null responses"); throw new DSTException(DSTUtils.bundle.getString("nullResponse")); } List modifyResponses = new ArrayList(); Iterator iter1 = responses.iterator(); while(iter1.hasNext()) { modifyResponses.add(new DSTModifyResponse((Element)iter1.next())); } return modifyResponses; } /** * Sends the SOAP Message to the data service. * @param List of Request Objects. * @return List of Response Objects. * @exception DSTException for failure. */ private List sendMessage(List requestObjects) throws DSTException, InteractionRedirectException { DSTUtils.debug.message("DSTClient:sendMessage:Init"); if(requestObjects == null || requestObjects.size() == 0) { DSTUtils.debug.message("DSTClient:sendMessage: requestobj are null"); throw new DSTException(DSTUtils.bundle.getString("nullInputParams")); } try { Message msg = null; ProviderHeader provH = null; if(providerID != null) { provH = new ProviderHeader(providerID); } if(securityProfile == Message.X509_TOKEN) { if(token == null) { throw new DSTException( DSTUtils.bundle.getString("nullToken")); } DSTUtils.debug.message("DSTClient:sendMessage:using x509"); msg = new Message(provH, token); } else if(securityProfile == Message.SAML_TOKEN) { DSTUtils.debug.message("DSTClient:sendMessage:using SAML"); msg = new Message(provH, assertion); } else if(securityProfile == Message.BEARER_TOKEN) { DSTUtils.debug.message("DSTClient:sendMessage:using Bearer"); msg = new Message(provH, assertion); } else if(securityProfile == Message.ANONYMOUS) { DSTUtils.debug.message("DSTClient:sendMessage:using Anonymous"); msg = new Message(provH); } else { throw new DSTException( DSTUtils.bundle.getString("invalidSecurityProfile")); } msg.setSOAPBodies(requestObjects); msg.setWSFVersion(wsfVersion); if(clientAuthEnabled) { msg.setClientAuthentication(clientAuthEnabled); } if(DSTUtils.debug.messageEnabled()) { DSTUtils.debug.message("DSTClient:sendMessage: request:" + msg.toString()); } Message response = null; if(httpRequest != null) { response = handleInteraction(msg); } else { response = Client.sendRequest( msg, soapURI, certAlias, soapAction); } if(DSTUtils.debug.messageEnabled()) { DSTUtils.debug.message("DSTClient:sendMessage:response = " + response.toString()); } serviceInstanceUpdateHeader = response.getServiceInstanceUpdateHeader(); return response.getBodies(); } catch(SOAPBindingException sbe) { DSTUtils.debug.error("DSTClient:sendMessage:soapbindexception",sbe); throw new DSTException(sbe); } catch(SOAPFaultException sfe) { DSTUtils.debug.error("DSTClient:sendMessage:soapfault", sfe); serviceInstanceUpdateHeader = sfe.getSOAPFaultMessage().getServiceInstanceUpdateHeader(); throw new DSTException(sfe); } } /** * Handles interaction request processing. * When the interaction is required, it throws and InteractRedirect * Exception, and redirect to the caller application(servlet). */ private Message handleInteraction(Message requestMsg) throws DSTException, SOAPFaultException, SOAPBindingException, InteractionRedirectException { if(requestMsg == null || httpRequest == null || httpResponse == null || soapURI == null) { DSTUtils.debug.error("DSTClient:handeInteraction:null values"); throw new DSTException( DSTUtils.bundle.getString("nullInputParams")); } DSTUtils.debug.message("DSTClient:handleInteraction:init"); String resend = httpRequest.getParameter( InteractionManager.RESEND_MESSAGE); String returnURL = httpRequest.getRequestURL().toString(); Message response; try { InteractionManager manager = InteractionManager.getInstance(); if(resend == null) { //If the interaction is not required, this will send a // original response. response = manager.sendRequest(requestMsg, soapURI, certAlias, soapAction, returnURL, httpRequest, httpResponse); } else { response = manager.resendRequest(returnURL, httpRequest, httpResponse); } return response; } catch (InteractionRedirectException ire) { DSTUtils.debug.message("DSTClient:handleInteraction: Interaction" + "Redirection happened."); throw ire; } catch (InteractionException ie) { DSTUtils.debug.error("DSTClient:handleInteraction: Interaction" + " Error occured.", ie); throw new DSTException(ie); } } /** * Gets the serviceInstanceUpdate header from the SOAP * response message. * Applications can make use of this method to check if there is an * alternate endpoint or credential available for the service requests. * * @return ServiceInstanceUpdateHeader from the response * message. */ public ServiceInstanceUpdateHeader getServiceInstanceUpdateHeader() { return serviceInstanceUpdateHeader; } /** * Sets the web services version. * * @param wsfVersion the web services version that needs to be set. */ public void setWSFVersion(String wsfVersion) { this.wsfVersion = wsfVersion; } }