Author: jbonofre Date: Tue Nov 15 15:55:12 2011 New Revision: 1202265 URL: http://svn.apache.org/viewvc?rev=1202265&view=rev Log: Add Oracle WebLogic controller
Added: incubator/kalumet/trunk/controller/weblogic/ incubator/kalumet/trunk/controller/weblogic/pom.xml - copied, changed from r1202264, incubator/kalumet/trunk/controller/pom.xml incubator/kalumet/trunk/controller/weblogic/src/ incubator/kalumet/trunk/controller/weblogic/src/main/ incubator/kalumet/trunk/controller/weblogic/src/main/java/ incubator/kalumet/trunk/controller/weblogic/src/main/java/org/ incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/ incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/kalumet/ incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/kalumet/controller/ incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/kalumet/controller/weblogic/ incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/kalumet/controller/weblogic/WeblogicController.java Modified: incubator/kalumet/trunk/controller/pom.xml Modified: incubator/kalumet/trunk/controller/pom.xml URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/controller/pom.xml?rev=1202265&r1=1202264&r2=1202265&view=diff ============================================================================== --- incubator/kalumet/trunk/controller/pom.xml (original) +++ incubator/kalumet/trunk/controller/pom.xml Tue Nov 15 15:55:12 2011 @@ -35,6 +35,7 @@ <modules> <module>core</module> + <module>weblogic</module> <module>websphere</module> </modules> Copied: incubator/kalumet/trunk/controller/weblogic/pom.xml (from r1202264, incubator/kalumet/trunk/controller/pom.xml) URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/controller/weblogic/pom.xml?p2=incubator/kalumet/trunk/controller/weblogic/pom.xml&p1=incubator/kalumet/trunk/controller/pom.xml&r1=1202264&r2=1202265&rev=1202265&view=diff ============================================================================== --- incubator/kalumet/trunk/controller/pom.xml (original) +++ incubator/kalumet/trunk/controller/weblogic/pom.xml Tue Nov 15 15:55:12 2011 @@ -22,20 +22,45 @@ <modelVersion>4.0.0</modelVersion> <parent> - <groupId>org.apache.kalumet</groupId> - <artifactId>kalumet</artifactId> + <groupId>org.apache.kalumet.controller</groupId> + <artifactId>controller</artifactId> <version>0.6-incubating</version> <relativePath>../pom.xml</relativePath> </parent> - <groupId>org.apache.kalumet.controller</groupId> - <artifactId>controller</artifactId> - <packaging>pom</packaging> - <name>Apache Kalumet :: Controller</name> - - <modules> - <module>core</module> - <module>websphere</module> - </modules> + <artifactId>org.apache.kalumet.controller.weblogic</artifactId> + <packaging>jar</packaging> + <name>Apache Kalumet :: Controller :: Oracle Weblogic AS</name> + + <properties> + <weblogic.version>8.1.2</weblogic.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>false</enabled> + </snapshots> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>org.apache.kalumet.controller</groupId> + <artifactId>org.apache.kalumet.controller.core</artifactId> + </dependency> + <dependency> + <groupId>com.oracle.weblogic</groupId> + <artifactId>server</artifactId> + <version>${weblogic.version}</version> + <scope>provided</scope> + </dependency> + </dependencies> </project> \ No newline at end of file Added: incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/kalumet/controller/weblogic/WeblogicController.java URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/kalumet/controller/weblogic/WeblogicController.java?rev=1202265&view=auto ============================================================================== --- incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/kalumet/controller/weblogic/WeblogicController.java (added) +++ incubator/kalumet/trunk/controller/weblogic/src/main/java/org/apache/kalumet/controller/weblogic/WeblogicController.java Tue Nov 15 15:55:12 2011 @@ -0,0 +1,682 @@ +/* + * 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.weblogic; + +import org.apache.kalumet.controller.core.AbstractJ2EEApplicationServerController; +import org.apache.kalumet.controller.core.ControllerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import weblogic.jndi.Environment; +import weblogic.management.MBeanHome; +import weblogic.management.configuration.*; +import weblogic.management.deploy.DeployerRuntime; +import weblogic.management.deploy.DeploymentData; +import weblogic.management.runtime.ClusterRuntimeMBean; +import weblogic.management.runtime.DeployerRuntimeMBean; +import weblogic.management.runtime.DeploymentTaskRuntimeMBean; +import weblogic.management.runtime.ServerRuntimeMBean; + +import java.util.Iterator; +import java.util.List; +import java.util.Properties; + +import javax.naming.Context; + +/** + * WeblogicController is a controller to manage a Oracle/BEA WebLogic server. + */ +public class WeblogicController extends AbstractJ2EEApplicationServerController { + + private final static transient Logger LOGGER = LoggerFactory.getLogger(WeblogicController.class); + + private static MBeanHome home = null; + + /** + * Default constructor. + * + * @param url the JMX URL to connect to WebLogic server. + * @param username the admin username to connect to the WebLogic server. + * @param password the admin password to connect to the WebLogic server. + * @param serverName the server/cluster name to manage. + * @param cluster a flag indicating if we manage a cluster (true) or a single server (false). + */ + public WeblogicController(String url, String username, String password, String serverName, Boolean cluster) throws ControllerException { + super(url, username, password, serverName, cluster); + } + + protected void init() throws ControllerException { + LOGGER.info("Connecting to the WebLogic JMX layer"); + try { + LOGGER.debug("Creating a WebLogic Environment JNDI container"); + Environment environment = new Environment(); + environment.setProviderUrl(this.getUrl()); + environment.setSecurityPrincipal(this.getUsername()); + environment.setSecurityCredentials(this.getPassword()); + LOGGER.debug("Creating the JNDI initial context"); + Context context = environment.getInitialContext(); + LOGGER.debug("Getting WebLogic JMX MBean connector"); + home = (MBeanHome) context.lookup(MBeanHome.ADMIN_JNDI_NAME); + LOGGER.info("WebLogic server JMX connection initialized"); + } catch (Exception e) { + LOGGER.error("Can't connect to WebLogic server. The server is probably down.", e); + throw new ControllerException("Can't connect to WebLogic server. The server is probably down.", e); + } + } + + public void shutdown() throws ControllerException { + try { + if (this.isCluster()) { + LOGGER.info("Shutting down WebLogic cluster {}", this.getServerName()); + ClusterRuntimeMBean clusterRuntime = (ClusterRuntimeMBean) home.getRuntimeMBean(this.getServerName(), "ClusterRuntime"); + String[] servers = clusterRuntime.getServerNames(); + for (int i = 0; i < servers.length; i++) { + LOGGER.info("Shutting down WebLogic server {}", servers[i]); + ServerRuntimeMBean serverRuntime = (ServerRuntimeMBean) home.getRuntimeMBean(servers[i], "ServerRuntime"); + serverRuntime.shutdown(); + } + } else { + LOGGER.info("Shutting down WebLogic server"); + ServerRuntimeMBean serverRuntime = (ServerRuntimeMBean) home.getRuntimeMBean(this.getServerName(), "ServerRuntime"); + serverRuntime.shutdown(); + } + } catch (Exception e) { + LOGGER.error("Can't shutdown WebLogic server/cluster {}", this.getServerName(), e); + throw new ControllerException("Can't shutdown WebLogic server/cluster " + this.getServerName(), e); + } + } + + public String status() { + String status = "N/A"; + try { + if (this.isCluster()) { + LOGGER.info("Checking status of WebLogic cluster {}", this.getServerName()); + ClusterRuntimeMBean clusterRuntime = (ClusterRuntimeMBean) home.getRuntimeMBean(this.getServerName(), "ClusterRuntime"); + status = "Weblogic cluster "; + String[] servers = clusterRuntime.getServerNames(); + for (int i = 0; i < servers.length; i++) { + LOGGER.info("Checking status of WebLogic server {}", servers[i]); + try { + ServerRuntimeMBean serverRuntime = (ServerRuntimeMBean) home.getRuntimeMBean(servers[i], "ServerRuntime"); + status = status + " (WebLogic " + servers[i] + " " + serverRuntime.getWeblogicVersion() + " " + serverRuntime.getState() + ")"; + } catch (Exception e) { + status = status + " (WebLogic " + servers[i] + " N/A)"; + } + } + } else { + LOGGER.info("Checking status of WebLogic server {}", this.getServerName()); + ServerRuntimeMBean serverRuntime = (ServerRuntimeMBean) home.getRuntimeMBean(this.getServerName(), "ServerRuntime"); + status = "WebLogic " + serverRuntime.getWeblogicVersion() + " " + serverRuntime.getState(); + } + } catch (Exception e) { + LOGGER.warn("Can't check status of WebLogic server/cluster status", e); + } + return status; + } + + public boolean isStopped() { + if (this.isCluster()) { + LOGGER.info("Checking if WebLogic cluster {} is stopped", this.getServerName()); + LOGGER.warn("With WebLogic cluster, if I can connect to the cluster manager, the cluster is considered up"); + try { + home.getRuntimeMBean(this.getServerName(), "ClusterRuntime"); + return false; + } catch (Exception e) { + LOGGER.warn("Can't connect to WebLogic cluster {}", this.getServerName(), e); + return true; + } + } else { + LOGGER.info("Checking if WebLogic server {} is stopped", this.getServerName()); + try { + ServerRuntimeMBean serverRuntime = (ServerRuntimeMBean) home.getRuntimeMBean(this.getServerName(), "ServerRuntime"); + if (serverRuntime.getState().equals(ServerRuntimeMBean.RUNNING)) + return false; + else + return true; + } catch (Exception e) { + LOGGER.warn("Can't check status of WebLogic server", e); + return true; + } + } + } + + public boolean isJ2EEApplicationDeployed(String path, String name) throws ControllerException { + LOGGER.info("Checking if the J2EE application {} is deployed", name); + try { + home.getAdminMBean(name, "Application", home.getDomainName()); + } catch (Exception e) { + return false; + } + return true; + } + + public void deployJ2EEApplication(String path, String name, String classloaderorder, String classloaderpolicy, String vhost) throws ControllerException { + LOGGER.info("Deploying J2EE application {} in WebLogic server/cluster {}", name, this.getServerName()); + try { + DeployerRuntimeMBean deployerRuntime = DeployerRuntime.getDeployerRuntime(home); + DeploymentData info = new DeploymentData(); + info.addTarget(this.getServerName(), null); + if (this.isCluster()) { + info.setTargetType(this.getServerName(), DeploymentData.CLUSTER); + } else { + info.setTargetType(this.getServerName(), DeploymentData.SERVER); + } + LOGGER.debug("Launching the deployment task ..."); + DeploymentTaskRuntimeMBean task = deployerRuntime.deploy(path, name, null, info, null); + while (task.isRunning()) { + Thread.sleep(200); + } + } catch (Exception e) { + LOGGER.error("Can't deploy J2EE application {}", name, e); + throw new ControllerException("Can't deploy J2EE application " + name, e); + } + } + + public void undeployJ2EEApplication(String path, String name) throws ControllerException { + LOGGER.info("Undeploying J2EE application {} from WebLogic server/cluster {}", name, this.getServerName()); + try { + DeployerRuntimeMBean deployerRuntime = DeployerRuntime.getDeployerRuntime(home); + DeploymentData info = new DeploymentData(); + info.addTarget(this.getServerName(), null); + if (this.isCluster()) { + info.setTargetType(this.getServerName(), DeploymentData.CLUSTER); + } else { + info.setTargetType(this.getServerName(), DeploymentData.SERVER); + } + LOGGER.debug("Launching the undeployment task ..."); + DeploymentTaskRuntimeMBean task = deployerRuntime.undeploy(name, info, null); + while (task.isRunning()) { + Thread.sleep(200); + } + } catch (Exception e) { + LOGGER.error("Can't undeploy J2EE application {}", name, e); + throw new ControllerException("Can't undeploy J2EE application " + name, e); + } + } + + public void redeployJ2EEApplication(String path, String name) throws ControllerException { + LOGGER.info("Redeploying J2EE application {} in WebLogic server/cluster {}", name, this.getServerName()); + try { + DeployerRuntimeMBean deployerRuntime = DeployerRuntime.getDeployerRuntime(home); + DeploymentData info = new DeploymentData(); + info.addTarget(this.getServerName(), null); + if (this.isCluster()) { + info.setTargetType(this.getServerName(), DeploymentData.CLUSTER); + } else { + info.setTargetType(this.getServerName(), DeploymentData.SERVER); + } + LOGGER.debug("Launching the redeploy task ..."); + DeploymentTaskRuntimeMBean task = deployerRuntime.redeploy(name, info, null); + while (task.isRunning()) { + Thread.sleep(200); + } + } catch (Exception e) { + LOGGER.error("Can't redeploy J2EE application {}", name, e); + throw new ControllerException("Can't redeploy J2EE application " + name, e); + } + } + + public boolean isJDBCConnectionPoolDeployed(String name) throws ControllerException { + LOGGER.info("Checking if JDBC connection pool {} is deployed in WebLogic server/cluster {}", name, this.getServerName()); + try { + home.getAdminMBean(name, "JDBCConnectionPool", home.getDomainName()); + } catch (Exception e) { + return false; + } + return true; + } + + 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 {} in WebLogic server/cluster {}", name, this.getServerName()); + if (!this.isJDBCConnectionPoolDeployed(name)) { + LOGGER.debug("JDBC connection pool {} is not deployed in the WebLogic server/cluster {}", name, this.getServerName()); + return false; + } + LOGGER.debug("Looking for JDBC connection pool MBean"); + try { + JDBCConnectionPoolMBean connectionPool = (JDBCConnectionPoolMBean) home.getAdminMBean(name, "JDBCConnectionPool", home.getDomainName()); + if (connectionPool.getDriverName().equals(driver) && connectionPool.getCapacityIncrement() == increment && connectionPool.getInitialCapacity() == initial && connectionPool.getMaxCapacity() == maximal + && ((String) connectionPool.getProperties().getProperty("user")).equals(user) && connectionPool.getPassword().equals(password) && connectionPool.getURL().equals(url)) { + LOGGER.debug("JDBC connection pool {} is up to date", name); + return true; + } + } catch (Exception e) { + LOGGER.error("Can't check status of JBDC connection pool {}", name, e); + throw new ControllerException("Can't check status of JDBC connection pool " + name, 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 {} in WebLogic server/cluster {}", name, this.getServerName()); + try { + LOGGER.debug("Looking for the JDBC connection pool MBean"); + JDBCConnectionPoolMBean connectionPool = (JDBCConnectionPoolMBean) home.getAdminMBean(name, "JDBCConnectionPool", home.getDomainName()); + if (connectionPool.getDriverName().equals(driver) && connectionPool.getCapacityIncrement() == increment && connectionPool.getInitialCapacity() == initial && connectionPool.getMaxCapacity() == maximal + && ((String) connectionPool.getProperties().getProperty("user")).equals(user) && connectionPool.getPassword().equals(password) && connectionPool.getURL().equals(url)) { + LOGGER.debug("JDBC connection pool {} is already up to date, nothing to do", name); + return false; + } + connectionPool.setDriverName(driver); + connectionPool.setCapacityIncrement(increment); + connectionPool.setInitialCapacity(initial); + connectionPool.setMaxCapacity(maximal); + connectionPool.setShrinkingEnabled(true); + Properties properties = new Properties(); + properties.put("user", user); + connectionPool.setProperties(properties); + connectionPool.setPassword(password); + connectionPool.setURL(url); + return true; + } catch (Exception e) { + LOGGER.error("Can't update JDBC connection pool {}", name, e); + throw new ControllerException("Can't update JDBC connection pool " + name, e); + } + } + + 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 JDBC connection pool {} in WebLogic server/cluster {}", name, this.getServerName()); + try { + TargetMBean target; + if (this.isCluster()) { + target = (ClusterMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } else { + target = (ServerMBean) home.getAdminMBean(this.getServerName(), "Server"); + } + JDBCConnectionPoolMBean connectionPool = (JDBCConnectionPoolMBean) home.createAdminMBean(name, "JDBCConnectionPool", home.getDomainName()); + connectionPool.setDriverName(driver); + connectionPool.setCapacityIncrement(increment); + connectionPool.setInitialCapacity(initial); + connectionPool.setMaxCapacity(maximal); + connectionPool.setURL(url); + connectionPool.setShrinkingEnabled(true); + Properties properties = new Properties(); + properties.put("user", user); + connectionPool.setProperties(properties); + connectionPool.setPassword(password); + connectionPool.addTarget(target); + } catch (Exception e) { + LOGGER.error("Can't deploy JBDC connection pool {}", name, e); + throw new ControllerException("Can't deploy JDBC connection pool " + name, e); + } + } + + public void undeployJDBCConnectionPool(String name) throws ControllerException { + LOGGER.info("Undeploying JDBC connection pool {} from WebLogic server/cluster {}", name, this.getServerName()); + try { + TargetMBean target; + if (this.isCluster()) { + target = (ClusterMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } else { + target = (ServerMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } + JDBCConnectionPoolMBean connectionPool = (JDBCConnectionPoolMBean) home.getMBean(name, "JDBCConnectionPool", home.getDomainName()); + connectionPool.removeTarget(target); + home.deleteMBean(connectionPool); + } catch (Exception e) { + LOGGER.error("Can't undeploy JBDC connection pool {}", name, e); + throw new ControllerException("Can't undeploy JDBC connection pool " + name, e); + } + } + + public boolean isJDBCDataSourceDeployed(String name) throws ControllerException { + LOGGER.info("Checking if JDBC data source {} is already deployed in WebLogic server/cluster {}", name, this.getServerName()); + try { + home.getMBean(name, "JDBCTxDataSource", home.getDomainName()); + } catch (Exception e) { + return false; + } + return true; + } + + public void deployJDBCDataSource(String name, String jdbcConnectionPool, String jdbcUrl, String helperClassname) throws ControllerException { + LOGGER.info("Deploying JDBC data source {} in WebLogic server/cluster {}", name, this.getServerName()); + try { + TargetMBean target; + if (this.isCluster()) { + target = (ClusterMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } else { + target = (ServerMBean) home.getAdminMBean(this.getServerName(), "Server"); + } + JDBCTxDataSourceMBean dataSource = (JDBCTxDataSourceMBean) home.createAdminMBean(name, "JDBCTxDataSource", home.getDomainName()); + dataSource.setJNDIName(name); + dataSource.setPoolName(jdbcConnectionPool); + dataSource.setRowPrefetchEnabled(true); + dataSource.addTarget(target); + } catch (Exception e) { + LOGGER.error("Can't deploy JDBC data source {}", name, e); + throw new ControllerException("Can't deploy JDBC data source " + name, e); + } + } + + public void undeployJDBCDataSource(String name) throws ControllerException { + LOGGER.info("Undeploying JDBC data source {} from WebLogic {}", name, this.getServerName()); + try { + TargetMBean target; + if (this.isCluster()) { + target = (ClusterMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } else { + target = (ServerMBean) home.getAdminMBean(this.getServerName(), "Server"); + } + JDBCTxDataSourceMBean dataSource = (JDBCTxDataSourceMBean) home.getMBean(name, "JDBCTxDataSource", home.getDomainName()); + dataSource.removeTarget(target); + home.deleteMBean(dataSource); + } catch (Exception e) { + LOGGER.error("Can't undeploy JDBC data source {}", name, e); + throw new ControllerException("Can't undeploy JDBC data source " + name, e); + } + } + + public boolean isJDBCDataSourceUpToDate(String name, String jdbcConnectionPool, String jdbcUrl, String helperClassname) throws ControllerException { + LOGGER.info("Checking status of JDBC data source {} in WebLogic server/cluster {}", name, this.getServerName()); + if (!this.isJDBCDataSourceDeployed(name)) { + LOGGER.debug("JDBC data source {} is not deployed in WebLogic server/cluster {}", name, this.getServerName()); + return false; + } + try { + JDBCTxDataSourceMBean dataSource = (JDBCTxDataSourceMBean) home.getAdminMBean(name, "JDBCTxDataSource", home.getDomainName()); + if (dataSource.getPoolName().equals(jdbcConnectionPool)) { + LOGGER.debug("JDBC data source {} is up to date", name); + return true; + } + } catch (Exception e) { + LOGGER.error("Can't check status of JDBC data source {}", name, e); + throw new ControllerException("Can't check status of JDBC data source " + name, e); + } + return false; + } + + public boolean updateJDBCDataSource(String name, String jdbcConnectionPool, String jdbcUrl, String helperClassname) throws ControllerException { + LOGGER.info("Updating JDBC data source {} in WebLogic server/cluster {}", name, this.getServerName()); + try { + if (!this.isJDBCDataSourceDeployed(name)) { + LOGGER.debug("JDBC data source {} is not deployed in WebLogic server/cluster {}", name, this.getServerName()); + return false; + } + JDBCTxDataSourceMBean dataSource = (JDBCTxDataSourceMBean) home.getAdminMBean(name, "JDBCTxDataSource", home.getDomainName()); + if (dataSource.getName().equals(name) && dataSource.getPoolName().equals(jdbcConnectionPool)) { + LOGGER.debug("JDBC data source {} is already up to date, nothing to do", name); + return false; + } else { + dataSource.setPoolName(jdbcConnectionPool); + dataSource.setRowPrefetchEnabled(true); + return true; + } + } catch (Exception e) { + LOGGER.error("Can't update JDBC data source {}", name, e); + throw new ControllerException("Can't update JDBC data source " + name, e); + } + } + + public boolean isJMSConnectionFactoryDeployed(String name) throws ControllerException { + LOGGER.info("Check if JMS connection factory {} is already deployed in WebLogic server/cluster {}", name, this.getServerName()); + try { + home.getAdminMBean(name, "JMSConnectionFactory", home.getDomainName()); + } catch (Exception e) { + return false; + } + return true; + } + + public void deployJMSConnectionFactory(String name) throws ControllerException { + LOGGER.info("Deploying JMS connection factory {} in WebLogic server/cluster {}", name, this.getServerName()); + try { + TargetMBean target; + if (this.isCluster()) { + target = (ClusterMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } else { + target = (ServerMBean) home.getAdminMBean(this.getServerName(), "Server"); + } + JMSConnectionFactoryMBean connectionFactory = (JMSConnectionFactoryMBean) home.createAdminMBean(name, "JMSConnectionFactory", home.getDomainName()); + connectionFactory.setJNDIName(name); + connectionFactory.addTarget(target); + } catch (Exception e) { + LOGGER.error("Can't deploy JMS connection factory {}", name, e); + throw new ControllerException("Can't deploy JMS connection factory " + name, e); + } + } + + public void undeployJMSConnectionFactory(String name) throws ControllerException { + LOGGER.info("Undeploying JMS connection factory {} from WebLogic server/cluster {}", name, this.getServerName()); + try { + TargetMBean target; + if (this.isCluster()) { + target = (ClusterMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } else { + target = (ServerMBean) home.getAdminMBean(this.getServerName(), "Server"); + } + JMSConnectionFactoryMBean connectionFactory = (JMSConnectionFactoryMBean) home.getAdminMBean(name, "JMSConnectionFactory", home.getDomainName()); + connectionFactory.removeTarget(target); + home.deleteMBean(connectionFactory); + } catch (Exception e) { + LOGGER.error("Can't undeploy 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 already deployed in WebLogic server/cluster {}", name, this.getServerName()); + try { + home.getAdminMBean(name, "JMSServer", home.getDomainName()); + } catch (Exception e) { + return false; + } + return true; + } + + public void deployJMSServer(String name, List queues, List topics) throws ControllerException { + LOGGER.info("Deploying JMS server {} in WebLogic server/cluster {}", name, this.getServerName()); + try { + TargetMBean target; + if (this.isCluster()) { + target = (ClusterMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } else { + target = (ServerMBean) home.getAdminMBean(this.getServerName(), "Server"); + } + JMSServerMBean jmsServer = (JMSServerMBean) home.createAdminMBean(name, "JMSServer", home.getDomainName()); + LOGGER.debug("Create the JMS queue destinations"); + for (Iterator queueIterator = queues.iterator(); queueIterator.hasNext(); ) { + String queueName = (String) queueIterator.next(); + JMSQueueMBean queue = (JMSQueueMBean) home.createAdminMBean(queueName, "JMSQueue"); + queue.setJNDIName(queueName); + queue.setParent(jmsServer); + jmsServer.addDestination(queue); + } + LOGGER.debug("Create the JMS topic destinations"); + for (Iterator topicIterator = topics.iterator(); topicIterator.hasNext(); ) { + String topicName = (String) topicIterator.next(); + JMSTopicMBean topic = (JMSTopicMBean) home.createAdminMBean(topicName, "JMSTopic"); + topic.setJNDIName(topicName); + topic.setParent(jmsServer); + jmsServer.addDestination(topic); + } + jmsServer.addTarget(target); + LOGGER.debug("JMS Server deployed"); + } catch (Exception e) { + LOGGER.error("Can't deploy JMS server {}", name, e); + throw new ControllerException("Can't deploy JMS server " + name, e); + } + } + + public boolean isJMSServerUpToDate(String name, List queues, List topics) throws ControllerException { + LOGGER.info("Checking status of JMS server {} in WebLogic server/cluster {}", name, this.getServerName()); + if (!this.isJMSServerDeployed(name)) { + LOGGER.debug("JMS server is not deployed in WebLogic server/cluster {}", this.getServerName()); + return false; + } + try { + // get the JMS server MBean + JMSServerMBean jmsServer = (JMSServerMBean) home.getAdminMBean(name, "JMSServer", home.getDomainName()); + // get the JMS server destinations + JMSDestinationMBean[] destinations = jmsServer.getDestinations(); + // check JMS queues + for (Iterator queueIterator = queues.iterator(); queueIterator.hasNext(); ) { + String queueName = (String) queueIterator.next(); + boolean found = false; + for (int i = 0; i < destinations.length; i++) { + JMSDestinationMBean destination = destinations[i]; + if (destination.getJNDIName().equals(queueName)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + // check JMS topic + for (Iterator topicIterator = topics.iterator(); topicIterator.hasNext(); ) { + String topicName = (String) topicIterator.next(); + boolean found = false; + for (int i = 0; i < destinations.length; i++) { + JMSDestinationMBean destination = destinations[i]; + if (destination.getJNDIName().equals(topicName)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + } catch (Exception e) { + LOGGER.error("Can't check status of JMS server {}", name, e); + throw new ControllerException("Can't check status of JMS server " + name, e); + } + return true; + } + + public boolean updateJMSServer(String name, List queues, List topics) throws ControllerException { + LOGGER.info("Updating JMS server {} in WebLogic server/cluster {}", name, this.getServerName()); + boolean updated = false; + try { + JMSServerMBean jmsServer = (JMSServerMBean) home.getAdminMBean(name, "JMSServer", home.getDomainName()); + LOGGER.debug("Getting JMS server destinations"); + JMSDestinationMBean[] destinations = jmsServer.getDestinations(); + LOGGER.debug("Checking if all JMS queues are present"); + for (Iterator queueIterator = queues.iterator(); queueIterator.hasNext(); ) { + String queueName = (String) queueIterator.next(); + boolean found = false; + for (int i = 0; i < destinations.length; i++) { + JMSDestinationMBean destination = destinations[i]; + if (destination.getJNDIName().equals(queueName)) { + found = true; + break; + } + } + if (!found) { + LOGGER.debug("JMS queue {} is not present in the JMS server, deploy it", name); + updated = true; + JMSQueueMBean queue = (JMSQueueMBean) home.createAdminMBean(queueName, "JMSQueue", home.getDomainName()); + queue.setJNDIName(queueName); + queue.setParent(jmsServer); + jmsServer.addDestination(queue); + } + } + LOGGER.debug("Check if all JMS topics are present"); + for (Iterator topicIterator = topics.iterator(); topicIterator.hasNext(); ) { + String topicName = (String) topicIterator.next(); + boolean found = false; + for (int i = 0; i < destinations.length; i++) { + JMSDestinationMBean destination = destinations[i]; + if (destination.getJNDIName().equals(topicName)) { + found = true; + break; + } + } + if (!found) { + LOGGER.debug("JMS topic {} is not present in the JMS server, deploy it", name); + updated = true; + JMSTopicMBean topic = (JMSTopicMBean) home.createAdminMBean(topicName, "JMSTopic", home.getDomainName()); + topic.setJNDIName(topicName); + topic.setParent(jmsServer); + jmsServer.addDestination(topic); + } + } + } catch (Exception e) { + LOGGER.error("Can't update JMS server {}" + name, e); + throw new ControllerException("Can't update JMS server " + name, e); + } + return updated; + } + + public void undeployJMSServer(String name) throws ControllerException { + LOGGER.info("Undeploying JMS server {} from WebLogic server/cluster {}", name, this.getServerName()); + try { + TargetMBean target; + if (this.isCluster()) { + target = (ClusterMBean) home.getAdminMBean(this.getServerName(), "Cluster"); + } else { + target = (ServerMBean) home.getAdminMBean(this.getServerName(), "Server"); + } + JMSServerMBean jmsServer = (JMSServerMBean) home.getAdminMBean(name, "JMSServer", home.getDomainName()); + jmsServer.removeTarget(target); + home.deleteMBean(jmsServer); + } catch (Exception e) { + LOGGER.error("Can't undeploy JMS server {}", name, e); + throw new ControllerException("Can't undeploy JMS server " + name, e); + } + } + + public boolean isJNDIBindingDeployed(String name) { + LOGGER.warn("JNDI bindings are not supported on WebLogic server/cluster"); + return true; + } + + public void deployJNDIBinding(String name, String jndiName, String jndiAlias, String providerUrl) throws ControllerException { + LOGGER.warn("JNDI bindings are not supported on WebLogic server/cluster"); + } + + public void undeployJNDIBinding(String name) throws ControllerException { + LOGGER.warn("JNDI bindings are not supported on WebLogic server/cluster"); + } + + public boolean isJNDIBindingUpToDate(String name, String jndiName, String jndiAlias, String providerUrl) throws ControllerException { + LOGGER.warn("JNDI bindings are not supported on WebLogic server/cluster"); + return false; + } + + public boolean updateJNDIBinding(String name, String jndiName, String jndiAlias, String providerUrl) throws ControllerException { + LOGGER.warn("JNDI bindings are not supported on WebLogic server/cluster"); + return false; + } + + public boolean isSharedLibraryDeployed(String name) throws ControllerException { + LOGGER.warn("Shared libraries are not supported on WebLogic server/cluster"); + return true; + } + + public void deploySharedLibrary(String name, String classpath) throws ControllerException { + LOGGER.warn("Shared libraries are not supported on WebLogic server/cluster"); + } + + public void undeploySharedLibrary(String name) throws ControllerException { + LOGGER.warn("Shared libraries are not supported on WebLogic server/cluster"); + } + + public boolean isSharedLibraryUpToDate(String name, String classpath) throws ControllerException { + LOGGER.warn("Shared libraries are not supported on WebLogic server/cluster"); + return false; + } + + public boolean updateSharedLibrary(String name, String classpath) throws ControllerException { + LOGGER.warn("Shared libraries are not supported on WebLogic server/cluster"); + return false; + } + +}