blob: 52633599159f214130cd7522fe6fe9980a27e0bb [file] [log] [blame]
/*
* 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);
}
}
}