/*
* 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.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.apache.commons.logging.Log;
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.domain.configuration.PropertySimple;
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.domain.resource.ResourceType;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.jbossas.util.DeploymentUtility;
import org.rhq.plugins.jbossas.util.XMLConfigurationEditor;
import org.rhq.plugins.jmx.MBeanResourceComponent;
/**
* Common base class for Messaging related stuff
* @author Heiko W. Rupp
*/
public abstract class AbstractMessagingComponent extends MBeanResourceComponent<JBossASServerComponent<?>> implements
CreateChildResourceFacet {
private static final Pattern PROPERTY_PATTERN = Pattern.compile("^(.*:.*):(.*)$");
protected static final String PLUGIN_CONFIG_NAME_PROP = "name";
private static final String MBEAN_NAME_PROP = "MBeanName";
XMLConfigurationEditor xmlEditor;
ResourceType resourceType;
protected String name;
protected Log LOG = null;
public void start(ResourceContext<JBossASServerComponent<?>> resourceContext, XMLConfigurationEditor editor) {
super.start(resourceContext);
this.resourceType = resourceContext.getResourceType();
xmlEditor = editor;
this.name = resourceContext.getPluginConfiguration().getSimpleValue(PLUGIN_CONFIG_NAME_PROP, null);
}
protected void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests, String pattern) {
Set<MeasurementScheduleRequest> others = new HashSet<MeasurementScheduleRequest>();
for (MeasurementScheduleRequest request : requests) {
// Handle stuff for the generic Messaging MBeans ourselves. Pass the remainder
// to our parent later.
if (request.getName().startsWith(pattern)) {
Matcher m = PROPERTY_PATTERN.matcher(request.getName());
if (m.matches() && (m.group(1) != null)) {
EmsBean eBean = getEmsConnection().getBean(m.group(1));
List<String> attributes = new ArrayList<String>(1);
attributes.add(m.group(2));
eBean.refreshAttributes(attributes);
EmsAttribute emsAtt = eBean.getAttribute(m.group(2));
Object value = emsAtt.getValue();
if ((request.getDataType() == DataType.MEASUREMENT) && (value instanceof Number)) {
report.addData(new MeasurementDataNumeric(request, ((Number) value).doubleValue()));
} else if (request.getDataType() == DataType.TRAIT) {
String displayValue = null;
if ((value != null) && value.getClass().isArray()) {
displayValue = Arrays.deepToString((Object[]) value);
} else {
displayValue = String.valueOf(value);
}
report.addData(new MeasurementDataTrait(request, displayValue));
}
}
} else
others.add(request);
}
super.getValues(report, others);
}
@Override
public Configuration loadResourceConfiguration() {
String resourceKey = getResourceContext().getResourceKey();
JBossASServerComponent jasco = getOurJBossASComponent();
File deploymentFile = jasco.getDeploymentFilePath(resourceKey);
Configuration loadedConfiguration = xmlEditor.loadConfiguration(deploymentFile, this.name);
if (loadedConfiguration == null)
return null;
String boundJNDIName = DeploymentUtility.getJndiNameBinding(getEmsBean());
loadedConfiguration.put(new PropertySimple("JNDIBinding", boundJNDIName));
return loadedConfiguration;
}
private JBossASServerComponent getOurJBossASComponent() {
ResourceComponent parent = getResourceContext().getParentResourceComponent();
JBossASServerComponent jasco;
if (parent instanceof JMSComponent) {
jasco = ((JMSComponent) parent).getResourceContext().getParentResourceComponent();
} else if (parent instanceof JBossMessagingComponent) {
jasco = ((JBossMessagingComponent) parent).getResourceContext().getParentResourceComponent();
} else if (parent instanceof JBossASServerComponent) {
jasco = (JBossASServerComponent) parent;
} else
jasco = new JBossASServerComponent(); // TODO fix me
return jasco;
}
@Override
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
JBossASServerComponent jasco = getOurJBossASComponent();
File deploymentFile = jasco.getDeploymentFilePath(getResourceContext().getResourceKey());
// Check to see if the user is changing the name of this JMS Topic/Queue
String mBeanName = report.getConfiguration().getSimpleValue(MBEAN_NAME_PROP, null);
boolean mBeanNameChanged = false;
if (!mBeanName.equals(this.name)) {
LOG.info("The MBEan Name for this Topic/Queue has been changed. This change will appear in the <mbean> tag for"
+ "this Topic/Queue.");
// User has changed the name, so update the plugin configuration.
PropertySimple nameProp = getResourceContext().getPluginConfiguration().getSimple(PLUGIN_CONFIG_NAME_PROP);
nameProp.setStringValue(mBeanName);
mBeanNameChanged = true;
}
if ((deploymentFile == null) || !deploymentFile.exists()) {
deploymentFile = new File(jasco.getConfigurationPath(), name + ".xml");
}
xmlEditor.updateConfiguration(deploymentFile, this.name, report);
if (mBeanNameChanged) {
this.name = mBeanName;
}
}
public void deleteResource() throws Exception {
String resourceKey = getResourceContext().getResourceKey();
JBossASServerComponent parent = getOurJBossASComponent();
File deploymentFile = parent.getDeploymentFilePath(resourceKey);
assert deploymentFile.exists() : "Deployment file " + deploymentFile + " doesn't exist for resource "
+ resourceKey;
xmlEditor.deleteComponent(deploymentFile, this.name);
parent.redeployFile(deploymentFile);
}
/**
* Returns the canonical version of the passed ObjectName
* @param objectName a valid {@link ObjectName}
* @return an {@link ObjectName} in its canonical form
* @throws MalformedObjectNameException if the passed {@link ObjectName} is invalid
*/
public String getCanonicalName(String objectName) throws MalformedObjectNameException {
ObjectName on = new ObjectName(objectName);
return on.getCanonicalName();
}
}