[jboss-svn-commits] JBL Code SVN: r22296 - in labs/jbossesb/workspace/skeagh: commons/src/main/java/org/jboss/esb/classpath and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Sep 1 12:47:00 EDT 2008


Author: tfennelly
Date: 2008-09-01 12:47:00 -0400 (Mon, 01 Sep 2008)
New Revision: 22296

Modified:
   labs/jbossesb/workspace/skeagh/api/service/src/main/java/org/jboss/esb/context/DeploymentContext.java
   labs/jbossesb/workspace/skeagh/commons/src/main/java/org/jboss/esb/classpath/ClassUtil.java
   labs/jbossesb/workspace/skeagh/runtime/src/main/java/org/jboss/esb/deploy/DeploymentRuntime.java
   labs/jbossesb/workspace/skeagh/runtime/src/main/java/org/jboss/esb/deploy/config/digest/SetProperty.java
   labs/jbossesb/workspace/skeagh/runtime/src/test/java/org/jboss/esb/deploy/config/MyResource.java
Log:
Setting of the deployment context on deployed objects.

Modified: labs/jbossesb/workspace/skeagh/api/service/src/main/java/org/jboss/esb/context/DeploymentContext.java
===================================================================
--- labs/jbossesb/workspace/skeagh/api/service/src/main/java/org/jboss/esb/context/DeploymentContext.java	2008-09-01 16:07:54 UTC (rev 22295)
+++ labs/jbossesb/workspace/skeagh/api/service/src/main/java/org/jboss/esb/context/DeploymentContext.java	2008-09-01 16:47:00 UTC (rev 22296)
@@ -72,12 +72,12 @@
     }
 
     /**
-     * Add a list of deployment resources to the context.
-     * @param resourcesToAdd A list of deployment resources associated with this deployment.
+     * Set the list of deployment resources on the context.
+     * @param resources A list of deployment resources associated with this deployment.
      */
-    public final void addResources(final Map<String, Object> resourcesToAdd)
+    public final void setResources(final Map<String, Object> resources)
     {
-        this.resources.putAll(resourcesToAdd);
+        this.resources = resources;
     }
 
     /**

Modified: labs/jbossesb/workspace/skeagh/commons/src/main/java/org/jboss/esb/classpath/ClassUtil.java
===================================================================
--- labs/jbossesb/workspace/skeagh/commons/src/main/java/org/jboss/esb/classpath/ClassUtil.java	2008-09-01 16:07:54 UTC (rev 22295)
+++ labs/jbossesb/workspace/skeagh/commons/src/main/java/org/jboss/esb/classpath/ClassUtil.java	2008-09-01 16:47:00 UTC (rev 22296)
@@ -25,10 +25,7 @@
 
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Proxy;
+import java.lang.reflect.*;
 
 /**
  * Utility methods to aid in class/resource loading.
@@ -329,4 +326,30 @@
 
         return false;
     }
+
+    /**
+     * Set the field value on the specified object instance.
+     *
+     * @param field    The field to set.
+     * @param instance The object instance on which to set.
+     * @param value    The object value.
+     * @throws IllegalAccessException cannot access field.
+     */
+    public static void setFieldValue(final Field field, final Object instance, final Object value) throws IllegalAccessException
+    {
+        boolean isAccessible = field.isAccessible();
+
+        if (!isAccessible)
+        {
+            field.setAccessible(true);
+        }
+
+        try
+        {
+            field.set(instance, value);
+        } finally
+        {
+            field.setAccessible(isAccessible);
+        }
+    }
 }

Modified: labs/jbossesb/workspace/skeagh/runtime/src/main/java/org/jboss/esb/deploy/DeploymentRuntime.java
===================================================================
--- labs/jbossesb/workspace/skeagh/runtime/src/main/java/org/jboss/esb/deploy/DeploymentRuntime.java	2008-09-01 16:07:54 UTC (rev 22295)
+++ labs/jbossesb/workspace/skeagh/runtime/src/main/java/org/jboss/esb/deploy/DeploymentRuntime.java	2008-09-01 16:47:00 UTC (rev 22296)
@@ -34,6 +34,7 @@
 import org.jboss.esb.service.ServiceName;
 import org.jboss.esb.util.AssertArgument;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 
@@ -67,7 +68,21 @@
     /**
      * Deployed Objects Map.
      */
