You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kalumet-commits@incubator.apache.org by jb...@apache.org on 2011/11/16 06:32:13 UTC

svn commit: r1202544 - in /incubator/kalumet/trunk/controller: ./ jboss/ jboss/src/ jboss/src/main/ jboss/src/main/java/ jboss/src/main/java/org/ jboss/src/main/java/org/apache/ jboss/src/main/java/org/apache/kalumet/ jboss/src/main/java/org/apache/kal...

Author: jbonofre
Date: Wed Nov 16 06:32:12 2011
New Revision: 1202544

URL: http://svn.apache.org/viewvc?rev=1202544&view=rev
Log:
Add JBoss application server controller

Added:
    incubator/kalumet/trunk/controller/jboss/
    incubator/kalumet/trunk/controller/jboss/NOTICE
    incubator/kalumet/trunk/controller/jboss/pom.xml
    incubator/kalumet/trunk/controller/jboss/src/
    incubator/kalumet/trunk/controller/jboss/src/main/
    incubator/kalumet/trunk/controller/jboss/src/main/java/
    incubator/kalumet/trunk/controller/jboss/src/main/java/org/
    incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/
    incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/kalumet/
    incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/kalumet/controller/
    incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/kalumet/controller/jboss/
    incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/kalumet/controller/jboss/JBossController.java
Modified:
    incubator/kalumet/trunk/controller/pom.xml

