[jboss-cvs] JBossAS SVN: r76105 - trunk/tomcat/src/main/org/jboss/web/tomcat/service.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Jul 22 11:09:29 EDT 2008


Author: emuckenhuber
Date: 2008-07-22 11:09:29 -0400 (Tue, 22 Jul 2008)
New Revision: 76105

Modified:
   trunk/tomcat/src/main/org/jboss/web/tomcat/service/TomcatInjectionContainer.java
Log:
[JBAS-5673] process @PostConstruct and @PreDestroy

Modified: trunk/tomcat/src/main/org/jboss/web/tomcat/service/TomcatInjectionContainer.java
===================================================================
--- trunk/tomcat/src/main/org/jboss/web/tomcat/service/TomcatInjectionContainer.java	2008-07-22 15:05:26 UTC (rev 76104)
+++ trunk/tomcat/src/main/org/jboss/web/tomcat/service/TomcatInjectionContainer.java	2008-07-22 15:09:29 UTC (rev 76105)
@@ -68,6 +68,7 @@
 import org.jboss.jpa.resolvers.PersistenceUnitDependencyResolver;
 import org.jboss.logging.Logger;
 import org.jboss.metadata.javaee.spec.Environment;
+import org.jboss.metadata.javaee.spec.LifecycleCallbackMetaData;
 import org.jboss.metadata.web.jboss.JBossServletsMetaData;
 import org.jboss.metadata.web.jboss.JBossWebMetaData;
 import org.jboss.metadata.web.spec.FilterMetaData;
@@ -280,12 +281,51 @@
 
    public void postConstruct(Object object) throws IllegalAccessException, InvocationTargetException
    {
-	   // ignore for now
+      if (webDD.getPostConstructs() == null)
+         return;
+
+      // @PostConstruct 
+      for (LifecycleCallbackMetaData metaData : webDD.getPostConstructs())
+      {
+         try
+         {
+            Class<?> clazz = webLoader.loadClass(metaData.getClassName());
+            if (clazz.isAssignableFrom(object.getClass()))
+            {
+               // process LifecycleCallbackMetaData
+               processesLifecycleCallbackMetaData(object, metaData);
+            }
+         }
+         catch (ClassNotFoundException e)
+         {
+            throw new RuntimeException("Error invoking postConstruct method: " + metaData.getMethodName(), e);
+         }
+      }
    }
 
    public void preDestroy(Object object) throws IllegalAccessException, InvocationTargetException
    {
-      // ignore for now
+      if (webDD.getPreDestroys() == null)
+         return;
+
+      // @PreDestroy
+      for (LifecycleCallbackMetaData metaData : webDD.getPreDestroys())
+      {
+         try
+         {
+            //  
+            Class<?> clazz = webLoader.loadClass(metaData.getClassName());
+            if (clazz.isAssignableFrom(object.getClass()))
+            {
+               // process LifecycleCallbackMetaData
+               processesLifecycleCallbackMetaData(object, metaData);
+            }
+         }
+         catch (ClassNotFoundException e)
+         {
+            throw new RuntimeException("Error invoking postConstruct method: " + metaData.getMethodName(), e);
+         }
+      }
    }
 
    /**
@@ -393,6 +433,33 @@
       }
    }
    
+   private void processesLifecycleCallbackMetaData(Object object, LifecycleCallbackMetaData lifeCycleMetaData) throws IllegalAccessException, InvocationTargetException
+   {
+      Method method = null;
+      Class<?> clazz = object.getClass();
+      // Also check superClasses for private members
+      while(clazz != null)
+      {
+         for(Method m : clazz.getDeclaredMethods())
+         {
+            if(m.getName().equals(lifeCycleMetaData.getMethodName()))
+            {
+               method = m;
+            }
+         }
+         if(method != null)
+            break;
+         clazz = clazz.getSuperclass();
+      }
+      if(method == null)
+         throw new IllegalStateException("Method: "+ lifeCycleMetaData.getMethodName() + " not found.");
+      
+      Object args[] = null;
+      method.setAccessible(true);
+      // Finally invoke the method
+      method.invoke(object, args);
+   }
+   
    /**
     * introspects EJB container to find all dependencies
     * and initialize any extra metadata.




More information about the jboss-cvs-commits mailing list