| /* |
| * Copyright 2001-2004 The Apache Software Foundation. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.axis.handlers; |
| |
| import org.apache.axis.components.logger.LogFactory; |
| import org.apache.axis.utils.ClassUtils; |
| import org.apache.axis.utils.Messages; |
| import org.apache.commons.logging.Log; |
| |
| import javax.xml.rpc.JAXRPCException; |
| import javax.xml.rpc.handler.Handler; |
| import javax.xml.rpc.handler.HandlerInfo; |
| import javax.xml.rpc.handler.MessageContext; |
| import javax.xml.rpc.handler.soap.SOAPMessageContext; |
| import javax.xml.rpc.soap.SOAPFaultException; |
| import javax.xml.soap.SOAPBody; |
| import javax.xml.soap.SOAPElement; |
| import javax.xml.soap.SOAPEnvelope; |
| import javax.xml.soap.SOAPException; |
| import javax.xml.soap.SOAPMessage; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Implementation of HandlerChain |
| */ |
| public class HandlerChainImpl extends ArrayList implements javax.xml.rpc.handler |
| .HandlerChain { |
| protected static Log log = |
| LogFactory.getLog(HandlerChainImpl.class.getName()); |
| |
| public static final String JAXRPC_METHOD_INFO = "jaxrpc.method.info"; |
| |
| private String[] _roles; |
| |
| private int falseIndex = -1; |
| |
| public String[] getRoles() { |
| return _roles; |
| } |
| |
| public void setRoles(String[] roles) { |
| if (roles != null) { |
| // use clone for cheap array copy |
| _roles = (String[])roles.clone(); |
| } |
| } |
| |
| public void init(Map map) { |
| // DO SOMETHING WITH THIS |
| } |
| |
| protected List handlerInfos = new ArrayList(); |
| |
| 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) { |
| String messageText = |
| Messages.getMessage("NoJAXRPCHandler00", className); |
| throw new JAXRPCException(messageText, ex); |
| } |
| } |
| |
| public boolean handleFault(MessageContext _context) { |
| SOAPMessageContext context = (SOAPMessageContext)_context; |
| preInvoke(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 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(); |
| Iterator it = body.getChildElements(); |
| SOAPElement operation = (SOAPElement)it.next(); |
| list.add(operation.getElementName().toString()); |
| for (Iterator i = operation.getChildElements(); i.hasNext();) { |
| SOAPElement elt = (SOAPElement)i.next(); |
| list.add(elt.getElementName().toString()); |
| } |
| } catch (Exception e) { |
| log.debug("Exception in getMessageInfo : ", e); |
| } |
| return list; |
| } |
| |
| public boolean handleRequest(MessageContext _context) { |
| org.apache.axis.MessageContext actx = |
| (org.apache.axis.MessageContext)_context; |
| actx.setRoles(getRoles()); |
| SOAPMessageContext context = (SOAPMessageContext)_context; |
| preInvoke(context); |
| try { |
| for (int i = 0; i < size(); i++) { |
| Handler currentHandler = getHandlerInstance(i); |
| try { |
| if (currentHandler.handleRequest(context) == false) { |
| falseIndex = i; |
| return false; |
| } |
| } catch (SOAPFaultException sfe) { |
| falseIndex = i; |
| throw sfe; |
| } |
| } |
| return true; |
| } finally { |
| postInvoke(context); |
| } |
| } |
| |
| public boolean handleResponse(MessageContext context) { |
| SOAPMessageContext scontext = (SOAPMessageContext)context; |
| preInvoke(scontext); |
| 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); |
| } |
| } |
| |
| private void preInvoke(SOAPMessageContext msgContext) { |
| try { |
| SOAPMessage message = msgContext.getMessage(); |
| // Ensure that message is already in the form we want |
| if(message != null && message.getSOAPPart() != null) |
| message.getSOAPPart().getEnvelope(); |
| msgContext.setProperty(org.apache.axis.SOAPPart.ALLOW_FORM_OPTIMIZATION, |
| Boolean.FALSE); |
| msgContext.setProperty(JAXRPC_METHOD_INFO, getMessageInfo(message)); |
| } catch (Exception e) { |
| log.debug("Exception in preInvoke : ", e); |
| throw new RuntimeException("Exception in preInvoke : " + e.toString()); |
| } |
| } |
| |
| private void postInvoke(SOAPMessageContext msgContext) { |
| Boolean propFormOptimization = (Boolean)msgContext.getProperty(org.apache.axis.SOAPPart.ALLOW_FORM_OPTIMIZATION); |
| if (propFormOptimization != null && !propFormOptimization.booleanValue()) { |
| msgContext.setProperty(org.apache.axis.SOAPPart.ALLOW_FORM_OPTIMIZATION, |
| Boolean.TRUE); |
| 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(Messages.getMessage("invocationArgumentsModified00")); |
| } |
| } |
| try { |
| if (message != null) { |
| message.saveChanges(); |
| } |
| } catch (SOAPException e) { |
| log.debug("Exception in postInvoke : ", e); |
| throw new RuntimeException("Exception in postInvoke : " + e.toString()); |
| } |
| } |
| } |
| |
| public void destroy() { |
| int endIdx = size() - 1; |
| if (falseIndex != -1) { |
| endIdx = falseIndex; |
| } |
| for (int i = endIdx; i >= 0; i--) { |
| getHandlerInstance(i).destroy(); |
| } |
| falseIndex = -1; |
| clear(); |
| } |
| |
| private Handler getHandlerInstance(int index) { |
| return (Handler)get(index); |
| } |
| |
| private HandlerInfo getHandlerInfo(int index) { |
| return (HandlerInfo)handlerInfos.get(index); |
| } |
| |
| private Handler newHandler(HandlerInfo handlerInfo) { |
| try { |
| Handler handler = (Handler)handlerInfo.getHandlerClass() |
| .newInstance(); |
| handler.init(handlerInfo); |
| return handler; |
| } catch (Exception ex) { |
| String messageText = |
| Messages.getMessage("NoJAXRPCHandler00", |
| handlerInfo.getHandlerClass().toString()); |
| throw new JAXRPCException(messageText, ex); |
| } |
| } |
| } |