Added: incubator/kalumet/trunk/controller/jboss/NOTICE
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/controller/jboss/NOTICE?rev=1202544&view=auto
==============================================================================
--- incubator/kalumet/trunk/controller/jboss/NOTICE (added)
+++ incubator/kalumet/trunk/controller/jboss/NOTICE Wed Nov 16 06:32:12 2011
@@ -0,0 +1,22 @@
+Apache Kalumet
+Copyright 2011 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+
+II. Used Software
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product uses software developed at
+JBoss (http://www.jboss.org/).
+
+III. License Summary
+- Apache License 2.0

Added: incubator/kalumet/trunk/controller/jboss/pom.xml
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/controller/jboss/pom.xml?rev=1202544&view=auto
==============================================================================
--- incubator/kalumet/trunk/controller/jboss/pom.xml (added)
+++ incubator/kalumet/trunk/controller/jboss/pom.xml Wed Nov 16 06:32:12 2011
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!--
+
+        Licensed to the Apache Software Foundation (ASF) under one or more
+        contributor license agreements.  See the NOTICE file distributed with
+        this work for additional information regarding copyright ownership.
+        The ASF licenses this file to You 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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.kalumet.controller</groupId>
+        <artifactId>controller</artifactId>
+        <version>0.6-incubating</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.kalumet.controller.jboss</artifactId>
+    <packaging>jar</packaging>
+    <name>Apache Kalumet :: Controller :: JBoss AS</name>
+
+    <properties>
+        <jboss.version>4.0.4</jboss.version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>kalumet.m2</id>
+            <name>Kalumet M2 repo</name>
+            <url>https://svn.apache.org/repos/asf/incubator/kalumet/m2-repo</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.kalumet</groupId>
+            <artifactId>org.apache.kalumet.common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.kalumet.controller</groupId>
+            <artifactId>org.apache.kalumet.controller.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.redhat.jboss</groupId>
+            <artifactId>client</artifactId>
+            <version>${jboss.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file

Added: incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/kalumet/controller/jboss/JBossController.java
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/kalumet/controller/jboss/JBossController.java?rev=1202544&view=auto
==============================================================================
--- incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/kalumet/controller/jboss/JBossController.java (added)
+++ incubator/kalumet/trunk/controller/jboss/src/main/java/org/apache/kalumet/controller/jboss/JBossController.java Wed Nov 16 06:32:12 2011
@@ -0,0 +1,787 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.kalumet.controller.jboss;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+import javax.management.Attribute;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.kalumet.FileManipulator;
+import org.apache.kalumet.FileManipulatorException;
+import org.apache.kalumet.controller.core.AbstractJ2EEApplicationServerController;
+import org.apache.kalumet.controller.core.ControllerException;
+import org.jboss.jmx.adaptor.rmi.RMIAdaptor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * JBossController is a controller to connect and manage a JBoss server.
+ */
+public class JBossController extends AbstractJ2EEApplicationServerController {
+
+    private final static transient Logger LOGGER = LoggerFactory.getLogger(JBossController.class);
+
+    private RMIAdaptor server;
+    private URL deployURL;
+
+    /**
+     * Default constructor.
+     *
+     * @param url        the JMX URL to connect to the JBoss MBean server.
+     * @param username   the JMX username to connect to the JBoss MBean server.
+     * @param password   the JMX password to connect to the JBoss MBean server.
+     * @param serverName the server/cluster name to manage.
+     * @param cluster    a flag indicating if we manage a cluster (true) or a single application server (false).
+     */
+    public JBossController(String url, String username, String password, String serverName, Boolean cluster) throws ControllerException {
+        super(url, username, password, serverName, cluster);
+    }
+
+    /**
+     * Initialize the connection to the JBoss MBean server.
+     */
+    protected void init() throws ControllerException {
+        Properties properties = new Properties();
+        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
+        properties.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
+        properties.setProperty(Context.PROVIDER_URL, this.getUrl());
+        try {
+            InitialContext context = new InitialContext(properties);
+            server = (RMIAdaptor) context.lookup("jmx/invoker/RMIAdaptor");
+        } catch (NamingException namingException) {
+            LOGGER.error("Can't connect to JBoss JMX RMI Adaptor", namingException);
+            throw new ControllerException("Can't connect to JBoss MBean RMI Adaptor", namingException);
+        }
+        // disable the deployment scanner and get the deploy directory
+        ObjectName deploymentScannerMBean = null;
+        try {
+            deploymentScannerMBean = new ObjectName("jboss.deployment:flavor=URL,type=DeploymentScanner");
+            server.setAttribute(deploymentScannerMBean, new Attribute("ScanEnabled", Boolean.FALSE));
+        } catch (Exception e) {
+            LOGGER.error("Can't change JBoss deployment scanner", e);
+            throw new ControllerException("Can't change JBoss deployment scanner", e);
+        }
+        try {
+            List urlList = (List) server.getAttribute(deploymentScannerMBean, "URLList");
+            if (urlList.size() < 1) {
+                throw new ControllerException("JBoss deploy URL list is empty");
+            }
+            deployURL = (URL) urlList.get(0);
+        } catch (Exception e) {
+            LOGGER.error("Can't get JBoss deploy directory", e);
+            throw new ControllerException("Can't get JBoss deploy directory", e);
+        }
+    }
+
+    public void shutdown() throws ControllerException {
+        LOGGER.info("Shutting down JBoss application server");
+        LOGGER.debug("Get the JBoss application server MBean");
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:type=Server");
+            LOGGER.debug("Invoke the shutdown operation on the application server MBean");
+            server.invoke(mbean, "shutdown", null, null);
+        } catch (Exception e) {
+            LOGGER.error("Can't shutdown JBoss application server", e);
+            throw new ControllerException("Can't shutdown JBoss application server", e);
+        }
+    }
+
+    public String status() {
+        LOGGER.info("Checking status of JBoss application server");
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:type=Server");
+            LOGGER.debug("Getting the server status property.");
+            boolean started = false;
+            started = ((Boolean) server.getAttribute(mbean, "Started")).booleanValue();
+            if (started) {
+                LOGGER.debug("JBoss server started.");
+                return "JBoss application server started since " + (Date) server.getAttribute(mbean, "StartDate");
+            } else {
+                LOGGER.debug("JBoss server not started.");
+                return "JBoss server not started.";
+            }
+        } catch (Exception e) {
+            LOGGER.warn("Can't check status of JBoss application server. The server is probably down.", e);
+            return "Can't get the JBoss application server status. The server is probably down.";
+        }
+    }
+
+    public boolean isStopped() {
+        LOGGER.info("Checking if JBoss application server is stopped");
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:type=Server");
+            LOGGER.debug("Getting the Started attribute in the server MBean");
+            return !(((Boolean) server.getAttribute(mbean, "Started")).booleanValue());
+        } catch (Exception e) {
+            LOGGER.error("Can't check if JBoss server is stopped. The server is probably down.", e);
+            return true;
+        }
+    }
+
+    /**
+     * Format an application path in a JBoss compatible URL.
+     *
+     * @param path the application path.
+     * @return the JBoss compatible URL.
+     */
+    private static String formatPathToUrl(String path) {
+        String trimPath = path.trim();
+        if (trimPath.startsWith("http:") || path.startsWith("file:")) {
+            LOGGER.debug("The path is already in a JBoss compatible URL format");
+            return trimPath;
+        } else {
+            LOGGER.debug("The path is going to be formatted in a JBoss compatible URL");
+            return "file:" + trimPath;
+        }
+    }
+
+    public boolean isJ2EEApplicationDeployed(String path, String name) throws ControllerException {
+        LOGGER.info("Checking if the J2EE application {} is deployed", name);
+        String applicationUrl = JBossController.formatPathToUrl(path);
+        boolean deployed = false;
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            deployed = ((Boolean) server.invoke(mbean, "isDeployed", new Object[]{applicationUrl}, new String[]{"java.lang.String"})).booleanValue();
+        } catch (Exception e) {
+            LOGGER.error("Can't check if the J2EE application {} is deployed", name, e);
+            throw new ControllerException("Can't check if the J2EE application " + name + " is deployed", e);
+        }
+        return deployed;
+    }
+
+    public void deployJ2EEApplication(String path, String name, String classloaderorder, String classloaderpolicy, String vhost) throws ControllerException {
+        LOGGER.info("Deploying the J2EE application {} ({})", name, path);
+        String applicationUrl = JBossController.formatPathToUrl(path);
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            server.invoke(mbean, "deploy", new Object[]{applicationUrl}, new String[]{"java.lang.String"});
+        } catch (Exception e) {
+            LOGGER.error("Can't deploy the J2EE application {}", name, e);
+            throw new ControllerException("Can't deploy the J2EE application " + name, e);
+        }
+    }
+
+    public void undeployJ2EEApplication(String path, String name) throws ControllerException {
+        LOGGER.info("Undeploying the J2EE application {} ({})", name, path);
+        String applicationUrl = JBossController.formatPathToUrl(path);
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            server.invoke(mbean, "undeploy", new Object[]{applicationUrl}, new String[]{"java.lang.String"});
+        } catch (Exception e) {
+            LOGGER.error("Can't undeploy the J2EE application {}", name, e);
+            throw new ControllerException("Can't undeploy the J2EE application " + name, e);
+        }
+    }
+
+    public void redeployJ2EEApplication(String path, String name) throws ControllerException {
+        LOGGER.info("Redeploying the J2EE application {} ({})", name, path);
+        String applicationUrl = JBossController.formatPathToUrl(path);
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            server.invoke(mbean, "redeploy", new Object[]{applicationUrl}, new String[]{"java.lang.String"});
+        } catch (Exception e) {
+            LOGGER.error("Can't redeploy the J2EE application {}", name, e);
+            throw new ControllerException("Can't redeploy the J2EE application " + name, e);
+        }
+    }
+
+    public boolean isJDBCConnectionPoolDeployed(String name) throws ControllerException {
+        LOGGER.info("Checking if JDBC connection pool {} is deployed", name);
+        boolean deployed = false;
+        ObjectName mbean = null;
+        File file = new File(deployURL.getPath() + "/" + name + "-ds.xml");
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            LOGGER.info("Getting the MainDeployer MBean");
+            deployed = ((Boolean) server.invoke(mbean, "isDeployed", new Object[]{file.toURL()}, new String[]{"java.net.URL"})).booleanValue();
+        } catch (Exception e) {
+            LOGGER.error("Can't check if JDBC connection pool {} is deployed", name, e);
+            throw new ControllerException("Can't check if JDBC connection pool " + name + " is deployed", e);
+        }
+        return deployed;
+    }
+
+    public boolean isJDBCConnectionPoolUpToDate(String name, String driver, int increment, int initial, int maximal, String user, String password, String url, String classpath) throws ControllerException {
+        LOGGER.info("Checking status of JDBC connection pool {}", name);
+        if (!this.isJDBCConnectionPoolDeployed(name)) {
+            LOGGER.debug("JDBC connection pool {} is not deployed", name);
+            return false;
+        }
+        LOGGER.debug("Loading the file value");
+        File tempFile = new File(deployURL.getPath() + "/" + name + "-ds.xml.temp");
+        this.jdbcConnectionPoolWriteFile(tempFile, name, driver, increment, initial, maximal, user, password, url);
+        FileManipulator fileManipulator = null;
+        try {
+            fileManipulator = FileManipulator.getInstance();
+            if (fileManipulator.contentEquals(deployURL.getPath() + "/" + name + "-ds.xml", deployURL.getPath() + "/" + name + "-ds.xml.temp")) {
+                LOGGER.debug("JDBC connection pool {} is already up to date", name);
+                try {
+                    fileManipulator.delete(tempFile.getAbsolutePath());
+                } catch (Exception e) {
+                    LOGGER.warn("Can't delete the temp file {}", tempFile.getAbsolutePath(), e);
+                }
+                return true;
+            }
+        } catch (FileManipulatorException fileManipulatorException) {
+            LOGGER.error("Can't check status of JDBC connection pool {}", name, fileManipulatorException);
+            throw new ControllerException("Can't check status of JDBC connection pool " + name, fileManipulatorException);
+        }
+        try {
+            fileManipulator.delete(tempFile.getAbsolutePath());
+        } catch (Exception e) {
+            LOGGER.warn("Can't delete the temp file {}", tempFile.getAbsolutePath(), e);
+        }
+        return false;
+    }
+
+    public boolean updateJDBCConnectionPool(String name, String driver, int increment, int initial, int maximal, String user, String password, String url, String classpath) throws ControllerException {
+        LOGGER.info("Updating JDBC connection pool {}", name);
+        if (!this.isJDBCConnectionPoolUpToDate(name, driver, increment, initial, maximal, user, password, url, classpath)) {
+            LOGGER.debug("JDBC connection pool {} must be updated, redeploy it", name);
+            this.undeployJDBCConnectionPool(name);
+            this.deployJDBCConnectionPool(name, driver, increment, initial, maximal, user, password, url, null);
+            return true;
+        }
+        return false;
+    }
+
+    public void deployJDBCConnectionPool(String name, String driver, int increment, int initial, int maximal, String user, String password, String url, String classpath) throws ControllerException {
+        LOGGER.info("Deploying the JDBC connection pool {}", name);
+        LOGGER.debug("Create the JBoss datasource XML file");
+        ObjectName mbean = null;
+        File file = new File(deployURL.getPath() + "/" + name + "-ds.xml");
+        this.jdbcConnectionPoolWriteFile(file, name, driver, increment, initial, maximal, user, password, url);
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            LOGGER.info("Getting the MainDeployer MBean");
+            server.invoke(mbean, "deploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+        } catch (Exception e) {
+            LOGGER.error("Can't deploy JDBC connection pool {}", name, e);
+            throw new ControllerException("Can't deploy JDBC connection pool " + name, e);
+        }
+    }
+
+    /**
+     * Create a JBoss connection pool/data source XML file.
+     *
+     * @param file      the JBoss connection pool/data source XML file.
+     * @param name      the JDBC connection pool name.
+     * @param driver    the JDBC connection pool JDBC driver.
+     * @param increment the JDBC connection pool capacity increment.
+     * @param initial   the JDBC connection pool initial capacity.
+     * @param maximal   the JDBC connection pool maximal capacity.
+     * @param user      the JDBC connection pool database user name.
+     * @param password  the JDBC connection pool database password.
+     * @param url       the JDBC connection pool JDBC URL.
+     */
+    private void jdbcConnectionPoolWriteFile(File file, String name, String driver, int increment, int initial, int maximal, String user, String password, String url) throws ControllerException {
+        LOGGER.info("Writing the JBoss JDBC connection pool/datasource XML file");
+        LOGGER.debug("Constructing the replacement values");
+        LOGGER.debug("Checking if we have XA driver or not");
+        InputStreamReader connectionPoolTemplate = null;
+        Object[] values = new Object[7];
+        values[0] = name;
+        values[1] = driver;
+        values[2] = url;
+        values[3] = user;
+        values[4] = password;
+        values[5] = new Integer(initial).toString();
+        values[6] = new Integer(maximal).toString();
+        if (StringUtils.containsIgnoreCase(driver, "xa")) {
+            LOGGER.debug("XA connection pool detected");
+            connectionPoolTemplate = new InputStreamReader(JBossController.class.getResourceAsStream("/jboss/template-xa-ds.xml"));
+        } else {
+            LOGGER.debug("Non XA connection pool detected");
+            connectionPoolTemplate = new InputStreamReader(JBossController.class.getResourceAsStream("/jboss/template-ds.xml"));
+        }
+        String connectionPoolContent = JBossController.format(connectionPoolTemplate, values);
+        try {
+            FileUtils.writeStringToFile(file, connectionPoolContent);
+        } catch (IOException ioException) {
+            LOGGER.error("Can't write JBoss JDBC connection pool descriptor file", ioException);
+            throw new ControllerException("Can't write JBoss JDBC connection pool descriptor file", ioException);
+        }
+    }
+
+    /**
+     * Format a JBoss configuration file template (JDBC connection
+     * pool/datasource, JMS connection factory, etc) with given values.
+     *
+     * @param templateReader the template reader.
+     * @param values   the <code>Object[]</code> values.
+     * @return the formatted string.
+     */
+    private static String format(Reader templateReader, Object[] values) throws ControllerException {
+        try {
+            BufferedReader templateBufferedReader = new BufferedReader(templateReader);
+            StringWriter writer = new StringWriter();
+            BufferedWriter buffer = new BufferedWriter(writer);
+            String templateLine = templateBufferedReader.readLine();
+            while (templateLine != null) {
+                buffer.write(MessageFormat.format(templateLine, values));
+                buffer.newLine();
+                templateLine = templateBufferedReader.readLine();
+            }
+            buffer.flush();
+            return writer.toString();
+        } catch (Exception e) {
+            LOGGER.error("Can't format JBoss XML configuration file template", e);
+            throw new ControllerException("Can't format JBoss XML configuration file template", e);
+        }
+    }
+
+    public void undeployJDBCConnectionPool(String name) throws ControllerException {
+        LOGGER.info("Undeploying the JDBC connection pool {}", name);
+        ObjectName mbean = null;
+        File file = new File(deployURL.getPath() + "/" + name + "-ds.xml");
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            server.invoke(mbean, "undeploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+        } catch (Exception e) {
+            LOGGER.error("Can't undeploy the JDBC connection pool {}", name, e);
+            throw new ControllerException("Can't undeploy the JDBC connection pool " + name, e);
+        }
+    }
+
+    public boolean isJDBCDataSourceDeployed(String name) throws ControllerException {
+        LOGGER.warn("JDBC data source is not available with JBoss server. Use JDBC connection pool instead.");
+        return true;
+    }
+
+    public boolean isJDBCDataSourceUpToDate(String name, String jdbcConnectionPool, String jdbcUrl, String helperClassname) throws ControllerException {
+        LOGGER.warn("JDBC data source is not available with JBoss server. Use JDBC connection pool instead.");
+        return true;
+    }
+
+    public void deployJDBCDataSource(String name, String jdbcConnectionPool, String jdbcUrl, String helperClassname) throws ControllerException {
+        LOGGER.warn("JDBC data source is not available with JBoss server. Use JDBC connection pool instead.");
+    }
+
+    public void undeployJDBCDataSource(String name) throws ControllerException {
+        LOGGER.warn("JDBC data source is not available with JBoss server. Use JDBC connection pool instead.");
+    }
+
+    public boolean updateJDBCDataSource(String name, String jdbcConnectionPool, String jdbcUrl, String helperClassname) throws ControllerException {
+        LOGGER.warn("JDBC data source is not available with JBoss server. Use JDBC connection pool instead.");
+        return false;
+    }
+
+    public boolean isJMSConnectionFactoryDeployed(String name) throws ControllerException {
+        LOGGER.info("Checking if the JMS connection factory {} is deployed", name);
+        boolean deployed = false;
+        ObjectName mbean = null;
+        File file = new File(deployURL.getPath() + "/jms/" + name + "-ds.xml");
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            deployed = ((Boolean) server.invoke(mbean, "isDeployed", new Object[]{file.toURL()}, new String[]{"java.net.URL"})).booleanValue();
+        } catch (Exception e) {
+            LOGGER.error("Can't check if the JMS connection factory {} is deployed", name, e);
+            throw new ControllerException("Can't check if the JMS connection factory " + name + " is deployed", e);
+        }
+        return deployed;
+    }
+
+    public void deployJMSConnectionFactory(String name) throws ControllerException {
+        LOGGER.info("Deploying the JMS connection factory {}", name);
+        ObjectName mbean = null;
+        File file = new File(deployURL.getPath() + "/jms/" + name + "-ds.xml");
+        this.jmsConnectionFactoryWriteFile(file, name);
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            server.invoke(mbean, "deploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+        } catch (Exception e) {
+            LOGGER.error("Can't deploy the JMS connection factory {}", name, e);
+            throw new ControllerException("Can't deploy the JMS connection factory " + name, e);
+        }
+    }
+
+    /**
+     * Write a JBoss JMS connection factory XML file.
+     *
+     * @param file the JMS connection factory <code>File</code>.
+     * @param name the JMS connection factory name.
+     */
+    private void jmsConnectionFactoryWriteFile(File file, String name) throws ControllerException {
+        LOGGER.info("Writing JBoss JMS connection factory XML file");
+        LOGGER.debug("Constructing the replacement values");
+        InputStreamReader connectionFactoryTemplate = new InputStreamReader(JBossController.class.getResourceAsStream("/jboss/template-jms-ds.xml"));
+        Object[] values = new Object[1];
+        values[0] = name;
+        String connectionPoolContent = JBossController.format(connectionFactoryTemplate, values);
+        try {
+            FileUtils.writeStringToFile(file, connectionPoolContent);
+        } catch (IOException ioException) {
+            LOGGER.error("Can't write JBoss JMS connection factory descriptor file", ioException);
+            throw new ControllerException("Can't write JBoss JMS connection factory descriptor file", ioException);
+        }
+    }
+
+    public void undeployJMSConnectionFactory(String name) throws ControllerException {
+        LOGGER.info("Undeploying the JMS connection factory {}", name);
+        File file = new File(deployURL.getPath() + "/jms/" + name + "-ds.xml");
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+            server.invoke(mbean, "undeploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+        } catch (Exception e) {
+            LOGGER.error("Can't undeploy the JMS connection factory {}", name, e);
+            throw new ControllerException("Can't undeploy JMS connection factory " + name, e);
+        }
+    }
+
+    public boolean isJMSServerDeployed(String name) throws ControllerException {
+        LOGGER.info("Checking if JMS server {} is deployed", name);
+        LOGGER.warn("JMS server is embedded in the JBoss server");
+        return true;
+    }
+
+    /**
+     * Write a JBoss JMS queue service file from the template.
+     *
+     * @param file the target file.
+     * @param name the queue name.
+     * @throws ControllerException in case of writing failure.
+     */
+    private void jmsQueueWriteFile(File file, String name) throws ControllerException {
+        InputStreamReader jmsQueueTemplate = new InputStreamReader(JBossController.class.getResourceAsStream("/jboss/template-jms-queue-service.xml"));
+        Object[] values = new Object[1];
+        values[0] = name;
+        String jmsQueueContent = JBossController.format(jmsQueueTemplate, values);
+        try {
+            FileUtils.writeStringToFile(file, jmsQueueContent);
+        } catch (Exception e) {
+            LOGGER.error("Can't write JBoss JMS queue service file", e);
+            throw new ControllerException("Can't write JBoss JMS queue service file", e);
+        }
+    }
+
+    /**
+     * Write a JBoss JMS topic service file from the template.
+     *
+     * @param file the target file.
+     * @param name the topic name.
+     * @throws ControllerException in case of writing failure.
+     */
+    private void jmsTopicWriteFile(File file, String name) throws ControllerException {
+        InputStreamReader jmsTopicTemplate = new InputStreamReader(JBossController.class.getResourceAsStream("/jboss/template-jms-topic-service.xml"));
+        Object[] values = new Object[1];
+        values[0] = name;
+        String jmsTopicContent = JBossController.format(jmsTopicTemplate, values);
+        try {
+            FileUtils.writeStringToFile(file, jmsTopicContent);
+        } catch (Exception e) {
+            LOGGER.error("Can't write JBoss JMS topic service file.", e);
+            throw new ControllerException("Can't write JBoss JMS topic service file", e);
+        }
+    }
+
+    public void deployJMSServer(String name, List queues, List topics) throws ControllerException {
+        LOGGER.info("Deploying the JMS server {}", name);
+        LOGGER.warn("JMS server is embedded in the JBoss application server");
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss.system:service=MainDeployer");
+        } catch (Exception e) {
+            LOGGER.error("Can't get JBoss MainDeployer", e);
+            throw new ControllerException("Can't get JBoss MainDeployer", e);
+        }
+        LOGGER.info("Deploying JMS queues");
+        for (Iterator queueIterator = queues.iterator(); queueIterator.hasNext(); ) {
+            String queue = (String) queueIterator.next();
+            File file = new File(deployURL.getPath() + "/jms/" + queue + "-service.xml");
+            this.jmsQueueWriteFile(file, queue);
+            LOGGER.info("Deploying JMS queue {}", queue);
+            try {
+                server.invoke(mbean, "deploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+            } catch (Exception e) {
+                LOGGER.error("Can't deploy JMS queue {}", queue, e);
+                throw new ControllerException("Can't deploy JMS queue " + queue, e);
+            }
+        }
+        LOGGER.info("Deploying JMS topics");
+        for (Iterator topicIterator = topics.iterator(); topicIterator.hasNext(); ) {
+            String topic = (String) topicIterator.next();
+            File file = new File(deployURL.getPath() + "/jms/" + topic + "-service.xml");
+            this.jmsTopicWriteFile(file, topic);
+            LOGGER.info("Deploying JMS topic {}", topic);
+            try {
+                server.invoke(mbean, "deploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+            } catch (Exception e) {
+                LOGGER.error("Can't deploy JMS topic {}", topic, e);
+                throw new ControllerException("Can't deploy JMS topic " + topic, e);
+            }
+        }
+    }
+
+    public boolean isJMSServerUpToDate(String name, List queues, List topics) throws ControllerException {
+        LOGGER.info("Checking status of the JMS server {}", name);
+        try {
+            ObjectName mbean = new ObjectName("jboss.mq:service=DestinationManager");
+        } catch (Exception e) {
+            LOGGER.error("Can't check status of the JMS server {}", name, e);
+            throw new ControllerException("Can't check status of the JMS server " + name, e);
+        }
+        // check JMS queue
+        for (Iterator queueIterator = queues.iterator(); queueIterator.hasNext(); ) {
+            String queue = (String) queueIterator.next();
+            ObjectName queueMBean = null;
+            try {
+                queueMBean = new ObjectName("jboss.mq.destination:name=" + queue + ",service=Queue");
+                boolean started = false;
+                started = ((Boolean) server.getAttribute(queueMBean, "Started")).booleanValue();
+                if (!started) {
+                    return false;
+                }
+            } catch (Exception e) {
+                LOGGER.error("Can't check status of the JMS queue {}" + queue, e);
+                throw new ControllerException("Can't check status of the JMS queue " + queue, e);
+            }
+        }
+        // check JMS topic
+        for (Iterator topicIterator = topics.iterator(); topicIterator.hasNext(); ) {
+            String topic = (String) topicIterator.next();
+            ObjectName topicMBean = null;
+            try {
+                topicMBean = new ObjectName("jboss.mq.destination:name=" + topic + ",service=Topic");
+                boolean started = false;
+                started = ((Boolean) server.getAttribute(topicMBean, "Started")).booleanValue();
+                if (!started) {
+                    return false;
+                }
+            } catch (Exception e) {
+                LOGGER.error("Can't check status of the JMS topic {}", topic, e);
+                throw new ControllerException("Can't check status of the JMS topic " + topic, e);
+            }
+        }
+        return true;
+    }
+
+    public boolean updateJMSServer(String name, List queues, List topics) throws ControllerException {
+        LOGGER.info("Updating JMS server {}", name);
+        LOGGER.info("Check JMS queues");
+        boolean updated = false;
+        for (Iterator queueIterator = queues.iterator(); queueIterator.hasNext(); ) {
+            String queue = (String) queueIterator.next();
+            boolean started = false;
+            LOGGER.debug("Check if the JMS queue {} is deployed", queue);
+            ObjectName queueMBean = null;
+            try {
+                queueMBean = new ObjectName("jboss.mq.destination:name=" + queue + ",service=Queue");
+            } catch (MalformedObjectNameException malformedObjectNameException) {
+                LOGGER.debug("The JMS queue seems to not be deployed in the JMS server, deploy it");
+                try {
+                    ObjectName mbean = new ObjectName("jboss.system:service=MainDeployer");
+                    File file = new File(deployURL.getPath() + "/jms/" + queue + "-service.xml");
+                    this.jmsQueueWriteFile(file, queue);
+                    server.invoke(mbean, "deploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+                    updated = true;
+                } catch (Exception e) {
+                    LOGGER.error("Can't deploy JMS queue {}", queue, e);
+                    throw new ControllerException("Can't deploy JMS queue " + queue, e);
+                }
+            }
+            try {
+                started = ((Boolean) server.getAttribute(queueMBean, "Started")).booleanValue();
+                if (!started) {
+                    server.invoke(queueMBean, "start", null, null);
+                    updated = true;
+                }
+            } catch (Exception e) {
+                LOGGER.error("Can't start JMS queue {}", queue, e);
+                throw new ControllerException("Can't start JMS queue " + queue, e);
+            }
+        }
+        LOGGER.info("Check JMS topics");
+        for (Iterator topicIterator = topics.iterator(); topicIterator.hasNext(); ) {
+            String topic = (String) topicIterator.next();
+            boolean started = false;
+            LOGGER.debug("Check if JMS topic {} is deployed", topic);
+            ObjectName topicMBean = null;
+            try {
+                topicMBean = new ObjectName("jboss.mq.destination:name=" + topic + ",service=Topic");
+            } catch (MalformedObjectNameException malformedObjectNameException) {
+                LOGGER.debug("The JMS topic seems to not be deployed in the JMS server, deploy it");
+                try {
+                    ObjectName mbean = new ObjectName("jboss.system:service=MainDeployer");
+                    File file = new File(deployURL.getPath() + "/jms/" + topic + "-service.xml");
+                    this.jmsTopicWriteFile(file, topic);
+                    server.invoke(mbean, "deploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+                    updated = true;
+                } catch (Exception e) {
+                    LOGGER.error("Can't deploy JMS topic {}", topic, e);
+                    throw new ControllerException("Can't deploy JMS topic " + topic, e);
+                }
+            }
+            try {
+                started = ((Boolean) server.getAttribute(topicMBean, "Started")).booleanValue();
+                if (!started) {
+                    server.invoke(topicMBean, "start", null, null);
+                    updated = true;
+                }
+            } catch (Exception e) {
+                LOGGER.error("Can't start JMS topic {}", topic, e);
+                throw new ControllerException("Can't start JMS topic " + topic, e);
+            }
+        }
+        return updated;
+    }
+
+    public void undeployJMSServer(String name) throws ControllerException {
+        LOGGER.info("Undeploying the JMS server {}", name);
+        LOGGER.warn("The JMS server is embedded in JBoss application server");
+    }
+
+    public boolean isJNDIBindingDeployed(String name) {
+        LOGGER.info("Checking if JNDI binding {} is deployed", name);
+        ObjectName mbean = null;
+        try {
+            mbean = new ObjectName("jboss:service=JNDIView");
+        } catch (MalformedObjectNameException malformedObjectNameException) {
+            LOGGER.warn("Can't check if the JNDI binding {} is deployed", name, malformedObjectNameException);
+            return false;
+        }
+        try {
+            String output = (String) server.invoke(mbean, "list", new Object[]{new Boolean("false")}, new String[]{"java.lang.Boolean"});
+            if (StringUtils.containsIgnoreCase(output, name)) {
+                LOGGER.debug("The JNDI binding {} has been found", name);
+                return true;
+            }
+        } catch (Exception e) {
+            LOGGER.warn("Can't check if the JNDI binding {} is deployed", name, e);
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * Write a JBoss JNDI alias service file.
+     *
+     * @param file the target service file.
+     * @param name the JNDI binding name.
+     * @param from the JNDI alias from name.
+     * @param to   the JNDI alias to name.
+     * @throws ControllerException in case of file writing failure.
+     */
+    private void jndiAliasWriteFile(File file, String name, String from, String to) throws ControllerException {
+        InputStreamReader jmsQueueTemplate = new InputStreamReader(JBossController.class.getResourceAsStream("/jboss/template-jndi-alias-service.xml"));
+        Object[] values = new Object[3];
+        values[0] = name;
+        values[1] = from;
+        values[2] = to;
+        String jndiAliasContent = JBossController.format(jmsQueueTemplate, values);
+        try {
+            FileUtils.writeStringToFile(file, jndiAliasContent);
+        } catch (Exception e) {
+            LOGGER.error("Can't write JBoss JNDI binding service file", e);
+            throw new ControllerException("Can't write JBoss JNDI binding service file", e);
+        }
+    }
+
+    public void deployJNDIBinding(String name, String jndiName, String jndiAlias, String providerUrl) throws ControllerException {
+        LOGGER.info("Deploying JNDI binding {}", name);
+        File file = new File(deployURL.getPath() + "/" + name + "-service.xml");
+        this.jndiAliasWriteFile(file, name, jndiName, jndiAlias);
+        try {
+            ObjectName mbean = new ObjectName("jboss.system:service=MainDeployer");
+            server.invoke(mbean, "deploy", new Object[]{file.toURL()}, new String[]{"java.net.URL"});
+        } catch (Exception e) {
+            LOGGER.error("Can't deploy JNDI binding {}", name, e);
+            throw new ControllerException("Can't deploy JNDI binding " + name, e);
+        }
+    }
+
+    public void undeployJNDIBinding(String name) throws ControllerException {
+        LOGGER.info("Undeploying JNDI binding {}", name);
+        try {
+            ObjectName mbean = new ObjectName("jboss:service=Naming");
+            server.invoke(mbean, "removeAlias", new Object[]{name}, new String[]{"java.lang.String"});
+        } catch (Exception e) {
+            LOGGER.error("Can't undeploy JNDI binding {}", name, e);
+            throw new ControllerException("Can't undeploy JNDI binding " + name, e);
+        }
+    }
+
+    public boolean isJNDIBindingUpToDate(String name, String jndiName, String jndiAlias, String providerUrl) throws ControllerException {
+        LOGGER.info("Checking status of JNDI binding {}", name);
+        if (isJNDIBindingDeployed(name)) {
+            return true;
+        }
+        return false;
+    }
+
+    public boolean updateJNDIBinding(String name, String jndiName, String jndiAlias, String providerUrl) throws ControllerException {
+        LOGGER.info("Updating JNDI binding {}", name);
+        if (isJNDIBindingDeployed(name)) {
+            this.undeployJNDIBinding(name);
+            this.deployJNDIBinding(name, jndiName, jndiAlias, providerUrl);
+            return true;
+        }
+        return false; // return false either if the name space binding is always updated
+    }
+
+    public boolean isSharedLibraryDeployed(String name) throws ControllerException {
+        LOGGER.warn("Shared libraries are not supported with JBoss application server");
+        return true;
+    }
+
+    public void deploySharedLibrary(String name, String classpath) throws ControllerException {
+        LOGGER.warn("Shared libraries are not supported with JBoss application server");
+    }
+
+    public void undeploySharedLibrary(String name) throws ControllerException {
+        LOGGER.warn("Shared libraries are not supported with JBoss application server");
+    }
+
+    public boolean isSharedLibraryUpToDate(String name, String classpath) throws ControllerException {
+        LOGGER.warn("Shared libraries are not supported with JBoss application server");
+        return false;
+    }
+
+    public boolean updateSharedLibrary(String name, String classpath) throws ControllerException {
+        LOGGER.warn("Shared libraries are not supported with JBoss application server");
+        return false;
+    }
+
+}

Modified: incubator/kalumet/trunk/controller/pom.xml
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/controller/pom.xml?rev=1202544&r1=1202543&r2=1202544&view=diff
==============================================================================
--- incubator/kalumet/trunk/controller/pom.xml (original)
+++ incubator/kalumet/trunk/controller/pom.xml Wed Nov 16 06:32:12 2011
@@ -35,6 +35,7 @@
 
     <modules>
         <module>core</module>
+        <module>jboss</module>
         <module>weblogic</module>
         <module>websphere</module>
     </modules>