JWS Task 9: Handlers and Rhino
Write client-side SOAP handler that outputs raw xml for both request and response. Use Rhino script engine for Java to execute simple math calculation in your web method.
Example Solution
Service Implementation Bean
package com.fuzilaga.jws.rhino;
import javax.jws.WebService;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
@WebService(endpointInterface = "com.fuzilaga.jws.rhino.RhinoService")
public class RhinoServiceImpl implements RhinoService
{
@Override
public float calc(String expr) throws Exception
{
if (!expr.matches("[0-9+-/)\\(.\\*]*"))
{
throw new IllegalArgumentException();
}
float result = 0;
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
result = Float.parseFloat(jsEngine.eval(expr).toString());
return result;
}
}
Handler
package com.fuzilaga.jws.rhino;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class RhinoClientHandler implements SOAPHandler<SOAPMessageContext>
{
@Override
public Set<QName> getHeaders()
{
// TODO Auto-generated method stub
return null;
}
@Override
public void close(MessageContext arg0)
{
// TODO Auto-generated method stub
}
@Override
public boolean handleFault(SOAPMessageContext context)
{
// TODO Auto-generated method stub
return false;
}
@Override
public boolean handleMessage(SOAPMessageContext context)
{
boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isRequest)
{
System.out.println("\nREQUEST:");
}
else
{
System.out.println("\nRESPONSE:");
}
try
{
context.getMessage().writeTo(System.out);
} catch (Exception e)
{
e.printStackTrace();
}
return true;
}
}
Service Client
package com.fuzilaga.jws.rhino;
import java.util.ArrayList;
import java.util.List;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import com.fuzilaga.jws.rhino.client.RhinoService;
import com.fuzilaga.jws.rhino.client.RhinoServiceImplService;
public class RhinoClient
{
public static void main(String args[])
{
RhinoServiceImplService service = new RhinoServiceImplService();
service.setHandlerResolver(new HandlerResolver()
{
@Override
public List<Handler> getHandlerChain(PortInfo portInfo)
{
List<Handler> handlers = new ArrayList<Handler>();
handlers.add(new RhinoClientHandler());
return handlers;
}
});
RhinoService port = service.getRhinoServiceImplPort();
try
{
float result = port.calc("12+30");
System.out.println("\nresult="+result);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
The result output is:
REQUEST: <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:calc xmlns:ns2="http://rhino.jws.fuzilaga.com/"><arg0>12+30</arg0></ns2:calc></S:Body></S:Envelope> RESPONSE: <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:calcResponse xmlns:ns2="http://rhino.jws.fuzilaga.com/"><return>42.0</return></ns2:calcResponse></S:Body></S:Envelope> result=42.0
NOTE: Full source and instructions on how to run locally can be found here.