package oracle.demo.handlerchain.service;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import javax.xml.rpc.handler.GenericHandler;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.rpc.soap.SOAPFaultException;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import java.util.Iterator;
public class NewAccountHandler extends GenericHandler{
private javax.xml.namespace.QName faultCode = new javax.xml.namespace.QName(
javax.xml.rpc.NamespaceConstants.NSURI_SOAP_ENVELOPE,
"Server",
javax.xml.rpc.NamespaceConstants.NSPREFIX_SOAP_ENVELOPE);
public QName[] getHeaders() {
return new QName[0];
}
public boolean handleRequest(MessageContext ctx){
SOAPMessageContext sctx = (SOAPMessageContext)ctx;
SOAPMessage sm = sctx.getMessage();
SOAPBody sb = null;
try{
sb = sm.getSOAPBody();
NodeList nl = sb.getChildNodes();
for(int i = 0; i < nl.getLength(); i++){
Node node = nl.item(i);
if(node instanceof SOAPElement){
SOAPElement se = (SOAPElement)node;
String operationName = se.getLocalName();
if(operationName.equals("createAccount")){
checkInitialBalance(sctx,se);
}
}
}
}
catch(SOAPException ex){
System.out.println(ex.getMessage());
}
return true;
}
private void checkInitialBalance(SOAPMessageContext sctx,SOAPElement se) {
SOAPFactory sf = null;
Detail det = null;
SOAPMessage sm = null;
MessageFactory mf = null;
try{
sf= SOAPFactory.newInstance();
det = sf.createDetail();
mf = MessageFactory.newInstance();
sm = mf.createMessage();
}
catch(Exception ex){
ex.printStackTrace();
}
NodeList nl = se.getChildNodes();
float amt = 0f;
for(int i = 0; i < nl.getLength();i++){
Node node = nl.item(i);
if(node instanceof SOAPElement){
SOAPElement s = (SOAPElement)node;
if(s.getLocalName().equals("float_2")){
amt = new Float(s.getValue().trim()).floatValue();
}
}
}
if(amt <= 0f){
throw new JAXRPCException(new SOAPFaultException(faultCode,
"Insufficient funds for new account. You must start an account"+
"with more than $0", "",det));
}
}
public boolean handleFault(MessageContext ctx){
System.out.println("handling fault");
return false;
}
public boolean handleResponse(MessageContext ctx){
System.out.println("handling response");
return true;
}
}
|