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 ro...@apache.org on 2008/03/05 19:04:35 UTC
svn commit: r633953 - in /webservices/axis2/trunk/java/modules:
jaxws-integration/test/org/apache/axis2/jaxws/sample/
jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/
jaxws/src/org/apache/axis2/jaxws/handler/lifecycle/factory/ ja...
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: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org