Author: gertv
Date: Mon Jun 20 09:32:39 2011
New Revision: 1137563

URL: http://svn.apache.org/viewvc?rev=1137563&view=rev
Log:
SM-2097: Ant tasks should allow interacting with ServiceMix running in WebSphere

Modified:
    
servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/ManagementContext.java
    
servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/task/JbiTask.java
    
servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/ManagementContextTest.java
    
servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/task/JbiTaskTest.java
    
servicemix/smx3/trunk/distributions/apache-servicemix/src/main/release/ant/servicemix-ant-task.xml

Modified: 
servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/ManagementContext.java
URL: 
http://svn.apache.org/viewvc/servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/ManagementContext.java?rev=1137563&r1=1137562&r2=1137563&view=diff
==============================================================================
--- 
servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/ManagementContext.java
 (original)
+++ 
servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/ManagementContext.java
 Mon Jun 20 09:32:39 2011
@@ -561,6 +561,24 @@ public class ManagementContext extends B
         return result;
     }
 
+    /**
+     * Retrieve an ObjectName instance that can be used for querying system 
service mbean instances
+     *
+     * @param domainName
+     * @param containerName
+     * @param interfaceType
+     * @return
+     */
+    public static ObjectName getSystemObjectNameQuery(String domainName, 
String containerName, Class interfaceType) {
+        ObjectName result = null;
+        try {
+            result = new ObjectName(String.format("%s,*", 
getSystemObjectName(domainName, containerName, interfaceType)));
+        } catch (MalformedObjectNameException e) {
+            LOG.error("Failed to build object name query: " + e.getMessage(), 
e);
+        }
+        return result;
+    }
+
     public static String getSystemServiceName(Class interfaceType) {
         String name = interfaceType.getName();
         name = name.substring(name.lastIndexOf('.') + 1);

Modified: 
servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/task/JbiTask.java
URL: 
http://svn.apache.org/viewvc/servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/task/JbiTask.java?rev=1137563&r1=1137562&r2=1137563&view=diff
==============================================================================
--- 
servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/task/JbiTask.java
 (original)
+++ 
servicemix/smx3/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/management/task/JbiTask.java
 Mon Jun 20 09:32:39 2011
@@ -18,10 +18,10 @@ package org.apache.servicemix.jbi.manage
 
 import java.io.IOException;
 import java.net.MalformedURLException;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import javax.management.MBeanServerInvocationHandler;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.management.remote.JMXConnector;
 import javax.management.remote.JMXConnectorFactory;
@@ -57,6 +57,10 @@ public abstract class JbiTask extends Ta
 
     private String password;
 
+    private String environment;
+
+    private String serviceUrl;
+
     private boolean failOnError = true;
 
     private JMXConnector jmxConnector;
@@ -67,9 +71,13 @@ public abstract class JbiTask extends Ta
      * @return the url
      */
     public JMXServiceURL getServiceURL() throws MalformedURLException {
-        JMXServiceURL url = null;
-        url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + host + ":" 
+ port + jndiPath);
-        return url;
+        if (serviceUrl == null || serviceUrl.trim().length() < 1) {
+            JMXServiceURL url = null;
+            url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + host + 
":" + port + jndiPath);
+            return url;
+        } else {
+            return new JMXServiceURL(serviceUrl);
+        }
     }
 
     /**
@@ -80,10 +88,26 @@ public abstract class JbiTask extends Ta
      * @throws IOException
      */
     public JMXConnector getJMXConnector(JMXServiceURL url) throws IOException {
+        log("Establishing connection to " + url, Project.MSG_DEBUG);
+        return JMXConnectorFactory.connect(url, getEnvironmentMap());
+    }
+
+    protected Map<String, Object> getEnvironmentMap() {
         String[] credentials = new String[] {getUsername(), getPassword() };
-        Map<String, Object> environment = new HashMap<String, Object>();
-        environment.put(JMXConnector.CREDENTIALS, credentials);
-        return JMXConnectorFactory.connect(url, environment);
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put(JMXConnector.CREDENTIALS, credentials);
+
+        if (environment != null && environment.trim().length() > 0) {
+            for (String entry : environment.split(",")) {
+                final String[] info = entry.trim().split("=");
+                final String value = info[1].trim();
+                final String key = info[0].trim();
+                log(String.format("Setting environment variable %s: %s", key, 
value), Project.MSG_DEBUG);
+                map.put(key, value);
+            }
+        }
+
+        return map;
     }
 
     /**
@@ -110,14 +134,21 @@ public abstract class JbiTask extends Ta
     }
 
     /**
-     * Get a servicemix internal system management instance, from it's class
-     * name
+     * Get a servicemix internal system management instance, from it's class 
name.
      * 
      * @param systemClass
      * @return the object name
      */
