[Jboss-cvs] JBossAS SVN: r55984 - in trunk/system/src: main/org/jboss/system main/org/jboss/system/metadata main/org/jboss/system/microcontainer tests/org/jboss/test/system/metadata/test

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Aug 16 09:41:55 EDT 2006


Author: adrian at jboss.org
Date: 2006-08-16 09:41:35 -0400 (Wed, 16 Aug 2006)
New Revision: 55984

Added:
   trunk/system/src/main/org/jboss/system/metadata/AbstractMetaDataVisitorNode.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceInjectionValueMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataVisitor.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataVisitorNode.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceValueContext.java
   trunk/system/src/main/org/jboss/system/microcontainer/OnlyUnregisterAction.java
Modified:
   trunk/system/src/main/org/jboss/system/ServiceConfigurator.java
   trunk/system/src/main/org/jboss/system/ServiceController.java
   trunk/system/src/main/org/jboss/system/ServiceCreator.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceAttributeMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceConstructorMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyListValueMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyValueMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceElementValueMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceJBXBValueMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceJavaBeanValueMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataParser.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceTextValueMetaData.java
   trunk/system/src/main/org/jboss/system/metadata/ServiceValueMetaData.java
   trunk/system/src/main/org/jboss/system/microcontainer/ConfigureAction.java
   trunk/system/src/main/org/jboss/system/microcontainer/DescribeAction.java
   trunk/system/src/main/org/jboss/system/microcontainer/ServiceControllerContext.java
   trunk/system/src/main/org/jboss/system/microcontainer/ServiceControllerContextActions.java
   trunk/system/src/main/org/jboss/system/microcontainer/ServiceProxy.java
   trunk/system/src/tests/org/jboss/test/system/metadata/test/AbstractMetaDataTest.java
Log:
Port latest ServiceController wrapper from MC-VDF-WORK
The tests have not been merged.

Modified: trunk/system/src/main/org/jboss/system/ServiceConfigurator.java
===================================================================
--- trunk/system/src/main/org/jboss/system/ServiceConfigurator.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/ServiceConfigurator.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -50,6 +50,7 @@
 import org.jboss.system.metadata.ServiceAttributeMetaData;
 import org.jboss.system.metadata.ServiceMetaData;
 import org.jboss.system.metadata.ServiceMetaDataParser;
+import org.jboss.system.metadata.ServiceValueContext;
 import org.jboss.util.xml.DOMWriter;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -88,40 +89,50 @@
     * Configure an MBean
     * 
     * @param server the server
+    * @param controller the service controller
     * @param objectName the object name
     * @param classLoaderName the classloader object name
     * @param attrs the attributes
     * @throws Exception for any error
     */
-   public static void configure(MBeanServer server, ObjectName objectName, ObjectName classLoaderName, Collection<ServiceAttributeMetaData> attrs) throws Exception
+   public static void configure(MBeanServer server, ServiceController controller, ObjectName objectName, ObjectName classLoaderName, Collection<ServiceAttributeMetaData> attrs) throws Exception
    {
+      server = checkMBeanServer(server, controller);
       ClassLoader cl = server.getClassLoader(classLoaderName);
-      configure(server, objectName, cl, attrs);
+      configure(server, controller, objectName, cl, attrs);
    }
-
+   
    /**
     * Configure an MBean
     * 
     * @param server the server
+    * @param controller the service controller
     * @param objectName the object name
     * @param cl the classloader
     * @param attrs the attributes
     * @throws Exception for any error
     */
-   public static void configure(MBeanServer server, ObjectName objectName, ClassLoader cl, Collection<ServiceAttributeMetaData> attrs) throws Exception
+   public static void configure(MBeanServer server, ServiceController controller, ObjectName objectName, ClassLoader cl, Collection<ServiceAttributeMetaData> attrs) throws Exception
    {
+      ServiceValueContext valueContext = new ServiceValueContext(server, controller, cl);
+      server = checkMBeanServer(server, controller);
+      
       HashMap<String, MBeanAttributeInfo> attributeMap = getAttributeMap(server, objectName);
 
       for (ServiceAttributeMetaData attribute : attrs)
       {
          String attributeName = attribute.getName();
+         if (attributeName == null || attributeName.length() == 0)
+            throw new DeploymentException("No or empty attribute name for " + objectName);
          MBeanAttributeInfo attributeInfo = attributeMap.get(attributeName);
          if (attributeInfo == null)
             throw new DeploymentException("No Attribute found with name: " + attributeName + " for " + objectName);
-         Object value = attribute.getValue(server, attributeInfo, cl);
-         log.debug(attributeName + " set to " + value + " in " + objectName);
+
+         valueContext.setAttributeInfo(attributeInfo);
+         Object value = attribute.getValue(valueContext);
          try
          {
+            log.debug(attributeName + " set to " + value + " in " + objectName);
             server.setAttribute(objectName, new Attribute(attributeName, value));
          }
          catch (Throwable t)
@@ -130,6 +141,24 @@
          }
       }
    }
+
+   /**
+    * Check the server/controller parameters
+    * 
+    * @param server the server
+    * @param controller the controller
+    * @return the server
+    */
+   private static MBeanServer checkMBeanServer(MBeanServer server, ServiceController controller)
+   {
+      if (server != null)
+         return server;
+      
+      if (controller != null)
+         return controller.getMBeanServer();
+      
+      throw new IllegalArgumentException("Either the server or controller must be passed");
+   }
    
    /**
     * Apply any service binding overrides
@@ -255,7 +284,7 @@
          {
             ServiceCreator.install(server, objectName, metaData, null);
             result.add(objectName);
-            configure(server, objectName, loaderName, attrs);
+            configure(server, null, objectName, loaderName, attrs);
             if (serviceBinding != null)
                applyServiceConfig(server, objectName, serviceBinding);
          }

Modified: trunk/system/src/main/org/jboss/system/ServiceController.java
===================================================================
--- trunk/system/src/main/org/jboss/system/ServiceController.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/ServiceController.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -24,8 +24,10 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.management.MBeanRegistration;
 import javax.management.MBeanServer;
@@ -100,6 +102,9 @@
    /** The contexts */
    protected Map<ObjectName, ServiceControllerContext> installed = new ConcurrentHashMap<ObjectName, ServiceControllerContext>(); 
    
