[jboss-cvs] JBossAS SVN: r89289 - in projects/microcontainer/trunk: kernel/src/main/java/org/jboss/kernel/plugins/bootstrap/basic and 6 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri May 22 10:53:04 EDT 2009


Author: alesj
Date: 2009-05-22 10:53:04 -0400 (Fri, 22 May 2009)
New Revision: 89289

Added:
   projects/microcontainer/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/LifecycleDispatchContext.java
   projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/LifecycleAwareKernelBus.java
Modified:
   projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/bootstrap/basic/KernelConstants.java
   projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
   projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/BasicKernelBus.java
   projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelControllerContext.java
   projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java
   projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/registry/support/BusBean.java
   projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/registry/test/BusTestCase.java
Log:
[JBKERNEL-32]; allow for lifecycle kernel bus invocations.

Copied: projects/microcontainer/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/LifecycleDispatchContext.java (from rev 89247, projects/microcontainer/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/InvokeDispatchContext.java)
===================================================================
--- projects/microcontainer/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/LifecycleDispatchContext.java	                        (rev 0)
+++ projects/microcontainer/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/LifecycleDispatchContext.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -0,0 +1,48 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.dependency.spi.dispatch;
+
+import org.jboss.dependency.spi.ControllerState;
+
+/**
+ * This context knows how to handle lifecycle invocation.
+ * Resulting in valid lifecycle invocation will force this context to change state.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public interface LifecycleDispatchContext extends InvokeDispatchContext
+{
+   /**
+    * Is this invocation a lifecycle invocation.
+    * 
+    * Return state value to which this context should be moved
+    * or return current state if we're already past the lifecycle state
+    * or null if the invocation is actually not a lifecycle invocation.
+    *
+    * @param name method name
+    * @param parameters parameter values
+    * @param signature method's parameter types / signatures
+    * @return state to which we should move this context, or null if this is not lifecycle invocation
+    * @throws Throwable for any error
+    */
+   ControllerState lifecycleInvocation(String name, Object parameters[], String[] signature) throws Throwable;
+}
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/bootstrap/basic/KernelConstants.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/bootstrap/basic/KernelConstants.java	2009-05-22 14:07:12 UTC (rev 89288)
+++ projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/bootstrap/basic/KernelConstants.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -49,7 +49,7 @@
    static final String KERNEL_BUS_PROPERTY = KernelBus.class.getName(); 
    
    /** The default kernel bus implementation */
-   static final String KERNEL_BUS_CLASS = "org.jboss.kernel.plugins.registry.basic.BasicKernelBus"; 
+   static final String KERNEL_BUS_CLASS = "org.jboss.kernel.plugins.registry.basic.LifecycleAwareKernelBus"; 
    
    /** The default kernel config name */
    static final String KERNEL_CONFIG_NAME = "jboss.kernel:service=KernelConfig"; 

Modified: projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java	2009-05-22 14:07:12 UTC (rev 89288)
+++ projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -25,16 +25,21 @@
 import java.security.AccessController;
 import java.security.SecurityPermission;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.spi.AliasMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.LifecycleMetaData;
+import org.jboss.beans.metadata.spi.ParameterMetaData;
 import org.jboss.dependency.plugins.AbstractControllerContext;
 import org.jboss.dependency.plugins.AbstractDependencyInfo;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerMode;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.ControllerStateModel;
 import org.jboss.dependency.spi.DependencyInfo;
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.ErrorHandlingMode;
@@ -292,10 +297,99 @@
       SecurityManager sm = System.getSecurityManager();
       if (sm != null)
          sm.checkPermission(GET_CLASSLOADER_PERMISSION);
+
       return Configurator.getClassLoader(getBeanMetaData());
    }
 
