org.rhq.modules.plugins.jbossas7.ModClusterContextDiscoveryComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.rhq.modules.plugins.jbossas7.ModClusterContextDiscoveryComponent.java

Source

/*
 * RHQ Management Platform
 * Copyright (C) 2005-2012 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 as published by
 * the Free Software Foundation version 2 of the License.
 *
 * 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 for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
package org.rhq.modules.plugins.jbossas7;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.modules.plugins.jbossas7.json.Address;
import org.rhq.modules.plugins.jbossas7.json.Operation;
import org.rhq.modules.plugins.jbossas7.json.Result;
import org.rhq.modules.plugins.jbossas7.modcluster.ProxyInfo;

/**
 * Discovers mod_cluster contexts using the proxyInfo details from as7.
 *
 * @author Simeon Pinder
 */
public class ModClusterContextDiscoveryComponent extends SubsystemDiscovery {

    private final Log log = LogFactory.getLog(this.getClass());
    private static Log staticLogger = LogFactory.getLog(ModClusterContextDiscoveryComponent.class);
    private final String PROXY_INFO_OPERATION = "read-proxies-info";
    private final String CONFIGURATION = ",mod-cluster-config=configuration";
    private static String jvmRoute = null;

    /* (non-Javadoc)
     * @see org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent#discoverResources(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext)
     */
    public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent<?>> context) {

        //initialize discovered list
        Set<DiscoveredResourceDetails> entities = new HashSet<DiscoveredResourceDetails>();

        //BZ:823624: Leave the following blank until this BZ and JIRA 4847 have been resolved.
        if (jvmRoute == null) {//lazy load it.
            //            jvmRoute = "00fa6bff-83a2-3bde-9e76-998b1a4a8c2c";
            jvmRoute = "";
        }

        //Retrieve rawProxyInfo to determine jvmRoute instances
        String rawProxyInfo = "";

        //Retrieve as7 and modcluster components
        BaseComponent parentComponent = context.getParentResourceComponent();
        ASConnection connection = parentComponent.getASConnection();
        //Should be modcluster element for standalone or managed instances.
        String path = parentComponent.getPath();
        //remove configuration portion
        int located = -1;
        if ((located = path.indexOf(CONFIGURATION)) > -1) {
            path = path.substring(0, located);
        }
        if (path == null || path.isEmpty()) {
            log.error("Path plugin config is null for ResourceType [" + context.getResourceType().getName() + "].");
            return entities;
        }

        Address addr = new Address(path);
        Operation op = new Operation(PROXY_INFO_OPERATION, addr);
        Result result = connection.execute(op);
        //get ProxyInfo and parse
        rawProxyInfo = extractRawProxyInfo(result);
        ProxyInfo proxyInfo = new ProxyInfo(rawProxyInfo);

        //only discover the virtualhosts and webcontexts relevant to this modcluster node.
        for (ProxyInfo.Context availableContext : proxyInfo.getAvailableContexts()) {
            if (availableContext.getJvmRoute().equals(jvmRoute)) {
                //prepend the modcluster component to the webcontext key for identification later
                String resourceKey = path + ":" + availableContext.createKey();
                DiscoveredResourceDetails detail = new DiscoveredResourceDetails(context.getResourceType(),
                        resourceKey, availableContext.createName(), null, "Webapp Context", null, null);
                entities.add(detail);
            }
        }
        return entities;
    }

    /** Extracts the ProxyInformation details as returned by AS7 CLI.
     *  Assumes that result.getResult() is of type ArrayList.
     * @param result
     * @return
     */
    static String extractRawProxyInfo(Result result) {
        String rawProxyInfo = "";
        if (result != null && result.isSuccess()) {
            //in invalid type, log and bail.
            if (!(result.getResult() instanceof ArrayList)) {
                staticLogger.warn("Attempting to extract proxyInfo but JSON type information is not correct.");
                return rawProxyInfo;
            }

            //Extract just the values portion Ex. returns "{proxyList},{value}:
            ArrayList container = (ArrayList) result.getResult();
            if ((container != null) && !container.isEmpty()) {
                Object type = container.get(0);
                String values = "";
                if (type instanceof String) {
                    //We only need the value element as the rest is extra.
                    values += container.get(1);
                } else {
                    values = container.toString();
                }
                rawProxyInfo = values;
            }
        }
        return rawProxyInfo;
    }
}