/*
* 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.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.core.system.ProcessInfo;
/**
* Discovers embedded Tomcat servers (that is, those embedded in JBossAS servers).
*
* @author Greg Hinkle
* @author Ian Springer
*/
public class JBossASTomcatDiscoveryComponent implements ResourceDiscoveryComponent<JBossASServerComponent<?>> {
private final Log log = LogFactory.getLog(JBossASTomcatDiscoveryComponent.class);
public static final String EMBEDDED_TOMCAT_PRE42_DIR = "jbossweb-tomcat";
public static final String EMBEDDED_TOMCAT_42_DIR = "jboss-web.";
private static final String SERVER_INFO_PROPERTIES_RESOURCE = "org/apache/catalina/util/ServerInfo.properties";
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JBossASServerComponent<?>> context)
throws InvalidPluginConfigurationException, Exception {
log.debug("Discovering Tomcat servers embedded in JBossAS server...");
File configDir = context.getParentResourceComponent().getConfigurationPath();
File deployDir = new File(configDir, "deploy");
File[] jbossWebDirs = deployDir.listFiles(new FileFilter() {
public boolean accept(File file) {
boolean pre42 = file.getName().startsWith(EMBEDDED_TOMCAT_PRE42_DIR);
boolean is42 = file.getName().startsWith(EMBEDDED_TOMCAT_42_DIR);
return file.isDirectory() && (pre42 || is42);
}
});
if ((!deployDir.isDirectory()) || (null == jbossWebDirs)) {
throw new InvalidPluginConfigurationException("Invalid deploy directory: " + deployDir.getAbsolutePath());
}
Set<DiscoveredResourceDetails> set = new HashSet<DiscoveredResourceDetails>();
for (File jbossWebDir : jbossWebDirs) {
String key = jbossWebDir.getName();
// TODO GH: Get bound addresses and ports or something
boolean pre42 = jbossWebDir.getName().startsWith(EMBEDDED_TOMCAT_PRE42_DIR);
String serverName = (pre42) ? "Tomcat" : "JBossWeb";
String version = getVersion(jbossWebDir);
String description = "JBossAS-Embedded " + serverName + " Web Server (" + jbossWebDir.getName()
+ File.separator + ")";
Configuration pluginConfig = null;
ProcessInfo processInfo = null;
DiscoveredResourceDetails resource = new DiscoveredResourceDetails(context.getResourceType(), key,
getResourceName(pre42), version, description, pluginConfig, processInfo);
set.add(resource);
}
return set;
}
private String getResourceName(boolean pre42) {
return pre42 ? "Embedded Tomcat Server" : "Embedded JBossWeb Server";
}
private String getVersion(File jbossWebDir) throws IOException {
boolean pre42 = jbossWebDir.getName().startsWith(EMBEDDED_TOMCAT_PRE42_DIR);
String jarFileName = (pre42) ? "catalina.jar" : "jbossweb.jar";
File jarFile = new File(jbossWebDir, jarFileName);
ClassLoader classLoader = new URLClassLoader(new URL[] { jarFile.toURI().toURL() });
InputStream stream = classLoader.getResourceAsStream(SERVER_INFO_PROPERTIES_RESOURCE);
String version = null;
if (stream != null) {
Properties serverInfo = new Properties();
serverInfo.load(stream);
stream.close();
version = serverInfo.getProperty("server.number");
if (version == null) {
String info = serverInfo.getProperty("server.info");
if (info != null) {
version = info.substring(info.indexOf('/') + 1);
}
}
}
if (version == null) {
version = "?";
log.error("Failed to determine version of Embedded Tomcat server located at '" + jbossWebDir + "'");
}
return version;
}
}