/* * Jopr Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.plugins.jbossas; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mc4j.ems.connection.EmsConnection; import org.mc4j.ems.connection.bean.EmsBean; import org.mc4j.ems.connection.bean.EmsBeanName; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails; import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext; import org.rhq.plugins.jmx.JMXComponent; import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent; import org.rhq.plugins.jmx.util.ObjectNameQueryUtility; /** * Plugin discovery component for JBoss Web (embedded Tomcat) connectors. The bulk of the discovery is performed by the * super class. This class exists to work with the bean attribute values once they have been read. * * @author Jason Dobies * @author Ian Springer */ public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> { private final Log log = LogFactory.getLog(this.getClass()); // MBeanResourceDiscoveryComponent Overridden Methods -------------------------------------------- @Override public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context) { Set<DiscoveredResourceDetails> resourceDetails = super.discoverResources(context); /* * Lookup all jboss.web:type=GlobalRequestProcessor,* MBeans in order to associate them later with the * corresponding jboss.web:type=Connector,* primary connector MBeans. */ EmsConnection connection = context.getParentResourceComponent().getEmsConnection(); ObjectNameQueryUtility queryUtility = new ObjectNameQueryUtility( "jboss.web:type=GlobalRequestProcessor,name=%name%"); List<EmsBean> beans = connection.queryBeans(queryUtility.getTranslatedQuery()); // We can't populate the name and scheme in the plugin config if the GlobalRequestProcessor MBeans aren't // deployed yet, so just abort and try again the next time the PC calls us. if (beans.size() != resourceDetails.size()) { if (log.isDebugEnabled()) log.debug("jboss.web:type=GlobalRequestProcessor,name=* MBeans are not fully deployed yet - aborting..."); return Collections.emptySet(); } // Map <port, scheme> Map<String, String> schemeMap = new HashMap<String, String>(beans.size()); // Map <port, addressPresent> Map<String, Boolean> addressPresentMap = new HashMap<String, Boolean>(beans.size()); for (EmsBean bean : beans) { EmsBeanName eName = bean.getBeanName(); // There are three possible formats for the value of the 'name' key property. When parsing, it's important // to remember that the hostname can potentially contain a '-'. Note, %2F is a URL-encoded '/'. // 1) jk-8009 (jk connectors in JBoss 3.2 only, due to what I think is a bug) // 2) http-192.168.10.11-8080 // 3) http-foo-bar.example.com%2F192.168.10.11-8080 String oName = eName.getKeyProperty("name"); int firstDashIndex = oName.indexOf('-'); String scheme = oName.substring(0, firstDashIndex); String remainder = oName.substring(firstDashIndex + 1); int lastDashIndex = remainder.lastIndexOf('-'); String port = remainder.substring(lastDashIndex + 1); schemeMap.put(port, scheme); boolean addressPresent = (lastDashIndex != -1); addressPresentMap.put(port, addressPresent); } // The address may be read with %2F at the start of it. Parse that out before returning the resources. // Also set the schema for the connectors as the non-http connectors use a different naming schema. for (DiscoveredResourceDetails resource : resourceDetails) { Configuration pluginConfiguration = resource.getPluginConfiguration(); String dirtyAddress = pluginConfiguration.getSimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS) .getStringValue(); String cleanAddress; if (dirtyAddress.startsWith("%2F")) { cleanAddress = dirtyAddress.substring(3); // The resource key contains the address, so update that too String dirtyResourceKey = resource.getResourceKey(); String cleanResourceKey = dirtyResourceKey.replace(dirtyAddress, cleanAddress); resource.setResourceKey(cleanResourceKey); } else { cleanAddress = dirtyAddress; } String port = pluginConfiguration.getSimple(JBossASTomcatConnectorComponent.PROPERTY_PORT).getStringValue(); // Add the address to the Resource name (e.g. "Tomcat Connector (127.0.0.1:8080)"). String resourceName = resource.getResourceName(); //resourceName = resourceName.replace("(", "(" + cleanAddress + ":"); resource.setResourceName(resourceName); String scheme = schemeMap.get(port); pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_SCHEMA, scheme)); // Update the "address" and "dash" plugin config props, or remove them if not needed. if (addressPresentMap.containsKey(port)) { pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, cleanAddress)); pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, "-")); } else { pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, "")); pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, "")); } log.debug("Found a JBoss Web connector: " + scheme + "-" + cleanAddress + ":" + port); } return resourceDetails; } }