[jboss-cvs] JBossAS SVN: r60568 - in projects/microcontainer/trunk: kernel/src/main/org/jboss/kernel/plugins/dependency and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Feb 15 08:38:04 EST 2007


Author: alesj
Date: 2007-02-15 08:38:04 -0500 (Thu, 15 Feb 2007)
New Revision: 60568

Added:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/ScopedKernelController.java
Modified:
   projects/microcontainer/trunk/container/src/main/org/jboss/metadata/plugins/scope/DeploymentScope.java
   projects/microcontainer/trunk/container/src/main/org/jboss/metadata/plugins/scope/InstanceScope.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java
Log:
Initial code for scoped controller.
A lot of todos to resolve - how to address parent controller's methods (instance values - current contexts, ...), ...

Modified: projects/microcontainer/trunk/container/src/main/org/jboss/metadata/plugins/scope/DeploymentScope.java
===================================================================
--- projects/microcontainer/trunk/container/src/main/org/jboss/metadata/plugins/scope/DeploymentScope.java	2007-02-15 11:35:43 UTC (rev 60567)
+++ projects/microcontainer/trunk/container/src/main/org/jboss/metadata/plugins/scope/DeploymentScope.java	2007-02-15 13:38:04 UTC (rev 60568)
@@ -21,6 +21,11 @@
 */
 package org.jboss.metadata.plugins.scope;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
 import org.jboss.metadata.spi.scope.ScopeFactoryLookup;
 
 /**
@@ -29,6 +34,8 @@
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
 @ScopeFactoryLookup(DeploymentScopeFactory.class)
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ElementType.TYPE})
 public @interface DeploymentScope
 {
    String value() default "";

Modified: projects/microcontainer/trunk/container/src/main/org/jboss/metadata/plugins/scope/InstanceScope.java
===================================================================
--- projects/microcontainer/trunk/container/src/main/org/jboss/metadata/plugins/scope/InstanceScope.java	2007-02-15 11:35:43 UTC (rev 60567)
+++ projects/microcontainer/trunk/container/src/main/org/jboss/metadata/plugins/scope/InstanceScope.java	2007-02-15 13:38:04 UTC (rev 60568)
@@ -21,6 +21,11 @@
 */
 package org.jboss.metadata.plugins.scope;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
 import org.jboss.metadata.spi.scope.ScopeFactoryLookup;
 
 /**
@@ -29,6 +34,8 @@
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
 @ScopeFactoryLookup(InstanceScopeFactory.class)
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ElementType.TYPE})
 public @interface InstanceScope
 {
    String value();

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java	2007-02-15 11:35:43 UTC (rev 60567)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java	2007-02-15 13:38:04 UTC (rev 60568)
@@ -72,6 +72,9 @@
    /** The access control context */
    protected AccessControlContext accessContext;
 
+   /** Did we do a initialVisit */
+   protected boolean isInitialProcessed;
+
    /** Did we do a describeVisit */
    protected boolean isDescribeProcessed;
 
@@ -176,8 +179,10 @@
    {
       if (metaData == null)
          return;
+      if (isInitialProcessed) return;
       PreprocessMetaDataVisitor visitor = new PreprocessMetaDataVisitor(metaData);
       AccessController.doPrivileged(visitor);
+      isInitialProcessed = true;
    }
 
    /**

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java	2007-02-15 11:35:43 UTC (rev 60567)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java	2007-02-15 13:38:04 UTC (rev 60568)
@@ -21,14 +21,28 @@
 */
 package org.jboss.kernel.plugins.dependency;
 
+import java.lang.annotation.Annotation;
+import java.util.Collection;
+import java.util.HashSet;
+
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.dependency.spi.Controller;
 import org.jboss.kernel.Kernel;
 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.metadata.KernelMetaDataRepository;
