/*
* 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.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.mc4j.ems.connection.EmsConnection;
import org.mc4j.ems.connection.EmsException;
import org.mc4j.ems.connection.bean.EmsBean;
import org.mc4j.ems.connection.bean.attribute.EmsAttribute;
import org.rhq.core.domain.configuration.Configuration;
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;
/**
* Abstract base class to discover JBossMessaging and JBossMQ related stuff
* @author Heiko W. Rupp
*/
public abstract class AbstractMessagingDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
/**
* Do the real discovery
* @param context ResourceContext
* @param objectName Object name of the object that determines if the service is available
* @param resourceName Name of the resource
* @param resourceDescription Description of the resource
* @param versionSource A string that determines how to obtain the version. See {@link #getVersionFromSource(org.mc4j.ems.connection.EmsConnection, String)}
* @return The details of a discovered resource.
*/
protected Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context, String objectName, String resourceName, String resourceDescription, String versionSource) {
Set<DiscoveredResourceDetails> result = new HashSet<DiscoveredResourceDetails>();
ObjectNameQueryUtility queryUtility = new ObjectNameQueryUtility(objectName);
JMXComponent parentResourceComponent = context.getParentResourceComponent();
EmsConnection connection = parentResourceComponent.getEmsConnection();
Configuration pluginConfig = context.getDefaultPluginConfiguration();
List<EmsBean> beans = connection.queryBeans(queryUtility.getTranslatedQuery());
if (beans.size() == 1) {
String version = getVersionFromSource(connection, versionSource);
DiscoveredResourceDetails detail = new DiscoveredResourceDetails(context.getResourceType(), objectName, resourceName, version, resourceDescription, pluginConfig, null);
result.add(detail);
}
return result;
}
/**
* Parse the passed source information and construct the version string from it
* @param connection EmsConnection to use for this.
* @param versionSource The source string. This is of the form "domain:mbean;att1,att2,..."
* @return A string naming the resource or null if it can't be obtained.
*/
private String getVersionFromSource(EmsConnection connection, String versionSource) {
int pos;
pos = versionSource.indexOf(';');
if (pos < 0)
return null;
String beanName = versionSource.substring(0, pos);
String attribs = versionSource.substring(pos + 1);
String[] attrs = attribs.split(",");
try {
ObjectNameQueryUtility queryUtility = new ObjectNameQueryUtility(beanName);
List<EmsBean> beans = connection.queryBeans(queryUtility.getTranslatedQuery());
if (beans.size() == 1) {
EmsBean bean = beans.get(0);
bean.refreshAttributes(Arrays.asList(attrs));
StringBuilder ret = new StringBuilder();
Iterator<String> iter = Arrays.asList(attrs).iterator();
while (iter.hasNext()) {
String att = iter.next();
EmsAttribute eatt = bean.getAttribute(att);
ret.append((String) eatt.getValue());
if (iter.hasNext())
ret.append(" ");
}
return ret.toString();
} else
return null;
} catch (EmsException ee) {
return null;
} catch (RuntimeException nse) { // NotSerializableException
return null; // We can't determine the version from this attribute
}
}
}