/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library 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 library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.rhq.plugin;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.naming.NamingException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.managed.api.ComponentType;
import org.jboss.managed.api.ManagedComponent;
import org.jboss.managed.api.ManagedProperty;
import org.jboss.managed.api.RunState;
import org.mc4j.ems.connection.EmsConnection;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.jbossas5.ApplicationServerComponent;
import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
import org.teiid.rhq.admin.DQPManagementView;
import org.teiid.rhq.plugin.util.PluginConstants;
import org.teiid.rhq.plugin.util.ProfileServiceUtil;
import org.teiid.rhq.plugin.util.PluginConstants.Operation;
import org.teiid.rhq.plugin.util.PluginConstants.ComponentType.Platform;
/**
*
*/
public class PlatformComponent extends Facet {
private final Log LOG = LogFactory.getLog(PluginConstants.DEFAULT_LOGGER_CATEGORY);
@Override
public void start(ResourceContext context) {
this.setComponentName(context.getPluginConfiguration().getSimpleValue( "name", null)); //$NON-NLS-1$
this.resourceConfiguration = context.getPluginConfiguration();
super.start(context);
}
/**
* @see org.teiid.rhq.plugin.Facet#getComponentType()
* @since 7.0
*/
@Override
String getComponentType() {
return PluginConstants.ComponentType.Platform.NAME;
}
@Override
public AvailabilityType getAvailability() {
RunState runState;
try {
runState = ProfileServiceUtil.getRuntimeEngineDeployer(getConnection()).getRunState();
} catch (NamingException e) {
LOG .debug("Naming exception getting: " + PluginConstants.ComponentType.Platform.TEIID_RUNTIME_ENGINE); //$NON-NLS-1$
return AvailabilityType.DOWN;
} catch (Exception e) {
LOG .debug("Exception getting: " + PluginConstants.ComponentType.Platform.TEIID_RUNTIME_ENGINE); //$NON-NLS-1$
return AvailabilityType.DOWN;
}
return (runState == RunState.RUNNING) ? AvailabilityType.UP: AvailabilityType.DOWN;
}
@Override
protected void setOperationArguments(String name,
Configuration configuration, Map<String, Object> valueMap) {
// Parameter logic for System Operations
if (name.equals(Platform.Operations.KILL_REQUEST)) {
valueMap.put(Operation.Value.REQUEST_ID, configuration.getSimple(Operation.Value.REQUEST_ID).getLongValue());
valueMap.put(Operation.Value.SESSION_ID, configuration.getSimple(Operation.Value.SESSION_ID).getStringValue());
} else if (name.equals(Platform.Operations.KILL_REQUEST)) {
valueMap.put(Operation.Value.TRANSACTION_ID, configuration.getSimple(Operation.Value.TRANSACTION_ID).getStringValue());
} else if (name.equals(Platform.Operations.KILL_SESSION)) {
valueMap.put(Operation.Value.SESSION_ID, configuration.getSimple(Operation.Value.SESSION_ID).getStringValue());
} else if (name.equals(Platform.Operations.DEPLOY_VDB_BY_URL)) {
valueMap.put(Operation.Value.VDB_URL, configuration.getSimple(Operation.Value.VDB_URL).getStringValue());
valueMap.put(Operation.Value.VDB_DEPLOY_NAME, configuration.getSimple(Operation.Value.VDB_DEPLOY_NAME).getStringValue());
valueMap.put(Operation.Value.VDB_VERSION, configuration.getSimple(Operation.Value.VDB_VERSION).getIntegerValue());
}
}
@Override
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests) throws Exception {
DQPManagementView view = new DQPManagementView();
Map<String, Object> valueMap = new HashMap<String, Object>();
try {
for (MeasurementScheduleRequest request : requests) {
String name = request.getName();
LOG.debug("Measurement name = " + name); //$NON-NLS-1$
// Initialize any parameters to be used in the retrieval of
// metric values
Object metric = view.getMetric(getConnection(),
getComponentType(), this.getComponentIdentifier(),
name, valueMap);
if (metric instanceof Double) {
report.addData(new MeasurementDataNumeric(request, (Double) metric));
}
else if (metric instanceof Integer ){
report.addData(new MeasurementDataNumeric(request, new Double(((Integer)metric).doubleValue())));
}
else if (metric instanceof Long){
report.addData(new MeasurementDataNumeric(request, new Double(((Long)metric).longValue())));
}
else {
LOG.error("Metric value must be a numeric value"); //$NON-NLS-1$
}
}
} catch (Exception e) {
LOG.error("Failed to obtain measurement [" + name + "]. Cause: " + e); //$NON-NLS-1$ //$NON-NLS-2$
throw (e);
}
}
@Override
public void stop() {
// TODO Auto-generated method stub
super.stop();
}
@Override
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
resourceConfiguration = report.getConfiguration().deepCopy();
Configuration resourceConfig = report.getConfiguration();
ManagementView managementView = null;
ComponentType componentType = new ComponentType(
PluginConstants.ComponentType.Platform.TEIID_TYPE,
PluginConstants.ComponentType.Platform.TEIID_SUB_TYPE);
report.setStatus(ConfigurationUpdateStatus.SUCCESS);
try {
managementView = getConnection().getManagementView();
Set<ManagedComponent> allComponents = managementView.getComponentsForType(componentType);
for (ManagedComponent managedComponent : allComponents) {
Map<String, ManagedProperty> managedProperties = managedComponent.getProperties();
ProfileServiceUtil.convertConfigurationToManagedProperties(managedProperties, resourceConfig, resourceContext.getResourceType(), managedComponent.getName());
try {
managementView.updateComponent(managedComponent);
} catch (Exception e) {
LOG.error("Unable to update component [" //$NON-NLS-1$
+ managedComponent.getName() + "] of type " //$NON-NLS-1$
+ componentType + ".", e); //$NON-NLS-1$
report.setStatus(ConfigurationUpdateStatus.FAILURE);
report.setErrorMessageFromThrowable(e);
}
}
} catch (Exception e) {
LOG.error("Unable to process update request", e); //$NON-NLS-1$
report.setStatus(ConfigurationUpdateStatus.FAILURE);
report.setErrorMessageFromThrowable(e);
}
managementView.load();
}
/*
* (non-Javadoc)
*
* @see org.teiid.rhq.plugin.Facet#loadResourceConfiguration()
*/
@Override
public Configuration loadResourceConfiguration() {
// Get plugin config
Configuration c = resourceConfiguration;
getProperties(c);
return c;
}
/**
* @param mc
* @param configuration
* @throws Exception
*/
private void getProperties(Configuration configuration) {
// Get all ManagedComponents of type Teiid and subtype dqp
Set<ManagedComponent> mcSet = null;
try {
mcSet = ProfileServiceUtil.getManagedComponents(getConnection(),
new org.jboss.managed.api.ComponentType(
PluginConstants.ComponentType.Platform.TEIID_TYPE,
PluginConstants.ComponentType.Platform.TEIID_SUB_TYPE));
} catch (NamingException e) {
LOG.error("NamingException getting components in Platform loadConfiguration(): " + e.getMessage()); //$NON-NLS-1$
} catch (Exception e) {
LOG.error("Exception getting components in Platform loadConfiguration(): " + e.getMessage()); //$NON-NLS-1$
}
for (ManagedComponent mc : mcSet) {
Map<String, ManagedProperty> mcMap = mc.getProperties();
String name = mc.getName();
setProperties(name, mcMap, configuration);
}
}
/**
* @param mcMap
* @param configuration
*/
private void setProperties(String compName, Map<String, ManagedProperty> mcMap, Configuration configuration) {
for (ManagedProperty mProp : mcMap.values()) {
try {
String value = ProfileServiceUtil.stringValue(mProp.getValue());
PropertySimple prop = new PropertySimple(compName+"."+mProp.getName(), value); //$NON-NLS-1$
configuration.put(prop);
} catch (Exception e) {
LOG.error("Exception setting properties in Platform loadConfiguration(): " + e.getMessage()); //$NON-NLS-1$
}
}
}
@Override
public ProfileServiceConnection getConnection() {
return ((ApplicationServerComponent) this.resourceContext.getParentResourceComponent()).getConnection();
}
@Override
public EmsConnection getEmsConnection() {
return null;
}
}