[jboss-cvs] JBossAS SVN: r75298 - 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
Wed Jul 2 04:18:05 EDT 2008


Author: alesj
Date: 2008-07-02 04:18:05 -0400 (Wed, 02 Jul 2008)
New Revision: 75298

Added:
   projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AbstractAliasControllerContext.java
   projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AliasControllerContext.java
   projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/ScopedAliasControllerContext.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractScopeAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallExistingScopeAction.java
Modified:
   projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AbstractController.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelController.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallScopeAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/ScopedKernelController.java
Log:
[JBMICROCONT-309]; refactoring in order to allow scoped alias controller context.

Added: projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AbstractAliasControllerContext.java
===================================================================
--- projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AbstractAliasControllerContext.java	                        (rev 0)
+++ projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AbstractAliasControllerContext.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -0,0 +1,78 @@
+/*
+* 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.plugins;
+
+import org.jboss.dependency.spi.ControllerContextActions;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.util.JBossStringBuilder;
+
+/**
+ * Abstract alias controller context.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public abstract class AbstractAliasControllerContext extends AbstractControllerContext implements AliasControllerContext
+{
+   private Object alias;
+   private Object original;
+
+   public AbstractAliasControllerContext(Object alias, String id, Object original, ControllerContextActions actions)
+   {
+      super(alias + "_Alias_" + id, actions);
+      if (alias == null)
+         throw new IllegalArgumentException("Null alias");
+      if (id == null)
+         throw new IllegalArgumentException("Null id");
+      if (original == null)
+         throw new IllegalArgumentException("Null original");
+
+      this.alias = alias;
+      this.original = original;
+      DependencyInfo info = getDependencyInfo();
+      info.addIDependOn(new AbstractDependencyItem(getName(), original, ControllerState.INSTALLED, ControllerState.INSTANTIATED));
+   }
+
+   public Object getAlias()
+   {
+      return alias;
+   }
+
+   public Object getOriginal()
+   {
+      return original;
+   }
+
+   public void toString(JBossStringBuilder buffer)
+   {
+      buffer.append("alias=").append(alias);
+      buffer.append(" original=").append(original).append(" ");
+      super.toString(buffer);
+   }
+
+   public void toShortString(JBossStringBuilder buffer)
+   {
+      buffer.append("alias=").append(alias);
+      buffer.append(" original=").append(original).append(" ");
+      super.toShortString(buffer);
+   }
+}
\ No newline at end of file

Modified: projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AbstractController.java
===================================================================
--- projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AbstractController.java	2008-07-02 07:37:00 UTC (rev 75297)
+++ projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AbstractController.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -48,7 +48,6 @@
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.LifecycleCallbackItem;
 import org.jboss.util.JBossObject;
-import org.jboss.util.JBossStringBuilder;
 
 /**
  * Abstract controller.
@@ -488,7 +487,7 @@
    {
       Map<ControllerState, ControllerContextAction> map = createAliasActions();
       ControllerContextActions actions = new AbstractControllerContextActions(map);
-      AliasControllerContext context = new AliasControllerContext(alias, original, actions);
+      AliasControllerContext context = new InnerAliasControllerContext(alias, original, actions);
       preAliasInstall(context);
       install(context);
       // is alias in error
@@ -1667,43 +1666,12 @@
 
    // --- alias dependency
 
-   private class AliasControllerContext extends AbstractControllerContext
+   private class InnerAliasControllerContext extends AbstractAliasControllerContext
    {
-      private Object alias;
-      private Object original;
-
-      public AliasControllerContext(Object alias, Object original, ControllerContextActions actions)
+      private InnerAliasControllerContext(Object alias, Object original, ControllerContextActions actions)
       {
-         super(alias + "_Alias_" + getId(), actions);
-         this.alias = alias;
-         this.original = original;
-         DependencyInfo info = getDependencyInfo();
-         info.addIDependOn(new AbstractDependencyItem(getName(), original, ControllerState.INSTALLED, ControllerState.INSTANTIATED));
+         super(alias, getId(), original, actions);
       }
-
-      public Object getAlias()
-      {
-         return alias;
-      }
-
-      public Object getOriginal()
-      {
-         return original;
-      }
-
-      public void toString(JBossStringBuilder buffer)
-      {
-         buffer.append("alias=").append(alias);
-         buffer.append(" original=").append(original).append(" ");
-         super.toString(buffer);
-      }
-
-      public void toShortString(JBossStringBuilder buffer)
-      {
-         buffer.append("alias=").append(alias);
-         buffer.append(" original=").append(original).append(" ");
-         super.toShortString(buffer);
-      }
    }
 
    private class AliasControllerContextAction extends SimpleControllerContextAction<AliasControllerContext>
@@ -1734,7 +1702,6 @@
          try
          {
             ControllerContext lookup = getRegisteredControllerContext(original, true);
-            // todo - do we need to add it to context.aliases?
             registerControllerContext(alias, lookup);
             if (log.isTraceEnabled())
                log.trace("Added alias " + alias + " for context " + context);

Added: projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AliasControllerContext.java
===================================================================
--- projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AliasControllerContext.java	                        (rev 0)
+++ projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/AliasControllerContext.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -0,0 +1,46 @@
+/*
+* 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.plugins;
+
+import org.jboss.dependency.spi.ControllerContext;
+
+/**
+ * Alias controller context.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public interface AliasControllerContext extends ControllerContext
+{
+   /**
+    * Get the alias.
+    *
+    * @return the alias to register
+    */
+   Object getAlias();
+
+   /**
+    * Get the original.
+    *
+    * @return the original to map to
+    */
+   Object getOriginal();
+}

