You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2006/03/04 01:31:55 UTC

svn commit: r382984 [2/4] - in /incubator/servicemix/trunk/servicemix-core/src: main/java/org/apache/servicemix/jbi/container/ main/java/org/apache/servicemix/jbi/framework/ main/java/org/apache/servicemix/jbi/loaders/ main/java/org/apache/servicemix/j...

Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/DeploymentService.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/DeploymentService.java?rev=382984&r1=382983&r2=382984&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/DeploymentService.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/DeploymentService.java Fri Mar  3 16:31:49 2006
@@ -14,10 +14,12 @@
  * limitations under the License.
  */
 package org.apache.servicemix.jbi.framework;
+
 import java.io.File;
 import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.jbi.JBIException;
 import javax.jbi.component.Component;
@@ -27,25 +29,28 @@
 import javax.management.JMException;
 import javax.management.MBeanAttributeInfo;
 import javax.management.MBeanOperationInfo;
-import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.jbi.container.EnvironmentContext;
 import org.apache.servicemix.jbi.container.JBIContainer;
-import org.apache.servicemix.jbi.deployment.Connection;
-import org.apache.servicemix.jbi.deployment.Consumer;
 import org.apache.servicemix.jbi.deployment.Descriptor;
-import org.apache.servicemix.jbi.deployment.Provider;
 import org.apache.servicemix.jbi.deployment.ServiceAssembly;
 import org.apache.servicemix.jbi.deployment.ServiceUnit;
-import org.apache.servicemix.jbi.deployment.Target;
 import org.apache.servicemix.jbi.management.AttributeInfoHelper;
 import org.apache.servicemix.jbi.management.BaseSystemService;
 import org.apache.servicemix.jbi.management.OperationInfoHelper;
 import org.apache.servicemix.jbi.management.ParameterHelper;
