com.intuit.tank.vm.settings.AgentConfig.java Source code

Java tutorial

Introduction

Here is the source code for com.intuit.tank.vm.settings.AgentConfig.java

Source

/**
 * Copyright 2011 Intuit Inc. All Rights Reserved
 */
package com.intuit.tank.vm.settings;

/*
 * #%L
 * Intuit Tank Api
 * %%
 * Copyright (C) 2011 - 2015 Intuit Inc.
 * %%
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * #L%
 */

import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.annotation.Nonnull;

import org.apache.commons.configuration.HierarchicalConfiguration;

/**
 * VmManagerConfig
 * 
 * @author dangleton
 * 
 */
public class AgentConfig implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AgentConfig.class);

    private static final String KEY_AGENT_DATA_FILE_STORAGE = "agent-data-file-storage";
    private static final String KEY_TANK_CLIENT_DEFUALT = "default-tank-client";

    private static final String KEY_MAX_BODY_REPORT_SIZE = "max-body-report-size";
    private static final String KEY_SSL_TIMEOUT = "ssl-timeout";
    private static final String KEY_MAX_RESPONSE_TIME = "max-response-time";
    private static final String KEY_TPS_PERIOD = "tps-period";

    private static final String KEY_VALID_MIME_TYPES = "valid-mime-types/mime-type-regex";
    private static final String KEY_TANK_HTTP_CLIENTS = "tank-http-clients/tank-client";
    private static final String KEY_POLL_TIME_MILIS = "status_report_interval_milis";
    private static final String KEY_MAX_FAILED_WAIT_TIME = "max-failed-wait-time";
    private static final String KEY_OVER_SIMULATION_MAX_TIME = "over-simulation-max-time";

    private static final String KEY_AGENT_PORT = "agent-port";
    private static final String KEY_LOG_POST_RESPONSE = "log-post-response";
    private static final String KEY_LOG_POST_REQUEST = "log-post-request";
    private static final String KEY_LOG_VARIABLES = "log-variables";
    private static final String KEY_CONNECTION_TIMEOUT = "connection-timeout";

    private static final String KEY_REQUEST_HEADERS = "request-headers/header";
    // private static final String KEY_RESULT_PROVIDERS =
    // "result-providers/provider";
    private static final String KEY_HEADER_KEY = "@key";
    // private static final String KEY_DISPLAY_NAME = "@displayName";
    // private static final String KEY_DEFUALT = "@isDefault";

    private static final String KEY_DURATION_SIMULATION = "duration-simulation/simulation";
    private static final String KEY_MIN = "@min";
    private static final String KEY_MAX = "@max";
    private static final String KEY_FOR = "@for";
    private static final String KEY_NAME = "@name";

    private HierarchicalConfiguration config;
    private Set<String> validMimeTypes;
    private Map<String, String> resultsProviderMap;
    private Map<String, String> tankClientMap;
    private Map<String, String> requestHeaderMap;
    private Map<String, String> resultsTypeMap;
    private String defaultResultProvider;
    private Map<String, Range> minMaxMap;
    private Range defaultRange = new Range(50L, 300L);

    @SuppressWarnings("unchecked")
    public AgentConfig(@Nonnull HierarchicalConfiguration config) {
        this.config = config;
        validMimeTypes = new HashSet<String>();
        List<HierarchicalConfiguration> validMimes = config.configurationsAt(KEY_VALID_MIME_TYPES);
        if (validMimes != null) {
            for (HierarchicalConfiguration c : validMimes) {
                validMimeTypes.add(c.getString(""));
            }
        }
        tankClientMap = new HashMap<String, String>();
        // <tank-http-clients>
        // <tank-client name="Apache HttpClient
        // 3.1">com.intuit.tank.httpclient3.TankHttpClient3</tank-client>
        // <tank-client name="apache HttpClient
        // 4.5">com.intuit.tank.httpclient4.TankHttpClient4</tank-client>
        // <tank-http-clients>
        List<HierarchicalConfiguration> tankClients = config.configurationsAt(KEY_TANK_HTTP_CLIENTS);
        if (tankClients != null) {
            for (HierarchicalConfiguration c : tankClients) {
                tankClientMap.put(c.getString(KEY_NAME), c.getString(""));
            }
        }
        if (tankClientMap.isEmpty()) {
            tankClientMap.put("Apache HttpClient 3.1", "com.intuit.tank.httpclient3.TankHttpClient3");
            tankClientMap.put("Apache HttpClient 4.5", "com.intuit.tank.httpclient4.TankHttpClient4");
        }
        resultsProviderMap = new HashMap<String, String>();
        resultsTypeMap = new HashMap<String, String>();
        requestHeaderMap = new HashMap<String, String>();
        List<HierarchicalConfiguration> requestHeaders = config.configurationsAt(KEY_REQUEST_HEADERS);
        if (requestHeaders != null) {
            for (HierarchicalConfiguration c : requestHeaders) {
                String key = c.getString(KEY_HEADER_KEY);
                requestHeaderMap.put(key, c.getString(""));
            }
        }
        minMaxMap = new HashMap<String, Range>();
        List<HierarchicalConfiguration> durations = config.configurationsAt(KEY_DURATION_SIMULATION);
        if (durations != null) {
            for (HierarchicalConfiguration c : durations) {
                try {
                    String key = c.getString(KEY_FOR).trim();
                    int min = c.getInt(KEY_MIN);
                    int max = c.getInt(KEY_MAX);
                    Range r = new Range(min, max);
                    minMaxMap.put(key.toLowerCase(), r);
                } catch (Exception e) {
                    LOG.warn("Error parsing duration: " + e);
                }
            }
        }
        if (!minMaxMap.containsKey("post")) {
            minMaxMap.put("post", new Range(500L, 1000L));
        }
        if (!minMaxMap.containsKey("get")) {
            minMaxMap.put("get", new Range(50L, 300L));
        }
        if (!minMaxMap.containsKey("process")) {
            minMaxMap.put("process", new Range(10L, 50L));
        }
    }

    /**
     * @return the requestHeaderMap
     */
    public Map<String, String> getRequestHeaderMap() {
        return requestHeaderMap;
    }

    public Range getRange(String type) {
        Range ret = minMaxMap.get(type.toLowerCase());
        return ret != null ? ret : defaultRange;
    }

    /**
     * @return the defaultResultProvider
     */
    public String getDefaultResultProvider() {
        return defaultResultProvider;
    }

    /**
     * @return the resultsTypeMap
     */
    public Map<String, String> getResultsTypeMap() {
        return resultsTypeMap;
    }

    /**
     * @param resultsTypeMap
     *            the resultsTypeMap to set
     */
    public void setResultsTypeMap(Map<String, String> resultsTypeMap) {
        this.resultsTypeMap = resultsTypeMap;
    }

    /**
     * @param results
     */
    public String getResultsProviderClass(String providerKey) {
        return resultsProviderMap.get(providerKey);
    }

    /**
     * 
     * @return
     */
    public Long getConnectionTimeout() {
        return config.getLong(KEY_CONNECTION_TIMEOUT, 40000L);
    }

    /**
     * 
     * @return
     */
    public int getTPSPeriod() {
        return config.getInt(KEY_TPS_PERIOD, 15);
    }

    /**
     * @return the Datafile storage root dir
     */
    public int getAgentPort() {
        return config.getInt(KEY_AGENT_PORT, 8090);
    }

    /**
     * 
     * @return whether to log each post request info.
     */
    public boolean getLogPostRequest() {
        return config.getBoolean(KEY_LOG_POST_REQUEST, false);
    }

    /**
     * 
     * @return whether to log each post request info.
     */
    public boolean getLogVariables() {
        return config.getBoolean(KEY_LOG_VARIABLES, false);
    }

    /**
     * 
     * @return
     */
    public boolean getLogPostResponse() {
        return config.getBoolean(KEY_LOG_POST_RESPONSE, false);
    }

    /**
     * @return the Datafile storage root dir
     */
    public String getAgentDataFileStorageDir() {
        return config.getString(KEY_AGENT_DATA_FILE_STORAGE, "/tmp");
    }

    /**
     * @return the SSL Timeout
     */
    public long getSSLTimeout() {
        return config.getLong(KEY_SSL_TIMEOUT, 90000L);
    }

    /**
     * @return the Max amount of time to wait for a response to a request
     */
    public long getMaxAgentResponseTime() {
        return config.getLong(KEY_MAX_RESPONSE_TIME, 5000L);
    }

    /**
     * @return the Max amount of time to wait for a response to a request
     */
    public long getMaxAgentWaitTime() {
        return config.getLong(KEY_MAX_FAILED_WAIT_TIME, 180000L);
    }

    /**
     * @return the Max amount of time to allow a thread to run after simulation
     *         time has been met
     */
    public long getOverSimulationMaxTime() {
        return config.getLong(KEY_OVER_SIMULATION_MAX_TIME, (1000 * 60 * 60 * 2));
    }

    /**
     * @return
     */
    public int getMaxBodyReportSize() {
        return config.getInt(KEY_MAX_BODY_REPORT_SIZE, 5000);
    }

    /**
     * Gets the valid regex patterns for text mime types.
     * 
     * @return
     */
    public Collection<String> getTextMimeTypeRegex() {
        return validMimeTypes;
    }

    /**
     * @return the Datafile storage root dir
     */
    public String getTankClientDefault() {
        return config.getString(KEY_TANK_CLIENT_DEFUALT, "Apache HttpClient 4.5");
    }

    /**
     * @return the Datafile storage root dir
     */
    public String getTankClientClassDefault() {
        String ret = getTankClientMap().get(getTankClientDefault());
        return ret != null ? ret : "com.intuit.tank.httpclient4.TankHttpClient4";
    }

    /**
     * @return the Datafile storage root dir
     */
    public String getTankClientName(String clientClass) {
        String ret = getTankClientDefault();
        for (Entry<String, String> entry : getTankClientMap().entrySet()) {
            if (entry.getValue().equals(clientClass)) {
                ret = entry.getKey();
                break;
            }
        }
        return ret;
    }

    /**
     * @return the tankClientMap map of Tank Client name and class
     */
    public Map<String, String> getTankClientMap() {
        return tankClientMap;
    }

    /**
     * @param pollTime
     * @return
     */
    public long getStatusReportIntervalMilis(long pollTime) {
        return config.getLong(KEY_POLL_TIME_MILIS, pollTime);
    }

}