Added: projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/ScopedAliasControllerContext.java
===================================================================
--- projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/ScopedAliasControllerContext.java	                        (rev 0)
+++ projects/microcontainer/trunk/dependency/src/main/org/jboss/dependency/plugins/ScopedAliasControllerContext.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -0,0 +1,78 @@
+/*
+* 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.plugins;
+
+import java.util.Map;
+
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContextActions;
+import org.jboss.dependency.spi.ScopeInfo;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.plugins.action.ControllerContextAction;
+import org.jboss.metadata.spi.scope.ScopeKey;
+
+/**
+ * Scoped alias controller context.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class ScopedAliasControllerContext extends AbstractAliasControllerContext
+{
+   private ScopedAliasControllerContext(Object alias, Object original, ScopeKey scopeKey, ControllerContextActions actions)
+   {
+      super(alias, scopeKey.toString(), original, actions);
+      ScopeInfo scopeInfo = getScopeInfo();
+      scopeInfo.setInstallScope(scopeKey);
+   }
+
+   /**
+    * Add scoped alias.
+    *
+    * @param alias the alias
+    * @param original the original
+    * @param scopeKey the scope key
+    * @param controller the controller
+    * @throws Throwable for any error
+    */
+   public static void addAlias(Object alias, Object original, ScopeKey scopeKey, Controller controller) throws Throwable
+   {
+      if (controller instanceof AbstractController == false)
+         throw new IllegalArgumentException("Can only handle AbstractController.");
+
+      AbstractController ac = (AbstractController)controller;
+      Map<ControllerState, ControllerContextAction> map = ac.createAliasActions();
+      ControllerContextActions actions = new AbstractControllerContextActions(map);
+      controller.install(new ScopedAliasControllerContext(alias, original, scopeKey, actions));
+   }
+
+   /**
+    * Remove alias.
+    *
+    * @param alias the alias
+    * @param scopeKey the scope key
+    * @param controller the controller
+    */
+   public static void removeAlias(Object alias, ScopeKey scopeKey, Controller controller)
+   {
+      controller.uninstall(alias + "_Alias_" + scopeKey);      
+   }
+}
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelController.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelController.java	2008-07-02 07:37:00 UTC (rev 75297)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelController.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -26,12 +26,14 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.HashMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.SupplyMetaData;
 import org.jboss.dependency.plugins.ScopedController;