+   /** The contexts in installation order */
+   protected CopyOnWriteArrayList<ServiceControllerContext> installedOrder = new CopyOnWriteArrayList<ServiceControllerContext>();
+   
    /**
     * Get the MBeanServer
     * 
@@ -109,8 +114,38 @@
    {
       return server;
    }
-   
+
    /**
+    * Set the server.
+    * 
+    * @param server the server.
+    */
+   public void setMBeanServer(MBeanServer server)
+   {
+      this.server = server;
+   }
+
+   /**
+    * Get the kernel.
+    * 
+    * @return the kernel.
+    */
+   public Kernel getKernel()
+   {
+      return kernel;
+   }
+
+   /**
+    * Set the kernel.
+    * 
+    * @param kernel the kernel.
+    */
+   public void setKernel(Kernel kernel)
+   {
+      this.kernel = kernel;
+   }
+
+   /**
     * Get the serviceBinding.
     * 
     * @return the serviceBinding.
@@ -133,8 +168,8 @@
    public List<ServiceContext> listDeployed()
    {
       // Retrieve the service context from all our installed contexts
-      ArrayList<ServiceContext> result = new ArrayList<ServiceContext>(installed.size());
-      for (ServiceControllerContext context : installed.values())
+      ArrayList<ServiceContext> result = new ArrayList<ServiceContext>(installedOrder.size());
+      for (ServiceControllerContext context : installedOrder)
          result.add(context.getServiceContext());
       return result;
    }
@@ -143,7 +178,7 @@
    {
       // Retrieve the service contexts that are not deployed properly
       ArrayList<ServiceContext> result = new ArrayList<ServiceContext>();
-      for (ServiceControllerContext context : installed.values())
+      for (ServiceControllerContext context : installedOrder)
       {
          ServiceContext sc = context.getServiceContext();
          if (sc.state != ServiceContext.CREATED &&
@@ -210,10 +245,9 @@
          ServiceControllerContext context = new ServiceControllerContext(this, metaData);
          try
          {
-            controller.install(context);
+            doInstall(controller, context);
             contexts.add(context);
-            controller.change(context, ControllerState.CONFIGURED);
-            installed.put(context.getObjectName(), context);
+            doChange(controller, context, ControllerState.CONFIGURED, "configure");
             result.add(context.getObjectName());
          }
          catch (Throwable t)
@@ -247,9 +281,8 @@
       ServiceControllerContext context = new ServiceControllerContext(this, name, object); 
       try
       {
-         controller.install(context);
-         controller.change(context, ControllerState.CONFIGURED);
-         installed.put(context.getObjectName(), context);
+         doInstall(controller, context);
+         doChange(controller, context, ControllerState.CONFIGURED, "configure");
       }
       catch (Throwable t)
       {
@@ -284,14 +317,14 @@
       // Install the context to the configured level
       try
       {
-         controller.install(context);
-         installed.put(serviceName, context);
-         controller.change(context, ControllerState.CONFIGURED);
+         doInstall(controller, context);
+         doChange(controller, context, ControllerState.CONFIGURED, "configure");
       }
       catch (Throwable t)
       {
          // Something went wrong
          safelyRemoveAnyRegisteredContext(context);
+         
          DeploymentException.rethrowAsDeploymentException("Error during register: " + serviceName, t);
       }
    }
@@ -333,9 +366,7 @@
       KernelController controller = kernel.getController();
       try
       {
-         controller.change(context, ControllerState.CREATE);
-         if (ctx.state != ServiceContext.CREATED)
-            log.debug("Waiting in create of " + serviceName + " on " + getUnresolvedDependencies(context, ControllerState.CREATE));
+         doChange(controller, context, ControllerState.CREATE, "create");
       }
       catch (Throwable t)
       {
@@ -373,9 +404,7 @@
       KernelController controller = kernel.getController();
       try
       {
-         controller.change(context, ControllerState.INSTALLED);
-         if (ctx.state != ServiceContext.RUNNING)
-            log.debug("Waiting in start of " + serviceName + " on " + getUnresolvedDependencies(context, ControllerState.START));
+         doChange(controller, context, ControllerState.INSTALLED, "start");
       }
       catch (Throwable t)
       {
@@ -425,7 +454,7 @@
       KernelController controller = kernel.getController();
       try
       {
-         controller.change(context, ControllerState.CREATE);
+         doChange(controller, context, ControllerState.CREATE, null);
       }
       catch (Throwable t)
       {
@@ -462,7 +491,7 @@
       KernelController controller = kernel.getController();
       try
       {
-         controller.change(context, ControllerState.CONFIGURED);
+         doChange(controller, context, ControllerState.CONFIGURED, null);
       }
       catch (Throwable t)
       {
@@ -489,6 +518,7 @@
          log.trace("Ignoring request to remove nonexistent service: " + objectName);
          return;
       }
+      installedOrder.remove(context);
       log.debug("removing service: " + objectName);
 
       // Uninstall the context
@@ -505,15 +535,17 @@
    
    public void shutdown()
    {
-      log.debug("Stopping " + installed.size() + " services");
+      log.debug("Stopping " + installedOrder.size() + " services");
 
       KernelController controller = kernel.getController();
       
       int serviceCounter = 0;
 
       // Uninstall all the contexts we know about
-      for (ServiceControllerContext context : installed.values())
+      ListIterator<ServiceControllerContext> iterator = installedOrder.listIterator(installedOrder.size());
+      while (iterator.hasPrevious())
       {
+         ServiceControllerContext context = iterator.previous();
          controller.uninstall(context.getName());
          ++serviceCounter;
       }
@@ -525,11 +557,13 @@
    {
       this.server = server;
 
-      // Bootstrap the microcontainer. 
-      // REVIEW: Should be an option to pass this to a specialised constructor
-      BasicBootstrap bootstrap = new BasicBootstrap();
-      bootstrap.run();
-      kernel = bootstrap.getKernel();
+      if( kernel == null )
+      {
+         // Bootstrap the microcontainer. 
+         BasicBootstrap bootstrap = new BasicBootstrap();
+         bootstrap.run();
+         kernel = bootstrap.getKernel();
+      }
 
       log.debug("Controller MBean online");
       return name == null ? OBJECT_NAME : name;
@@ -564,8 +598,43 @@
    public void postDeregister()
    {
       installed.clear();
+      installedOrder.clear();
       server = null;
    }
+   
+   /**
+    * Install a context
+    * 
+    * @param controller the controller
+    * @param context the context
+    * @throws Throwable for any error
+    */
+   private void doInstall(KernelController controller, ServiceControllerContext context) throws Throwable
+   {
+      controller.install(context);
+      installed.put(context.getObjectName(), context);
+      installedOrder.add(context);
+   }
+   
+   /**
+    * Change a context
+    * 
+    * @param controller the controller
+    * @param context the context
+    * @param requiredState the require state
+    * @param logWait log the waiting dependencies
+    * @throws Throwable for any error
+    */
+   private void doChange(KernelController controller, ServiceControllerContext context, ControllerState requiredState, String logWait) throws Throwable
+   {
+      if (ControllerMode.ON_DEMAND.equals(context.getMode()) == false)
+      {
+         controller.change(context, requiredState);
+         ControllerState state = context.getState();
+         if (logWait != null && requiredState.equals(state) == false && state != ControllerState.ERROR)
+            log.debug("Waiting in " + logWait + " of " + context.getObjectName() + " on " + getUnresolvedDependencies(context, requiredState));
+      }
+   }
 
    /**
     * Sends outs controller notifications about service lifecycle events

Modified: trunk/system/src/main/org/jboss/system/ServiceCreator.java
===================================================================
--- trunk/system/src/main/org/jboss/system/ServiceCreator.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/ServiceCreator.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -31,8 +31,11 @@
 
 import org.jboss.deployment.DeploymentException;
 import org.jboss.logging.Logger;
+import org.jboss.mx.server.ServerConstants;
+import org.jboss.mx.server.registry.MBeanEntry;
 import org.jboss.mx.service.ServiceConstants;
 import org.jboss.mx.util.JMXExceptionDecoder;
+import org.jboss.mx.util.ObjectNameFactory;
 import org.jboss.system.metadata.ServiceConstructorMetaData;
 import org.jboss.system.metadata.ServiceMetaData;
 import org.jboss.system.metadata.ServiceMetaDataParser;
@@ -54,6 +57,9 @@
    /** Instance logger. */
    private static final Logger log = Logger.getLogger(ServiceCreator.class);
    
+   /** The MBean Registry Object Name */
+   private static ObjectName MBEAN_REGISTRY = ObjectNameFactory.create(ServerConstants.MBEAN_REGISTRY);
+   
    /** The server */
    private MBeanServer server;
 
@@ -93,6 +99,10 @@
          }
          else
          {
+            String code = metaData.getCode();
+            if (code == null || code.trim().length() == 0)
+               throw new ConfigurationException("Missing or empty code for mbean " + objectName);
+            
             String xmbeanDD = metaData.getXMBeanDD();
             
             // Not an XMBean
@@ -189,9 +199,10 @@
                                                    loaderName,
                                                    constructor.getParameters(loader),
                                                    constructor.getSignature());
-      
-      log.debug("About to register MBean : " + objectName);
-      return new ServiceInstance(instance, null); // FIXME need to get the resource
+
+      MBeanEntry entry = (MBeanEntry) server.invoke(MBEAN_REGISTRY, "get", new Object[] { objectName }, new String[] { ObjectName.class.getName() });
+      Object resource = entry.getResourceInstance();
+      return new ServiceInstance(instance, resource);
    }
 
    /**

Added: trunk/system/src/main/org/jboss/system/metadata/AbstractMetaDataVisitorNode.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/AbstractMetaDataVisitorNode.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/AbstractMetaDataVisitorNode.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -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.system.metadata;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.jboss.util.collection.CollectionsFactory;
+
+/**
+ * AbstractMetaDataVisitorNode.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class AbstractMetaDataVisitorNode implements ServiceMetaDataVisitorNode
+{
+   public Iterator<? extends ServiceMetaDataVisitorNode> getChildren()
+   {
+      Set<ServiceMetaDataVisitorNode> children = CollectionsFactory.createLazySet();
+      addChildren(children);
+      if (children.size() == 0)
+         return null;
+      else
+         return children.iterator();
+   }
+
+   public void visit(ServiceMetaDataVisitor visitor)
+   {
+      visitor.visit(this);
+   }
+
+   /**
+    * Add to the children
+    * 
+    * @param children the children
+    */
+   protected void addChildren(Set<ServiceMetaDataVisitorNode> children)
+   {
+   }
+}

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceAttributeMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceAttributeMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceAttributeMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -21,9 +21,9 @@
 */
 package org.jboss.system.metadata;
 
-import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanServer;
+import java.util.Set;
 
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.deployment.DeploymentException;
 import org.jboss.util.UnreachableStatementException;
 
@@ -33,7 +33,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public class ServiceAttributeMetaData
+public class ServiceAttributeMetaData extends AbstractMetaDataVisitorNode
 {
    /** The attribute name */
    private String name;
@@ -134,17 +134,17 @@
    /**
     * Get the value
     * 
-    * @param server the mbean server
-    * @param attributeInfo the attribute info
-    * @param cl the classloader
+    * @param valueContext the value context
     * @return the value
     * @throws Exception for any error
     */
-   public Object getValue(MBeanServer server, MBeanAttributeInfo attributeInfo, ClassLoader cl) throws Exception
+   public Object getValue(ServiceValueContext valueContext) throws Exception
    {
+      valueContext.setTrim(isTrim());
+      valueContext.setReplace(isReplace());
       try
       {
-         return value.getValue(server, attributeInfo, cl, isTrim(), isReplace());
+         return value.getValue(valueContext);
       }
       catch (Throwable t)
       {
@@ -152,4 +152,15 @@
          throw new UnreachableStatementException();
       }
    }
+   
+   public void visit(ServiceMetaDataVisitor visitor)
+   {
+      visitor.setContextState(ControllerState.CONFIGURED);
+      visitor.visit(this);
+   }
+
+   protected void addChildren(Set<ServiceMetaDataVisitorNode> children)
+   {
+      children.add(value);
+   }
 }

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceConstructorMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceConstructorMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceConstructorMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -82,9 +82,15 @@
     * Get the signature.
     * 
     * @return the signature.
