/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.container.monitor.jvm; import org.exoplatform.commons.utils.SecurityHelper; import org.exoplatform.container.ar.Archive; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import java.io.File; import java.lang.management.ManagementFactory; import java.lang.reflect.Method; import java.net.URI; import java.net.URISyntaxException; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.StringTokenizer; import javax.management.MBeanServer; /** * @author Tuan Nguyen (tuan08@users.sourceforge.net) * @since Nov 8, 2004 * @version $Id: J2EEServerInfo.java 5799 2006-05-28 17:55:42Z geaz $ */ public class J2EEServerInfo { /** * The logger */ private static final Log LOG = ExoLogger.getLogger("exo.kernel.container.J2EEServerInfo"); /** * The name of the JVM parameter that allows us to change the location of the * configuration directory */ public static final String EXO_CONF_PARAM = "exo.conf.dir"; /** * The name of the JVM parameter that allows us to change the default name * of the configuration directory which is "exo-conf" */ public static final String EXO_CONF_DIR_NAME_PARAM = "exo.conf.dir.name"; /** * The name of the JVM parameter that allows us to change * the default directories where the archives are deployed */ public static final String EXO_ARCHIVE_DIRS_PARAM = "exo.archive.dirs"; private String serverName_; private String serverHome_; private String exoConfDir_; private List<String> appDeployDirectories_; private Set<Archive> appDeployArchives_; private MBeanServer mbeanServer; public J2EEServerInfo() { this(false); } public J2EEServerInfo(final boolean logEnabled) { SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>() { public Void run() { String jonasHome = System.getProperty("jonas.base"); String jbossHome = System.getProperty("jboss.home.dir"); String jettyHome = System.getProperty("jetty.home"); String websphereHome = System.getProperty("was.install.root"); String weblogicHome = System.getProperty("wls.home"); String glassfishHome = System.getProperty("com.sun.aas.instanceRoot"); String catalinaHome = System.getProperty("catalina.home"); String testHome = System.getProperty("maven.exoplatform.dir"); // The name of the configuration directory final String confDirName = System.getProperty(EXO_CONF_DIR_NAME_PARAM, "exo-conf"); if (jonasHome != null) { serverName_ = "jonas"; serverHome_ = jonasHome; } else if (jbossHome != null) { serverName_ = "jboss"; serverHome_ = jbossHome; // try find and use jboss.server.config.url // based on http://www.jboss.org/community/docs/DOC-10730 String jbossConfigUrl = System.getProperty("jboss.server.config.url"); if (jbossConfigUrl != null) { try { exoConfDir_ = new File(new File(new URI(jbossConfigUrl)), confDirName).getAbsolutePath(); appDeployDirectories_ = Collections.singletonList(new File(new File(new URI(jbossConfigUrl)).getParentFile(), "deploy").getAbsolutePath()); } catch (SecurityException e) { if (logEnabled && LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } catch (URISyntaxException e) { if (logEnabled && LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } catch (IllegalArgumentException e) { if (logEnabled && LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } } else { // New variable that exists only since JBoss AS 7 String jbossConfigDir = System.getProperty("jboss.server.config.dir"); if (jbossConfigDir != null) { try { exoConfDir_ = new File(jbossConfigDir, confDirName).getAbsolutePath(); appDeployDirectories_ = Collections.singletonList(new File(new File(jbossConfigDir).getParentFile(), "deployments").getAbsolutePath()); } catch (SecurityException e) { if (logEnabled && LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } } } try { Class<?> clazz = Thread.currentThread().getContextClassLoader() .loadClass("org.jboss.mx.util.MBeanServerLocator"); Method m = clazz.getMethod("locateJBoss"); mbeanServer = (MBeanServer)m.invoke(null); } catch (ClassNotFoundException ignore) { // We assume that JBoss AS 7 or higher is currently used // since this class has been removed starting from this version // of JBoss AS if (logEnabled && LOG.isDebugEnabled()) LOG.debug(ignore.getLocalizedMessage(), ignore); } catch (Exception ignore) { if (logEnabled && LOG.isErrorEnabled()) LOG.error(ignore.getLocalizedMessage(), ignore); } } else if (jettyHome != null) { serverName_ = "jetty"; serverHome_ = jettyHome; appDeployDirectories_ = Collections.singletonList(new File(jettyHome, "webapps").getAbsolutePath()); appDeployArchives_ = Collections.singleton(Archive.WAR); } else if (websphereHome != null) { serverName_ = "websphere"; serverHome_ = websphereHome; } else if (weblogicHome != null) { serverName_ = "weblogic"; serverHome_ = weblogicHome; } else if (glassfishHome != null) { serverName_ = "glassfish"; serverHome_ = glassfishHome; } else if (catalinaHome != null) { // Catalina has to be processed at the end as other servers may embed it serverName_ = "tomcat"; serverHome_ = catalinaHome; appDeployDirectories_ = Collections.singletonList(new File(catalinaHome, "webapps").getAbsolutePath()); appDeployArchives_ = Collections.singleton(new Archive("war", true, false, null)); } else if (testHome != null) { serverName_ = "test"; serverHome_ = testHome; } else { // throw new UnsupportedOperationException("unknown server platform") ; serverName_ = "standalone"; serverHome_ = System.getProperty("user.dir"); } if (exoConfDir_ == null) { exoConfDir_ = serverHome_ + "/" + confDirName; } if (mbeanServer == null) { mbeanServer = ManagementFactory.getPlatformMBeanServer(); } String exoConfHome = System.getProperty(EXO_CONF_PARAM); if (exoConfHome != null && exoConfHome.length() > 0) { if (logEnabled && LOG.isInfoEnabled()) LOG.info("Override exo-conf directory '" + exoConfDir_ + "' with location '" + exoConfHome + "'"); exoConfDir_ = exoConfHome; } String archiveDirs = System.getProperty(EXO_ARCHIVE_DIRS_PARAM); if (archiveDirs != null) { StringTokenizer st = new StringTokenizer(archiveDirs, ","); if (st.hasMoreTokens()) { if (logEnabled && LOG.isInfoEnabled()) LOG.info("The location of the archives has been set to '" + archiveDirs + "'"); List<String> dirs = new ArrayList<String>(); while (st.hasMoreTokens()) { String dir = st.nextToken().trim().replace('\\', '/'); String path = new File(serverHome_, dir).getAbsolutePath(); if (logEnabled && LOG.isDebugEnabled()) { LOG.debug("Location of the archives: {}", path); } dirs.add(path); } appDeployDirectories_ = dirs; } else { appDeployDirectories_ = null; } } if (appDeployDirectories_ == null) { if (logEnabled && LOG.isInfoEnabled()) LOG.info("No location of the archives has been set"); } else if (appDeployArchives_ == null) { appDeployArchives_ = new HashSet<Archive>(Arrays.asList(Archive.EAR, Archive.WAR)); } serverHome_ = serverHome_.replace('\\', '/'); exoConfDir_ = exoConfDir_.replace('\\', '/'); return null; } }); } /** * Returns an mbean server setup by the application server environment or null * if none cannot be located. * * @return an mean server */ public MBeanServer getMBeanServer() { return mbeanServer; } public String getServerName() { return serverName_; } public String getServerHome() { return serverHome_; } public String getExoConfigurationDirectory() { return exoConfDir_; } public List<String> getApplicationDeployDirectories() { return appDeployDirectories_; } public Set<Archive> getApplicationDeployArchives() { return appDeployArchives_; } public boolean isJBoss() { return "jboss".equals(serverName_); } }