[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