+    * @throws ConfigurationException if there is a problem with the signature
     */
-   public String[] getSignature()
+   public String[] getSignature() throws ConfigurationException
    {
+      for (String string : signature)
+      {
+         if (string == null || string.trim().length() == 0)
+            throw new ConfigurationException("Missing or empty 'type' attribute in constructor arg");
+      }
       return signature;
    }
 
@@ -111,10 +117,15 @@
    {
       if (params.length == 0)
          return EMPTY_PARAMETERS;
+
+      String[] signature = getSignature();
       
       Object[] result = new Object[params.length];
       for (int i = 0; i < result.length; ++i)
       {
+         if (params[i] == null)
+            throw new ConfigurationException("Missing 'value' attribute in constructor arg");
+         
          String value = StringPropertyReplacer.replaceProperties(params[i]); 
          Object realValue = value;
 

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyListValueMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyListValueMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyListValueMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -21,20 +21,27 @@
 */
 package org.jboss.system.metadata;
 
+import java.util.ArrayList;
 import java.util.List;
 
-import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.system.microcontainer.LifecycleDependencyItem;
+import org.jboss.system.microcontainer.ServiceControllerContext;
+
 /**
  * ServiceDependencyListValueMetaData.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public class ServiceDependencyListValueMetaData implements ServiceValueMetaData
+public class ServiceDependencyListValueMetaData extends AbstractMetaDataVisitorNode implements ServiceValueMetaData
 {
+   /** The dependencies */
+   private List<String> dependencies;
+
    /** The object names */
    private List<ObjectName> objectNames;
    
@@ -48,20 +55,72 @@
    /**
     * Create a new ServiceDependencyListValueMetaData.
     * 
-    * @param objectNames the object names
+    * @param dependencies the dependencies
     */
-   public ServiceDependencyListValueMetaData(List<ObjectName> objectNames)
+   public ServiceDependencyListValueMetaData(List<String> dependencies)
    {
-      setObjectNames(objectNames);
+      setDependencies(dependencies);
    }
 
    /**
+    * Get the dependencies.
+    * 
+    * @return the dependencies.
+    */
+   public List<String> getDependencies()
+   {
+      if (dependencies == null)
+      {
+         List<String> result = new ArrayList<String>(objectNames.size());
+         for (ObjectName objectName : objectNames)
+            result.add(objectName.getCanonicalName());
+         return result;
+      }
+      return dependencies;
+   }
+
+   /**
+    * Set the dependencies.
+    * 
+    * @param dependencies the dependencies.
+    */
+   public void setDependencies(List<String> dependencies)
+   {
+      if (dependencies == null)
+         throw new IllegalArgumentException("Null dependencies");
+      for (String dependency: dependencies)
+      {
+         if (dependency == null)
+            throw new IllegalArgumentException("Null dependency in dependencies");
+      }
+      
+      this.dependencies = dependencies;
+      this.objectNames = null;
+   }
+
+   /**
     * Get the objectNames.
     * 
     * @return the objectNames.
+    * @throws MalformedObjectNameException if the list of string was set with an invalid object name
     */
-   public List<ObjectName> getObjectNames()
+   public List<ObjectName> getObjectNames() throws MalformedObjectNameException
    {
+      if (objectNames == null)
+      {
+         List<ObjectName> names = new ArrayList<ObjectName>(dependencies.size());
+         for (String dependency : dependencies)
+         {
+            if (dependency.trim().length() == 0)
+               throw new MalformedObjectNameException("Missing object name in depends-list");
+            ObjectName objectName = new ObjectName(dependency);
+            if (objectName.isPattern())
+               throw new MalformedObjectNameException("ObjectName patterns are not allowed in depends-list: " + dependency);
+            names.add(objectName);
+         }
+         objectNames = names;
+         dependencies = null;
+      }
       return objectNames;
    }
 
@@ -74,11 +133,41 @@
    {
       if (objectNames == null)
          throw new IllegalArgumentException("Null objectNames");
+      for (ObjectName objectName: objectNames)
+      {
+         if (objectName == null)
+            throw new IllegalArgumentException("Null object name in objectNames");
+      }
+
       this.objectNames = objectNames;
    }
 
-   public Object getValue(MBeanServer server, MBeanAttributeInfo attributeInfo, ClassLoader cl, boolean trim, boolean replace) throws Exception
+   public Object getValue(ServiceValueContext valueContext) throws Exception
    {
-      return objectNames;
+      return getObjectNames();
    }
+
+   public void visit(ServiceMetaDataVisitor visitor)
+   {
+      ServiceControllerContext context = visitor.getControllerContext();
+      Object name = context.getName();
+      List<String> list = dependencies;
+      try
+      {
+         List<ObjectName> names = getObjectNames();
+         list = new ArrayList<String>(names.size());
+         for (ObjectName objectName : names)
+            list.add(objectName.getCanonicalName());
+      }
+      catch (MalformedObjectNameException ignored)
+      {
+      }
+      for (String other : list)
+      {
+         // TODO visitor.addDependency(new LifecycleDependencyItem(name, other, ControllerState.CONFIGURED));
+         visitor.addDependency(new LifecycleDependencyItem(name, other, ControllerState.CREATE));
+         visitor.addDependency(new LifecycleDependencyItem(name, other, ControllerState.START));
+      }
+      visitor.visit(this);
+   }
 }

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -21,38 +21,99 @@
 */
 package org.jboss.system.metadata;
 
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.system.microcontainer.LifecycleDependencyItem;
+import org.jboss.system.microcontainer.ServiceControllerContext;
+
 /**
  * ServiceDependencyMetaData.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public class ServiceDependencyMetaData
+public class ServiceDependencyMetaData extends AbstractMetaDataVisitorNode
 {
    /** The dependency */
-   private ObjectName iDependOn;
+   private String iDependOn;
 
+   /** The dependency */
+   private ObjectName iDependOnObjectName;
+
    /**
     * Get the iDependOn.
     * 
     * @return the iDependOn.
     */
-   public ObjectName getIDependOn()
+   public String getIDependOn()
    {
+      if (iDependOn == null)
+         return iDependOnObjectName.getCanonicalName();
       return iDependOn;
    }
 
    /**
     * Set the iDependOn.
     * 
-    * @param dependOn the iDependOn.
+    * @param iDependOn the iDependOn.
     */
-   public void setIDependOn(ObjectName iDependOn)
+   public void setIDependOn(String iDependOn)
    {
       if (iDependOn == null)
          throw new IllegalArgumentException("Null iDependOn");
       this.iDependOn = iDependOn;
-   } 
+      this.iDependOnObjectName = null;
+   }
+
+   /**
+    * Get the iDependOn.
+    * 
+    * @return the iDependOn.
+    * @throws MalformedObjectNameException if the string was set with an invalid object name
+    */
+   public ObjectName getIDependOnObjectName() throws MalformedObjectNameException
+   {
+      if (iDependOnObjectName == null)
+      {
+         if (iDependOn.trim().length() == 0)
+            throw new MalformedObjectNameException("Missing object name in depends");
+         ObjectName objectName = new ObjectName(iDependOn);
+         if (objectName.isPattern())
+            throw new MalformedObjectNameException("ObjectName patterns are not allowed in depends: " + iDependOn);
+         iDependOnObjectName = objectName;
+         iDependOn = null;
+      }
+      return iDependOnObjectName;
+   }
+
+   /**
+    * Set the iDependOn.
+    * 
+    * @param iDependOn the iDependOn.
+    */
+   public void setIDependOnObjectName(ObjectName iDependOn)
+   {
+      if (iDependOn == null)
+         throw new IllegalArgumentException("Null iDependOn");
+      this.iDependOnObjectName = iDependOn;
+   }
+
+   public void visit(ServiceMetaDataVisitor visitor)
+   {
+      ServiceControllerContext context = visitor.getControllerContext();
+      Object name = context.getName();
+      Object other = iDependOn;
+      try
+      {
+         other = getIDependOnObjectName().getCanonicalName();
+      }
+      catch (MalformedObjectNameException ignored)
+      {
+      }
+      visitor.addDependency(new LifecycleDependencyItem(name, other, ControllerState.CREATE));
+      visitor.addDependency(new LifecycleDependencyItem(name, other, ControllerState.START));
+      visitor.visit(this);
+   }
 }

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyValueMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyValueMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceDependencyValueMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -23,9 +23,14 @@
 
 import javax.management.MBeanAttributeInfo;
 import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.deployment.DeploymentException;
 import org.jboss.mx.util.MBeanProxyExt;