+import org.jboss.dependency.plugins.action.ControllerContextAction;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.kernel.Kernel;
@@ -76,6 +78,13 @@
    {
    }
 
+   protected Map<ControllerState, ControllerContextAction> createAliasActions()
+   {
+      Map<ControllerState, ControllerContextAction> map = new HashMap<ControllerState, ControllerContextAction>(super.createAliasActions());
+      map.put(ControllerState.PRE_INSTALL, InstallScopeAction.INSTANCE);
+      return map;
+   }
+
    /**
     * Create event emitter.
     *

Copied: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractScopeAction.java (from rev 75218, projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallScopeAction.java)
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractScopeAction.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractScopeAction.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -0,0 +1,60 @@
+/*
+* 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 org.jboss.dependency.plugins.action.SimpleControllerContextAction;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ScopeInfo;
+import org.jboss.metadata.spi.scope.ScopeKey;
+
+/**
+ * Abstract scope action.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public abstract class AbstractScopeAction extends SimpleControllerContextAction<ControllerContext>
+{
+   protected ControllerContext contextCast(ControllerContext context)
+   {
+      return context;
+   }
+
+   protected boolean validateContext(ControllerContext context)
+   {
+      return true;
+   }
+
+   /**
+    * Get install scope key.
+    *
+    * @param context the context
+    * @return install scope key
+    */
+   protected ScopeKey getScopeKey(ControllerContext context)
+   {
+      ScopeInfo scopeInfo = context.getScopeInfo();
+      if (scopeInfo != null)
+         return scopeInfo.getInstallScope();
+
+      return null;
+   }
+}
\ No newline at end of file

Copied: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallExistingScopeAction.java (from rev 75218, projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallScopeAction.java)
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallExistingScopeAction.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallExistingScopeAction.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -0,0 +1,83 @@
+/*
+* 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 org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.kernel.spi.metadata.KernelMetaDataRepository;
+import org.jboss.metadata.spi.repository.MutableMetaDataRepository;
+import org.jboss.metadata.spi.retrieval.MetaDataItem;
+import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
+import org.jboss.metadata.spi.scope.ScopeKey;
+
+/**
+ * Install into existing scope action.
+ *
+ * It expects scoped controller already to be present
+ * under the right scope key.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class InstallExistingScopeAction extends AbstractScopeAction
+{
+   public static final InstallExistingScopeAction INSTANCE = new InstallExistingScopeAction();
+
+   protected void installAction(ControllerContext context) throws Throwable
+   {
+      ScopeKey scopeKey = getScopeKey(context);
+      if (scopeKey != null)
+      {
+         Controller controller = context.getController();
+         if (controller instanceof KernelController == false)
+            throw new IllegalArgumentException("Can only handle kernel controller: " + controller);
+
+         KernelController kernelController = (KernelController)controller;
+         KernelMetaDataRepository repository = kernelController.getKernel().getMetaDataRepository();
+
+         MutableMetaDataRepository mmdr = repository.getMetaDataRepository();
+         MetaDataRetrieval mdr = mmdr.getMetaDataRetrieval(scopeKey);
+         if (mdr == null)
+            throw new IllegalArgumentException("No metadata retrieval for scope: " + scopeKey);
+
+         MetaDataItem<ScopedKernelController> controllerItem = mdr.retrieveMetaData(ScopedKernelController.class);
+         if (controllerItem == null)
+            throw new IllegalArgumentException("Scoped controller should exist: " + scopeKey);
+
+         ScopedKernelController scopedController = controllerItem.getValue();
+         scopedController.addScopedControllerContext(context);
+      }
+   }
+
+   protected void uninstallAction(ControllerContext context)
+   {
+      if (getScopeKey(context) != null)
+      {
+         Controller controller = context.getController();
+         if (controller instanceof ScopedKernelController == false)
+            throw new IllegalArgumentException("Current controller should be scoped: " + controller);
+
+         ScopedKernelController scopedController = (ScopedKernelController)controller;
+         scopedController.removeScopedControllerContext(context);
+      }
+   }
+}
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallScopeAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallScopeAction.java	2008-07-02 07:37:00 UTC (rev 75297)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallScopeAction.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -21,12 +21,13 @@
 */
 package org.jboss.kernel.plugins.dependency;
 