+   // TODO - not the nicest impl with 4 trys, but what else can we do?
+   public ControllerState lifecycleInvocation(String name, Object[] parameters, String[] signature) throws Throwable
+   {
+      if (useLifecycleState(name, signature, metaData.getCreate(), "create"))
+      {
+         ControllerStateModel model = getController().getStates();
+         if (model.isAfterState(ControllerState.CREATE, getState()))
+            return ControllerState.CREATE;
+         else
+            return getState();
+      }
+
+      if (useLifecycleState(name, signature, metaData.getStart(), "start"))
+      {
+         ControllerStateModel model = getController().getStates();
+         if (model.isAfterState(ControllerState.START, getState()))
+            return ControllerState.START;
+         else
+            return getState();
+      }
+
+      if (useLifecycleState(name, signature, metaData.getStop(), "stop"))
+      {
+         ControllerStateModel model = getController().getStates();
+         if (model.isBeforeState(ControllerState.CREATE, getState()))
+            return ControllerState.CREATE;
+         else
+            return getState();
+      }
+
+      if (useLifecycleState(name, signature, metaData.getDestroy(), "destroy"))
+      {
+         ControllerStateModel model = getController().getStates();
+         if (model.isBeforeState(ControllerState.CONFIGURED, getState()))
+            return ControllerState.CONFIGURED;
+         else
+            return getState();
+      }
+
+      return null;
+   }
+
    /**
+    * Get lifecycle state if it matches the parameters.
+    *
+    * @param name the method name
+    * @param signature the signature
+    * @param lmd the lifecycle metadata
+    * @param defaultName the default name
+    * @return true if lifecycle matches, false otherwise
+    */
+   protected static boolean useLifecycleState(String name, String[] signature, LifecycleMetaData lmd, String defaultName)
+   {
+      if (lmd != null)
+      {
+         String methodName = lmd.getMethodName();
+         if (name.equals(methodName) || (methodName == null && name.equals(defaultName)))
+         {
+            List<ParameterMetaData> params = lmd.getParameters();
+            if (params != null)
+            {
+               if (signature != null && params.size() == signature.length)
+               {
+                  int i = 0;
+                  for (ParameterMetaData pmd : params)
+                  {
+                     String type = pmd.getType();
+                     if (type != null && signature[i] != null && type.equals(signature[i]) == false)
+                        return false; // we found a non match
+                     i++;
+                  }
+                  return true;
+               }
+            }
+            else if (signature == null || signature.length == 0)
+            {
+               return true;
+            }
+         }
+      }
+      else if (defaultName.equals(name) && (signature == null || signature.length == 0))
+      {
+         return true;
+      }
+
+      return false;
+   }
+
+   /**
     * Validate method invocation.
     * Use jsr303 constraints.
     *

Modified: projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/BasicKernelBus.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/BasicKernelBus.java	2009-05-22 14:07:12 UTC (rev 89288)
+++ projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/BasicKernelBus.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -49,8 +49,25 @@
       ControllerContext context = controller.getInstalledContext(name);
       if (context == null)
          throw new IllegalArgumentException("No such context: " + name);
+      
+      return execute(context, clazz, dispatcher);
+   }
+
+   /**
+    * Execute dispatch.
+    *
+    * @param <T> exact context type
+    * @param context the context
+    * @param clazz the context class
+    * @param dispatcher the dispatcher
+    * @return dispatcher's result
+    * @throws Throwable for any error
+    */
+   protected <T> Object execute(ControllerContext context, Class<T> clazz, Dispatcher<T> dispatcher) throws Throwable
+   {
       if (clazz.isAssignableFrom(context.getClass()) == false)
          throw new IllegalArgumentException("Cannot execute " + dispatcher + " on non " + clazz.getSimpleName() + " context: " + context);
+
       return dispatcher.dispatch(clazz.cast(context));
    }
 
@@ -108,7 +125,7 @@
     *
     * @param <T> exact context type
     */
