package ora.jwsnut.chapter6.handlerbookservice;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.handler.GenericHandler;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
/**
* SOAP message handler used on the server side
* of the handler book service.
*/
public class ServiceHandler extends GenericHandler {
// Namespace for types used by this handler
private static final String NS_URI = "urn:jwsnut.chapter6.handlerbookservice/wsdl/HandlerBookQuery";
// Namespace prefix used by this handler
private static final String NS_PREFIX = "tns";
// Name of the authentication header
private static final QName authHeader = new QName(NS_URI, "auth");
// Name of the date/time header
private static final QName timeHeader = new QName(NS_URI, "time");
// Formatter for dates
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
// SOAPFactory used to create Names
private static SOAPFactory factory;
// Name of the authentication header as a Name
private static Name authHeaderName;
// Name of the date/time header as a Name
private static Name timeHeaderName;
// The headers that this handler is associated with
private static QName[] headers;
// Debug flag
private boolean debug;
// Performs initialization
public void init(HandlerInfo info) {
// Extract the debug setting from the configuration
Map config = info.getHandlerConfig();
String value = (String)config.get("debug");
debug = value == null ? false : Boolean.valueOf(value).booleanValue();
// Create Names
try {
factory = SOAPFactory.newInstance();
authHeaderName = factory.createName("auth", NS_PREFIX, NS_URI);
timeHeaderName = factory.createName("time", NS_PREFIX, NS_URI);
headers = new QName[] { authHeader, timeHeader };
} catch (SOAPException ex) {
throw new JAXRPCException("Init failure", ex);
}
if (debug) {
System.out.println("Server-side handler initialized");
}
}
// Called when the handler is no longer required.
public void destroy() {
if (debug) {
System.out.println("Server-side handler destroyed");
}
}
// Gets the headers that this handler can deal with
public QName[] getHeaders() {
return headers;
}
// Called to process a request message
public boolean handleRequest(MessageContext ctx) {
try {
if (debug) {
System.out.println("handleRequest called");
}
String userName = null;
String password = null;
SOAPMessage message = ((SOAPMessageContext)ctx).getMessage();
SOAPHeader header = message.getSOAPPart().getEnvelope().getHeader();
if (header != null) {
// Locate the "auth" header
Iterator iter = header.getChildElements(authHeaderName);
if (iter.hasNext()) {
SOAPElement element = (SOAPElement)iter.next();
Iterator children = element.getChildElements();
while (children.hasNext()) {
SOAPElement childElement = (SOAPElement)children.next();
String localPart = childElement.getElementName().getLocalName();
if (localPart.equals("UserName") && userName == null) {
userName = childElement.getValue();
} else if (localPart.equals("Password") && password == null) {
password = childElement.getValue();
}
}
// Remove this header
element.detachNode();
}
// Remove any other "auth" headers.
while (iter.hasNext()) {
((SOAPElement)iter.next()).detachNode();
}
// Install the user name and password in the MessageContext.
// This installs null if either attribute was missing.
ctx.setProperty(HandlerBookServiceConstants.USERNAME_PROPERTY, userName);
ctx.setProperty(HandlerBookServiceConstants.PASSWORD_PROPERTY, password);
if (debug) {
System.out.println("Got auth: user: [" + userName + "], password: [" + password + "]");
}
}
} catch (SOAPException ex) {
throw new JAXRPCException("Error in handleRequest", ex);
}
return true;
}
// Called to process a response message
public boolean handleResponse(MessageContext ctx) {
try {
if (debug) {
System.out.println("handleResponse called");
}
SOAPMessage message = ((SOAPMessageContext)ctx).getMessage();
SOAPHeader header = message.getSOAPPart().getEnvelope().getHeader();
if (header == null) {
header = message.getSOAPPart().getEnvelope().addHeader();
}
SOAPElement element = header.addChildElement(timeHeaderName);
String text = format.format(new Date());
element.addTextNode(text);
if (debug) {
System.out.println("Added time header, value " + text);
}
} catch (SOAPException ex) {
throw new JAXRPCException("Error in handleRequest", ex);
}
return true;
}
} |