package org.jolokia.config; /* * Copyright 2009-2013 Roland Huss * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.util.*; /** * Class encapsulating all Agent configuration, global config and processing parameters * * @author roland * @since 07.02.13 */ public class Configuration { // Alternative query parameter for providing path info public static final String PATH_QUERY_PARAM = "p"; // The global configuration given during startup private Map<ConfigKey, String> globalConfig; /** * Convenience constructor for setting up base configuration with key values pairs. This constructor * is especially suited for unit tests. * * @param keyAndValues an array with even number of elements and ConfigKey and String alternating */ public Configuration(Object ... keyAndValues) { globalConfig = new HashMap<ConfigKey, String>(); for (int i = 0;i < keyAndValues.length; i+= 2) { globalConfig.put( (ConfigKey) keyAndValues[i], (String) keyAndValues[i+1]); } } /** * Update the configuration hold by this object * * @param pExtractor an extractor for retrieving the configuration from some external object */ public void updateGlobalConfiguration(ConfigExtractor pExtractor) { Enumeration e = pExtractor.getNames(); while (e.hasMoreElements()) { String keyS = (String) e.nextElement(); ConfigKey key = ConfigKey.getGlobalConfigKey(keyS); if (key != null) { globalConfig.put(key,pExtractor.getParameter(keyS)); } } } /** * Update this global configuration from a string-string. Only the known keys are taken * from this map * * @param pConfig config map from where to take the configuration */ public void updateGlobalConfiguration(Map<String, String> pConfig) { for (ConfigKey c : ConfigKey.values()) { if (c.isGlobalConfig()) { String value = pConfig.get(c.getKeyValue()); if (value != null) { globalConfig.put(c,value); } } } } /** * Get a configuration value if set as configuration or the default * value if not * * @param pKey the configuration key to lookup * @return the configuration value or the default value if no configuration * was given. */ public String get(ConfigKey pKey) { String value = globalConfig.get(pKey); if (value == null) { value = pKey.getDefaultValue(); } return value; } /** * Get an configuration value as int value * @param pKey the configuration key * @return the value set or, if not, the default value */ public int getAsInt(ConfigKey pKey) { int ret; try { ret = Integer.parseInt(get(pKey)); } catch (NumberFormatException exp) { ret = Integer.parseInt(pKey.getDefaultValue()); } return ret; } /** * Get processing parameters from a string-string map * * @param pParams params to extra. A parameter "p" is used as extra path info * @return the processing parameters */ public ProcessingParameters getProcessingParameters(Map<String,String> pParams) { Map<ConfigKey,String> procParams = ProcessingParameters.convertToConfigMap(pParams); for (Map.Entry<ConfigKey,String> entry : globalConfig.entrySet()) { ConfigKey key = entry.getKey(); if (key.isRequestConfig() && !procParams.containsKey(key)) { procParams.put(key,entry.getValue()); } } return new ProcessingParameters(procParams,pParams.get(PATH_QUERY_PARAM)); } /** * Get an configuration value as boolean value. The value must * be configured as 'true' for this method to return true * * @param pKey the configuration key for which a boolean config value is requested * @return true if the configuration (or the default value, if the configuration is not set) * is "true" for this key, false otherwise. */ public boolean getAsBoolean(ConfigKey pKey) { return Boolean.valueOf(get(pKey)); } /** * Get the number of stored configuration values * * @return number of configuration values */ public int size() { return globalConfig.size(); } /** * Check whether a key is explicitely provided * @param pKey key to check * @return true if the key is contained in the configuration, false otherwise */ public boolean containsKey(ConfigKey pKey) { return globalConfig.containsKey(pKey); } }