-   private interface Dispatcher<T>
+   protected interface Dispatcher<T>
    {
       /**
        * Invoke simple dispatcher.

Copied: projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/LifecycleAwareKernelBus.java (from rev 89247, projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/BasicKernelBus.java)
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/LifecycleAwareKernelBus.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/basic/LifecycleAwareKernelBus.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -0,0 +1,76 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.registry.basic;
+
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.dispatch.LifecycleDispatchContext;
+import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
+
+/**
+ * A kernel bus that understands lifecycle invocation.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class LifecycleAwareKernelBus extends BasicKernelBus
+{
+   public Object invoke(Object name, final String methodName, final Object parameters[], final String[] signature) throws Throwable
+   {
+      ControllerContext context = controller.getContext(name, null);
+      if (context == null)
+         throw new IllegalArgumentException("No such context: " + name);
+
+      if (context instanceof LifecycleDispatchContext)
+      {
+         LifecycleDispatchContext ldc = (LifecycleDispatchContext)context;
+         ControllerState state = ldc.lifecycleInvocation(methodName, parameters, signature);
+         if (state != null)
+         {
+            if (state.equals(context.getState()) == false)
+               controller.change(context, state);
+            
+            return null;
+         }
+      }
+
+      if (ControllerState.INSTALLED.equals(context.getState()))
+      {
+         return execute(context, InvokeDispatchContext.class, new Dispatcher<InvokeDispatchContext>()
+         {
+            public Object dispatch(InvokeDispatchContext dispatchContext) throws Throwable
+            {
+               return dispatchContext.invoke(methodName, parameters, signature);
+            }
+
+            @Override
+            public String toString()
+            {
+               return "invoke";
+            }
+         });
+      }
+      else
+      {
+         throw new IllegalArgumentException("The invocation is not a lifecycle invocation or context is not fully installed: " + context);
+      }
+   }
+}
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelControllerContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelControllerContext.java	2009-05-22 14:07:12 UTC (rev 89288)
+++ projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelControllerContext.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -23,7 +23,7 @@
 
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.metadata.spi.BeanMetaData;
-import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
+import org.jboss.dependency.spi.dispatch.LifecycleDispatchContext;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.spi.registry.KernelRegistryEntry;
 
@@ -33,7 +33,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
-public interface KernelControllerContext extends KernelRegistryEntry, InvokeDispatchContext
+public interface KernelControllerContext extends KernelRegistryEntry, LifecycleDispatchContext
 {
    /**
     * Get the kernel

Modified: projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java	2009-05-22 14:07:12 UTC (rev 89288)
+++ projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -25,6 +25,7 @@
 import org.jboss.beans.info.spi.helpers.UnmodifiableBeanInfo;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.dependency.spi.helpers.UnmodifiableControllerContext;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 
@@ -95,4 +96,9 @@
    {
       throw new UnsupportedOperationException("Cannot execute set on unmodifiable wrapper.");
    }
+
+   public ControllerState lifecycleInvocation(String name, Object[] parameters, String[] signature) throws Throwable
+   {
+      return null;
+   }
 }

Modified: projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/registry/support/BusBean.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/registry/support/BusBean.java	2009-05-22 14:07:12 UTC (rev 89288)
+++ projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/registry/support/BusBean.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -21,6 +21,8 @@
 */
 package org.jboss.test.kernel.registry.support;
 
+import java.util.Date;
+
 /**
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
@@ -37,4 +39,25 @@
    {
       this.value = value;
    }
+
+   public void create()
+   {
+      System.out.println("Created");
+   }
+
+   public void start(String msg)
+   {
+      System.out.println("msg = " + msg);
+   }
+
+   public void doStop()
+   {
+      System.out.println("doStop");
+   }
+
+   public void executeDestroy(int exit, Date date)
+   {
+      System.out.println("exit = " + exit);
+      System.out.println("date = " + date);
+   }
 }

Modified: projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/registry/test/BusTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/registry/test/BusTestCase.java	2009-05-22 14:07:12 UTC (rev 89288)
+++ projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/registry/test/BusTestCase.java	2009-05-22 14:53:04 UTC (rev 89289)
@@ -21,13 +21,19 @@
 */
 package org.jboss.test.kernel.registry.test;
 
+import java.util.Date;
+
 import junit.framework.Test;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.plugins.dependency.AbstractKernelControllerContext;
+import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.kernel.spi.registry.KernelBus;
 import org.jboss.kernel.spi.registry.KernelRegistryEntry;
-import org.jboss.kernel.spi.config.KernelConfigurator;
 import org.jboss.test.kernel.AbstractKernelTest;
 import org.jboss.test.kernel.registry.support.BusBean;
 
@@ -35,7 +41,7 @@
  * Bus Test Case.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
- * @version $Revision$
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  */
 @SuppressWarnings("deprecation")
 public class BusTestCase extends AbstractKernelTest
@@ -56,6 +62,7 @@
       org.jboss.kernel.spi.registry.KernelRegistry registry = kernel.getRegistry();
       KernelConfigurator configurator = kernel.getConfigurator();
       registry.registerEntry("Bus", makeContext(configurator, "Name1", new BusBean()));
+
       KernelBus bus = kernel.getBus();
       Object result1 = bus.get("Bus", "value");
       assertNull("Result 1", result1);
@@ -69,8 +76,15 @@
       Kernel kernel = bootstrap();
       org.jboss.kernel.spi.registry.KernelRegistry registry = kernel.getRegistry();
       KernelConfigurator configurator = kernel.getConfigurator();
-      registry.registerEntry("Name1", makeContext(configurator, "Name1", "A string"));
-      registry.registerEntry("Name2", makeContext(configurator, "Name2", "B string"));
+
+      KernelRegistryEntry entry1 = makeContext(configurator, "Name1", "A string");
+      entry1.setState(ControllerState.INSTALLED);
+      registry.registerEntry("Name1", entry1);
+
+      KernelRegistryEntry entry2 = makeContext(configurator, "Name2", "B string");
+      entry2.setState(ControllerState.INSTALLED);
+      registry.registerEntry("Name2", entry2);
+
       KernelBus bus = kernel.getBus();
       Object result1 = bus.invoke("Name1", "toString", new Object[]{}, new String[]{});
       Object result2 = bus.invoke("Name2", "toString", new Object[]{}, new String[]{});
@@ -78,6 +92,36 @@
       assertEquals("B string", result2);
    }
 
