/* * NOTE: This copyright does *not* cover user programs that use HQ * program services by normal system calls through the application * program interfaces provided as part of the Hyperic Plug-in Development * Kit or the Hyperic Client Development Kit - this is merely considered * normal use of the program, and does *not* fall under the heading of * "derived work". * * Copyright (C) [2004, 2005, 2006], Hyperic, Inc. * This file is part of HQ. * * HQ is free software; you can redistribute it and/or modify * it under the terms version 2 of the GNU General Public License 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 for more * details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ package org.hyperic.hq.plugin.weblogic.jmx; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.Set; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.management.modelmbean.ModelMBeanAttributeInfo; import javax.management.modelmbean.ModelMBeanInfo; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hyperic.hq.plugin.weblogic.WeblogicMetric; import org.hyperic.hq.plugin.weblogic.WeblogicUtil; import org.hyperic.hq.product.PluginException; public class WeblogicDiscover { private static Log log = LogFactory.getLog(WeblogicDiscover.class); private String adminName = null; private String version; private String domain = null; private Properties props; private HashMap mbeanServers = new HashMap(); private HashMap internalApps = new HashMap(); private final WeblogicQuery[] SERVICE_QUERIES = { new ApplicationQuery(), //has webapp and ejb kids new JDBCPoolQuery(), new ExqQuery(), new JMSServerQuery(), //has JMSDestination kid new JTAResourceQuery(), }; public WeblogicDiscover(String version, Properties props) { this.version = version; this.props = props; } public String getVersion() { return this.version; } public static Log getLog() { return log; } private Properties getProperties(String adminURL, String username, String password) { Properties props = new Properties(); props.put(WeblogicMetric.PROP_ADMIN_URL, adminURL); props.put(WeblogicMetric.PROP_ADMIN_USERNAME, username); props.put(WeblogicMetric.PROP_ADMIN_PASSWORD, password); return props; } public boolean isAdminSSL() { return getAdminURL().startsWith(ServerQuery.PROTOCOL_T3S); } public String getAdminURL() { return getAdminURL(this.props); } public String getUsername() { return getUsername(this.props); } public String getPassword() { return getPassword(this.props); } public String getAdminURL(Properties props) { return props.getProperty(WeblogicMetric.PROP_ADMIN_URL); } public String getUsername(Properties props) { return props.getProperty(WeblogicMetric.PROP_ADMIN_USERNAME); } public String getPassword(Properties props) { return props.getProperty(WeblogicMetric.PROP_ADMIN_PASSWORD, ""); } public String getDomain() { return this.domain; } public String getAdminName() { return this.adminName; } public MBeanServer getMBeanServer() throws WeblogicDiscoverException { return getMBeanServer(this.props); } public MBeanServer getMBeanServer(String url) throws WeblogicDiscoverException { return getMBeanServer(url, getUsername(), getPassword()); } public MBeanServer getMBeanServer(String url, String user, String pass) throws WeblogicDiscoverException { return getMBeanServer(getProperties(url, user, pass)); } public MBeanServer getMBeanServer(Properties props) throws WeblogicDiscoverException { String url = getAdminURL(props); MBeanServer server = (MBeanServer) mbeanServers.get(url); if (server != null) { return server; } try { server = WeblogicUtil.getMBeanServer(props); } catch (Exception e) { // WeblogicUtil fixes up the exception messages throw new WeblogicDiscoverException(e.getMessage(), e); } mbeanServers.put(url, server); return server; } public void find(MBeanServer mServer, WeblogicQuery query, List types) throws WeblogicDiscoverException { ObjectName scope; try { scope = new ObjectName(domain + ":" + query.getScope() + ",*"); log.debug("[find] scope="+scope); } catch (MalformedObjectNameException e) { // wont happen throw new IllegalArgumentException(e.getMessage()); } try{ for (Iterator it = mServer.queryNames(scope, null).iterator(); it.hasNext();) { ObjectName obj = (ObjectName) it.next(); String name = obj.getKeyProperty("Name"); if (name != null) { if (name.startsWith("__") || (name.indexOf("uuid-") != -1)) // wierdo 9.1 stuff i.e __weblogic_admin_rmi_queue { continue; } } WeblogicQuery type = query.cloneInstance(); if (type.getAttributes(mServer, obj)) { types.add(type); WeblogicQuery[] childQueries = query.getChildQueries(); for (int i = 0; i < childQueries.length; i++) { WeblogicQuery childQuery = childQueries[i]; childQuery.setParent(type); childQuery.setVersion(type.getVersion()); find( mServer, childQuery, types); } } } } catch (Exception e) { throw new WeblogicDiscoverException(e); } } public void init(MBeanServer mServer) throws WeblogicDiscoverException { try { discoverInit(mServer); } catch (Exception e) { // XXX there are a handful of possible exceptions // most of which will never happen. throw new WeblogicDiscoverException(e.getMessage(), e); } } private void discoverInit(MBeanServer mServer) throws Exception { // only exists on the admin server final String scope = "*:Type=ApplicationConfig,*"; for (Iterator it = mServer.queryNames(new ObjectName(scope), null).iterator(); it.hasNext();) { ObjectName oName = (ObjectName) it.next(); if (this.domain == null) { this.domain = oName.getDomain(); } if (this.adminName == null) { this.adminName = oName.getKeyProperty("Location"); } String name = oName.getKeyProperty("Name"); // special case for console so we can control it if (name.equals("console")) { continue; } boolean isInternal = ((Boolean) mServer.getAttribute(oName, "InternalApp")).booleanValue(); if (isInternal) { this.internalApps.put(name, Boolean.TRUE); } } } public boolean isInternalApp(String name) { return this.internalApps.get(name) == Boolean.TRUE; } public WeblogicQuery[] getServiceQueries() { return SERVICE_QUERIES; } }