-    private Map<Object, Object> deployedObjects = new LinkedHashMap<Object, Object>();
+    private Map<Object, Object> deployedObjects = new LinkedHashMap<Object, Object>()
+    {
+        public Object put(final Object key, final Object value)
+        {
+            if (containsKey(key))
+            {
+                throw new IllegalStateException("ESB Deployment instance configured with resources/components having the same name '" + key + "'.  Resource/component names must be unique!");
+            }
+            return super.put(key, value);
+        }
+    };
+    /**
+     * Undeployed Objects List.
+     */
+    private List<Object> undeployedObjects = new ArrayList<Object>();
 
     /**
      * Public default constructor.
@@ -176,23 +191,44 @@
     public final void undeploy() throws DeploymentException
     {
         logger.info("Starting JBoss ESB undeployment: '" + deploymentName + "'.");
-        if (!deployedObjects.isEmpty())
+        // Undeploy all objects that were deployed on ESB Startup...
+        undeploy(deployedObjects);
+        // Undeploy any objects manually set in the ESB deployment context...
+        undeploy(context.getAll());
+        logger.info("JBoss ESB undeployment completed successfully: '" + deploymentName + "'.");
+    }
+
+    /**
+     * Undeploy the Objects supplied in the objectMap.
+     *
+     * @param objectMap The map of objects to be undeployed.
+     */
+    private void undeploy(final Map<Object, Object> objectMap)
+    {
+        if (!objectMap.isEmpty())
         {
-            Map.Entry<Object, Object>[] deploymentSet = new Map.Entry[deployedObjects.size()];
+            Map.Entry<Object, Object>[] deploymentSet = new Map.Entry[objectMap.size()];
 
-            deployedObjects.entrySet().toArray(deploymentSet);
+            objectMap.entrySet().toArray(deploymentSet);
             for (int i = deploymentSet.length - 1; i >= 0; i--)
             {
-                try
+                Object object = deploymentSet[i].getValue();
+
+                // Keeping track of Objects as we undeploy them, so as not to
+                // undeploy the same object twice...
+                if (!undeployedObjects.contains(object))
                 {
-                    ClassUtil.execAnnotatedMethod(deploymentSet[i].getValue(), Uninitialize.class);
-                } catch (Throwable t)
-                {
-                    logger.debug("Error while undeploying '" + deploymentSet[i].getKey() + "' (" + deploymentSet[i].getValue().getClass().getName() + ").");
+                    try
+                    {
+                        ClassUtil.execAnnotatedMethod(object, Uninitialize.class);
+                        undeployedObjects.add(object);
+                    } catch (Throwable t)
+                    {
+                        logger.debug("Error while undeploying '" + deploymentSet[i].getKey() + "' (" + deploymentSet[i].getValue().getClass().getName() + ").");
+                    }
                 }
             }
         }
-        logger.info("JBoss ESB undeployment completed successfully: '" + deploymentName + "'.");
     }
 
     /**
@@ -202,6 +238,8 @@
      */
     private void deployResources() throws DeploymentException
     {
+        Map<String, Object> deployedResources = new LinkedHashMap<String, Object>();
+
         for (ConfigurationUnit configurationUnit : configurationUnits)
         {
             Map<String, Object> resourceMap = configurationUnit.getResources();
@@ -211,9 +249,10 @@
             {
                 try
                 {
-                    ClassUtil.execAnnotatedMethod(resource.getValue(), Initialize.class);
+                    deployObject(resource.getValue());
                     logger.debug("Deployed resource '" + resource.getKey() + "' (" + resource.getValue().getClass().getName() + ").");
                     deployedObjects.put(resource.getKey(), resource.getValue());
+                    deployedResources.put(resource.getKey(), resource.getValue());
                 } catch (InvocationTargetException e)
                 {
                     throw new DeploymentException("Unable to deploy resource '" + resource.getKey() + "' (" + resource.getValue().getClass().getName() + ").", e.getCause());
@@ -223,6 +262,9 @@
                 }
             }
         }
+
+        // Expose the deployed resources via the DeploymentContext...
+        context.setResources(deployedResources);
     }
 
     /**
@@ -241,7 +283,7 @@
             {
                 try
                 {
-                    ClassUtil.execAnnotatedMethod(service.getValue().getService(), Initialize.class);
+                    deployObject(service.getValue().getService());
                     logger.debug("Deployed service '" + service.getKey() + "' (" + service.getValue().getClass().getName() + ").");
                     deployedObjects.put(service.getKey(), service.getValue().getService());
                 } catch (InvocationTargetException e)
@@ -289,7 +331,7 @@
                         routerConfig.getRouter().setDispatcher(dispatcher);
 
                         // Now deploy the router...
-                        ClassUtil.execAnnotatedMethod(routerConfig.getRouter(), Initialize.class);
+                        deployObject(routerConfig.getRouter());
                         logger.debug("Deployed InboundRouter '" + routerConfig.getName() + "' (" + routerConfig.getRouter().getClass().getName() + ").");
                         deployedObjects.put(routerConfig.getName(), routerConfig.getRouter());
                     } catch (InvocationTargetException e)
@@ -344,7 +386,7 @@
                         deployTransformers(routerConfig.getTransformers(), routerConfig.getName());
 
                         // Now deploy the router...
-                        ClassUtil.execAnnotatedMethod(routerConfig.getRouter(), Initialize.class);
+                        deployObject(routerConfig.getRouter());
                         logger.debug("Deployed OutboundRouter '" + routerConfig.getName() + "' (" + routerConfig.getRouter().getClass().getName() + ").");
                         deployedObjects.put(routerConfig.getName(), routerConfig.getRouter());
                     } catch (InvocationTargetException e)
@@ -374,7 +416,7 @@
             {
                 try
                 {
-                    ClassUtil.execAnnotatedMethod(transformer, Initialize.class);
+                    deployObject(transformer);
                     logger.debug("Deployed transformer for router '" + routerConfigName + "' (" + transformer.getClass().getName() + ").");
                     deployedObjects.put(transformer, transformer);
                 } catch (InvocationTargetException e)
@@ -389,6 +431,47 @@
     }
 
     /**
+     * Deploy the specified object.
+     *
+     * @param object The Object to be deployed.
+     * @throws InvocationTargetException Exception during object deployment.
+     * @throws IllegalAccessException    Unable to invoke initialize method on object.
+     */
+    private void deployObject(final Object object) throws InvocationTargetException, IllegalAccessException
+    {
+        // Set the deployment context on the object, if specified...
+        setContext(object, object.getClass());
+        ClassUtil.execAnnotatedMethod(object, Initialize.class);
+    }
+
+    /**
+     * Set the DeploymentContext anywhere it's declared.
+     *
+     * @param object         The object on which to set the context.
+     * @param hierarchyClass The class hierarchy on which to check for fields.
+     * @throws IllegalAccessException Unable to access the object field.
+     */
+    private void setContext(final Object object, final Class hierarchyClass) throws IllegalAccessException
+    {
+        // Check all the fields in this class...
+        Field[] fields = object.getClass().getDeclaredFields();
+        for (Field field : fields)
+        {
+            if (field.getType() == DeploymentContext.class)
+            {
+                ClassUtil.setFieldValue(field, object, context);
+            }
+        }
+
+        // Iterate up the inheritance hierarchy...
+        Class superClass = hierarchyClass.getSuperclass();
+        if (superClass != null)
+        {
+            setContext(object, superClass);
+        }
+    }
+
+    /**
      * Assert whether or not ESB configurations have been added to this
      * Runtime.
      *

Modified: labs/jbossesb/workspace/skeagh/runtime/src/main/java/org/jboss/esb/deploy/config/digest/SetProperty.java
===================================================================
--- labs/jbossesb/workspace/skeagh/runtime/src/main/java/org/jboss/esb/deploy/config/digest/SetProperty.java	2008-09-01 16:07:54 UTC (rev 22295)
+++ labs/jbossesb/workspace/skeagh/runtime/src/main/java/org/jboss/esb/deploy/config/digest/SetProperty.java	2008-09-01 16:47:00 UTC (rev 22296)
@@ -27,6 +27,7 @@
 import org.milyn.javabean.repository.BeanRepositoryManager;
 import org.milyn.xml.DomUtils;
 import org.w3c.dom.Element;
+import org.jboss.esb.classpath.ClassUtil;
 
 import java.lang.reflect.Field;
 
@@ -101,21 +102,10 @@
      */
     private void setPropertyValue(final Field field, final Object instance, final String value) throws IllegalAccessException
     {
-        boolean isAccessible = field.isAccessible();
         DataDecoder decoder = DataDecoder.Factory.create(field.getType());
+        Object objValue = decoder.decode(value);
 
-        if (!isAccessible)
-        {
-            field.setAccessible(true);
-        }
-
-        try
-        {
-            field.set(instance, decoder.decode(value));
-        } finally
-        {
-            field.setAccessible(isAccessible);
-        }
+        ClassUtil.setFieldValue(field, instance, objValue);
     }
 
     /**

Modified: labs/jbossesb/workspace/skeagh/runtime/src/test/java/org/jboss/esb/deploy/config/MyResource.java
===================================================================
--- labs/jbossesb/workspace/skeagh/runtime/src/test/java/org/jboss/esb/deploy/config/MyResource.java	2008-09-01 16:07:54 UTC (rev 22295)
+++ labs/jbossesb/workspace/skeagh/runtime/src/test/java/org/jboss/esb/deploy/config/MyResource.java	2008-09-01 16:47:00 UTC (rev 22296)
@@ -21,16 +21,20 @@
 
 import org.jboss.esb.annotations.Initialize;
 import org.jboss.esb.annotations.Uninitialize;
+import org.jboss.esb.context.DeploymentContext;
+import junit.framework.TestCase;
 
 /**
  * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
  */
 public class MyResource
 {
+    private DeploymentContext context;
     public static boolean initialised = false;
 
     @Initialize
     public void initialise() {
+        TestCase.assertNotNull("Deployment context should have been initialised in resource.", context);
         initialised = true;
     }
 




More information about the jboss-svn-commits mailing list