-    protected ObjectName getObjectName(Class systemClass) {
-        return ManagementContext.getSystemObjectName(jmxDomainName, 
containerName, systemClass);
+    protected ObjectName getObjectName(Class systemClass) throws IOException, 
MalformedObjectNameException {
+        ObjectName query = 
ManagementContext.getSystemObjectNameQuery(jmxDomainName, containerName, 
systemClass);
+
+        Set<ObjectName> names = 
jmxConnector.getMBeanServerConnection().queryNames(query, null);
+
+        if (names.size() == 1) {
+            return names.iterator().next();
+        } else {
+            throw new BuildException(String.format("Expected one instance, but 
found %s instances of %s", names.size(), systemClass));
+        }
     }
 
     /**
@@ -126,7 +157,7 @@ public abstract class JbiTask extends Ta
      * @return the main administration service MBean
      * @throws IOException
      */
-    public AdminCommandsServiceMBean getAdminCommandsService() throws 
IOException {
+    public AdminCommandsServiceMBean getAdminCommandsService() throws 
IOException, MalformedObjectNameException {
         ObjectName objectName = getObjectName(AdminCommandsServiceMBean.class);
 
         return (AdminCommandsServiceMBean) 
MBeanServerInvocationHandler.newProxyInstance(jmxConnector.getMBeanServerConnection(),
@@ -253,6 +284,19 @@ public abstract class JbiTask extends Ta
         this.username = username;
     }
 
+    public String getServiceUrl() {
+        return serviceUrl;
+    }
+
+    /**
+     * Configure the JMX service URL - if this property is set, the 
host/port/path properties are ignored.
+     *
+     * @param serviceUrl
+     */
+    public void setServiceUrl(String serviceUrl) {
+        this.serviceUrl = serviceUrl;
+    }
+
     /**
      * @return Returns the failOnError.
      */
@@ -268,6 +312,14 @@ public abstract class JbiTask extends Ta
         this.failOnError = failOnError;
     }
 
+    public String getEnvironment() {
+        return environment;
+    }
+
+    public void setEnvironment(String environment) {
+        this.environment = environment;
+    }
+
     /**
      * execute the task
      * 
@@ -301,5 +353,4 @@ public abstract class JbiTask extends Ta
     }
 
     protected abstract void doExecute(AdminCommandsServiceMBean acs) throws 
Exception;
-
 }
\ No newline at end of file

Modified: 
servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/ManagementContextTest.java
URL: 
http://svn.apache.org/viewvc/servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/ManagementContextTest.java?rev=1137563&r1=1137562&r2=1137563&view=diff
==============================================================================
--- 
servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/ManagementContextTest.java
 (original)
+++ 
servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/ManagementContextTest.java
 Mon Jun 20 09:32:39 2011
@@ -16,10 +16,12 @@
  */
 package org.apache.servicemix.jbi.management;
 
+import javax.jbi.management.AdminServiceMBean;
 import javax.jbi.management.LifeCycleMBean;
 import javax.management.MBeanServerConnection;
 import javax.management.MBeanServerDelegateMBean;
 import javax.management.MBeanServerInvocationHandler;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.management.remote.JMXConnector;
 import javax.management.remote.JMXConnectorFactory;
@@ -110,4 +112,9 @@ public class ManagementContextTest exten
         assertEquals(LifeCycleMBean.STOPPED, echo.getCurrentState());
     }
 
+    public void testGetSystemObjectNameQuery() throws 
MalformedObjectNameException {
+        assertEquals(new 
ObjectName("org.apache.servicemix:ContainerName=ServiceMix,Type=SystemService,Name=AdminService,*"),
+                     
ManagementContext.getSystemObjectNameQuery("org.apache.servicemix", 
"ServiceMix", AdminServiceMBean.class));
+    }
+
 }

Modified: 
servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/task/JbiTaskTest.java
URL: 
http://svn.apache.org/viewvc/servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/task/JbiTaskTest.java?rev=1137563&r1=1137562&r2=1137563&view=diff
==============================================================================
--- 
servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/task/JbiTaskTest.java
 (original)
+++ 
servicemix/smx3/trunk/core/servicemix-core/src/test/java/org/apache/servicemix/jbi/management/task/JbiTaskTest.java
 Mon Jun 20 09:32:39 2011
@@ -16,17 +16,22 @@
  */
 package org.apache.servicemix.jbi.management.task;
 
+import java.util.Map;
+import javax.management.remote.JMXConnector;
+
 import org.apache.servicemix.jbi.framework.AdminCommandsServiceMBean;
 import org.apache.tools.ant.Project;
 
-
 /**
  *
  * JbiTaskTest
  * @version $Revision$
  */
 public class JbiTaskTest extends JbiTaskSupport {
-   
+
+    private static final String USERNAME = "user";
+    private static final String PASSWORD = "passw0rd";
+
     private JbiTask jbiTask;
     
     /*
@@ -55,4 +60,47 @@ public class JbiTaskTest extends JbiTask
         AdminCommandsServiceMBean mbean = jbiTask.getAdminCommandsService();
         assertNotNull(mbean);
     }
-}
+
+    public void testGetEnvironmentMapOnlyCredentials() throws Exception {
+        jbiTask.setUsername(USERNAME);
+        jbiTask.setPassword(PASSWORD);
+
+        // support null ...
+        jbiTask.setEnvironment(null);
+        assertOnlyCredentialsInMap(jbiTask.getEnvironmentMap());
+
+        // ... as well as an empty string
+        jbiTask.setEnvironment("   ");
+        assertOnlyCredentialsInMap(jbiTask.getEnvironmentMap());
+    }
+
+    public void testGetEnvironmentMapExtraInformationAdded() throws Exception {
+        jbiTask.setUsername(USERNAME);
+        jbiTask.setPassword(PASSWORD);
+
+        // one extra value
+        jbiTask.setEnvironment("key=value");
+        Map<String, Object> map = jbiTask.getEnvironmentMap();
+        assertCredentialsInMap(map);
+        assertEquals("Extra value should be in map", "value", map.get("key"));
+
+        // two extra values
+        jbiTask.setEnvironment("key=value, another_key=another_value");
+        map = jbiTask.getEnvironmentMap();
+        assertCredentialsInMap(map);
+        assertEquals("Extra value should be in map", "value", map.get("key"));
+        assertEquals("Extra value should be in map", "another_value", 
map.get("another_key"));
+    }
+
+    private void assertOnlyCredentialsInMap(Map<String, Object> map) {
+        assertEquals("Map contains 1 entry", 1, map.size());
+        assertCredentialsInMap(map);
+    }
+
+    private void assertCredentialsInMap(Map<String, Object> map) {
+        String[] credentials = (String[]) map.get(JMXConnector.CREDENTIALS);
+        assertNotNull("Credentials should be in environment map", credentials);
+        assertEquals(USERNAME, credentials[0]);
+        assertEquals(PASSWORD, credentials[1]);
+    }
+}
\ No newline at end of file

Modified: 
servicemix/smx3/trunk/distributions/apache-servicemix/src/main/release/ant/servicemix-ant-task.xml
URL: 
http://svn.apache.org/viewvc/servicemix/smx3/trunk/distributions/apache-servicemix/src/main/release/ant/servicemix-ant-task.xml?rev=1137563&r1=1137562&r2=1137563&view=diff
==============================================================================
--- 
servicemix/smx3/trunk/distributions/apache-servicemix/src/main/release/ant/servicemix-ant-task.xml
 (original)
+++ 
servicemix/smx3/trunk/distributions/apache-servicemix/src/main/release/ant/servicemix-ant-task.xml
 Mon Jun 20 09:32:39 2011
@@ -53,6 +53,12 @@
     
     <!-- default port. -->
     <property name="sm.port" value="1099" />
+
+    <!-- JMX connection url - when this value is provided, sm.host and sm.port 
will be ignored -->
+    <property name="sm.url" value="" />
+
+    <!-- JMX connection environment settings -->
+    <property name="sm.environment" value="" />
     
     
     <!-- Command Line Argumants can override the following values. -->
@@ -81,6 +87,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              file="${sm.install.file}"/>  
       </target>
      
@@ -96,6 +104,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              name="${sm.component.name}"
          />
          
@@ -114,6 +124,8 @@
             password="${sm.password}"
             host="${sm.host}"
                port="${sm.port}"
+            serviceUrl="${sm.url}"
+            environment="${sm.environment}"
             file="${sm.install.file}"
         />
      </target>
@@ -131,6 +143,8 @@
             password="${sm.password}"
             host="${sm.host}"
                port="${sm.port}"
+            serviceUrl="${sm.url}"
+            environment="${sm.environment}"
             name="${sm.shared.library.name}"    
         />
          
@@ -149,6 +163,8 @@
             password="${sm.password}"
             host="${sm.host}"
                port="${sm.port}"
+            serviceUrl="${sm.url}"
+            environment="${sm.environment}"
             name="${sm.component.name}"        
         />
      
@@ -167,6 +183,8 @@
             password="${sm.password}"
             host="${sm.host}"
                port="${sm.port}"
+            serviceUrl="${sm.url}"
+            environment="${sm.environment}"
             name="${sm.component.name}"            
          />
           
@@ -185,6 +203,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              name="${sm.component.name}"                
          />
      </target>
@@ -202,6 +222,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              file="${sm.deploy.file}"                    
          />
      </target>
@@ -219,6 +241,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              name="${sm.service.assembly.name}"                        
          />
      
@@ -237,6 +261,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              name="${sm.service.assembly.name}"                            
          />
          
@@ -255,6 +281,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              name="${sm.service.assembly.name}"                                
          />     
      </target>
@@ -272,6 +300,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              name="${sm.service.assembly.name}"                                
    
          />
      
@@ -292,6 +322,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              state="${sm.state}"
              serviceAssemblyName="${sm.service.assembly.name}"
              sharedLibraryName="${sm.shared.library.name}"
@@ -314,6 +346,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              state="${sm.state}"
              sharedLibraryName="${sm.shared.library.name}"
              serviceAssemblyName="${sm.service.assembly.name}"
@@ -335,6 +369,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              componentName="${sm.component.name}"
              sharedLibraryName="${sm.shared.library.name}"
       />
@@ -355,6 +391,8 @@
              password="${sm.password}"
              host="${sm.host}"
                 port="${sm.port}"
+             serviceUrl="${sm.url}"
+             environment="${sm.environment}"
              state="${sm.state}"
              componentName="${sm.component.name}"
              serviceAssemblyName="${sm.service.assembly.name}"


Reply via email to