+import org.jboss.system.microcontainer.LifecycleDependencyItem;
+import org.jboss.system.microcontainer.ServiceControllerContext;
 
 /**
  * ServiceDependencyValueMetaData.
@@ -40,9 +45,12 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public class ServiceDependencyValueMetaData implements ServiceValueMetaData
+public class ServiceDependencyValueMetaData extends AbstractMetaDataVisitorNode implements ServiceValueMetaData
 {
-   /** The object name */
+   /** The dependency */
+   private String dependency;
+
+   /** The dependency */
    private ObjectName objectName;
 
    /** The proxy type */
@@ -58,39 +66,75 @@
    /**
     * Create a new ServiceDependencyValueMetaData.
     * 
-    * @param objectName the object name
+    * @param dependency the dependents object name
     */
-   public ServiceDependencyValueMetaData(ObjectName objectName)
+   public ServiceDependencyValueMetaData(String dependency)
    {
-      setObjectName(objectName);
+      setDependency(dependency);
    }
    
    /**
     * Create a new ServiceDependencyValueMetaData.
     * 
-    * @param objectName the object name
+    * @param dependency the dependents object name
     * @param proxyType the proxy type
     */
-   public ServiceDependencyValueMetaData(ObjectName objectName, String proxyType)
+   public ServiceDependencyValueMetaData(String dependency, String proxyType)
    {
-      setObjectName(objectName);
+      setDependency(dependency);
       setProxyType(proxyType);
    }
 
    /**
-    * Get the objectName.
+    * Get the dependency.
     * 
-    * @return the objectName.
+    * @return the dependency.
     */
-   public ObjectName getObjectName()
+   public String getDependency()
    {
+      if (dependency == null)
+         return objectName.getCanonicalName();
+      return dependency;
+   }
+
+   /**
+    * Set the dependency.
+    * 
+    * @param dependency the dependency.
+    */
+   public void setDependency(String dependency)
+   {
+      if (dependency == null)
+         throw new IllegalArgumentException("Null dependency");
+      this.dependency = dependency;
+      this.objectName = null;
+   }
+
+   /**
+    * Get the object name.
+    * 
+    * @return the object name.
+    * @throws MalformedObjectNameException if the string was set with an invalid object name
+    */
+   public ObjectName getObjectName() throws MalformedObjectNameException
+   {
+      if (objectName == null)
+      {
+         if (dependency.trim().length() == 0)
+            throw new MalformedObjectNameException("Missing object name in depends");
+         ObjectName name = new ObjectName(dependency);
+         if (name.isPattern())
+            throw new MalformedObjectNameException("ObjectName patterns are not allowed in depends: " + objectName);
+         objectName = new ObjectName(dependency);
+         dependency = null;
+      }
       return objectName;
    }
 
    /**
-    * Set the objectName.
+    * Set the object name
     * 
-    * @param objectName the objectName.
+    * @param objectName the object name
     */
    public void setObjectName(ObjectName objectName)
    {
@@ -119,12 +163,22 @@
       this.proxyType = proxyType;
    }
 
-   public Object getValue(MBeanServer server, MBeanAttributeInfo attributeInfo, ClassLoader cl, boolean trim, boolean replace) throws Exception
+   public Object getValue(ServiceValueContext valueContext) throws Exception
    {
+      MBeanAttributeInfo attributeInfo = valueContext.getAttributeInfo();
+      ClassLoader cl = valueContext.getClassloader();
+      MBeanServer server = valueContext.getServer();
+
+      ObjectName objectName = getObjectName();
+      
       if (proxyType != null)
       {
          if (proxyType.equals("attribute"))
+         {
             proxyType = attributeInfo.getType();
+            if (proxyType == null)
+               throw new DeploymentException("AttributeInfo for " + attributeInfo.getName() + " has no type");
+         }
 
          Class proxyClass = cl.loadClass(proxyType);
          return MBeanProxyExt.create(proxyClass, objectName, server, true);
@@ -132,4 +186,22 @@
       
       return objectName;
    }
+
+   public void visit(ServiceMetaDataVisitor visitor)
+   {
+      ServiceControllerContext context = visitor.getControllerContext();
+      Object name = context.getName();
+      Object other = dependency;
+      try
+      {
+         other = getObjectName().getCanonicalName();
+      }
+      catch (MalformedObjectNameException ignored)
+      {
+      }
+      // TODO visitor.addDependency(new LifecycleDependencyItem(name, other, ControllerState.CONFIGURED));
+      visitor.addDependency(new LifecycleDependencyItem(name, other, ControllerState.CREATE));
+      visitor.addDependency(new LifecycleDependencyItem(name, other, ControllerState.START));
+      visitor.visit(this);
+   }
 }

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceElementValueMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceElementValueMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceElementValueMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -24,9 +24,6 @@
 import java.beans.PropertyEditor;
 import java.beans.PropertyEditorManager;
 
-import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanServer;
-
 import org.jboss.logging.Logger;
 import org.jboss.util.StringPropertyReplacer;
 import org.w3c.dom.Element;
@@ -44,7 +41,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public class ServiceElementValueMetaData implements ServiceValueMetaData
+public class ServiceElementValueMetaData extends AbstractMetaDataVisitorNode implements ServiceValueMetaData
 {
    /** The log */
    private static final Logger log = Logger.getLogger(ServiceElementValueMetaData.class); 
@@ -91,10 +88,10 @@
       this.element = element;
    }
 