-import org.apache.servicemix.jbi.servicedesc.InternalEndpoint;
+import org.apache.servicemix.jbi.util.DOMUtil;
 import org.apache.servicemix.jbi.util.FileUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
 /**
  * The deployment service MBean allows administrative tools to manage service assembly deployments.
@@ -56,7 +61,11 @@
     
     private static final Log log = LogFactory.getLog(DeploymentService.class);
     private EnvironmentContext environmentContext;
+    private Registry registry;
     
+    //
+    // ServiceMix service implementation
+    //
 
     /**
      * Initialize the Service
@@ -66,8 +75,10 @@
      * @throws DeploymentException
      */
     public void init(JBIContainer container) throws JBIException {
-        super.init(container);
         this.environmentContext = container.getEnvironmentContext();
+        this.registry = container.getRegistry();
+        super.init(container);
+        buildState();
     }
     
     protected Class getServiceMBean() {
@@ -75,11 +86,70 @@
     }
 
     public void start() throws javax.jbi.JBIException {
-        buildState();
         super.start();
+        String[] sas = registry.getDeployedServiceAssemblies();
+        for (int i = 0; i < sas.length; i++) {
+            try {
+                ServiceAssemblyLifeCycle sa = registry.getServiceAssembly(sas[i]);
+                sa.restore();
+            } catch (Exception e) {
+                log.error("Unable to restore state for service assembly " + sas[i], e);
+            }
+        }
     }
     
     /**
+     * Get an array of MBeanAttributeInfo
+     * 
+     * @return array of AttributeInfos
+     * @throws JMException
+     */
+    public MBeanAttributeInfo[] getAttributeInfos() throws JMException {
+        AttributeInfoHelper helper = new AttributeInfoHelper();
+        helper.addAttribute(getObjectToManage(), "deployedServiceAssemblies", "list of deployed SAs");
+        return AttributeInfoHelper.join(super.getAttributeInfos(), helper.getAttributeInfos());
+    }
+
+    /**
+     * Get an array of MBeanOperationInfo
+     * 
+     * @return array of OperationInfos
+     * @throws JMException
+     */
+    public MBeanOperationInfo[] getOperationInfos() throws JMException {
+        OperationInfoHelper helper = new OperationInfoHelper();
+        ParameterHelper ph = helper.addOperation(getObjectToManage(), "deploy", 1, "deploy An SA");
+        ph.setDescription(0, "saZipURL", "location of SA zip file");
+        ph = helper.addOperation(getObjectToManage(), "undeploy", 1, "undeploy An SA");
+        ph.setDescription(0, "saName", "SA name");
+        ph = helper.addOperation(getObjectToManage(), "getDeployedServiceUnitList", 1,
+                "list of SU's currently deployed");
+        ph.setDescription(0, "componentName", "Component name");
+        ph = helper.addOperation(getObjectToManage(), "getServiceAssemblyDescriptor", 1, "Get descriptor for a SA");
+        ph.setDescription(0, "saName", "SA name");
+        ph = helper.addOperation(getObjectToManage(), "getDeployedServiceAssembliesForComponent", 1,
+                "list of SA's for a Component");
+        ph.setDescription(0, "componentName", "Component name");
+        ph = helper.addOperation(getObjectToManage(), "getComponentsForDeployedServiceAssembly", 1,
+                "list of Components  for a SA");
+        ph.setDescription(0, "saName", "SA name");
+        ph = helper.addOperation(getObjectToManage(), "isDeployedServiceUnit", 2, "is SU deployed at a Component ?");
+        ph.setDescription(0, "componentName", "Component name");
+        ph.setDescription(1, "suName", "SU name");
+        ph = helper
+                .addOperation(getObjectToManage(), "canDeployToComponent", 1, "Can a SU be deployed to a Component?");
+        ph.setDescription(0, "componentName", "Component name");
+        ph = helper.addOperation(getObjectToManage(), "start", 1, "start an SA");
+        ph.setDescription(0, "saName", "SA name");
+        ph = helper.addOperation(getObjectToManage(), "stop", 1, "stop an SA");
+        ph.setDescription(0, "saName", "SA name");
+        ph = helper.addOperation(getObjectToManage(), "shutDown", 1, "shutDown an SA");
+        ph.setDescription(0, "saName", "SA name");
+        ph = helper.addOperation(getObjectToManage(), "getState", 1, "Running state of an SA");
+        ph.setDescription(0, "saName", "SA name");
+        return OperationInfoHelper.join(super.getOperationInfos(), helper.getOperationInfos());
+    }
+    /**
      * Get the description
      * 
      * @return description
@@ -88,69 +158,53 @@
         return "Allows admin tools to manage service deployments";
     }
 
+    //
+    // DeploymentServiceMBean implementation
+    //
+
     /**
      * Deploys the given SA to the JBI environment.
      * 
      * @param saZipURL String containing the location of the Service Assembly zip file.
-     * @return Result/Status of the SA deployment.
-     * @throws Exception if complete deployment fails.
+     * @return Result/Status of the SA deployment in xml format.
+     * @throws Exception in xml format if complete deployment fails.
      */
     public String deploy(String saZipURL) throws Exception {
         try {
-            String result = null;
-            File tmpDir = AutoDeploymentService.unpackLocation(environmentContext.getTmpDir(), saZipURL);
-            Descriptor root = AutoDeploymentService.buildDescriptor(tmpDir);
-            ServiceAssembly sa = root.getServiceAssembly();
-            if (sa != null) {
-                result = deploy(tmpDir, sa);
+            if (saZipURL == null) {
+                throw ManagementSupport.failure("deploy", "saZipURL must not be null");
             }
-            else {
-                throw new DeploymentException("Not an assembly: " + saZipURL);
+            File tmpDir = null;
+            try {
+                tmpDir = AutoDeploymentService.unpackLocation(environmentContext.getTmpDir(), saZipURL);
+            } catch (Exception e) {
+                throw ManagementSupport.failure("deploy", "Unable to unpack archive: " + saZipURL, e);
+            }
+            // unpackLocation returns null if no jbi descriptor is found
+            if (tmpDir == null) {
+                throw ManagementSupport.failure("deploy", "Unable to find jbi descriptor: " + saZipURL);
+            }
+            Descriptor root = null;
+            try {
+                root = AutoDeploymentService.buildDescriptor(tmpDir);
+            } catch (Exception e) {
+                throw ManagementSupport.failure("deploy", "Unable to build jbi descriptor: " + saZipURL, e);
             }
-            return result;
+            if (root == null) {
+                throw ManagementSupport.failure("deploy", "Unable to find jbi descriptor: " + saZipURL);
+            }
+            ServiceAssembly sa = root.getServiceAssembly();
+            if (sa == null) {
+                throw ManagementSupport.failure("deploy", "JBI descriptor is not an assembly descriptor: " + saZipURL);
+            }
+            return deployServiceAssembly(tmpDir, sa);
         } catch (Exception e) {
-            log.info("Unable to deploy assembly", e);
+            log.error("Error deploying service assembly", e);
             throw e;
         }
     }
 
     /**
-     * Deploy an SA
-     * 
-     * @param tmpDir
-     * @param sa
-     * @return result/status of the deployment
-     * @throws Exception
-     */
-    protected String deploy(File tmpDir, ServiceAssembly sa) throws Exception {
-        String result = "";
-        String assemblyName = sa.getIdentification().getName();
-        File oldSaDirectory = environmentContext.getSARootDirectory(assemblyName);
-        FileUtil.deleteFile(oldSaDirectory);
-        File saDirectory = environmentContext.createSARootDirectory(assemblyName);
-        log.info(assemblyName + " Moving " + tmpDir.getAbsolutePath() + " to " + saDirectory.getAbsolutePath());
-        
-        if (tmpDir.renameTo(saDirectory)) {
-            // move the assembly to a well-named holding area
-            ServiceUnit[] sus = sa.getServiceUnits();
-            if (sus != null) {
-                for (int i = 0;i < sus.length;i++) {
-                    if (i > 0) {
-                        result += " ; ";
-                    }
-                    result += deployServiceUnit(saDirectory, sus[i]);
-                }
-            }
-            buildConnections(sa);
-            container.getRegistry().registerServiceAssembly(sa);
-        }
-        else {
-            log.error("Failed to rename " + tmpDir + " TO " + saDirectory);
-        }
-        return result;
-    }
-
-    /**
      * Undeploys the given SA from the JBI environment.
      * 
      * @param saName name of the SA that has to be undeployed.
@@ -158,16 +212,26 @@
      * @throws Exception if compelete undeployment fails.
      */
     public String undeploy(String saName) throws Exception {
+        if (saName == null) {
+            throw ManagementSupport.failure("undeploy", "SA name must not be null");
+        }
+        ServiceAssemblyLifeCycle sa = registry.getServiceAssembly(saName);
+        if (sa == null) {
+            throw ManagementSupport.failure("undeploy", "SA has not been deployed: " + saName);
+        }
+        String state = sa.getCurrentState();
+        if (!DeploymentServiceMBean.SHUTDOWN.equals(state)) {
+            throw ManagementSupport.failure("undeploy", "SA must be shut down: " + saName);
+        }
         try {
             String result = null;
-            ServiceAssembly sa = container.getRegistry().getServiceAssembly(saName);
             if (sa != null) {
-                container.getRegistry().unregisterServiceAssembly(sa);
-                String assemblyName = sa.getIdentification().getName();
+                String assemblyName = sa.getName();
+                registry.unregisterServiceAssembly(assemblyName);
                 File saDirectory = environmentContext.getSARootDirectory(assemblyName);
-                ServiceUnit[] sus = sa.getServiceUnits();
+                ServiceUnitLifeCycle[] sus = sa.getDeployedSUs();
                 if (sus != null) {
-                    for (int i = 0;i < sus.length;i++) {
+                    for (int i = 0;i < sus.length; i++) {
                         undeployServiceUnit(sus[i]);
                     }
                 }
@@ -188,7 +252,12 @@
      */
     public String[] getDeployedServiceUnitList(String componentName) throws Exception {
         try {
-            return container.getRegistry().getSADeployedServiceUnitList(componentName);
+            ServiceUnitLifeCycle[] sus = registry.getDeployedServiceUnits(componentName);
+            String[] names = new String[sus.length];
+            for (int i = 0; i < names.length; i++) {
+                names[i] = sus[i].getName();
+            }
+            return names;
         } catch (Exception e) {
             log.info("Unable to get deployed service unit list", e);
             throw e;
@@ -202,7 +271,7 @@
      */
     public String[] getDeployedServiceAssemblies() throws Exception {
         try {
-            return container.getRegistry().getDeployedServiceAssemblies();
+            return registry.getDeployedServiceAssemblies();
         } catch (Exception e) {
             log.info("Unable to get deployed service assemblies", e);
             throw e;
@@ -216,26 +285,15 @@
      * @return descriptor of the Service Assembly.
      */
     public String getServiceAssemblyDescriptor(String saName) throws Exception {
-        try {
-            ServiceAssembly sa =  container.getRegistry().getServiceAssembly(saName);
-            return sa != null ? sa.getIdentification().getDescription() : "";
-        } catch (Exception e) {
-            log.info("Error in getServiceAssemblyDescriptor", e);
-            throw e;
+        ServiceAssemblyLifeCycle sa = registry.getServiceAssembly(saName);
+        if (sa != null) {
+            return sa.getDescriptor();
+        } else {
+            return null;
         }
     }
 
     /**
-     * See if an Sa is already deployed
-     * 
-     * @param saName
-     * @return true if already deployed
-     */
-    protected boolean isSaDeployed(String saName) {
-        return container.getRegistry().getServiceAssembly(saName) != null;
-    }
-
-    /**
      * Returns a list of Service Assemblies that contain SUs for the given component.
      * 
      * @param componentName name of the component.
@@ -244,7 +302,7 @@
      */
     public String[] getDeployedServiceAssembliesForComponent(String componentName) throws Exception {
         try {
-            return container.getRegistry().getDeployedServiceAssembliesForComponent(componentName);
+            return registry.getDeployedServiceAssembliesForComponent(componentName);
         } catch (Exception e) {
             log.info("Error in getDeployedServiceAssembliesForComponent", e);
             throw e;
@@ -260,7 +318,7 @@
      */
     public String[] getComponentsForDeployedServiceAssembly(String saName) throws Exception {
         try {
-            return container.getRegistry().getComponentsForDeployedServiceAssembly(saName);
+            return registry.getComponentsForDeployedServiceAssembly(saName);
         } catch (Exception e) {
             log.info("Error in getComponentsForDeployedServiceAssembly", e);
             throw e;
@@ -277,7 +335,7 @@
      */
     public boolean isDeployedServiceUnit(String componentName, String suName) throws Exception {
         try {
-            return container.getRegistry().isSADeployedServiceUnit(componentName, suName);
+            return registry.isSADeployedServiceUnit(componentName, suName);
         } catch (Exception e) {
             log.info("Error in isSADeployedServiceUnit", e);
             throw e;
@@ -291,9 +349,8 @@
      * @return boolean value indicating whether the SU can be deployed.
      */
     public boolean canDeployToComponent(String componentName) {
-        boolean result = false;
-        result = container.getComponent(componentName) != null;
-        return result;
+        LocalComponentConnector lcc = container.getLocalComponentConnector(componentName);
+        return lcc != null && lcc.getComponentMBean().isStarted() && lcc.getServiceUnitManager() != null;
     }
 
     /**
@@ -305,7 +362,8 @@
      */
     public String start(String serviceAssemblyName) throws Exception {
         try {
-            return container.getRegistry().startServiceAssembly(serviceAssemblyName);
+            ServiceAssemblyLifeCycle sa = registry.getServiceAssembly(serviceAssemblyName);
+            return sa.start(true);
         } catch (Exception e) {
             log.info("Error in start", e);
             throw e;
@@ -323,7 +381,8 @@
      */
     public String stop(String serviceAssemblyName) throws Exception {
         try {
-            return container.getRegistry().stopServiceAssembly(serviceAssemblyName);
+            ServiceAssemblyLifeCycle sa = registry.getServiceAssembly(serviceAssemblyName);
+            return sa.stop(true);
         } catch (Exception e) {
             log.info("Error in stop", e);
             throw e;
@@ -339,7 +398,8 @@
      */
     public String shutDown(String serviceAssemblyName) throws Exception {
         try {
-            return container.getRegistry().shutDownServiceAssembly(serviceAssemblyName);
+            ServiceAssemblyLifeCycle sa = registry.getServiceAssembly(serviceAssemblyName);
+            return sa.shutDown(true);
         } catch (Exception e) {
             log.info("Error in shutDown", e);
             throw e;
@@ -355,95 +415,215 @@
      */
     public String getState(String serviceAssemblyName) throws Exception {
         try {
-            return container.getRegistry().getServiceAssemblyState(serviceAssemblyName);
+            ServiceAssemblyLifeCycle sa = registry.getServiceAssembly(serviceAssemblyName);
+            return sa.getCurrentState();
         } catch (Exception e) {
             log.info("Error in getState", e);
             throw e;
         }
     }
 
-    protected Set getComponentNames(ServiceAssembly sa) {
-        Set names = null;
-        if (sa.getServiceUnits() != null && sa.getServiceUnits().length > 0) {
-        	names = new HashSet();
-        	for (int i = 0; i < sa.getServiceUnits().length; i++) {
-        		names.add(sa.getServiceUnits()[i].getTarget().getComponentName());
-        	}
-        }
-        return names;
-    }
-
-    protected String deployServiceUnit(File location, ServiceUnit su) throws DeploymentException {
-        String result = null;
-        String name = su.getIdentification().getName();
-        Target target = su.getTarget();
-        String componentName = target.getComponentName();
-        String artifact = target.getArtifactsZip();
-        try {
-            File targetDir = environmentContext.getServiceUnitDirectory(componentName, name);
-            // unpack the artifact
-            if (artifact != null) {
-                File artifactFile = new File(location, artifact);
-                log.debug("Artifact is [" + artifactFile.getAbsolutePath() + "]");
-                if (artifactFile.exists()) {
-                    log.info("deployServiceUnit: unpack archive " + artifactFile + " to " + targetDir);
-                    // FileUtil.moveFile(artifactFile, targetDir);
-                    FileUtil.unpackArchive(artifactFile, targetDir);
-                    // now get the component and give it a SA
+    /**
+     * See if an Sa is already deployed
+     * 
+     * @param serviceAssemblyName - name of the service assembly.
+     * @return true if already deployed
+     */
+    protected boolean isSaDeployed(String serviceAssemblyName) {
+        return registry.getServiceAssembly(serviceAssemblyName) != null;
+    }
+
+    /**
+     * Deploy an SA
+     * 
+     * @param tmpDir
+     * @param sa
+     * @return result/status of the deployment in xml format
+     * @throws Exception  in xml format
+     */
+    protected String deployServiceAssembly(File tmpDir, ServiceAssembly sa) throws Exception {
+        String assemblyName = sa.getIdentification().getName();
+        File oldSaDirectory = environmentContext.getSARootDirectory(assemblyName);
+        FileUtil.deleteFile(oldSaDirectory);
+        File saDirectory = environmentContext.createSARootDirectory(assemblyName);
+
+        // move the assembly to a well-named holding area
+        if (log.isDebugEnabled()) {
+            log.debug("Moving " + tmpDir.getAbsolutePath() + " to " + saDirectory.getAbsolutePath());
+        }
+        if (!tmpDir.renameTo(saDirectory)) {
+            throw ManagementSupport.failure("deploy", "Failed to rename " + tmpDir + " to " + saDirectory);
+        }
+        // Check all SUs requirements
+        ServiceUnit[] sus = sa.getServiceUnits();
+        if (sus != null) {
+            for (int i = 0; i < sus.length; i++) {
+                String suName = sus[i].getIdentification().getName();
+                String artifact = sus[i].getTarget().getArtifactsZip();
+                String componentName = sus[i].getTarget().getComponentName();
+                File artifactFile = new File(saDirectory, artifact);
+                if (!artifactFile.exists()) {
+                    throw ManagementSupport.failure("deploy", "Artifact " + artifact + " not found for service unit " + suName);
+                }
+                LocalComponentConnector lcc = container.getLocalComponentConnector(componentName);
+                if (lcc == null) {
+                    throw ManagementSupport.failure("deploy", "Target component " + componentName + " for service unit " + suName + " is not installed");
+                }
+                if (!lcc.getComponentMBean().isStarted()) {
+                    throw ManagementSupport.failure("deploy", "Target component " + componentName + " for service unit " + suName + " is not started");
                 }
-                else {
-                    throw new DeploymentException("artifact: " + artifact + "(" + artifactFile.getAbsolutePath()
-                            + ") doesn't exist");
-                }
-            }
-            Component component = container.getComponent(componentName);
-            if (component != null) {
-                ServiceUnitManager sum = component.getServiceUnitManager();
-                if (sum != null) {
-                    result = sum.deploy(name, targetDir.getAbsolutePath());
-                    //sum.init(name, targetDir.getAbsolutePath());
-                    // register active endpoints
+                if (lcc.getServiceUnitManager() == null) {
+                    throw ManagementSupport.failure("deploy", "Target component " + componentName + " for service unit " + suName + " does not accept deployments");
                 }
-                else {
+                // TODO: check duplicates here ?
+                if (isDeployedServiceUnit(componentName, suName)) {
+                    throw ManagementSupport.failure("deploy", "Service unit " + suName + " is already deployed on component " + componentName);
+                }
+            }
+        }
+        // Everything seems ok, so deploy all SUs
+        int nbSuccess = 0;
+        int nbFailures = 0;
+        List componentResults = new ArrayList();
+        List suKeys = new ArrayList();
+        if (sus != null) {
+            for (int i = 0; i < sus.length; i++) {
+                File targetDir = null;
+                String suName = sus[i].getIdentification().getName();
+                String artifact = sus[i].getTarget().getArtifactsZip();
+                String componentName = sus[i].getTarget().getComponentName();
+                // TODO: skip duplicates
+                // Unpack SU
+                try {
+                    File artifactFile = new File(saDirectory, artifact);
+                    targetDir = environmentContext.getServiceUnitDirectory(componentName, suName);
+                    if (log.isDebugEnabled()) {
+                        log.debug("Unpack service unit archive " + artifactFile + " to " + targetDir);
+                    }
+                    FileUtil.unpackArchive(artifactFile, targetDir);
+                } catch (IOException e) {
+                    nbFailures++;
+                    componentResults.add(ManagementSupport.createComponentFailure(
+                            "deploy", componentName,
+                            "Error unpacking service unit", e));
+                    continue;
+                }
+                // Deploy it
+                boolean success = false;
+                try {
+                    LocalComponentConnector lcc = container.getLocalComponentConnector(componentName);
+                    ServiceUnitManager sum = lcc.getServiceUnitManager();
+                    String resultMsg = sum.deploy(suName, targetDir.getAbsolutePath());
+                    success = getComponentTaskResult(resultMsg, componentName, componentResults, true);
+                    // TODO: need to register the SU somewhere to keep track of its state
+                } catch (Exception e) {
+                    // Delete SU deployment dir
                     FileUtil.deleteFile(targetDir);
-                    throw new DeploymentException("Component " + componentName + " doesn't have a ServiceUnitManager");
+                    getComponentTaskResult(e.getMessage(), componentName, componentResults, false);
+                }
+                if (success) {
+                    nbSuccess++;
+                    suKeys.add(registry.registerServiceUnit(sus[i], assemblyName));
+                } else {
+                    nbFailures++;
                 }
             }
-            else {
-                FileUtil.deleteFile(targetDir);
-                throw new DeploymentException("Component " + componentName + " doesn't exist");
+        }
+        // Total failure
+        if (nbSuccess == 0 && nbFailures > 0) {
+            // Delete SA deployment directory 
+            FileUtil.deleteFile(tmpDir);
+            throw ManagementSupport.failure("deploy", componentResults);
+        }
+        // Success
+        else {
+            // Register SA
+            String[] deployedSUs = (String[]) suKeys.toArray(new String[suKeys.size()]);
+            registry.registerServiceAssembly(sa, deployedSUs);
+            // Build result string
+            if (nbFailures > 0) {
+                return ManagementSupport.createWarningMessage("deploy", "Failed to deploy some service units", componentResults);
+            } else {
+                return ManagementSupport.createSuccessMessage("deploy", componentResults);
             }
         }
-        catch (IOException e) {
-            log.error("Could not deploy ServiceUnit: " + name + " to component " + componentName, e);
-            throw new DeploymentException(e);
-        }
-        log.info("Deployed ServiceUnit " + name + " to Component: " + componentName);
-        return result;
-    }
-
-    protected void undeployServiceUnit(ServiceUnit su) throws DeploymentException {
-        String name = su.getIdentification().getName();
-        Target target = su.getTarget();
-        String componentName = target.getComponentName();
-        try {
-            File targetDir = environmentContext.getServiceUnitDirectory(componentName, name);
-            // unpack the artifact
-            // now get the component and give it a SA
-            Component component = container.getComponent(componentName);
-            if (component != null) {
-                ServiceUnitManager sum = component.getServiceUnitManager();
-                if (sum != null) {
-                    sum.undeploy(name, targetDir.getAbsolutePath());
-                    FileUtil.deleteFile(targetDir);
+    }
+    
+    protected boolean getComponentTaskResult(String resultMsg, String component, List results, boolean success) {
+        Element result = null;
+        try {
+            Document doc = parse(resultMsg);
+            result = getElement(doc, "component-task-result");
+            Element e = getChildElement(result, "component-task-result-details");
+            e = getChildElement(e, "task-result-details");
+            e = getChildElement(e, "task-result");
+            String r = DOMUtil.getElementText(e);
+            if (!"SUCCESS".equals(r)) {
+                success = false;
+            }
+        } catch (Exception e) {
+            // The component did not throw an exception upon deployment,
+            // but the result string is not compliant, so issue a warning
+            // and consider this is a successfull deployment
+            try {
+                if (success) {
+                    result = ManagementSupport.createComponentFailure(
+                            "deploy", component,
+                            "Unable to parse result string", e);
+                } else {
+                    result = ManagementSupport.createComponentWarning(
+                            "deploy", component,
+                            "Unable to parse result string", e);
                 }
+            } catch (Exception e2) {
+                log.error(e2);
+                result = null;
             }
-            else {
+        }
+        if (result != null) {
+            results.add(result);
+        }
+        return success;
+    }
+    
+    protected Document parse(String result) throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);
+        factory.setIgnoringElementContentWhitespace(true);
+        factory.setIgnoringComments(true);
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        return builder.parse(new InputSource(new StringReader(result)));
+    }
+    
+    protected Element getElement(Document doc, String name) {
+        NodeList l = doc.getElementsByTagNameNS("http://java.sun.com/xml/ns/jbi/management-message", name);
+        Element e = (Element) l.item(0);
+        return e;
+    }
+    
+    protected Element getChildElement(Element element, String name) {
+        NodeList l = element.getElementsByTagNameNS("http://java.sun.com/xml/ns/jbi/management-message", name);
+        Element e = (Element) l.item(0);
+        return e;
+    }
+
+    protected void undeployServiceUnit(ServiceUnitLifeCycle su) throws DeploymentException {
+        String name = su.getName();
+        String componentName = su.getComponentName();
+        File targetDir = su.getServiceUnitRootPath();
+        registry.unregisterServiceUnit(su.getKey());
+        // unpack the artifact
+        // now get the component and give it a SA
+        Component component = container.getComponent(componentName);
+        if (component != null) {
+            ServiceUnitManager sum = component.getServiceUnitManager();
+            if (sum != null) {
+                sum.undeploy(name, targetDir.getAbsolutePath());
                 FileUtil.deleteFile(targetDir);
             }
         }
-        catch (IOException e) {
-            throw new DeploymentException(e);
+        else {
+            FileUtil.deleteFile(targetDir);
         }
         log.info("UnDeployed ServiceUnit " + name + " from Component: " + componentName);
     }
@@ -452,6 +632,7 @@
      * Find runnning state and things deployed before shutdown
      */
     protected void buildState() {
+        log.info("Restoring service assemblies");
         // walk through deployed SA's
         File top = environmentContext.getServiceAssembiliesDirectory();
         if (top != null && top.exists() && top.isDirectory()) {
@@ -461,16 +642,13 @@
                 for (int i = 0; i < files.length; i++) {
                     if (files[i].isDirectory()) {
                         String assemblyName = files[i].getName();
-                        log.info("initializing assembly " + assemblyName);
                         try {
                         	File assemblyDir = environmentContext.getSARootDirectory(assemblyName);
 	                        Descriptor root = AutoDeploymentService.buildDescriptor(assemblyDir);
 	                        if (root != null) {
 	                            ServiceAssembly sa = root.getServiceAssembly();
 	                            if (sa != null && sa.getIdentification() != null) {
-	                                container.getRegistry().registerServiceAssembly(sa);
-	                                buildConnections(sa);
-	                                container.getRegistry().restoreServiceAssembly(assemblyName);
+	                                registry.registerServiceAssembly(sa);
 	                            }
 	                        }
                         } catch(Exception e) {
@@ -482,151 +660,4 @@
         }
     }
 
-    protected void buildConnections(ServiceAssembly sa) throws JBIException {
-        if (sa != null) {
-            Connection[] connections = sa.getConnections().getConnections();
-            if (connections != null) {
-                for (int i = 0; i < connections.length; i++) {
-                    Connection connection = connections[i];
-                    Consumer consumer = connection.getConsumer();
-                    Provider provider = connection.getProvider();
-                    QName suName = consumer.getInterfaceName();
-                    if (suName != null) {
-                        LocalComponentConnector lcc = (LocalComponentConnector) container.getRegistry()
-                                .getComponentConnector(suName);
-                        if (lcc != null) {
-                            lcc.getActivationSpec().setDestinationEndpoint(provider.getEndpointName());
-                            lcc.getActivationSpec().setDestinationService(provider.getServiceName());
-                        }
-                        else {
-                            throw new DeploymentException("Unable to build connections, can't find consumer interface "
-                                    + suName);
-                        }
-                    }
-                    else {
-                        // We didn't have the interface so we will go after
-                        // the service name and endpoint
-                        InternalEndpoint endPoint = (InternalEndpoint) container.getRegistry().getEndpoint(
-                                consumer.getServiceName(), consumer.getEndpointName());
-                        if (endPoint != null) {
-                            LocalComponentConnector lcc = (LocalComponentConnector) container.getRegistry()
-                                    .getComponentConnector(endPoint.getComponentNameSpace());
-                            if (lcc != null) {
-                                lcc.getActivationSpec().setDestinationEndpoint(provider.getEndpointName());
-                                lcc.getActivationSpec().setDestinationService(provider.getServiceName());
-                            }
-                            else {
-                                throw new DeploymentException(
-                                        "Unable to build connections, can't find consumer based on component name space "
-                                                + endPoint.getComponentNameSpace());
-                            }
-                        }
-                        else {
-                            throw new DeploymentException(
-                                    "Unable to build connections, can't find consumer with servicename "
-                                            + consumer.getServiceName() + " and endpoint " + consumer.getEndpointName());
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    protected ServiceUnit getServiceUnit(String serviceUnitName, ServiceUnit[] sus) {
-        ServiceUnit result = null;
-        if (sus != null) {
-            for (int i = 0;i < sus.length;i++) {
-                if (sus[i].getIdentification().getName().equals(serviceUnitName)) {
-                    result = sus[i];
-                    break;
-                }
-            }
-        }
-        return result;
-    }
-
-    protected String buildStatusString(String taskName, String componentName, String message) {
-        StringBuffer result = new StringBuffer();
-        result.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
-        result.append("jbi-task xmlns = \"http://java/sun.com/xml/ns/management-message\">");
-        result.append("<component-task-result>");
-        result.append("<component-name>");
-        result.append(componentName);
-        result.append("</component-name>");
-        result.append("<component-task-result-details>");
-        result.append("<task-result-details>");
-        result.append("<task-id>");
-        result.append(taskName);
-        result.append("</task-id>");
-        result.append("<task-result>FAILED</task-result>");
-        result.append("<message-type>ERROR</message-type>");
-        result.append("<task-status-msg>");
-        result.append("<msg-loc-info>");
-        result.append("<loc-token>");
-        result.append(" ");
-        result.append("</loc-token>");
-        result.append("<loc-message>");
-        result.append(message);
-        result.append("</loc-message>");
-        result.append("</msg-loc-info>");
-        result.append("</task-status-msg>");
-        result.append("</task-result-details>");
-        result.append(message);
-        result.append("</component-task-result-details>");
-        result.append("</component-task-result>");
-        return result.toString();
-    }
-    
-    
-    /**
-     * Get an array of MBeanAttributeInfo
-     * 
-     * @return array of AttributeInfos
-     * @throws JMException
-     */
-    public MBeanAttributeInfo[] getAttributeInfos() throws JMException {
-        AttributeInfoHelper helper = new AttributeInfoHelper();
-        helper.addAttribute(getObjectToManage(), "deployedServiceAssemblies", "list of deployed SAs");
-        return AttributeInfoHelper.join(super.getAttributeInfos(), helper.getAttributeInfos());
-    }
-
-    /**
-     * Get an array of MBeanOperationInfo
-     * 
-     * @return array of OperationInfos
-     * @throws JMException
-     */
-    public MBeanOperationInfo[] getOperationInfos() throws JMException {
-        OperationInfoHelper helper = new OperationInfoHelper();
-        ParameterHelper ph = helper.addOperation(getObjectToManage(), "deploy", 1, "deploy An SA");
-        ph.setDescription(0, "saZipURL", "location of SA zip file");
-        ph = helper.addOperation(getObjectToManage(), "undeploy", 1, "undeploy An SA");
-        ph.setDescription(0, "saName", "SA name");
-        ph = helper.addOperation(getObjectToManage(), "getDeployedServiceUnitList", 1,
-                "list of SU's currently deployed");
-        ph.setDescription(0, "componentName", "Component name");
-        ph = helper.addOperation(getObjectToManage(), "getServiceAssemblyDescriptor", 1, "Get descriptor for a SA");
-        ph.setDescription(0, "saName", "SA name");
-        ph = helper.addOperation(getObjectToManage(), "getDeployedServiceAssembliesForComponent", 1,
-                "list of SA's for a Component");
-        ph.setDescription(0, "componentName", "Component name");
-        ph = helper.addOperation(getObjectToManage(), "getComponentsForDeployedServiceAssembly", 1,
-                "list of Components  for a SA");
-        ph.setDescription(0, "saName", "SA name");
-        ph = helper.addOperation(getObjectToManage(), "isDeployedServiceUnit", 2, "is SU deployed at a Component ?");
-        ph.setDescription(0, "componentName", "Component name");
-        ph.setDescription(1, "suName", "SU name");
-        ph = helper
-                .addOperation(getObjectToManage(), "canDeployToComponent", 1, "Can a SU be deployed to a Component?");
-        ph.setDescription(0, "componentName", "Component name");
-        ph = helper.addOperation(getObjectToManage(), "start", 1, "start an SA");
-        ph.setDescription(0, "saName", "SA name");
-        ph = helper.addOperation(getObjectToManage(), "stop", 1, "stop an SA");
-        ph.setDescription(0, "saName", "SA name");
-        ph = helper.addOperation(getObjectToManage(), "shutDown", 1, "shutDown an SA");
-        ph.setDescription(0, "saName", "SA name");
-        ph = helper.addOperation(getObjectToManage(), "getState", 1, "Running state of an SA");
-        ph.setDescription(0, "saName", "SA name");
-        return OperationInfoHelper.join(super.getOperationInfos(), helper.getOperationInfos());
-    }
 }

Added: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/Endpoint.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/Endpoint.java?rev=382984&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/Endpoint.java (added)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/Endpoint.java Fri Mar  3 16:31:49 2006
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.jbi.framework;
+
+import java.beans.PropertyChangeListener;
+
+import javax.management.JMException;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanOperationInfo;
+import javax.xml.namespace.QName;
+import javax.xml.transform.TransformerException;
+
+import org.apache.servicemix.jbi.management.AttributeInfoHelper;
+import org.apache.servicemix.jbi.management.MBeanInfoProvider;
+import org.apache.servicemix.jbi.management.OperationInfoHelper;
+import org.apache.servicemix.jbi.servicedesc.AbstractServiceEndpoint;
+import org.apache.servicemix.jbi.util.DOMUtil;
+
+public class Endpoint implements EndpointMBean, MBeanInfoProvider {
+
+    private AbstractServiceEndpoint endpoint;
+    private EndpointRegistry endpointRegistry;
+    
+    public Endpoint(AbstractServiceEndpoint endpoint, EndpointRegistry endpointRegistry) {
+        this.endpoint = endpoint;
+        this.endpointRegistry = endpointRegistry;
+    }
+
+    public String getEndpointName() {
+        return endpoint.getEndpointName();
+    }
+
+    public QName[] getInterfaces() {
+        return endpoint.getInterfaces();
+    }
+
+    public QName getServiceName() {
+        return endpoint.getServiceName();
+    }
+    
+    public String getReference() {
+        try {
+            return DOMUtil.asIndentedXML(endpoint.getAsReference(null));
+        } catch (TransformerException e) {
+            return null;
+        }
+    }
+    
+    public String getWSDL() {
+        try {
+            return DOMUtil.asXML(endpointRegistry.getEndpointDescriptor(endpoint));
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    public String getComponentName() {
+        return endpoint.getComponentNameSpace().getName();
+    }
+
+    public MBeanAttributeInfo[] getAttributeInfos() throws JMException {
+        AttributeInfoHelper helper = new AttributeInfoHelper();
+        helper.addAttribute(getObjectToManage(), "endpointName", "name of the endpoint");
+        helper.addAttribute(getObjectToManage(), "serviceName", "name of the service");
+        helper.addAttribute(getObjectToManage(), "componentName", "component name of the service unit");
+        helper.addAttribute(getObjectToManage(), "interfaces", "interfaces implemented by this endpoint");
+        return helper.getAttributeInfos();
+    }
+
+    public MBeanOperationInfo[] getOperationInfos() throws JMException {
+        OperationInfoHelper helper = new OperationInfoHelper();
+        helper.addOperation(getObjectToManage(), "getReference", "retrieve the endpoint reference");
+        helper.addOperation(getObjectToManage(), "getWSDL", "retrieve the wsdl description of this endpoint");
+        return helper.getOperationInfos();
+    }
+
+    public Object getObjectToManage() {
+        return this;
+    }
+
+    public String getName() {
+        return endpoint.getServiceName().toString() + endpoint.getEndpointName();
+    }
+
+    public String getType() {
+        return "Endpoint";
+    }
+
+    public String getSubType() {
+        // TODO: return internal, external, linked ?
+        return null;
+    }
+
+    public String getDescription() {
+        return null;
+    }
+
+    public void setPropertyChangeListener(PropertyChangeListener l) {
+    }
+
+}

Added: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/EndpointMBean.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/EndpointMBean.java?rev=382984&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/EndpointMBean.java (added)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/EndpointMBean.java Fri Mar  3 16:31:49 2006
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.jbi.framework;
+
+import javax.xml.namespace.QName;
+
+public interface EndpointMBean {
+
+    public String getEndpointName();
+
+    public QName[] getInterfaces();
+
+    public QName getServiceName();
+    
+    public String getComponentName();
+    
+    public String getReference();
+    
+    public String getWSDL();
+
+}

Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/EndpointRegistry.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/EndpointRegistry.java?rev=382984&r1=382983&r2=382984&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/EndpointRegistry.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/EndpointRegistry.java Fri Mar  3 16:31:49 2006
@@ -24,10 +24,14 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentFragment;
 
+import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
+
 import javax.jbi.JBIException;
 import javax.jbi.component.Component;
 import javax.jbi.component.ComponentContext;
 import javax.jbi.servicedesc.ServiceEndpoint;
+import javax.management.JMException;
+import javax.management.ObjectName;
 import javax.wsdl.Definition;
 import javax.wsdl.Port;
 import javax.wsdl.Service;
@@ -37,6 +41,7 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -48,15 +53,18 @@
     
     private static final Log logger = LogFactory.getLog(EndpointRegistry.class);
     
-    private ComponentRegistry componentRegistry;
+    private Registry registry;
+    
+    private Map endpoints;
 
     /**
      * Constructor
      * 
      * @param cr
      */
-    public EndpointRegistry(ComponentRegistry cr) {
-        this.componentRegistry = cr;
+    public EndpointRegistry(Registry registry) {
+        this.registry = registry;
+        this.endpoints = new ConcurrentHashMap();
     }
 
     /**
@@ -141,10 +149,18 @@
      * @param serviceEndpoint
      */
     public synchronized void activateEndpoint(ComponentContext provider, InternalEndpoint serviceEndpoint) {
-        ComponentConnector cc = componentRegistry.getLocalComponentConnector(serviceEndpoint.getComponentNameSpace());
+        ComponentConnector cc = registry.getLocalComponentConnector(serviceEndpoint.getComponentNameSpace());
         if (cc != null) {
             cc.addActiveEndpoint(serviceEndpoint);
         }
+        try {
+            Endpoint endpoint = new Endpoint(serviceEndpoint, this);
+            ObjectName objectName = registry.getContainer().getManagementContext().createObjectName(endpoint);
+            registry.getContainer().getManagementContext().registerMBean(objectName, endpoint, EndpointMBean.class);
+            endpoints.put(serviceEndpoint, endpoint);
+        } catch (JMException e) {
+            logger.error("Could not register MBean for endpoint", e);
+        }
     }
 
     /**
@@ -154,10 +170,18 @@
      * @param serviceEndpoint
      */
     public void deactivateEndpoint(ComponentContext provider, InternalEndpoint serviceEndpoint) {
-        ComponentConnector cc = componentRegistry.getLocalComponentConnector(serviceEndpoint.getComponentNameSpace());
+        ComponentConnector cc = registry.getLocalComponentConnector(serviceEndpoint.getComponentNameSpace());
         if (cc != null) {
             cc.removeActiveEndpoint(serviceEndpoint);
         }
+        Endpoint ep = (Endpoint) endpoints.remove(serviceEndpoint);
+        if (ep != null) {
+            try {
+                registry.getContainer().getManagementContext().unregisterMBean(ep);
+            } catch (JBIException e) {
+                logger.error("Could not unregister MBean for endpoint", e);
+            }
+        }
     }
 
     /**
@@ -193,7 +217,7 @@
             throw new JBIException("Descriptors can not be queried for external endpoints");
         }
         AbstractServiceEndpoint se = (AbstractServiceEndpoint) endpoint;
-        Component component = componentRegistry.getComponent(se.getComponentNameSpace());
+        Component component = registry.getComponent(se.getComponentNameSpace());
         return component.getServiceDescription(endpoint);
     }
 
@@ -206,7 +230,7 @@
      * @param externalEndpoint the external endpoint to be registered, must be non-null.
      */
     public void registerExternalEndpoint(ComponentContextImpl provider, ServiceEndpoint externalEndpoint) {
-        ComponentConnector cc = componentRegistry.getLocalComponentConnector(provider.getComponentNameSpace());
+        ComponentConnector cc = registry.getLocalComponentConnector(provider.getComponentNameSpace());
         if (cc != null) {
             cc.addExternalActiveEndpoint(new ExternalEndpoint(cc.getComponentNameSpace(), externalEndpoint));
         }
@@ -221,7 +245,7 @@
      * @param externalEndpoint the external endpoint to be deregistered; must be non-null.
      */
     public void deregisterExternalEndpoint(ComponentContextImpl provider, ServiceEndpoint externalEndpoint) {
-        ComponentConnector cc = componentRegistry.getLocalComponentConnector(provider.getComponentNameSpace());
+        ComponentConnector cc = registry.getLocalComponentConnector(provider.getComponentNameSpace());
         if (cc != null) {
             cc.removeExternalActiveEndpoint(externalEndpoint);
         }
@@ -263,7 +287,7 @@
      * cannot be resolved.
      */
     public ServiceEndpoint resolveEndpointReference(DocumentFragment epr) {
-        Collection connectors = componentRegistry.getLocalComponentConnectors();
+        Collection connectors = registry.getLocalComponentConnectors();
         for (Iterator iter = connectors.iterator(); iter.hasNext();) {
             LocalComponentConnector connector = (LocalComponentConnector) iter.next();
             ServiceEndpoint se = connector.getComponent().resolveEndpointReference(epr);
@@ -349,33 +373,7 @@
         Set set = getEndpointsByName(serviceName, getInternalEndpoints());
         if (!set.isEmpty()) {
             InternalEndpoint endpoint = (InternalEndpoint) set.iterator().next();
-            result = componentRegistry.getComponentConnector(endpoint.getComponentNameSpace());
-        }
-        return result;
-    }
-
-    /**
-     * Utility method to get a ComponentConnector from an InterfaceName
-     * 
-     * @param interfaceName
-     * @return the ComponentConnector
-     */
-    public ComponentConnector getComponentConnector(QName interfaceName) {
-        ComponentConnector result = null;
-        for (Iterator i = getInternalEndpoints().iterator();i.hasNext();) {
-            InternalEndpoint endpoint = (InternalEndpoint) i.next();
-            QName[] interfaces = endpoint.getInterfaces();
-            if (interfaces != null) {
-                if (interfaceName != null) {
-                    for (int k = 0;k < interfaces.length;k++) {
-                        QName qn = interfaces[k];
-                        if (qn != null && qn.equals(interfaceName)) {
-                            result = componentRegistry.getComponentConnector(endpoint.getComponentNameSpace());
-                            break;
-                        }
-                    }
-                }
-            }
+            result = registry.getComponentConnector(endpoint.getComponentNameSpace());
         }
         return result;
     }
@@ -386,7 +384,7 @@
             for (Iterator i = getInternalEndpoints().iterator();i.hasNext();) {
                 InternalEndpoint endpoint = (InternalEndpoint) i.next();
                 if (endpoint.getEndpointName().equals(endpointName)) {
-                    result = componentRegistry.getComponentConnector(endpoint.getComponentNameSpace());
+                    result = registry.getComponentConnector(endpoint.getComponentNameSpace());
                     break;
                 }
             }
@@ -413,7 +411,7 @@
      */
     protected Set getInternalEndpoints() {
         Set answer = new HashSet();
-        for (Iterator iter = this.componentRegistry.getComponentConnectors().iterator();iter.hasNext();) {
+        for (Iterator iter = this.registry.getComponentConnectors().iterator();iter.hasNext();) {
             ComponentConnector cc = (ComponentConnector) iter.next();
             answer.addAll(cc.getActiveEndpoints());
         }
@@ -425,7 +423,7 @@
      */
     protected Set getExternalEndpoints() {
         Set answer = new HashSet();
-        for (Iterator iter = this.componentRegistry.getComponentConnectors().iterator(); iter.hasNext();) {
+        for (Iterator iter = this.registry.getComponentConnectors().iterator(); iter.hasNext();) {
             ComponentConnector cc = (ComponentConnector) iter.next();
             answer.addAll(cc.getExternalActiveEndpoints());
         }

Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/InstallationService.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/InstallationService.java?rev=382984&r1=382983&r2=382984&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/InstallationService.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/InstallationService.java Fri Mar  3 16:31:49 2006
@@ -24,6 +24,7 @@
 
 import javax.jbi.JBIException;
 import javax.jbi.management.DeploymentException;
+import javax.jbi.management.InstallationServiceMBean;
 import javax.jbi.management.InstallerMBean;
 import javax.management.Attribute;
 import javax.management.JMException;
@@ -44,6 +45,8 @@
 import org.apache.servicemix.jbi.deployment.InstallationDescriptorExtension;
 import org.apache.servicemix.jbi.deployment.SharedLibrary;
 import org.apache.servicemix.jbi.deployment.SharedLibraryList;
+import org.apache.servicemix.jbi.loaders.ClassLoaderService;
+import org.apache.servicemix.jbi.loaders.InstallationClassLoader;
 import org.apache.servicemix.jbi.management.BaseSystemService;
 import org.apache.servicemix.jbi.management.ManagementContext;
 import org.apache.servicemix.jbi.management.OperationInfoHelper;
@@ -56,7 +59,7 @@
  * 
  * @version $Revision$
  */
-public class InstallationService extends BaseSystemService implements FrameworkInstallationService{
+public class InstallationService extends BaseSystemService implements InstallationServiceMBean {
     private static final Log log=LogFactory.getLog(InstallationService.class);
     private EnvironmentContext environmentContext;
     private ManagementContext managementContext;
@@ -205,7 +208,7 @@
      *            true if the component is to be deleted as well.
      * @return - true if the operation was successful, otherwise false.
      */
-    public boolean unloadInstaller(String componentName, boolean isToBeDeleted){
+    public boolean unloadInstaller(String componentName, boolean isToBeDeleted) {
         boolean result=false;
         try {
             container.getBroker().suspend();
@@ -220,7 +223,7 @@
                 }
             }
         } catch(JBIException e) {
-            String errStr = "problem shutting down Component: " + componentName;
+            String errStr = "Problem shutting down Component: " + componentName;
             log.error(errStr, e);
         } finally {
             container.getBroker().resume();
@@ -261,16 +264,12 @@
      *            the name of the shared library to uninstall.
      * @return - true iff the uninstall was successful.
      */
-    public boolean uninstallSharedLibrary(String aSharedLibName){
-        boolean result=false;
+    public boolean uninstallSharedLibrary(String aSharedLibName) {
+        // TODO: should check existence of shared library
+        // and that it is not currently in use
         classLoaderService.removeSharedLibrary(aSharedLibName);
-        try{
-            environmentContext.removeSharedLibraryDirectory(aSharedLibName);
-            result=true;
-        }catch(IOException e){
-            log.error("Failed to remove shared library directory");
-        }
-        return result;
+        environmentContext.removeSharedLibraryDirectory(aSharedLibName);
+        return true;
     }
 
     /**
@@ -288,7 +287,7 @@
     }
     
     protected Class getServiceMBean() {
-        return FrameworkInstallationService.class;
+        return InstallationServiceMBean.class;
     }
 
     /**
@@ -446,10 +445,12 @@
                     FileUtil.deleteFile(installationDir);
                 }
                 if(!tmpDirectory.renameTo(installationDir)){
-                    throw new DeploymentException("Unable to rename "+tmpDirectory+" to "+installationDir);
+                    throw new DeploymentException("Unable to rename " + tmpDirectory + " to " + installationDir);
+                }
+                if (log.isDebugEnabled()) {
+                    log.debug("Moved " + tmpDirectory + " to " + installationDir);
                 }
-                log.info("moved "+tmpDirectory+" to "+installationDir);
-                classLoaderService.addSharedLibrary(installationDir,descriptor);
+                classLoaderService.addSharedLibrary(installationDir, descriptor);
             }catch(IOException e){
                 log.error("Deployment of Shared Library failed",e);
                 // remove any files created for installation
@@ -468,13 +469,15 @@
             File oldInstallationDir=environmentContext.getInstallationDirectory(name);
             // try and delete the old version ? - maybe should leave around ??
             if(!FileUtil.deleteFile(oldInstallationDir)){
-                log.warn("Failed to delete old installation directory: "+oldInstallationDir.getPath());
+                log.warn("Failed to delete old installation directory: " + oldInstallationDir.getPath());
             }
             File componentRoot=environmentContext.createComponentRootDirectory(name);
             // this will get the new one
             File installationDir=environmentContext.getInstallationDirectory(name);
             tmpDirectory.renameTo(installationDir);
-            log.info("moved "+tmpDirectory+" to "+installationDir);
+            if (log.isDebugEnabled()) {
+                log.debug("Moved " + tmpDirectory + " to " + installationDir);
+            }
             result=initializeInstaller(installationDir,componentRoot,descriptor);
             return result;
         }catch(IOException e){

Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/InstallerMBeanImpl.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/InstallerMBeanImpl.java?rev=382984&r1=382983&r2=382984&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/InstallerMBeanImpl.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/InstallerMBeanImpl.java Fri Mar  3 16:31:49 2006
@@ -25,6 +25,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.loaders.ClassLoaderUtil;
 
 /**
  * InstallerMBean defines standard installation and uninstallation controls for Binding Components and Service Engines.

Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/LocalComponentConnector.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/LocalComponentConnector.java?rev=382984&r1=382983&r2=382984&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/LocalComponentConnector.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/LocalComponentConnector.java Fri Mar  3 16:31:49 2006
@@ -28,12 +28,13 @@
 import javax.jbi.servicedesc.ServiceEndpoint;
 import javax.management.ObjectName;
 
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.jbi.container.ActivationSpec;
+import org.apache.servicemix.jbi.container.JBIContainer;
 import org.apache.servicemix.jbi.management.ManagementContext;
 import org.apache.servicemix.jbi.messaging.DeliveryChannelImpl;
+import org.apache.servicemix.jbi.messaging.MessagingStats;
 import org.apache.servicemix.jbi.util.XmlPersistenceSupport;
 
 /**
@@ -49,20 +50,19 @@
     private ServiceUnitManager suManager;
     private ComponentContextImpl context;
     private ActivationSpec activationSpec;
-    private DeliveryChannelImpl deliveryChannel;
     private ObjectName extendedMBeanName;
     private ComponentMBeanImpl componentMBean;
-    private ComponentStatsMBeanImpl componentStatsMBean;
+    private ObjectName componentMBeanName;
+    private ComponentStats componentStatsMBean;
+    private ObjectName componentStatsMBeanName;
+    private JBIContainer container;
+    private MessagingStats messagingStats;
+    private boolean exchangeThrottling;
+    private long throttlingTimeout = 100;
+    private int throttlingInterval = 1;
     private boolean pojo;
 
     /**
-     * Default Constructor
-     */
-    public LocalComponentConnector() {
-        super();
-    }
-
-    /**
      * Construct with it's id and delivery channel Id
      * 
      * @param name
@@ -72,16 +72,17 @@
      * @param binding
      * @param service
      */
-    public LocalComponentConnector(ComponentNameSpace name, String description, Component component,
-            DeliveryChannelImpl dc, boolean binding, boolean service) {
+    public LocalComponentConnector(JBIContainer container, ComponentNameSpace name, String description, Component component,
+            boolean binding, boolean service) {
         super(name);
+        this.container = container;
         this.component = component;
-        this.deliveryChannel = dc;
         packet.setDescription(description);
         packet.setBinding(binding);
         packet.setService(service);
         this.componentMBean = new ComponentMBeanImpl(this);
-        this.componentStatsMBean = new ComponentStatsMBeanImpl(this);
+        this.componentStatsMBean = new ComponentStats(this);
+        this.messagingStats = new MessagingStats(name.getName());
     }
     
     
@@ -93,13 +94,11 @@
      */
     public ObjectName registerMBeans(ManagementContext context) throws JBIException{
         try{
-            ObjectName result = context.createObjectName(componentMBean);
-            context.registerMBean(result, componentMBean, ComponentMBean.class);
-            componentMBean.setObjectName(result);
-            ObjectName objName = context.createObjectName(componentStatsMBean);
-            context.registerMBean(objName, componentStatsMBean, ComponentStatsMBean.class);
-            componentStatsMBean.setObjectName(objName);
-            return result;
+            componentMBeanName = context.createObjectName(componentMBean);
+            context.registerMBean(componentMBeanName, componentMBean, ComponentMBean.class);
+            componentStatsMBeanName = context.createObjectName(componentStatsMBean);
+            context.registerMBean(componentStatsMBeanName, componentStatsMBean, ComponentStatsMBean.class);
+            return componentMBeanName;
         }catch(Exception e){
             String errorStr="Failed to register MBeans";
             log.error(errorStr,e);
@@ -113,8 +112,8 @@
      * @throws JBIException
      */
     public void unregisterMbeans(ManagementContext context) throws JBIException{
-        context.unregisterMBean(componentMBean.getObjectName());
-        context.unregisterMBean(componentStatsMBean.getObjectName());
+        context.unregisterMBean(componentMBeanName);
+        context.unregisterMBean(componentStatsMBeanName);
     }
 
     /**
@@ -206,7 +205,7 @@
      * @return Returns the deliveryChannel.
      */
     public DeliveryChannelImpl getDeliveryChannel() {
-        return deliveryChannel;
+        return (DeliveryChannelImpl) context.getDeliveryChannel();
     }
 
     /**
@@ -214,7 +213,7 @@
      *            The deliveryChannel to set.
      */
     public void setDeliveryChannel(DeliveryChannelImpl deliveryChannel) {
-        this.deliveryChannel = deliveryChannel;
+        context.setDeliveryChannel(deliveryChannel);
     }
 
     /**
@@ -236,8 +235,8 @@
     /**
      * @return Returns the mbeanName.
      */
-    public ObjectName getMbeanName() {
-        return componentMBean.getObjectName();
+    public ObjectName getMBeanName() {
+        return componentMBeanName;
     }
 
     /**
@@ -250,14 +249,14 @@
     /**
     * @return Returns the stats mbeanName.
     */
-   public ObjectName getStatsMbeanName() {
-       return componentStatsMBean.getObjectName();
+   public ObjectName getStatsMBeanName() {
+       return componentStatsMBeanName;
    }
 
    /**
     * @return Returns the ComponentMBean
     */
-   public ComponentStatsMBeanImpl getComponentStatsMBean() {
+   public ComponentStats getComponentStatsMBean() {
        return componentStatsMBean;
    }
 
@@ -283,6 +282,10 @@
      */
     public void init() throws JBIException {
         if (context != null && component != null) {
+            DeliveryChannelImpl channel = new DeliveryChannelImpl(container, context.getComponentName());
+            channel.setConnector(this);
+            channel.setContext(context);
+            context.setDeliveryChannel(channel);
             ClassLoader loader = Thread.currentThread().getContextClassLoader();
             try {
                 Thread.currentThread().setContextClassLoader(getLifeCycle().getClass().getClassLoader());
@@ -385,4 +388,74 @@
         }
         return result;
     }
+
+    /**
+     * @return Returns the container.
+     */
+    public JBIContainer getContainer() {
+        return container;
+    }
+
+    /**
+     * @return Returns the messagingStats.
+     */
+    public MessagingStats getMessagingStats() {
+        return messagingStats;
+    }
+
+
+    /**
+     * Is MessageExchange sender throttling enabled ?
+     * 
+     * @return true if throttling enabled
+     */
+    public boolean isExchangeThrottling() {
+        return exchangeThrottling;
+    }
+
+    /**
+     * Set message throttling
+     * 
+     * @param value
+     */
+    public void setExchangeThrottling(boolean value) {
+        this.exchangeThrottling = value;
+    }
+
+    /**
+     * Get the throttling timeout
+     * 
+     * @return throttling tomeout (ms)
+     */
+    public long getThrottlingTimeout() {
+        return throttlingTimeout;
+    }
+
+    /**
+     * Set the throttling timout
+     * 
+     * @param value (ms)
+     */
+    public void setThrottlingTimeout(long value) {
+        throttlingTimeout = value;
+    }
+
+    /**
+     * Get the interval for throttling - number of Exchanges set before the throttling timeout is applied
+     * 
+     * @return interval for throttling
+     */
+    public int getThrottlingInterval() {
+        return throttlingInterval;
+    }
+
+    /**
+     * Set the throttling interval number of Exchanges set before the throttling timeout is applied
+     * 
+     * @param value
+     */
+    public void setThrottlingInterval(int value) {
+        throttlingInterval = value;
+    }
+
 }

Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/ManagementSupport.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/ManagementSupport.java?rev=382984&r1=382983&r2=382984&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/ManagementSupport.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/framework/ManagementSupport.java Fri Mar  3 16:31:49 2006
@@ -17,9 +17,19 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.util.DOMUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.jbi.management.DeploymentException;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
 
 /**
  * ManagementMessageHelper is a class that ease the building of management messages. 
@@ -29,25 +39,33 @@
     private static final Log logger = LogFactory.getLog(ManagementSupport.class);
 
     public static class Message {
+        private boolean isCauseFramework;
         private String task;
-        private String component;
         private String result;
         private Exception exception;
         private String type;
         private String message;
+        private String component;
+        private String locale;
         
-        public String getComponent() {
-            return component;
-        }
-        public void setComponent(String component) {
-            this.component = component;
-        }
         public Exception getException() {
             return exception;
         }
         public void setException(Exception exception) {
             this.exception = exception;
         }
+        public boolean isCauseFramework() {
+            return isCauseFramework;
+        }
+        public void setCauseFramework(boolean isCauseFramework) {
+            this.isCauseFramework = isCauseFramework;
+        }
+        public String getMessage() {
+            return message;
+        }
+        public void setMessage(String message) {
+            this.message = message;
+        }
         public String getResult() {
             return result;
         }
@@ -66,104 +84,200 @@
         public void setType(String type) {
             this.type = type;
         }
-        public String getMessage() {
-            return message;
+        public String getComponent() {
+            return component;
         }
-        public void setMessage(String message) {
-            this.message = message;
+        public void setComponent(String component) {
+            this.component = component;
+        }
+        public String getLocale() {
+            return locale;
         }
+        public void setLocale(String locale) {
+            this.locale = locale;
+        }
+    }
+    
+    public static Exception failure(String task, String info) throws Exception {
+        return failure(task, info, null, null);
+    }
+    
+    public static Exception failure(String task, List componentResults) throws Exception {
+        return failure(task, null, null, componentResults);
+    }
+    
+    public static Exception failure(String task, String info, Exception e) throws Exception {
+        return failure(task, info, e, null);
+    }
+    
+    public static Exception failure(String task, String info, Exception e, List componentResults) throws Exception {
+        ManagementSupport.Message msg = new ManagementSupport.Message();
+        msg.setTask(task);
+        msg.setResult("FAILED");
+        msg.setType("ERROR");
+        msg.setException(e);
+        msg.setMessage(info);
+        return new Exception(ManagementSupport.createFrameworkMessage(msg, componentResults));
+    }
+
+    public static String createSuccessMessage(String task) {
+        return createSuccessMessage(task, null, null);
     }
     
-    public static String createComponentMessage(Message msg) {
+    public static String createSuccessMessage(String task, List componentResults) {
+        return createSuccessMessage(task, null, componentResults);
+    }
+    
+    public static String createSuccessMessage(String task, String info) {
+        return createSuccessMessage(task, info, null);
+    }
+
+    public static String createSuccessMessage(String task, String info, List componentResults) {
+        ManagementSupport.Message msg = new ManagementSupport.Message();
+        msg.setTask(task);
+        msg.setResult("SUCCESS");
+        msg.setMessage(info);
+        return ManagementSupport.createFrameworkMessage(msg, componentResults);
+    }
+    
+    public static String createWarningMessage(String task, String info, List componentResults) {
+        ManagementSupport.Message msg = new ManagementSupport.Message();
+        msg.setTask(task);
+        msg.setResult("SUCCESS");
+        msg.setType("WARNING");
+        msg.setMessage(info);
+        return ManagementSupport.createFrameworkMessage(msg, componentResults);
+    }
+
+    public static String createFrameworkMessage(Message fmkMsg, List componentResults) {
         try {
-            StringBuffer sw = new StringBuffer();
-            // component-task-result
-            sw.append("<component-task-result");
-            sw.append("xmlns=\"http://java.sun.com/xml/ns/jbi/management-message\"");
-            sw.append("\n\t");
-            // component-name
-            sw.append("<component-name>");
-            sw.append(msg.getComponent());
-            sw.append("</component-name>");
-            // component-task-result-details
-            sw.append("\n\t");
-            sw.append("<component-task-result-details>");
-            // task-result-details
-            sw.append("\n\t\t");
-            sw.append("<task-result-details>");
-            // task-id
-            sw.append("\n\t\t\t");
-            sw.append("<task-id>");
-            sw.append(msg.getTask());
-            sw.append("</task-id>");
-            // task-result
-            sw.append("\n\t\t\t");
-            sw.append("<task-result>");
-            sw.append(msg.getResult());
-            sw.append("</task-result>");
-            // message-type
-            if (msg.getType() != null) {
-                sw.append("\n\t\t\t");
-                sw.append("<message-type>");
-                sw.append(msg.getType());
-                sw.append("</message-type>");
-            }
-            // task-status-message
-            if (msg.getMessage() != null) {
-                sw.append("\n\t\t\t");
-                sw.append("<task-status-message>");
-                sw.append("<msg-loc-info>");
-                sw.append("<loc-token/>");
-                sw.append("<loc-message>");
-                sw.append(msg.getMessage());
-                sw.append("</loc-message>");
-                sw.append("</msg-loc-info>");
-                sw.append("</task-status-message>");
+            Document doc = createDocument();
+            Element jbiTask = createChild(doc, "jbi-task");
+            jbiTask.setAttribute("xmlns", "http://java.sun.com/xml/ns/jbi/management-message");
+            jbiTask.setAttribute("version", "1.0");
+            Element jbiTaskResult = createChild(jbiTask, "jbi-task-result");
+            Element frmkTaskResult = createChild(jbiTaskResult, "frmwk-task-result");
+            Element frmkTaskResultDetails = createChild(frmkTaskResult, "frmwk-task-result-details");
+            appendTaskResultDetails(frmkTaskResultDetails, fmkMsg);
+            if (fmkMsg.getLocale() != null) {
+                createChild(frmkTaskResult, "locale", fmkMsg.getLocale());
             }
-            // exception-info
-            if (msg.getException() != null) {
-                sw.append("\n\t\t\t");
-                sw.append("<exception-info>");
-                sw.append("\n\t\t\t\t");
-                sw.append("<nesting-level>1</nesting-level>");
-                sw.append("\n\t\t\t\t");
-                sw.append("<msg-loc-info>");
-                sw.append("\n\t\t\t\t\t");
-                sw.append("<loc-token />");
-                sw.append("\n\t\t\t\t\t");
-                sw.append("<loc-message>");
-                sw.append(msg.getException().getMessage());
-                sw.append("</loc-message>");
-                sw.append("\n\t\t\t\t\t");
-                sw.append("<stack-trace>");
-                StringWriter sw2 = new StringWriter();
-                PrintWriter pw = new PrintWriter(sw2);
-                msg.getException().printStackTrace(pw);
-                pw.close();
-                sw.append("<[CDATA[");
-                sw.append(sw2.toString());
-                sw.append("]]>");
-                sw.append("</stack-trace>");
-                sw.append("\n\t\t\t\t");
-                sw.append("</msg-loc-info>");
-                sw.append("\n\t\t\t");
-                sw.append("</exception-info>");
+            if (componentResults != null) {
+                for (Iterator iter = componentResults.iterator(); iter.hasNext();) {
+                    Element element = (Element) iter.next();
+                    jbiTaskResult.appendChild(doc.importNode(element, true));
+                }
             }
-            // end: task-result-details
-            sw.append("\n\t\t");
-            sw.append("</task-result-details>");
-            // end: component-task-result-details
-            sw.append("\n\t");
-            sw.append("</component-task-result-details>");
-            // end: component-task-result
-            sw.append("\n");
-            sw.append("</component-task-result>");
-            // return result
-            return sw.toString();
+            return DOMUtil.asIndentedXML(doc);
         } catch (Exception e) {
-            logger.warn("Error generating component management message", e);
+            logger.error("Error", e);
             return null;
         }
+    }
+    
+    private static Document createDocument() {
+        try {
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            factory.setNamespaceAware(true);
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            return builder.newDocument();
+        } catch (Exception e) {
+            throw new RuntimeException("Could not create DOM document", e);
+        }
+    }
+    
+    private static Element createChild(Node parent, String name) {
+        return createChild(parent, name, null);
+    }
+    
+    private static Element createChild(Node parent, String name, String text) {
+        Document doc = parent instanceof Document ? (Document) parent : parent.getOwnerDocument();
+        Element child = doc.createElementNS("http://java.sun.com/xml/ns/jbi/management-message", name);
+        if (text != null) {
+            child.appendChild(doc.createTextNode(text));
+        }
+        parent.appendChild(child);
+        return child;
+    }
+    
+    private static void appendTaskResultDetails(Element root, Message fmkMsg) {
+        Element taskResultDetails = createChild(root, "task-result-details");
+        createChild(taskResultDetails, "task-id", fmkMsg.getTask());
+        createChild(taskResultDetails, "task-result", fmkMsg.getResult());
+        if (fmkMsg.getType() != null) {
+            createChild(taskResultDetails, "message-type", fmkMsg.getType());
+        }
+        // task-status-message
+        if (fmkMsg.getMessage() != null) {
+            Element taskStatusMessage = createChild(taskResultDetails, "task-status-message");
+            Element msgLocInfo = createChild(taskStatusMessage, "msg-loc-info");
+            createChild(msgLocInfo, "loc-token");
+            createChild(msgLocInfo, "loc-message", fmkMsg.getMessage());
+        }
+        // exception-info
+        if (fmkMsg.getException() != null) {
+            Element exceptionInfo = createChild(taskResultDetails, "exception-info");
+            createChild(exceptionInfo, "nesting-level", "1");
+            createChild(exceptionInfo, "loc-token");
+            createChild(exceptionInfo, "loc-message", fmkMsg.getException().getMessage());
+            Element stackTrace = createChild(exceptionInfo, "stack-trace");
+            StringWriter sw2 = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw2);
+            fmkMsg.getException().printStackTrace(pw);
+            pw.close();
+            stackTrace.appendChild(root.getOwnerDocument().createCDATASection(sw2.toString()));
+        }
+    }
+    
+    public static DeploymentException componentFailure(String task, String component, String info) {
+        try {
+            Element e = createComponentFailure(task, component, info, null);
+            return new DeploymentException(DOMUtil.asXML(e));
+        } catch (Exception e) {
+            if (logger.isDebugEnabled()) {
+                logger.debug("Error creating management message", e);
+            }
+            return new DeploymentException(info);
+        }
+    }
+    
+    public static Element createComponentMessage(Message msg) {
+        Document doc = createDocument();
+        Element componentTaskResult = createChild(doc, "component-task-result");
+        createChild(componentTaskResult, "component-name", msg.getComponent());
+        Element componentTaskResultDetails = createChild(componentTaskResult, "component-task-result-details");
+        appendTaskResultDetails(componentTaskResultDetails, msg);
+        return componentTaskResult;
+    }
+    
+    public static Element createComponentSuccess(String task, String component) {
+        ManagementSupport.Message msg = new ManagementSupport.Message();
+        msg.setTask(task);
+        msg.setResult("SUCCESS");
+        msg.setComponent(component);
+        return createComponentMessage(msg);
+    }
+    
+    public static Element createComponentFailure(String task, String component, String info, Exception e) {
+        ManagementSupport.Message msg = new ManagementSupport.Message();
+        msg.setTask(task);
+        msg.setResult("FAILED");
+        msg.setType("ERROR");
+        msg.setException(e);
+        msg.setMessage(info);
+        msg.setComponent(component);
+        return createComponentMessage(msg);
+    }
+    
+    public static Element createComponentWarning(String task, String component, String info, Exception e) {
+        ManagementSupport.Message msg = new ManagementSupport.Message();
+        msg.setTask(task);
+        msg.setResult("SUCCESS");
+        msg.setType("WARNING");
+        msg.setException(e);
+        msg.setMessage(info);
+        msg.setComponent(component);
+        return createComponentMessage(msg);
     }
     
 }