[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