-   public Object getValue(MBeanServer server, MBeanAttributeInfo attributeInfo, ClassLoader cl, boolean trim, boolean replace) throws Exception
+   public Object getValue(ServiceValueContext valueContext) throws Exception
    {         
       // Replace any ${x} references in the element text
-      if (replace)
+      if (valueContext.isReplace())
       {
          PropertyEditor editor = PropertyEditorManager.findEditor(Element.class);
          if (editor == null)

Added: trunk/system/src/main/org/jboss/system/metadata/ServiceInjectionValueMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceInjectionValueMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceInjectionValueMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -0,0 +1,189 @@
+/*
+* 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.system.metadata;
+
+import org.jboss.beans.info.spi.BeanInfo;
+import org.jboss.dependency.plugins.AbstractDependencyItem;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.joinpoint.spi.TargettedJoinpoint;
+import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.system.microcontainer.ServiceControllerContext;
+
+/**
+ * ServiceInjectionValueMetaData.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class ServiceInjectionValueMetaData extends AbstractMetaDataVisitorNode implements ServiceValueMetaData
+{
+   /** The dependency */
+   private Object dependency;
+
+   /** The property */
+   private String property;
+
+   /** The required state of the dependency */
+   private ControllerState dependentState = ControllerState.INSTALLED;
+
+   /**
+    * Create a new ServiceInjectionValueMetaData.
+    */
+   public ServiceInjectionValueMetaData()
+   {
+   }
+
+   /**
+    * Create a new ServiceInjectionValueMetaData.
+    * 
+    * @param dependency the dependency
+    */
+   public ServiceInjectionValueMetaData(Object dependency)
+   {
+      this(dependency, null);
+   }
+   
+   /**
+    * Create a new ServiceInjectionValueMetaData.
+    * 
+    * @param dependency the dependency
+    * @param property the property name
+    */
+   public ServiceInjectionValueMetaData(Object dependency, String property)
+   {
+      this(dependency, property, ControllerState.INSTALLED);
+   }
+   
+   /**
+    * Create a new ServiceInjectionValueMetaData.
+    * 
+    * @param dependency the dependency
+    * @param property the property name
+    * @param dependentState the dependent state
+    */
+   public ServiceInjectionValueMetaData(Object dependency, String property, ControllerState dependentState)
+   {
+      setDependency(dependency);
+      setProperty(property);
+      setDependentState(dependentState);
+   }
+
+   /**
+    * Get the dependency.
+    * 
+    * @return the dependency.
+    */
+   public Object getDependency()
+   {
+      return dependency;
+   }
+
+   /**
+    * Set the dependency.
+    * 
+    * @param dependency the dependency.
+    */
+   public void setDependency(Object dependency)
+   {
+      if (dependency == null)
+         throw new IllegalArgumentException("Null dependency");
+      this.dependency = dependency;
+   }
+
+   /**
+    * Get the property.
+    * 
+    * @return the property.
+    */
+   public String getProperty()
+   {
+      return property;
+   }
+
+   /**
+    * Set the property.
+    * 
+    * @param property the property.
+    */
+   public void setProperty(String property)
+   {
+      this.property = property;
+   }
+
+   /**
+    * Get the dependentState.
+    * 
+    * @return the dependentState.
+    */
+   public ControllerState getDependentState()
+   {
+      return dependentState;
+   }
+
+   /**
+    * Set the dependentState.
+    * 
+    * @param dependentState the dependentState.
+    */
+   public void setDependentState(ControllerState dependentState)
+   {
+      this.dependentState = dependentState;
+   }
+
+   public Object getValue(ServiceValueContext valueContext) throws Throwable
+   {
+      KernelController controller = valueContext.getController();
+      
+      ControllerState state = dependentState;
+      if (state == null)
+         state = ControllerState.INSTALLED;
+
+      ControllerContext context = controller.getContext(dependency, dependentState);
+      if (context == null)
+         throw new Error("Should not be here - dependency failed! " + this);
+      Object result = context.getTarget();
+      if (result != null && property != null)
+      {
+         KernelConfigurator configurator = controller.getKernel().getConfigurator();
+         BeanInfo beanInfo = configurator.getBeanInfo(result.getClass());
+         TargettedJoinpoint joinpoint = configurator.getPropertyGetterJoinPoint(beanInfo, property);
+         joinpoint.setTarget(result);
+         return joinpoint.dispatch();
+      }
+      return result;
+   }
+
+   public void visit(ServiceMetaDataVisitor visitor)
+   {
+      ServiceControllerContext context = visitor.getControllerContext();
+      Object name = context.getName();
+      ControllerState whenRequired = visitor.getContextState();
+
+      DependencyItem item = new AbstractDependencyItem(name, dependency, whenRequired, dependentState);
+      visitor.addDependency(item);
+
+      visitor.visit(this);
+   }
+}

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceJBXBValueMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceJBXBValueMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceJBXBValueMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -21,24 +21,14 @@
 */
 package org.jboss.system.metadata;
 
-import java.io.IOException;
 import java.io.StringReader;
-import java.io.StringWriter;
 
-import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanServer;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
+import org.jboss.system.ServiceConfigurator;
 import org.jboss.xb.binding.Unmarshaller;
 import org.jboss.xb.binding.UnmarshallerFactory;
-import org.jboss.xb.binding.sunday.unmarshalling.DefaultSchemaResolver;
+import org.jboss.xb.binding.sunday.unmarshalling.SchemaBindingResolver;
+import org.jboss.xb.binding.sunday.unmarshalling.SingletonSchemaResolverFactory;
 import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
 /**
  * ServiceJBXBValueMetaData.
@@ -73,53 +63,16 @@
       super(element);
    }
 
-   public Object getValue(MBeanServer server, MBeanAttributeInfo attributeInfo, ClassLoader cl, boolean trim, boolean replace) throws Exception
+   public Object getValue(ServiceValueContext valueContext) throws Exception
    {
       // Get the attribute element content in a parsable form
-      StringBuffer buffer = getElementContent(getElement());
+      StringBuffer buffer = ServiceConfigurator.getElementContent(getElement());
 
       // Parse the attribute element content
-      DefaultSchemaResolver resolver = new DefaultSchemaResolver();
+      SchemaBindingResolver resolver = SingletonSchemaResolverFactory.getInstance().getSchemaBindingResolver();
       Unmarshaller unmarshaller = UnmarshallerFactory.newInstance().newUnmarshaller();
       StringReader reader = new StringReader(buffer.toString());
       Object bean = unmarshaller.unmarshal(reader, resolver);
       return bean;
    }
-
-   /**
-    * A utility method that transforms the contents of the argument element into
-    * a StringBuffer representation that can be reparsed.
-    * 
-    * [FIXME] This is not a general DOMUtils method because of its funny contract. It does not 
-    * support multiple child elements neither can it deal with text content.
-    * 
-    * @param element - the parent dom element whose contents are to be extracted as an xml document string. 
-    * @return the xml document string.
-    */
-   private static StringBuffer getElementContent(Element element) throws IOException, TransformerException
-   {
-      NodeList children = element.getChildNodes();
-      Element content = null;
-      for (int n = 0; n < children.getLength(); n++)
-      {
-         Node node = children.item(n);
-         if (node.getNodeType() == Node.ELEMENT_NODE)
-         {
-            content = (Element)node;
-            break;
-         }
-      }
-      if (content == null)
-         return null;
-
-      // Get a parsable representation of this elements content
-      DOMSource source = new DOMSource(content);
-      TransformerFactory tFactory = TransformerFactory.newInstance();
-      Transformer transformer = tFactory.newTransformer();
-      StringWriter sw = new StringWriter();
-      StreamResult result = new StreamResult(sw);
-      transformer.transform(source, result);
-      sw.close();
-      return sw.getBuffer();
-   }
 }

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceJavaBeanValueMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceJavaBeanValueMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceJavaBeanValueMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -24,8 +24,8 @@
 import java.util.Properties;
 
 import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanServer;
 
+import org.jboss.deployment.DeploymentException;
 import org.jboss.util.propertyeditor.PropertyEditors;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -64,13 +64,20 @@
       super(element);
    }
 
