You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by as...@apache.org on 2005/07/07 15:14:28 UTC
svn commit: r209598 -
/webservices/axis/trunk/archive/java/scratch/ashu_jaya_venkat/jaxws/src/org/apache/axis/jaxrpc/handler/HandlerChainImpl.java
Author: ashutosh
Date: Thu Jul 7 06:14:26 2005
New Revision: 209598
URL: http://svn.apache.org/viewcvs?rev=209598&view=rev
Log:
HandlerChain implementation
Added:
webservices/axis/trunk/archive/java/scratch/ashu_jaya_venkat/jaxws/src/org/apache/axis/jaxrpc/handler/HandlerChainImpl.java
Added: webservices/axis/trunk/archive/java/scratch/ashu_jaya_venkat/jaxws/src/org/apache/axis/jaxrpc/handler/HandlerChainImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/ashu_jaya_venkat/jaxws/src/org/apache/axis/jaxrpc/handler/HandlerChainImpl.java?rev=209598&view=auto
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/ashu_jaya_venkat/jaxws/src/org/apache/axis/jaxrpc/handler/HandlerChainImpl.java (added)
+++ webservices/axis/trunk/archive/java/scratch/ashu_jaya_venkat/jaxws/src/org/apache/axis/jaxrpc/handler/HandlerChainImpl.java Thu Jul 7 06:14:26 2005
@@ -0,0 +1,187 @@
+package org.apache.axis.jaxrpc.handler;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Arrays;
+
+import javax.xml.rpc.JAXRPCException;
+import javax.xml.rpc.handler.Handler;
+import javax.xml.rpc.handler.HandlerChain;
+import javax.xml.rpc.handler.HandlerInfo;
+import javax.xml.rpc.handler.MessageContext;
+import javax.xml.rpc.handler.soap.SOAPMessageContext;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPMessage;
+
+import org.apache.axis.jaxrpc.handler.soap.SOAPMessageContextImpl;
+import org.apache.axis.jaxrpc.handler.MessageContextImpl;
+
+public class HandlerChainImpl extends ArrayList implements HandlerChain {
+
+ private String[] roles;
+
+ private int falseIndex = -1;
+
+ protected List handlerInfos = new ArrayList();
+
+ public static final String JAXRPC_METHOD_INFO = "jaxrpc.method.info";
+
+ private HandlerInfo getHandlerInfo(int index){
+ return (HandlerInfo)handlerInfos.get(index);
+ }
+
+ private Handler getHandlerInstance(int index) {
+ return (Handler)get(index);
+ }
+
+ private Handler newHandler(HandlerInfo handlerInfo){
+ try{
+ Handler handler = (Handler)handlerInfo.getHandlerClass().newInstance();
+ handler.init(handlerInfo);
+ return handler;
+ } catch (Exception ex){
+ throw new JAXRPCException("No Jax-RPC handler" + handlerInfo.getHandlerClass().toString(), ex);
+ }
+ }
+
+ private void postInvoke(SOAPMessageContext msgContext) {
+ SOAPMessage message = msgContext.getMessage();
+ ArrayList oldList = (ArrayList)msgContext.getProperty(JAXRPC_METHOD_INFO);
+ if (oldList != null) {
+ if (!Arrays.equals(oldList.toArray(), getMessageInfo(message).toArray())) {
+ throw new RuntimeException("invocationArgumentsModified");
+ }
+ }
+ }
+
+ public HandlerChainImpl(){
+
+ }
+
+ public HandlerChainImpl(List handlerInfos){
+ this.handlerInfos = handlerInfos;
+ for(int i = 0; i < handlerInfos.size(); i++){
+ add(newHandler(getHandlerInfo(i)));
+ }
+ }
+
+ public void addNewHandler(String className, Map config){
+ try {
+ HandlerInfo handlerInfo = new HandlerInfo(ClassUtils.forName(className), config, null);
+ handlerInfos.add(handlerInfo);
+ add(newHandler(handlerInfo));
+ } catch(Exception ex){
+ throw new JAXRPCException("No Jax-RPC handler"+className, ex);
+ }
+ }
+
+ public ArrayList getMessageInfo(SOAPMessage message) {
+ ArrayList list = new ArrayList();
+ try {
+ if(message == null || message.getSOAPPart() == null)
+ return list;
+ SOAPEnvelope env = message.getSOAPPart().getEnvelope();
+ SOAPBody body = env.getBody();
+ java.util.Iterator it = body.getChildElements();
+ SOAPElement operation = (SOAPElement)it.next();
+ list.add(operation.getElementName().toString());
+ for (java.util.Iterator i = operation.getChildElements(); i.hasNext();) {
+ SOAPElement elt = (SOAPElement)i.next();
+ list.add(elt.getElementName().toString());
+ }
+ } catch(Exception e){
+
+ }
+ return list;
+ }
+
+ public boolean handleRequest(MessageContext context) throws JAXRPCException {
+ SOAPMessageContextImpl actx = (SOAPMessageContextImpl)context;
+ actx.setRoles(getRoles());
+ try {
+ for (int i = 0; i < size(); i++) {
+ Handler currentHandler = getHandlerInstance(i);
+ try {
+ if (currentHandler.handleRequest(context) == false) {
+ falseIndex = i;
+ return false;
+ }
+ }catch (javax.xml.rpc.soap.SOAPFaultException sfe) {
+ falseIndex = i;
+ throw sfe;
+ }
+ }
+ return true;
+ }finally {
+ postInvoke(actx);
+ }
+ }
+
+ public boolean handleResponse(MessageContext context)
+ throws JAXRPCException {
+ SOAPMessageContextImpl scontext = (SOAPMessageContextImpl)context;
+ try {
+ int endIdx = size() - 1;
+ if (falseIndex != -1) {
+ endIdx = falseIndex;
+ }
+ for (int i = endIdx; i >= 0; i--) {
+ if (getHandlerInstance(i).handleResponse(context) == false) {
+ return false;
+ }
+ }
+ return true;
+ } finally {
+ postInvoke(scontext);
+ }
+ }
+
+ public boolean handleFault(MessageContext _context) throws JAXRPCException {
+ SOAPMessageContextImpl context = (SOAPMessageContextImpl)_context;
+ try {
+ int endIdx = size() - 1;
+ if (falseIndex != -1) {
+ endIdx = falseIndex;
+ }
+ for (int i = endIdx; i >= 0; i--) {
+ if (getHandlerInstance(i).handleFault(context) == false) {
+ return false;
+ }
+ }
+ return true;
+ } finally{
+ postInvoke(context);
+ }
+ }
+
+ public void init(Map config) throws JAXRPCException {
+ // DO SOMETHING WITH THIS
+ }
+
+ public void destroy() throws JAXRPCException {
+ int endIdx = size() - 1;
+ if (falseIndex != -1) {
+ endIdx = falseIndex;
+ }
+ for (int i = endIdx; i >= 0; i--) {
+ getHandlerInstance(i).destroy();
+ }
+ falseIndex = -1;
+ clear();
+ }
+
+ public void setRoles(String[] soapActorNames) {
+ if(soapActorNames != null){
+ // use clone for cheap array copy
+ roles = (String[])soapActorNames.clone();
+ }
+ }
+
+ public String[] getRoles() {
+ return roles;
+ }
+
+}