package org.hyperic.hq.api.transfer.mapping;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.hyperic.hq.api.model.ConfigurationOption;
import org.hyperic.hq.api.model.ConfigurationTemplate;
import org.hyperic.hq.product.ProductPlugin;
import org.hyperic.util.config.ConfigOption;
import org.hyperic.util.config.ConfigSchema;
import org.hyperic.util.config.EnumerationConfigOption;
import org.hyperic.util.config.StringConfigOption;
import org.springframework.stereotype.Component;
@Component
public class ConfigurationTemplateMapper {
private static final String CONFIG_OPTION_TYPE_IP = "ip";
private static final String CONFIG_OPTION_TYPE_INT = "int";
private static final String UI_CONFIG_TYPE_CONTROL = "Control";
private static final String UI_CONFIG_TYPE_SHARED = "Shared";
private static final String UI_CONFIG_TYPE_MONITORING = "Monitoring";
public ConfigurationTemplate toConfigurationTemplate(ConfigSchema configSchema, String configType, ConfigurationTemplate configTemplate){
if (null == configSchema)
return configTemplate;
final List<ConfigOption> options = configSchema.getOptions();
if (null == configTemplate) {
configTemplate = new ConfigurationTemplate();
configTemplate.setConfigurationOptions(new ArrayList<ConfigurationOption>(options.size()));
}
final List<ConfigurationOption> apiConfigurationOptions = configTemplate.getConfigurationOptions();
for(ConfigOption configOption:options) {
apiConfigurationOptions.add(toConfigurationOption(configOption, configType));
}
return configTemplate;
}
/**
*
* @param configSchemas schemas per platform
* @param configType
* @param configTemplate the configTemplate to append config options to. If null, a new config
* template will be returned
* @return configurationTemplate with mapped config options
*/
public ConfigurationTemplate toConfigurationTemplate(Map<String,ConfigSchema> configSchemas, String configType, ConfigurationTemplate configTemplate){
if ((null == configSchemas) || configSchemas.isEmpty() || (null == configType)) {
return configTemplate;
}
if (null == configTemplate) {
configTemplate = new ConfigurationTemplate();
}
// a very rough estimation according to the first option list
final ConfigSchema firstConfigSchema = configSchemas.values().iterator().next();
final int firstOptionsListSize =
(((null == firstConfigSchema) || (null == firstConfigSchema.getOptions())) ? 1 :
firstConfigSchema.getOptions().size());
int optionsSizeEstimation = ProductPlugin.CONFIGURABLE_TYPES.length * (firstOptionsListSize + 1);
if (null == configTemplate.getConfigurationOptions()) {
configTemplate.setConfigurationOptions(new ArrayList<ConfigurationOption>(optionsSizeEstimation));
}
final List<ConfigurationOption> apiConfigurationOptions = configTemplate.getConfigurationOptions();
// Here we combine configuration options from all platforms,
// and each option name will appear only once in configTemplate
Set<String> optionNames = new HashSet<String>(optionsSizeEstimation);
for (Map.Entry<String, ConfigSchema> configSchemaPerPlatform:configSchemas.entrySet()) {
final List<ConfigOption> configOptions = configSchemaPerPlatform.getValue().getOptions();
for (ConfigOption configOption:configOptions) {
final String optionName = configOption.getName();
if (!optionNames.contains(optionName)) {
optionNames.add(optionName);
apiConfigurationOptions.add(toConfigurationOption(configOption, configType));
}
}
}
return configTemplate;
}
@SuppressWarnings("unchecked")
private ConfigurationOption toConfigurationOption(ConfigOption configOption, String configType) {
List<String> enumValues = null;
if (configOption instanceof EnumerationConfigOption) {
EnumerationConfigOption enumConfigOption = (EnumerationConfigOption)configOption;
enumValues = enumConfigOption.getValues();
}
// configType is used instead of category
ConfigurationOption apiConfigurationOption = new ConfigurationOption(configOption.getName(), configOption.getDescription(),
toUIConfigType(configType),// configOption.getCategory(),
configOption.getDefault(), configOption.getConfirm(), configOption.isOptional(), toType(configOption), enumValues);
return apiConfigurationOption;
}
/**
*
* @param configOption One of { int, double, boolean, long, string, ip, enum, secret, hidden, port, macaddress, stringarray}
* @return
*/
private String toType(ConfigOption configOption) {
final String className = configOption.getClass().getSimpleName();
// IntegerConfigOption -> integer, BooleanConfigOption -> boolean, ...
String typeName = StringUtils.removeEnd(className, ConfigOption.class.getSimpleName()).toLowerCase();
// integer->int, ipaddress->ip, enumeration->enum,
// string.isSecret->secret, string.isHidden->hidden
if ("integer".equals(typeName))
typeName = CONFIG_OPTION_TYPE_INT;
else if ("ipaddress".equals(typeName))
typeName = CONFIG_OPTION_TYPE_IP;
else if ("enumeration".equals(typeName))
typeName = "enum";
else if (configOption instanceof StringConfigOption) {
StringConfigOption strConfigOption = (StringConfigOption) configOption;
if (strConfigOption.isSecret())
typeName = "secret";
else if (strConfigOption.isHidden())
typeName = "hidden";
}
return typeName;
}
private String toUIConfigType(String configType) {
// final static Map<String,String>
String uiConfigType = "";
if(ProductPlugin.TYPE_MEASUREMENT.equals(configType)) {
uiConfigType = UI_CONFIG_TYPE_MONITORING;
}else if(ProductPlugin.TYPE_PRODUCT.equals(configType)) {
uiConfigType = UI_CONFIG_TYPE_SHARED;
}else if(ProductPlugin.TYPE_CONTROL.equals(configType)) {
uiConfigType = UI_CONFIG_TYPE_CONTROL;
}
return uiConfigType;
}
}