-   public Object getValue(MBeanServer server, MBeanAttributeInfo attributeInfo, ClassLoader cl, boolean trim, boolean replace) throws Exception
+   public Object getValue(ServiceValueContext valueContext) throws Exception
    {
+      MBeanAttributeInfo attributeInfo = valueContext.getAttributeInfo();
+      ClassLoader cl = valueContext.getClassloader();
+      boolean trim = valueContext.isTrim();
+      boolean replace = valueContext.isReplace();
+      
       // Extract the property elements
       Element element = getElement();
       String attributeClassName = element.getAttribute("attributeClass");
       if( attributeClassName == null || attributeClassName.length() == 0 )
          attributeClassName = attributeInfo.getType();
+      if (attributeClassName == null)
+         throw new DeploymentException("AttributeInfo for " + attributeInfo.getName() + " has no type");
       Class attributeClass = cl.loadClass(attributeClassName);
       // Create the bean instance
       Object bean = attributeClass.newInstance();

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -23,9 +23,11 @@
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import javax.management.ObjectName;
 
+import org.jboss.dependency.spi.ControllerMode;
 import org.w3c.dom.Element;
 
 /**
@@ -34,7 +36,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public class ServiceMetaData
+public class ServiceMetaData extends AbstractMetaDataVisitorNode
 {
    /** The default XMBean class, when one is not specified */
    public static final String XMBEAN_CODE = "org.jboss.mx.modelmbean.XMBean";
@@ -44,6 +46,9 @@
    
    /** The code */
    private String code;
+
+   /** The mode */
+   private ControllerMode mode;
    
    /** The interface name */
    private String interfaceName;
@@ -114,6 +119,26 @@
    }
 
    /**
+    * Get the mode.
+    * 
+    * @return the mode.
+    */
+   public ControllerMode getMode()
+   {
+      return mode;
+   }
+
+   /**
+    * Set the mode.
+    * 
+    * @param mode the mode.
+    */
+   public void setMode(ControllerMode mode)
+   {
+      this.mode = mode;
+   }
+
+   /**
     * Get the constructor.
     * 
     * @return the constructor.
@@ -278,4 +303,10 @@
    {
       this.classLoaderName = classLoaderName;
    }
+
+   protected void addChildren(Set<ServiceMetaDataVisitorNode> children)
+   {
+      children.addAll(attributes);
+      children.addAll(dependencies);
+   }
 }

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataParser.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataParser.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataParser.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -26,8 +26,10 @@
 
 import javax.management.ObjectName;
 
+import org.jboss.dependency.spi.ControllerMode;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.deployment.DeploymentException;
-import org.jboss.system.ConfigurationException;
+import org.jboss.logging.Logger;
 import org.jboss.util.StringPropertyReplacer;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
@@ -50,8 +52,14 @@
  */
 public class ServiceMetaDataParser
 {
+   /** The log */
+   private static final Logger log = Logger.getLogger(ServiceMetaDataParser.class);
+   
    /** The element config */
    private Element config;
+
+   /** The mode */
+   private ControllerMode serverMode;
    
    /**
     * Create a new service meta data parser
@@ -75,13 +83,17 @@
    public List<ServiceMetaData> parse() throws DeploymentException
    {
       List<ServiceMetaData> services = new ArrayList<ServiceMetaData>();
-
+      
       try
       {
-         if ("mbean".equals(config.getTagName()))
+         String tagName = config.getTagName();
+         if ("mbean".equals(tagName))
             internalParse(services, config, true);
          else
          {
+            if ("server".equals(tagName))
+               parseServer(config);
+
             NodeList nl = config.getChildNodes();
 
             for (int i = 0; i < nl.getLength(); ++i)
@@ -107,6 +119,23 @@
    }
 
    /**
+    * Parse the server element
+    * 
+    * @param serverElement the server element
+    * @throws Exception for any error
+    */
+   private void parseServer(Element serverElement) throws Exception
+   {
+      String modeString = serverElement.getAttribute("mode");
+      if (modeString != null)
+      {
+         modeString = modeString.trim();
+         if (modeString.length() != 0)
+            serverMode = new ControllerMode(modeString);
+      }
+   }
+
+   /**
     * Internal parse
     * 
     * @param services the list of service meta data
@@ -124,6 +153,11 @@
       
       String code = parseCode(mbeanName, mbeanElement);
       service.setCode(code);
+      
+      ControllerMode mode = parseMode(mbeanName, mbeanElement);
+      if (mode == null)
+         mode = serverMode;
+      service.setMode(mode);
 
       ServiceConstructorMetaData constructor = parseConstructor(mbeanName, mbeanElement, replace);
       service.setConstructor(constructor);
@@ -162,7 +196,7 @@
          {
             String attributeName = element.getAttribute("name");
             if (attributeName == null)
-               throw new DeploymentException("Null attribute name for " + mbeanName);
+               throw new DeploymentException("No attribute name for " + mbeanName);
             boolean trim = true;
             String replaceAttr = element.getAttribute("replace");
             if (replaceAttr.length() > 0)
@@ -192,7 +226,25 @@
                      Node n = nl.item(i);
                      if (n.getNodeType() == Node.ELEMENT_NODE)
                      {
-                        value = new ServiceElementValueMetaData((Element) n);
+                        Element el = (Element) n;
+                        String tagName = el.getTagName();
+                        if ("inject".equals(tagName))
+                        {
+                           String dependency = el.getAttribute("bean");
+                           String property = null;
+                           Attr attr = el.getAttributeNode("property");
+                           if (attr != null)
+                              property = attr.getValue();
+                           ControllerState requiredState = ControllerState.INSTALLED;
+                           attr = el.getAttributeNode("state");
+                           if (attr != null)
+                              requiredState = new ControllerState(attr.getValue());
+                           value = new ServiceInjectionValueMetaData(dependency, property, requiredState);
+                        }
+                        else
+                        {
+                           value = new ServiceElementValueMetaData((Element) n);
+                        }
                         break;
                      }
                   }
@@ -210,9 +262,6 @@
          }
          else if (element.getTagName().equals("depends"))
          {
-            if (element.hasChildNodes() == false)
-               throw new DeploymentException("No ObjectName supplied for depends in " + mbeanName);
-
             String mbeanRefName = element.getAttribute("optional-attribute-name");
             if ("".equals(mbeanRefName))
                mbeanRefName = null;
@@ -226,25 +275,22 @@
                proxyType = StringPropertyReplacer.replaceProperties(proxyType);
 
             // Get the mbeanRef value
-            ObjectName dependsObjectName = processDependency(mbeanName, element, services, replace);
+            String dependsObjectName = processDependency(mbeanName, mbeanRefName, element, services, replace);
 
             if (mbeanRefName != null)
             {
-               if (proxyType != null)
-               {
-                  if (mbeanRefName == null)
-                     throw new DeploymentException("You cannot use a proxy-type without an optional-attribute-name for " + mbeanName);
-               }
                ServiceValueMetaData value = new ServiceDependencyValueMetaData(dependsObjectName, proxyType);
                ServiceAttributeMetaData attribute = new ServiceAttributeMetaData();
                attribute.setName(mbeanRefName);
                attribute.setValue(value);
                attributes.add(attribute);
             }
-            
-            ServiceDependencyMetaData dependency = new ServiceDependencyMetaData();
-            dependency.setIDependOn(dependsObjectName);
-            dependencies.add(dependency);
+            else
+            {
+               ServiceDependencyMetaData dependency = new ServiceDependencyMetaData();
+               dependency.setIDependOn(dependsObjectName);
+               dependencies.add(dependency);
+            }
          }
          else if (element.getTagName().equals("depends-list"))
          {
@@ -253,7 +299,7 @@
                dependsListName = null;
 
             NodeList dependsList = element.getChildNodes();
-            ArrayList<ObjectName> dependsListNames = new ArrayList<ObjectName>();
+            ArrayList<String> dependsListNames = new ArrayList<String>();
             for (int l = 0; l < dependsList.getLength(); ++l)
             {
                if (dependsList.item(l).getNodeType() != Node.ELEMENT_NODE)
@@ -262,17 +308,17 @@
                Element dependsElement = (Element) dependsList.item(l);
                if (dependsElement.getTagName().equals("depends-list-element"))
                {
-                  if (dependsElement.hasChildNodes() == false)
-                     throw new DeploymentException("Empty depends-list-element for " + mbeanName);
-
                   // Get the depends value
-                  ObjectName dependsObjectName = processDependency(mbeanName, dependsElement, services, replace);
+                  String dependsObjectName = processDependency(mbeanName, dependsListName, dependsElement, services, replace);
                   if (dependsListNames.contains(dependsObjectName) == false)
                      dependsListNames.add(dependsObjectName);
 
-                  ServiceDependencyMetaData dependency = new ServiceDependencyMetaData();
-                  dependency.setIDependOn(dependsObjectName);
-                  dependencies.add(dependency);
+                  if (dependsListName == null)
+                  {
+                     ServiceDependencyMetaData dependency = new ServiceDependencyMetaData();
+                     dependency.setIDependOn(dependsObjectName);
+                     dependencies.add(dependency);
+                  }
                }
             }
             if (dependsListName != null)
@@ -324,12 +370,26 @@
     */
    private String parseCode(final ObjectName name, final Element mbeanElement) throws Exception
    {
-      String code = mbeanElement.getAttribute("code");
+      return mbeanElement.getAttribute("code");
+   }
 
-      if (code == null || code.trim().length() == 0)
-         throw new ConfigurationException("Missing or empty 'code' attribute for mbean " + name);
-
-      return code;
+   /**
+    * Parse the mode
+    * 
+    * @param name the mbean name
+    * @param mbeanElement the element to parse name from.
+    * @return the mode
+    * @throws Exception for any error
+    */
+   private ControllerMode parseMode(final ObjectName name, final Element mbeanElement) throws Exception
+   {
+      String modeString = mbeanElement.getAttribute("mode");
+      if (modeString == null)
+         return null;
+      modeString = modeString.trim();
+      if (modeString.length() == 0)
+         return null;
+      return new ControllerMode(modeString);
    }
 
    /**
@@ -367,14 +427,10 @@
             Attr attr = arg.getAttributeNode("type");
             if (attr != null)
                typeName = attr.getValue();
-            if (typeName == null || typeName.trim().length() == 0)
-               throw new ConfigurationException("Missing or empty 'type' attribute in constructor arg for " + name);
             String value = null;
             attr = arg.getAttributeNode("value");
             if (attr != null)
                value = attr.getValue();
-            if (value == null)
-               throw new ConfigurationException("Missing 'value' attribute in constructor arg for " + name);
             signature[j] = typeName;
             params[j] = value;
          }
@@ -457,15 +513,16 @@
     * Process a dependency
     * 
     * @param mbeanName the surronding mbean
+    * @param attributeName the attribute name
     * @param element the element
     * @param services the list of services
     * @param replace whether to replace properties
     * @return the dependent object name
     * @throws Exception for any error
     */
-   private ObjectName processDependency(ObjectName mbeanName, Element element, List<ServiceMetaData> services, boolean replace) throws Exception
+   private String processDependency(ObjectName mbeanName, String attributeName, Element element, List<ServiceMetaData> services, boolean replace) throws Exception
    {
-      ObjectName dependsObjectName = null;
+      String dependsObjectName = null;
       
       NodeList nl = element.getChildNodes();
       for (int i = 0; i < nl.getLength(); i++)
@@ -474,31 +531,24 @@
          if (childNode.getNodeType() == Node.ELEMENT_NODE)
          {
             Element child = (Element) childNode;
-            if (child.getTagName().equals("mbean"))
+            String tagName = child.getTagName();
+            if ("mbean".equals(tagName))
             {
-               dependsObjectName = internalParse(services, child, replace);
+               dependsObjectName = internalParse(services, child, replace).getCanonicalName();
                break;
             }
             else
-               throw new DeploymentException("Non mbean child element in depends tag for " + mbeanName);
+            {
+               if (attributeName != null)
+                  log.warn("Non mbean child <" + tagName + "/> in depends tag for " + mbeanName + " attribute: " + attributeName);
+               else
+                  log.warn("Non mbean child <" + tagName + "/> in depends tag for " + mbeanName);
+            }
          }
       }
 
       if (dependsObjectName == null)
-      {
-         String name = getElementTextContent(element, true, replace);
-         try
-         {
-            dependsObjectName = new ObjectName(name);
-         }
-         catch (Throwable t)
-         {
-            throw new DeploymentException("Invalid object name '" + name + "' in depends tag for " + mbeanName, t);
-         }
-      }
-      
-      if (dependsObjectName == null)
-         throw new DeploymentException("No object name found in depends tag for " + mbeanName);
+         dependsObjectName = getElementTextContent(element, true, replace);
 
       return dependsObjectName;
    }
@@ -507,6 +557,8 @@
     * Get an elements text content
     * 
     * @param element the element
+    * @param trim whether to trim
+    * @param replace whetehr to replace properties
     * @return the concatentation of the text nodes
     * @throws Exception for any error
     */

