/*
* 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.jbosscache3;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
import org.mc4j.ems.connection.EmsConnection;
import org.mc4j.ems.connection.bean.EmsBean;
import org.mc4j.ems.connection.bean.attribute.EmsAttribute;
import org.mc4j.ems.connection.bean.operation.EmsOperation;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.plugins.jbossas5.ProfileServiceComponent;
import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
/**
*
* @author Filip Drabek
*
*/
public class JBossCacheDetailComponent implements MeasurementFacet, OperationFacet,
ProfileServiceComponent<ProfileServiceComponent<?>> {
public static String JMX_NAME = "jmx-name";
public static String CACHE_DETAIL_BEAN_NAME = "bean-name";
public ProfileServiceComponent parentComponent;
private String beanName;
private final Log log = LogFactory.getLog(this.getClass());
private ResourceContext<ProfileServiceComponent<?>> resourceContext;
public void start(ResourceContext<ProfileServiceComponent<?>> context) throws InvalidPluginConfigurationException,
Exception {
resourceContext = context;
parentComponent = context.getParentResourceComponent();
EmsConnection connection = getEmsConnection();
beanName = context.getPluginConfiguration().getSimple(CACHE_DETAIL_BEAN_NAME).getStringValue();
log.debug("JBoss Cache " + beanName + " was loaded.");
}
public void stop() {
return;
}
public AvailabilityType getAvailability() {
try {
EmsConnection connection = parentComponent.getEmsConnection();
if (connection == null)
return AvailabilityType.DOWN;
boolean up = connection.getBean(beanName).isRegistered();
return up ? AvailabilityType.UP : AvailabilityType.DOWN;
} catch (Exception e) {
if (log.isDebugEnabled())
log.debug("Can not determine availability for " + beanName + ": " + e);
return AvailabilityType.DOWN;
}
}
public EmsConnection getEmsConnection() {
return parentComponent.getEmsConnection();
}
public ProfileServiceConnection getConnection() {
return parentComponent.getConnection();
}
@NotNull
public ResourceContext<ProfileServiceComponent<?>> getResourceContext() {
return resourceContext;
}
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
EmsConnection connection = getEmsConnection();
EmsBean detailComponent = connection.getBean(beanName);
for (MeasurementScheduleRequest request : metrics) {
String metricName = request.getName();
try {
EmsAttribute atribute = detailComponent.getAttribute(metricName);
Object value = atribute.refresh();
if (value != null)
if (request.getDataType() == DataType.MEASUREMENT) {
Double number = ((Number) value).doubleValue();
report.addData(new MeasurementDataNumeric(request, number));
} else if (request.getDataType() == DataType.TRAIT) {
report.addData(new MeasurementDataTrait(request, value.toString()));
}
} catch (Exception e) {
log.error("Failure to collect measurement data for metric " + metricName + " from bean "
+ detailComponent.getBeanName(), e);
}
}
}
public OperationResult invokeOperation(String name, Configuration parameters) throws InterruptedException,
Exception {
OperationResult result = null;
try {
EmsBean detailComponent = getEmsConnection().getBean(beanName);
EmsOperation operation = detailComponent.getOperation(name);
Object obj = operation.invoke(new Object[] {});
if (obj != null) {
result = new OperationResult();
result.getComplexResults().put(
new PropertySimple(OperationResult.SIMPLE_OPERATION_RESULT_NAME, String.valueOf(obj)));
}
} catch (Exception e) {
log.error("Failure to invoke operation " + name + " on bean " + beanName, e);
}
// If this is a lifecycle operation ask for an avail check
boolean availCheck = name.toLowerCase().equals("stop") || name.toLowerCase().contains("start");
if (availCheck) {
getResourceContext().getAvailabilityContext().requestAvailabilityCheck();
}
return result;
}
}