-import org.jboss.metadata.spi.MetaData;
+import org.jboss.metadata.plugins.loader.memory.MemoryMetaDataLoader;
+import org.jboss.metadata.spi.MutableMetaData;
+import org.jboss.metadata.spi.repository.MutableMetaDataRepository;
+import org.jboss.metadata.spi.retrieval.AnnotationItem;
+import org.jboss.metadata.spi.retrieval.AnnotationsItem;
+import org.jboss.metadata.spi.retrieval.MetaDataItem;
+import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
+import org.jboss.metadata.spi.scope.Scope;
+import org.jboss.metadata.spi.scope.ScopeFactoryLookup;
+import org.jboss.metadata.spi.scope.ScopeKey;
 
 /**
  * PreInstallAction.
@@ -49,10 +63,11 @@
          BeanInfo info = configurator.getBeanInfo(metaData);
          context.setBeanInfo(info);
 
-         MetaData md = addMetaData(context);
+         KernelMetaDataRepository repository = controller.getKernel().getMetaDataRepository();
+         repository.addMetaData(context);
          try
          {
-            // todo
+            //applyScoping(context);
          }
          catch (Throwable t)
          {
@@ -62,26 +77,101 @@
       }
    }
 
-   protected void uninstallActionInternal(KernelControllerContext context)
+   protected void applyScoping(KernelControllerContext context) throws Throwable
    {
-      removeMetaData(context);
-      context.setBeanInfo(null);
+      KernelController controller = (KernelController)context.getController();
+      KernelMetaDataRepository repository = controller.getKernel().getMetaDataRepository();
+      MetaDataRetrieval retrieval = repository.getMetaDataRetrieval(context);
+      if (retrieval != null)
+      {
+         AnnotationsItem annotations = retrieval.retrieveAnnotations();
+         if (annotations != null)
+         {
+            AnnotationItem[] annotationItems = annotations.getAnnotations();
+            if (annotationItems != null && annotationItems.length > 0)
+            {
+               Collection<Scope> scopes = new HashSet<Scope>();
+               for(AnnotationItem annItem : annotationItems)
+               {
+                  Annotation annotation = annItem.getAnnotation();
+                  if (annotation.annotationType().isAnnotationPresent(ScopeFactoryLookup.class))
+                  {
+                     ScopeFactoryLookup sfl = annotation.annotationType().getAnnotation(ScopeFactoryLookup.class);
+                     Scope scope = sfl.value().newInstance().create(annotation);
+                     scopes.add(scope);
+                  }
+               }
+               if (scopes.size() > 0)
+               {
+                  ScopeKey scopeKey = new ScopeKey(scopes);
+                  context.setScope(scopeKey);
+                  // find scoped controller
+                  MutableMetaDataRepository mmdr = repository.getMetaDataRepository();
+                  MetaDataRetrieval mdr = mmdr.getMetaDataRetrieval(scopeKey);
+                  if (mdr == null)
+                  {
+                     mdr = new MemoryMetaDataLoader(scopeKey);
+                     mmdr.addMetaDataRetrieval(mdr);
+                  }
+                  MetaDataItem<Controller> controllerItem = mdr.retrieveMetaData(Controller.class);
+                  Controller scopedController;
+                  if (controllerItem != null)
+                  {
+                     scopedController = controllerItem.getValue();
+                  }
+                  else
+                  {
+                     Controller parentController = null;
+                     ScopeKey parentKey = scopeKey.getParent();
+                     while(parentController == null && parentKey != null)
+                     {
+                        MetaDataRetrieval pmdr = mmdr.getMetaDataRetrieval(parentKey);
+                        if (pmdr != null)
+                        {
+                           MetaDataItem<Controller> pci = pmdr.retrieveMetaData(Controller.class);
+                           if (pci != null)
+                           {
+                              parentController = pci.getValue();
+                           }
+                        }
+                        parentKey = parentKey.getParent();
+                     }
+                     if (parentController == null)
+                     {
+                        parentController = controller;
+                     }
+                     scopedController = new ScopedKernelController(parentController);
+                     ((MutableMetaData)mdr).addMetaData(scopedController, Controller.class);
+                  }
+                  context.setController(scopedController);
+               }
+            }
+         }
+      }
    }
 
-   /**
-    * Adds annotations to the bean.
-    *
-    * @param context the context
-    * @return the metadata
-    */
-   private MetaData addMetaData(KernelControllerContext context)
+   protected void removeScoping(KernelControllerContext context) throws Throwable
    {
-      KernelController controller = (KernelController) context.getController();
-      KernelMetaDataRepository repository = controller.getKernel().getMetaDataRepository();
-      repository.addMetaData(context);
-      return repository.getMetaData(context);
+      // todo
    }
 
