org.teiid.rhq.plugin.PlatformComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.teiid.rhq.plugin.PlatformComponent.java

Source

/*
 * 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;
    }

}