Added: trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataVisitor.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataVisitor.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataVisitor.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -0,0 +1,70 @@
+/*
+* 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.system.metadata;
+
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.system.microcontainer.ServiceControllerContext;
+
+/**
+ * ServiceMetaDataVisitor.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public interface ServiceMetaDataVisitor
+{
+   /**
+    * Get the controller context
+    * 
+    * @return the context
+    */
+   ServiceControllerContext getControllerContext();
+
+   /**
+    * Get the context state
+    * 
+    * @return the context state
+    */
+   ControllerState getContextState();
+
+   /**
+    * Set the context state
+    * 
+    * @param contextState the context state
+    */
+   void setContextState(ControllerState contextState);
+
+   /**
+    * Add a dependency
+    * 
+    * @param dependency the dependency
+    */
+   void addDependency(DependencyItem dependency);
+   
+   /**
+    * Visit the node
+    * 
+    * @param node the node
+    */
+   void visit(ServiceMetaDataVisitorNode node);
+}

Added: trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataVisitorNode.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataVisitorNode.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceMetaDataVisitorNode.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -0,0 +1,47 @@
+/*
+* 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.system.metadata;
+
+import java.util.Iterator;
+
+/**
+ * ServiceMetaDataVisitorNode.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public interface ServiceMetaDataVisitorNode
+{
+   /**
+    * Visit the node
+    * 
+    * @param vistor the visitor
+    */
+   public void visit(ServiceMetaDataVisitor vistor);
+   
+   /**
+    * Return the child nodes
+    * 
+    * @return Iterator<MetaDataVisitorNode> or null if there aren't any
+    */
+   public Iterator<? extends ServiceMetaDataVisitorNode> getChildren();
+}

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceTextValueMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceTextValueMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceTextValueMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -25,7 +25,6 @@
 import java.beans.PropertyEditorManager;
 
 import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanServer;
 
 import org.jboss.deployment.DeploymentException;
 import org.jboss.util.Classes;
@@ -44,7 +43,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public class ServiceTextValueMetaData implements ServiceValueMetaData
+public class ServiceTextValueMetaData extends AbstractMetaDataVisitorNode implements ServiceValueMetaData
 {
    static
    {
@@ -92,9 +91,14 @@
       this.text = text;
    }
 
-   public Object getValue(MBeanServer server, MBeanAttributeInfo attributeInfo, ClassLoader cl, boolean trim, boolean replace) throws Exception
+   public Object getValue(ServiceValueContext valueContext) throws Exception
    {
+      MBeanAttributeInfo attributeInfo = valueContext.getAttributeInfo();
+      ClassLoader cl = valueContext.getClassloader();
+
       String typeName = attributeInfo.getType();
+      if (typeName == null)
+         throw new DeploymentException("AttributeInfo for " + attributeInfo.getName() + " has no type");
 
       // see if it is a primitive type first
       Class typeClass = Classes.getPrimitiveTypeForName(typeName);

Added: trunk/system/src/main/org/jboss/system/metadata/ServiceValueContext.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceValueContext.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceValueContext.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -0,0 +1,242 @@
+/*
+* 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.system.metadata;
+
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanServer;
+
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.system.ServiceController;
+
+/**
+ * ServiceValueContext.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class ServiceValueContext
+{
+   /** The MBeanServer */ 
+   private MBeanServer server;
+   
+   /** The service controller */
+   private ServiceController controller;
+   
+   /** The MBeanAttributeInfo */
+   private MBeanAttributeInfo attributeInfo;
+   
+   /** The ClassLoader */
+   private ClassLoader classloader;
+   
+   /** Whether to trim */
+   private boolean trim;
+   
+   /** Whether to replace */
+   private boolean replace;
+
+   /**
+    * Create a new ServiceValueContext.
+    */
+   public ServiceValueContext()
+   {
+   }
+
+   /**
+    * Create a new ServiceValueContext.
+    * 
+    * @param server the server
+    * @param controller the service controller
+    * @param classloader the classloader
+    */
+   public ServiceValueContext(MBeanServer server, ServiceController controller, ClassLoader classloader)
+   {
+      this.server = server;
+      this.controller = controller;
+      this.classloader = classloader;
+   }
+
+   /**
+    * Create a new ServiceValueContext.
+    * 
+    * @param server the server
+    * @param controller the service controller
+    * @param attributeInfo the attribute info
+    * @param classloader the classloader
+    */
+   public ServiceValueContext(MBeanServer server, ServiceController controller, MBeanAttributeInfo attributeInfo, ClassLoader classloader)
+   {
+      this.server = server;
+      this.controller = controller;
+      this.attributeInfo = attributeInfo;
+      this.classloader = classloader;
+   }
+
+   /**
+    * Get the attributeInfo.
+    * 
+    * @return the attributeInfo.
+    */
+   public MBeanAttributeInfo getAttributeInfo()
+   {
+      return attributeInfo;
+   }
+
+   /**
+    * Set the attributeInfo.
+    * 
+    * @param attributeInfo the attributeInfo.
+    */
+   public void setAttributeInfo(MBeanAttributeInfo attributeInfo)
+   {
+      this.attributeInfo = attributeInfo;
+   }
+
+   /**
+    * Get the classloader.
+    * 
+    * @return the classloader.
+    */
+   public ClassLoader getClassloader()
+   {
+      return classloader;
+   }
+
+   /**
+    * Set the classloader.
+    * 
+    * @param classloader the classloader.
+    */
+   public void setClassloader(ClassLoader classloader)
+   {
+      this.classloader = classloader;
+   }
+
+   /**
+    * Get the replace.
+    * 
+    * @return the replace.
+    */
+   public boolean isReplace()
+   {
+      return replace;
+   }
+
+   /**
+    * Set the replace.
+    * 
+    * @param replace the replace.
+    */
+   public void setReplace(boolean replace)
+   {
+      this.replace = replace;
+   }
+
+   /**
+    * Get the server.
+    * 
+    * @return the server.
+    */
+   public MBeanServer getServer()
+   {
+      if (server == null)
+      {
+         if (controller == null)
+            throw new IllegalStateException("No MBeanServer");
+         else
+            return controller.getMBeanServer();
+      }
+      return server;
+   }
+
+   /**
+    * Set the server.
+    * 
+    * @param server the server.
+    */
+   public void setServer(MBeanServer server)
+   {
+      this.server = server;
+   }
+
+   /**
+    * Get the service controller.
+    * 
+    * @return the controller.
+    */
+   public ServiceController getServiceController()
+   {
+      if (controller == null)
+         throw new IllegalStateException("No ServiceController");
+      return controller;
+   }
+
+   /**
+    * Set the service controller.
+    * 
+    * @param controller the controller.
+    */
+   public void setServiceController(ServiceController controller)
+   {
+      this.controller = controller;
+   }
+
+   /**
+    * Get the trim.
+    * 
+    * @return the trim.
+    */
+   public boolean isTrim()
+   {
+      return trim;
+   }
+
+   /**
+    * Set the trim.
+    * 
+    * @param trim the trim.
+    */
+   public void setTrim(boolean trim)
+   {
+      this.trim = trim;
+   }
+   
+   /**
+    * Get the kernel
+    * 
+    * @return the kernel
+    */
+   public Kernel getKernel()
+   {
+      return getServiceController().getKernel();
+   }
+   
+   /**
+    * Get the controller
+    * 
+    * @return the controller
+    */
+   public KernelController getController()
+   {
+      return getKernel().getController();
+   }
+}

Modified: trunk/system/src/main/org/jboss/system/metadata/ServiceValueMetaData.java
===================================================================
--- trunk/system/src/main/org/jboss/system/metadata/ServiceValueMetaData.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/metadata/ServiceValueMetaData.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -21,27 +21,20 @@
 */
 package org.jboss.system.metadata;
 
-import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanServer;
-
 /**
  * ServiceValueMetaData.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public interface ServiceValueMetaData
+public interface ServiceValueMetaData extends ServiceMetaDataVisitorNode
 {
    /**
     * Get the value
     * 
-    * @param server the mbean server
-    * @param attributeInfo the mbean attribute info
-    * @param cl the class loader
-    * @param trim whether to trim
-    * @param replace whether to replace
+    * @param valueContext the value context
     * @return the value
-    * @throws Exception for any error
+    * @throws Throwable for any error
     */
-   Object getValue(MBeanServer server, MBeanAttributeInfo attributeInfo, ClassLoader cl, boolean trim, boolean replace) throws Exception;
+   Object getValue(ServiceValueContext valueContext) throws Throwable;
 }

Modified: trunk/system/src/main/org/jboss/system/microcontainer/ConfigureAction.java
===================================================================
--- trunk/system/src/main/org/jboss/system/microcontainer/ConfigureAction.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/microcontainer/ConfigureAction.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -29,6 +29,7 @@
 import org.jboss.system.ServiceBinding;
 import org.jboss.system.ServiceConfigurator;
 import org.jboss.system.ServiceContext;
+import org.jboss.system.ServiceController;
 import org.jboss.system.metadata.ServiceAttributeMetaData;
 import org.jboss.system.metadata.ServiceMetaData;
 