-import org.jboss.dependency.plugins.action.SimpleControllerContextAction;
+import org.jboss.dependency.plugins.AbstractController;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
-import org.jboss.dependency.spi.ScopeInfo;
 import org.jboss.kernel.spi.dependency.KernelController;
 import org.jboss.kernel.spi.metadata.KernelMetaDataRepository;
+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.MetaDataItem;
 import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
@@ -34,39 +35,13 @@
 
 /**
  * Install scope action.
- * 
- * It expects scoped controller already to be present
- * under the right scope key.
  *
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  */
-public class InstallScopeAction extends SimpleControllerContextAction<ControllerContext>
+public class InstallScopeAction extends AbstractScopeAction
 {
-   protected ControllerContext contextCast(ControllerContext context)
-   {
-      return context;
-   }
+   public static final InstallScopeAction INSTANCE = new InstallScopeAction();
 
-   protected boolean validateContext(ControllerContext context)
-   {
-      return true;
-   }
-
-   /**
-    * Get install scope key.
-    *
-    * @param context the context
-    * @return install scope key
-    */
-   protected ScopeKey getScopeKey(ControllerContext context)
-   {
-      ScopeInfo scopeInfo = context.getScopeInfo();
-      if (scopeInfo != null)
-         return scopeInfo.getInstallScope();
-
-      return null;
-   }
-
    protected void installAction(ControllerContext context) throws Throwable
    {
       ScopeKey scopeKey = getScopeKey(context);
@@ -82,27 +57,83 @@
          MutableMetaDataRepository mmdr = repository.getMetaDataRepository();
          MetaDataRetrieval mdr = mmdr.getMetaDataRetrieval(scopeKey);
          if (mdr == null)
-            throw new IllegalArgumentException("No metadata retrieval for scope: " + scopeKey);
-
+         {
+            mdr = new MemoryMetaDataLoader(scopeKey);
+            mmdr.addMetaDataRetrieval(mdr);
+         }
          MetaDataItem<ScopedKernelController> controllerItem = mdr.retrieveMetaData(ScopedKernelController.class);
-         if (controllerItem == null)
-            throw new IllegalArgumentException("Scoped controller should exist: " + scopeKey);
-
-         ScopedKernelController scopedController = controllerItem.getValue();
+         ScopedKernelController scopedController;
+         if (controllerItem != null)
+         {
+            scopedController = controllerItem.getValue();
+         }
+         else
+         {
+            AbstractController parentController = null;
+            ScopeKey parentKey = scopeKey.getParent();
+            while (parentController == null && parentKey != null)
+            {
+               MetaDataRetrieval pmdr = mmdr.getMetaDataRetrieval(parentKey);
+               if (pmdr != null)
+               {
+                  MetaDataItem<ScopedKernelController> pci = pmdr.retrieveMetaData(ScopedKernelController.class);
+                  if (pci != null)
+                  {
+                     parentController = pci.getValue();
+                  }
+               }
+               parentKey = parentKey.getParent();
+            }
+            if (parentController == null)
+            {
+               if (kernelController instanceof AbstractController == false)
+                  throw new IllegalArgumentException("Underlying controller not AbstractController instance!");
+               parentController = (AbstractController)kernelController;
+            }
+            scopedController = new ScopedKernelController(kernelController.getKernel(), parentController, scopeKey);
+            ((MutableMetaData)mdr).addMetaData(scopedController, ScopedKernelController.class);
+         }
          scopedController.addScopedControllerContext(context);
       }
    }
 
    protected void uninstallAction(ControllerContext context)
    {
-      if (getScopeKey(context) != null)
+      ScopeKey scopeKey = getScopeKey(context);
+      if (scopeKey != null)
       {
          Controller controller = context.getController();
-         if (controller instanceof ScopedKernelController == false)
-            throw new IllegalArgumentException("Current controller should be scoped: " + controller);
+         if (controller instanceof KernelController == false)
+            throw new IllegalArgumentException("Can only handle kernel controller: " + controller);
 
-         ScopedKernelController scopedController = (ScopedKernelController)controller;
+         KernelController kernelController = (KernelController)controller;
+         KernelMetaDataRepository repository = kernelController.getKernel().getMetaDataRepository();
+
+         // find scoped controller
+         MutableMetaDataRepository mmdr = repository.getMetaDataRepository();
+         MetaDataRetrieval mdr = mmdr.getMetaDataRetrieval(scopeKey);
+         if (mdr == null)
+         {
+            throw new IllegalArgumentException("Expecting MetaDataRetrieval instance in scope: " + scopeKey);
+         }
+         MetaDataItem<ScopedKernelController> controllerItem = mdr.retrieveMetaData(ScopedKernelController.class);
+         if (controllerItem == null)
+         {
+            throw new IllegalArgumentException("Expecting ScopedKernelController instance in scope:" + scopeKey);
+         }
+         ScopedKernelController scopedController = controllerItem.getValue();
          scopedController.removeScopedControllerContext(context);
+         if (scopedController.isActive() == false)
+         {
+            try
+            {
+               ((MutableMetaData)mdr).removeMetaData(ScopedKernelController.class);
+            }
+            finally
+            {
+               scopedController.release();
+            }
+         }
       }
    }
 }