+   protected void uninstallActionInternal(KernelControllerContext context)
+   {
+      try
+      {
+         removeScoping(context);
+      }
+      catch(Throwable ignored)
+      {
+         log.warn("Unexpected error removing scoping: ", ignored);
+      }
+      finally
+      {
+         removeMetaData(context);
+         context.setBeanInfo(null);
+      }
+   }
+
    /**
     * Remove any previously added metadata
     *

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/ScopedKernelController.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/ScopedKernelController.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/ScopedKernelController.java	2007-02-15 13:38:04 UTC (rev 60568)
@@ -0,0 +1,223 @@
+/*
+* 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.kernel.plugins.dependency;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.kernel.spi.event.KernelEvent;
+import org.jboss.kernel.spi.event.KernelEventFilter;
+import org.jboss.kernel.spi.event.KernelEventListener;
+import org.jboss.kernel.spi.registry.KernelRegistryEntry;
+import org.jboss.kernel.spi.registry.KernelRegistryPlugin;
+
+/**
+ * Scoped Kernel controller.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class ScopedKernelController extends AbstractKernelController
+{
+   protected Controller parent;
+
+   public ScopedKernelController(Controller parentController)
+         throws Exception
+   {
+      super();
+      parent = parentController;
+      parent.addController(this);
+   }
+
+   private boolean isParentKernelController()
+   {
+      return (parent instanceof KernelController);
+   }
+
+   private KernelController getParentKernelController()
+   {
+      if (isParentKernelController() == false)
+         throw new IllegalArgumentException("Illegal call to parent Controller, not of KernelController instance!");
+      return (KernelController)parent;
+   }
+
+   // Controller methods
+
+   public ControllerContext getContext(Object name, ControllerState state)
+   {
+      ControllerContext context = super.getContext(name, state);
+      if (context != null)
+      {
+         return context;
+      }
+      return parent.getContext(name, state);
+   }
+
+   public Set<ControllerContext> getNotInstalled()
+   {
+      Set<ControllerContext> uninstalled = new HashSet<ControllerContext>(parent.getNotInstalled());
+      uninstalled.addAll(super.getNotInstalled());
+      return uninstalled;
+   }
+
+   public ControllerContext uninstall(Object name)
+   {
+      return super.uninstall(name);    //todo
+   }
+
+   protected void install(ControllerContext context, boolean trace) throws Throwable
+   {
+      super.install(context, trace);    //todo
+   }
+
+   protected void change(ControllerContext context, ControllerState state, boolean trace) throws Throwable
+   {
+      super.change(context, state, trace);    //todo
+   }
+
+   protected void enableOnDemand(ControllerContext context, boolean trace) throws Throwable
+   {
+      super.enableOnDemand(context, trace);    //todo
+   }
+
+   protected boolean incrementState(ControllerContext context, boolean trace)
+   {
+      return super.incrementState(context, trace);    //todo
+   }
+
+   protected void resolveContexts(boolean trace)
+   {
+      super.resolveContexts(trace);    //todo
+   }
+
+   protected boolean resolveContexts(ControllerState fromState, ControllerState toState, boolean trace)
+   {
+      return super.resolveContexts(fromState, toState, trace);    //todo
+   }
+
+   protected void uninstallContext(ControllerContext context, boolean trace)
+   {
+      super.uninstallContext(context, trace);    //todo
+   }
+
+   // KernelController methods
+
+   public Kernel getKernel()
+   {
+      if (isParentKernelController())
+      {
+         return getParentKernelController().getKernel();
+      }
+      else
+      {
+         return super.getKernel();
+      }
+   }
+
+   public void setKernel(Kernel kernel) throws Throwable
+   {
+      if (isParentKernelController())
+      {
+         getParentKernelController().setKernel(kernel);
+      }
+      else
+      {
+         super.setKernel(kernel);
+      }
+   }
+
+   public void fireKernelEvent(KernelEvent event)
+   {
+      if (isParentKernelController())
+      {
+         getParentKernelController().fireKernelEvent(event);
+      }
+      else
+      {
+         super.fireKernelEvent(event);
+      }
+   }
+
+   public void registerListener(KernelEventListener listener, KernelEventFilter filter, Object handback) throws Throwable
+   {
+      if (isParentKernelController())
+      {
+         getParentKernelController().registerListener(listener, filter, handback);
+      }
+      else
+      {
+         super.registerListener(listener, filter, handback);
+      }
+   }
+
+   public void unregisterListener(KernelEventListener listener, KernelEventFilter filter, Object handback) throws Throwable
+   {
+      if (isParentKernelController())
+      {
+         getParentKernelController().unregisterListener(listener, filter, handback);
+      }
+      else
+      {
+         super.unregisterListener(listener, filter, handback);
+      }
+   }
+
+   public Set<KernelControllerContext> getInstantiatedContexts(Class clazz)
+   {
+      // todo - some locking?
+      Set<KernelControllerContext> contexts = new HashSet<KernelControllerContext>();
+      Set<KernelControllerContext> currentContexts = super.getInstantiatedContexts(clazz);
+      if (currentContexts != null && currentContexts.size() > 0)
+      {
+         contexts.addAll(currentContexts);
+      }
+      if (isParentKernelController())
+      {
+         Set<KernelControllerContext> parentContexts = ((KernelController)parent).getInstantiatedContexts(clazz);
+         if (parentContexts != null && parentContexts.size() > 0)
+         {
+            contexts.addAll(parentContexts);
+         }
+      }
+      return contexts.size() > 0 ? contexts : null;
+   }
+
+   // KernelRegistry plugin method
+
+   public KernelRegistryEntry getEntry(Object name)
+   {
+      KernelRegistryEntry entry = super.getEntry(name);
+      if (entry != null)
+         return entry;
+      if (parent instanceof KernelRegistryPlugin)
+      {
+         return ((KernelRegistryPlugin)parent).getEntry(name);
+      }
+      return null;
+   }
+
+}




More information about the jboss-cvs-commits mailing list