@@ -42,7 +43,8 @@
 {
    public void installAction(ServiceControllerContext context) throws Throwable
    {
-      MBeanServer server = context.getServiceController().getMBeanServer();
+      ServiceController controller = context.getServiceController();
+      MBeanServer server = controller.getMBeanServer();
       ObjectName objectName = context.getObjectName();
 
       // Configure any attributes
@@ -53,7 +55,7 @@
          if (attrs.size() > 0)
          {
             ObjectName classLoaderName = metaData.getClassLoaderName(); 
-            ServiceConfigurator.configure(server, objectName, classLoaderName, attrs);
+            ServiceConfigurator.configure(null, controller, objectName, classLoaderName, attrs);
          }
       }
 

Modified: trunk/system/src/main/org/jboss/system/microcontainer/DescribeAction.java
===================================================================
--- trunk/system/src/main/org/jboss/system/microcontainer/DescribeAction.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/microcontainer/DescribeAction.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -21,19 +21,9 @@
 */
 package org.jboss.system.microcontainer;
 
-import java.util.List;
-
-import javax.management.ObjectName;
-
-import org.jboss.dependency.spi.ControllerState;
-import org.jboss.dependency.spi.DependencyInfo;
-import org.jboss.system.metadata.ServiceDependencyMetaData;
-import org.jboss.system.metadata.ServiceMetaData;
-
 /**
  * DescribeAction.
  * 
- * @todo use a visitor on the metadata like the pojo version
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
@@ -41,20 +31,6 @@
 {
    public void installAction(ServiceControllerContext context) throws Throwable
    {
-      // Add the lifecycle dependencies
-      ServiceMetaData metaData = context.getServiceMetaData();
-      if (metaData != null)
-      {
-         Object name = context.getName();
-         DependencyInfo info = context.getDependencyInfo();
-         List<ServiceDependencyMetaData> dependencies = metaData.getDependencies();
-         for (ServiceDependencyMetaData dependency : dependencies)
-         {
-            ObjectName iDependOn = dependency.getIDependOn();
-            info.addIDependOn(new LifecycleDependencyItem(name, iDependOn.getCanonicalName(), ControllerState.CREATE));
-            info.addIDependOn(new LifecycleDependencyItem(name, iDependOn.getCanonicalName(), ControllerState.START));
-         }
-      }
    }
 
    public void uninstallAction(ServiceControllerContext context)

Added: trunk/system/src/main/org/jboss/system/microcontainer/OnlyUnregisterAction.java
===================================================================
--- trunk/system/src/main/org/jboss/system/microcontainer/OnlyUnregisterAction.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/microcontainer/OnlyUnregisterAction.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -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.system.microcontainer;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.jboss.system.ServiceCreator;
+
+/**
+ * Only unregister action
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class OnlyUnregisterAction extends ServiceControllerContextAction
+{
+   public void installAction(ServiceControllerContext context) throws Throwable
+   {
+   }
+
+   public void uninstallAction(ServiceControllerContext context)
+   {
+      MBeanServer server = context.getServiceController().getMBeanServer();
+      ObjectName objectName = context.getObjectName();
+      ServiceCreator.uninstall(server, objectName);
+      context.setTarget(null);
+   }
+}

Modified: trunk/system/src/main/org/jboss/system/microcontainer/ServiceControllerContext.java
===================================================================
--- trunk/system/src/main/org/jboss/system/microcontainer/ServiceControllerContext.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/microcontainer/ServiceControllerContext.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -21,6 +21,10 @@
 */
 package org.jboss.system.microcontainer;
 
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Iterator;
+
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
@@ -28,10 +32,13 @@
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerMode;
 import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.system.Service;
 import org.jboss.system.ServiceContext;
 import org.jboss.system.ServiceController;
 import org.jboss.system.metadata.ServiceMetaData;
+import org.jboss.system.metadata.ServiceMetaDataVisitor;
+import org.jboss.system.metadata.ServiceMetaDataVisitorNode;
 
 /**
  * ServiceControllerContext.
@@ -80,8 +87,12 @@
       this.objectName = metaData.getObjectName();
       serviceContext.objectName = objectName;
       this.serviceController = serviceController;
-      setMode(ControllerMode.MANUAL);
+      ControllerMode mode = metaData.getMode();
       this.serviceMetaData = metaData;
+      if (mode == null)
+         setMode(ControllerMode.MANUAL);
+      else
+         setMode(mode);
    }
    
    /**
@@ -145,6 +156,7 @@
     * Get the service proxy
     * 
     * @return the service proxy
+    * @throws Exception for any error
     */
    public Service getServiceProxy() throws Exception
    {
@@ -200,8 +212,91 @@
    {
       super.setController(controller);
       if (controller != null)
+      {
+         preprocessMetaData();
          serviceContext.state = ServiceContext.INSTALLED;
+      }
       else
          serviceContext.state = ServiceContext.NOTYETINSTALLED;
    }
+
+   /**
+    * Preprocess the metadata for this context
+    */
+   protected void preprocessMetaData()
+   {
+      if (serviceMetaData == null)
+         return;
+      PreprocessMetaDataVisitor visitor = new PreprocessMetaDataVisitor();
+      AccessController.doPrivileged(visitor);
+   }
+   
+   /**
+    * A visitor for the metadata that looks for dependencies.
+    */
+   protected class PreprocessMetaDataVisitor implements ServiceMetaDataVisitor, PrivilegedAction<Object>
+   {
+      /** The current context for when the dependencies are required */ 
+      private ControllerState contextState = ControllerState.INSTANTIATED;
+      
+      /**
+       * Visit the bean metadata node, this is the starting point
+       */
+      public Object run()
+      {
+         serviceMetaData.visit(this);
+         return null;
+      }
+      
+      /**
+       * Visit a node
+       * 
+       * @param node the node
+       */
+      public void visit(ServiceMetaDataVisitorNode node)
+      {
+         boolean trace = log.isTraceEnabled();
+         if (trace)
+            log.trace("Visit node " + node);
+         
+         // Visit the children of this node
+         Iterator<? extends ServiceMetaDataVisitorNode> children = node.getChildren();
+         if (children != null)
+         {
+            ControllerState restoreState = contextState;
+            while (children.hasNext())
+            {
+               ServiceMetaDataVisitorNode child = children.next();
+               try
+               {
+                  child.visit(this);
+               }
+               finally
+               {
+                  contextState = restoreState;
+               }
+            }
+         }
+      }
+
+      public ServiceControllerContext getControllerContext()
+      {
+         return ServiceControllerContext.this;
+      }
+      
+      public ControllerState getContextState()
+      {
+         return contextState;
+      }
+      
+      public void addDependency(DependencyItem dependency)
+      {
+         getDependencyInfo().addIDependOn(dependency);
+      }
+
+      public void setContextState(ControllerState contextState)
+      {
+         this.contextState = contextState;
+      }
+   }
 }

Modified: trunk/system/src/main/org/jboss/system/microcontainer/ServiceControllerContextActions.java
===================================================================
--- trunk/system/src/main/org/jboss/system/microcontainer/ServiceControllerContextActions.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/microcontainer/ServiceControllerContextActions.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -72,6 +72,7 @@
       if (lifecycleOnly == null)
       {
          Map<ControllerState, ControllerContextAction> actions = new HashMap<ControllerState, ControllerContextAction>();
+         actions.put(ControllerState.INSTANTIATED, new OnlyUnregisterAction());
          actions.put(ControllerState.CREATE, new CreateDestroyLifecycleAction());
          actions.put(ControllerState.START, new StartStopLifecycleAction());
          lifecycleOnly = new ServiceControllerContextActions(actions);

Modified: trunk/system/src/main/org/jboss/system/microcontainer/ServiceProxy.java
===================================================================
--- trunk/system/src/main/org/jboss/system/microcontainer/ServiceProxy.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/main/org/jboss/system/microcontainer/ServiceProxy.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -85,6 +85,7 @@
     * @param objectName the object name
     * @param server the mbean server
     * @return The Service value
+    * @throws Exception for any error
     */
    public static Service getServiceProxy(ObjectName objectName, MBeanServer server) throws Exception
    {
@@ -103,8 +104,9 @@
     * the Service interface methods set the corresponding hasOp array value
     * to true.
     *
-    * @param objectName
-    * @param opInfo
+    * @param objectName the object name
+    * @param server the mbean server
+    * @param opInfo the MBean operation info
     */
    public ServiceProxy(ObjectName objectName, MBeanServer server, MBeanOperationInfo[] opInfo)
    {

Modified: trunk/system/src/tests/org/jboss/test/system/metadata/test/AbstractMetaDataTest.java
===================================================================
--- trunk/system/src/tests/org/jboss/test/system/metadata/test/AbstractMetaDataTest.java	2006-08-16 13:28:21 UTC (rev 55983)
+++ trunk/system/src/tests/org/jboss/test/system/metadata/test/AbstractMetaDataTest.java	2006-08-16 13:41:35 UTC (rev 55984)
@@ -207,7 +207,7 @@
          expectedSet.add(expect);
       HashSet<ObjectName> actual = new HashSet<ObjectName>();
       for (ServiceDependencyMetaData depends : dependencies)
-         actual.add(depends.getIDependOn());
+         actual.add(depends.getIDependOnObjectName());
       assertEquals(expectedSet, actual);
    }
    




More information about the jboss-cvs-commits mailing list