Author: rott Date: Wed Mar 5 10:04:30 2008 New Revision: 633953 URL: http://svn.apache.org/viewvc?rev=633953&view=rev Log: Call jaxws handler instance @PreDestroy annotated methods
Modified: webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/factory/HandlerLifecycleManager.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/impl/HandlerLifecycleManagerImpl.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java Modified: webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java?rev=633953&r1=633952&r2=633953&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java (original) +++ webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java Wed Mar 5 10:04:30 2008 @@ -103,10 +103,18 @@ assertEquals("With handler manipulation, total should be 3 less than a proper sumation.", 17, total); TestLogger.logger.debug("Total (after handler manipulation) = " + total); + + // also confirm that @PreDestroy method is called. Since it only makes sense to call it on the managed + // (server) side and just before the handler instance goes out of scope, we are creating a file in the + // @PreDestroy method, and will check for its existance here. If the file does not exist, it means + // @PreDestroy method was never called. The file is set to .deleteOnExit(), so no need to delete it. + File file = new File("AddNumbersProtocolHandler.preDestroy.txt"); + assertTrue("File AddNumbersProtocolHandler.preDestroy.txt does not exist, meaning the @PreDestroy method was not called.", file.exists()); + TestLogger.logger.debug("----------------------------------"); } catch(Exception e) { e.printStackTrace(); - fail(e.getMessage()); + fail(e.getMessage()); } } Modified: webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java?rev=633953&r1=633952&r2=633953&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java (original) +++ webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java Wed Mar 5 10:04:30 2008 @@ -18,13 +18,19 @@ */ package org.apache.axis2.jaxws.sample.addnumbershandler; +import java.io.File; +import java.io.FileOutputStream; +import java.util.Set; + +import javax.annotation.PreDestroy; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import javax.xml.ws.WebServiceException; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPMessageContext; -import java.util.Set; + +import org.apache.axis2.jaxws.ExceptionFactory; public class AddNumbersProtocolHandler implements javax.xml.ws.handler.soap.SOAPHandler<SOAPMessageContext> { @@ -80,6 +86,26 @@ tracker.handleMessage(messagecontext); return true; + } + + @PreDestroy + public void preDestroy() { + try { + /* + * since @PreDestroy methods are called just before the managed (server) side + * handler instance goes out of scope, there's not a good way to test if it is + * called. So, we are creating a file that one of the AddNumbersHandlerTests tests + * checks the existance of. + */ + File file = new File("AddNumbersProtocolHandler.preDestroy.txt"); + file.createNewFile(); + FileOutputStream fos = new FileOutputStream(file); + fos.write(new byte[]{'h','i'}); + fos.close(); + file.deleteOnExit(); + } catch (Exception e) { + throw ExceptionFactory.makeWebServiceException(e); + } } } Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/factory/HandlerLifecycleManager.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/factory/HandlerLifecycleManager.java?rev=633953&r1=633952&r2=633953&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/factory/HandlerLifecycleManager.java (original) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/factory/HandlerLifecycleManager.java Wed Mar 5 10:04:30 2008 @@ -32,6 +32,9 @@ public Handler createHandlerInstance(MessageContext mc, Class handlerClass) throws LifecycleException, ResourceInjectionException; + public void destroyHandlerInstance(MessageContext mc, Handler handler) + throws LifecycleException, ResourceInjectionException; + /* * Invokes method on endpoint marked with @PostConstruct annotation. */ Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/impl/HandlerLifecycleManagerImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/impl/HandlerLifecycleManagerImpl.java?rev=633953&r1=633952&r2=633953&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/impl/HandlerLifecycleManagerImpl.java (original) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/impl/HandlerLifecycleManagerImpl.java Wed Mar 5 10:04:30 2008 @@ -58,5 +58,30 @@ return (Handler)this.instance; } + + /** + * destroyHandlerInstance calls the handler's annotated PreDestroy method, + * if it exists. A handler instance that has been passed through this method SHOULD NOT be used again + * + * @param handler + */ + public void destroyHandlerInstance(MessageContext mc, Handler handler) throws LifecycleException, ResourceInjectionException { + if (handler == null) { + throw ExceptionFactory.makeWebServiceException("Handler class must be passed"); + } + + this.instance = handler; + + ServiceDescription serviceDesc = mc.getEndpointDescription().getServiceDescription(); + ResourceInjectionServiceRuntimeDescription injectionDesc = null; + if (serviceDesc != null) { + injectionDesc = ResourceInjectionServiceRuntimeDescriptionFactory.get(serviceDesc, handler.getClass()); + } + + //Invoke PreDestroy + if (injectionDesc != null && injectionDesc.getPreDestroyMethod() != null) { + invokePreDestroy(injectionDesc.getPreDestroyMethod()); + } + } } Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java?rev=633953&r1=633952&r2=633953&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java (original) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java Wed Mar 5 10:04:30 2008 @@ -38,6 +38,8 @@ import org.apache.axis2.jaxws.handler.HandlerInvoker; import org.apache.axis2.jaxws.handler.HandlerResolverImpl; import org.apache.axis2.jaxws.handler.factory.HandlerInvokerFactory; +import org.apache.axis2.jaxws.handler.lifecycle.factory.HandlerLifecycleManager; +import org.apache.axis2.jaxws.handler.lifecycle.factory.HandlerLifecycleManagerFactory; import org.apache.axis2.jaxws.i18n.Messages; import org.apache.axis2.jaxws.message.Message; import org.apache.axis2.jaxws.message.Protocol; @@ -53,6 +55,7 @@ import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamReader; +import javax.xml.ws.WebServiceException; import javax.xml.ws.handler.Handler; import java.io.StringReader; @@ -274,7 +277,7 @@ // If the message is one way, we should not invoke the response handlers. There is no response // MessageContext since a one way invocation is considered to have a "void" return. - if (!isOneWay(eic.getRequestMessageContext().getAxisMessageContext())) { + if (!isOneWay(request.getAxisMessageContext())) { response.setMEPContext(request.getMEPContext()); HandlerInvocationContext hiContext = buildHandlerInvocationContext(request, eic.getHandlers(), @@ -291,6 +294,17 @@ // TODO for now, throw it. We probably should try to make an XMLFault object and set it on the message throw ExceptionFactory.makeWebServiceException(e); } finally { + // at this point, we are done with handler instances on the server; call @PreDestroy on all of them + HandlerLifecycleManager hlm = createHandlerlifecycleManager(); + for (Iterator it = eic.getHandlers().iterator(); it.hasNext();) { + try { + Handler handler = (Handler) it.next(); + hlm.destroyHandlerInstance(request, handler); + } catch (Exception e) { + // TODO: can we ignore this? + throw ExceptionFactory.makeWebServiceException(e); + } + } responseReady(eic); restoreRequestMessage(request); } @@ -597,5 +611,14 @@ } } } + } + + /** + * we need a HandlerLifecycleManager so we can call the @PreDestroy when we are done with the server-side handler instances + */ + private HandlerLifecycleManager createHandlerlifecycleManager() { + HandlerLifecycleManagerFactory elmf = (HandlerLifecycleManagerFactory)FactoryRegistry + .getFactory(HandlerLifecycleManagerFactory.class); + return elmf.createHandlerLifecycleManager(); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]