All Downloads are FREE. Search and download functionalities are using the official Maven repository.

psiprobe.beans.JBossResourceResolverBean Maven / Gradle / Ivy

/**
 * Licensed under the GPL License. You may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 *
 * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE.
 */
package psiprobe.beans;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.catalina.Context;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import psiprobe.model.ApplicationResource;
import psiprobe.model.DataSourceInfo;

/**
 * An Adapter to convert information retrieved from JBoss JMX beans into internal resource model.
 */
public class JBossResourceResolverBean implements ResourceResolver {

  /** The Constant logger. */
  private static final Logger logger = LoggerFactory.getLogger(JBossResourceResolverBean.class);

  @Override
  public MBeanServer getMBeanServer() {
    for (MBeanServer server : MBeanServerFactory.findMBeanServer(null)) {
      if ("jboss".equals(server.getDefaultDomain())
          || "DefaultDomain".equals(server.getDefaultDomain())) {
        return server;
      }
    }
    return null;
  }

  @Override
  public boolean supportsPrivateResources() {
    return false;
  }

  @Override
  public boolean supportsGlobalResources() {
    return true;
  }

  @Override
  public boolean supportsDataSourceLookup() {
    return false;
  }

  @Override
  public List getApplicationResources() throws NamingException {

    List resources = new ArrayList<>();

    MBeanServer server = getMBeanServer();
    if (server != null) {
      try {
        Set dsNames =
            server.queryNames(new ObjectName("jboss.jca:service=ManagedConnectionPool,*"), null);
        for (ObjectName managedConnectionPoolOName : dsNames) {
          ApplicationResource resource = new ApplicationResource();
          resource.setName(managedConnectionPoolOName.getKeyProperty("name"));
          resource.setType("jboss");
          String criteria = (String) server.getAttribute(managedConnectionPoolOName, "Criteria");
          if ("ByApplication".equals(criteria)) {
            resource.setAuth("Application");
          } else if ("ByContainerAndApplication".equals(criteria)) {
            resource.setAuth("Both");
          } else {
            resource.setAuth("Container");
          }
          DataSourceInfo dsInfo = new DataSourceInfo();
          dsInfo.setMaxConnections(
              (Integer) server.getAttribute(managedConnectionPoolOName, "MaxSize"));
          dsInfo.setEstablishedConnections(
              (Integer) server.getAttribute(managedConnectionPoolOName, "ConnectionCount"));
          dsInfo.setBusyConnections(
              ((Long) server.getAttribute(managedConnectionPoolOName, "InUseConnectionCount"))
                  .intValue());
          ObjectName connectionFactoryOName = new ObjectName(
              "jboss.jca:service=ManagedConnectionFactory,name=" + resource.getName());
          Element elm = (Element) server.getAttribute(connectionFactoryOName,
              "ManagedConnectionFactoryProperties");

          if (elm != null) {
            NodeList nl = elm.getChildNodes();
            for (int i = 0; i < nl.getLength(); i++) {
              Node node = nl.item(i);
              Node na = node.getAttributes().getNamedItem("name");
              if (na != null) {
                if ("ConnectionURL".equals(na.getNodeValue())) {
                  dsInfo.setJdbcUrl(node.getFirstChild().getNodeValue());
                }

                if ("UserName".equals(na.getNodeValue())) {
                  dsInfo.setUsername(node.getFirstChild().getNodeValue());
                }

                // JMS datasource
                if ("JmsProviderAdapterJNDI".equals(na.getNodeValue())) {
                  dsInfo.setJdbcUrl(node.getFirstChild().getNodeValue());
                  resource.setType("jms");
                }
              }
            }
          }

          dsInfo.setResettable(true);

          resource.setDataSourceInfo(dsInfo);
          resources.add(resource);
        }
      } catch (Exception e) {
        logger.error("There was an error querying JBoss JMX server:", e);
      }
    }
    return resources;
  }

  /**
   * Gets the application resources.
   *
   * @param context the context
   * @return the application resources
   * @throws NamingException the naming exception
   */
  public List getApplicationResources(Context context) throws NamingException {
    return new ArrayList<>();
  }

  @Override
  public List getApplicationResources(Context context,
      ContainerWrapperBean containerWrapper) throws NamingException {

    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public boolean resetResource(Context context, String resourceName,
      ContainerWrapperBean containerWrapper) throws NamingException {
    try {
      ObjectName poolOName =
          new ObjectName("jboss.jca:service=ManagedConnectionPool,name=" + resourceName);
      MBeanServer server = getMBeanServer();
      if (server != null) {
        try {
          server.invoke(poolOName, "stop", null, null);
          server.invoke(poolOName, "start", null, null);
          return true;
        } catch (Exception e) {
          logger.error("Could not reset resource '{}'", resourceName, e);
        }
      }
      return false;
    } catch (MalformedObjectNameException e) {
      logger.trace("", e);
      throw new NamingException(
          "Resource name: \"" + resourceName + "\" makes a malformed ObjectName");
    }
  }

  @Override
  public DataSource lookupDataSource(Context context, String resourceName,
      ContainerWrapperBean containerWrapper) throws NamingException {
    throw new UnsupportedOperationException(
        "This feature has not been implemented for JBoss server yet.");
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy