Wednesday, December 01, 2010

Add Java SOAP Handler to the Client Code

Step:
1. Implement SOAPHandler class
2. Implement authentication part to the SOAPHandler part
2. Add SOAP handler to the Service class.



import java.util.Collections;
import java.util.Set;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;


public class AuthenticationHandler implements SOAPHandler {

private static Logger log = Logger.getLogger(GCAuthenticationHandler.class.getName());

private String emailAddress;
private String password;


private String url = "http://www.localhost.net/webservice/";

private static final String CAuthenticationHeader= "CAuthenticationHeader";

public static enum AuthenticationHeader {EmailAddress, Password}



public GCAuthenticationHandler(String emailAddress, String password){
this.emailAddress = emailAddress;
this.password = password;

}


public GCAuthenticationHandler(String emailAddress, String password, String url){
this(emailAddress, password);
this.url = url;
}

@PostConstruct
public void init() {
}

@PreDestroy
public void destroy() {
}

public boolean handleMessage(SOAPMessageContext smc) {

boolean direction = ((Boolean) smc.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue();

if (direction) {

try {

// get SOAP envelope from SOAP message
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();

// create instance of SOAP factory
SOAPFactory soapFactory = SOAPFactory.newInstance();

// create SOAP elements specifying prefix and URI
SOAPElement headerElm = soapFactory.createElement(CAuthenticationHeader, "", url);

SOAPElement idElm = soapFactory.createElement(AuthenticationHeader.Password.name(),"", url);
idElm.addTextNode(password);

SOAPElement passwdElm = soapFactory.createElement(AuthenticationHeader.EmailAddress.name(),"", url);
passwdElm.addTextNode(emailAddress);


// add child elements to the root element
headerElm.addChildElement(idElm);
headerElm.addChildElement(passwdElm);


// create SOAPHeader instance for SOAP envelope
SOAPHeader sh = envelope.addHeader();

// add SOAP element for header to SOAP header object
sh.addChildElement(headerElm);
} catch (Exception ex) {
ex.printStackTrace();
}


}

return true;

}

public Set getHeaders() {
return Collections.EMPTY_SET;
}

public boolean handleFault(SOAPMessageContext messageContext) {
return true;
}

public void close(MessageContext context) {
}
}