\ No newline at end of file

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	2008-07-02 07:37:00 UTC (rev 75297)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -206,11 +206,11 @@
 
    protected void removeScoping(KernelControllerContext context) throws Throwable
    {
-      KernelController controller = (KernelController)context.getController();
-      KernelMetaDataRepository repository = controller.getKernel().getMetaDataRepository();
       ScopeKey scopeKey = context.getScopeInfo().getInstallScope();
       if (scopeKey != null)
       {
+         KernelController controller = (KernelController)context.getController();
+         KernelMetaDataRepository repository = controller.getKernel().getMetaDataRepository();
          // find scoped controller
          MutableMetaDataRepository mmdr = repository.getMetaDataRepository();
          MetaDataRetrieval mdr = mmdr.getMetaDataRetrieval(scopeKey);

Modified: 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	2008-07-02 07:37:00 UTC (rev 75297)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/ScopedKernelController.java	2008-07-02 08:18:05 UTC (rev 75298)
@@ -56,9 +56,6 @@
  */
 public class ScopedKernelController extends AbstractKernelController
 {
-   /** Alias scope action instance */
-   private static final InstallScopeAction ALIAS_SCOPE_ACTION = new InstallScopeAction();
-
    protected Kernel parentKernel;
    private ScopeKey scopeKey;
 
@@ -139,7 +136,7 @@
    protected Map<ControllerState, ControllerContextAction> createAliasActions()
    {
       Map<ControllerState, ControllerContextAction> map = new HashMap<ControllerState, ControllerContextAction>(super.createAliasActions());
-      map.put(ControllerState.PRE_INSTALL, ALIAS_SCOPE_ACTION);
+      map.put(ControllerState.PRE_INSTALL, InstallExistingScopeAction.INSTANCE);
       return map;
    }
 




More information about the jboss-cvs-commits mailing list