DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17950>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17950 Defect of the jax-rpc handler impl on the processing model ------- Additional Comments From [EMAIL PROTECTED] 2003-03-13 10:55 ------- I'd like to propose the following approach to solve this problem. Could you please refer to the ml archive if you want to know the detail of the background ? ***** The additional rule of the flow definition ***** .........*.........*.........*.........*.........*.........* a)Adds a special parameter for "*.wsdd" to setting up a user specific response flow in case of 'return false'. b)The name of the parameter is "onFalseRestartAt". c)It can optionally appear under the '<handlerInfoChain>' as the child node of the "<handlerInfo>". (If not set, the default rule will be applied. In other words, the respose handler chain starts processing from the same Handler instance that returned false.) d)The appropriate value is an integer (-1, 0, 1, 2, ...) to indicate the starting point index of response flow. (Exceptionally, the '-1' indicates the runtime doesn't invoke any handleResponse methods and directly sends back the response message from handleRequest to the client.) .........*.........*.........*.........*.........*.........* ***** A sample definition of deploy.wsdd ***** (--- How to use "onFalseRestartAt" parameter. ---) .........*.........*.........*.........*.........*.........* <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="testWebService" provider="java:RPC"> <parameter name="className" value="webservices.testWebService"/> <parameter name="allowedMethods" value="*"/> <handlerInfoChain> <handlerInfo classname="samples.jaxrpc.hello.ServerHandlerA"> <parameter name="onFalseRestartAt" value="0"/> </handlerInfo> <handlerInfo classname="samples.jaxrpc.hello.ServerHandlerB"> <parameter name="onFalseRestartAt" value="-1"/> </handlerInfo> </handlerInfoChain> </service> </deployment> .........*.........*.........*.........*.........*.........* ***** Tha patch for HandlerChainImpl.java ***** .........*.........*.........*.........*.........*.........* --- xml-axis/java/src/org/apache/axis/handlers/HandlerChainImpl.java Wed Dec 11 22:38:18 2002 UTC +++ HandlerChainImpl.java Thu Mar 13 19:23:44 2003 JST @@ -118,15 +118,18 @@ return true; } + private int falseIndex; + public boolean handleRequest(MessageContext _context) { SOAPMessageContext context = (SOAPMessageContext) _context; - boolean processFault = false; + falseIndex = -1; for (int i = 0; i < size(); i++) { Handler currentHandler = getHandlerInstance(i); try { if (currentHandler.handleRequest(context) == false) { + falseIndex = i; return false; } } catch (SOAPFaultException sfe) { @@ -137,7 +140,20 @@ } public boolean handleResponse(MessageContext context) { - for (int i = size() - 1; i >= 0; i--) + int endIdx = this.handlerInfos.size() - 1; + + if (falseIndex != -1) { + HandlerInfo info = (HandlerInfo)this.handlerInfos.get(falseIndex); + String st = (String)info.getHandlerConfig().get ("onFalseRestartAt"); + + if (st != null) { + endIdx = Integer.parseInt(st); + } else { + endIdx = falseIndex; + } + } + + for (int i = endIdx; i >= 0; i--) if (getHandlerInstance(i).handleResponse(context) == false) return false; return true; .........*.........*.........*.........*.........*.........* Best Regards, Toshi (Toshiyuki Kimura) <[EMAIL PROTECTED]> R&D Headquarters NTT DATA Corporation