+   public void testLifecycle() throws Throwable
+   {
+      Kernel kernel = bootstrap();
+      KernelController controller = kernel.getController();
+
+      BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("Name1", BusBean.class.getName());
+      builder.addStartParameter(String.class.getName(), "123-Start");
+      builder.setStop("doStop");
+      builder.setDestroy("executeDestroy");
+      builder.addDestroyParameter("int", 123);
+      builder.addDestroyParameter(Date.class.getName(), new Date());
+
+      KernelControllerContext context = controller.install(builder.getBeanMetaData());
+      assertEquals(ControllerState.INSTALLED, context.getState());
+
+      KernelBus bus = kernel.getBus();
+
+      bus.invoke("Name1", "executeDestroy", new Object[]{-1, new Date()}, new String[]{int.class.getName(), Date.class.getName()});
+      assertEquals(ControllerState.CONFIGURED, context.getState());
+
+      bus.invoke("Name1", "create", null, null);
+      assertEquals(ControllerState.CREATE, context.getState());
+
+      bus.invoke("Name1", "start", new Object[]{"foobar"}, new String[]{String.class.getName()});
+      assertEquals(ControllerState.START, context.getState());
+
+      bus.invoke("Name1", "doStop", null, null);
+      assertEquals(ControllerState.CREATE, context.getState());     
+   }
+
    protected static KernelRegistryEntry makeContext(KernelConfigurator configurator, String name, Object target)
          throws Throwable
    {




More information about the jboss-cvs-commits mailing list