/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.plugins.perftest.configuration;
import java.util.Collection;
import java.util.Map;
import org.rhq.core.domain.configuration.AbstractPropertyMap;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
/**
* Basic implementation of the configuration factory that fills in a valid value for each defined property.
*
* @author Ian Springer
*/
public class SimpleConfigurationFactory implements ConfigurationFactory {
public Configuration generateConfiguration(ConfigurationDefinition definition) {
Collection<PropertyDefinition> allDefinitions = definition.getPropertyDefinitions().values();
Configuration configuration = new Configuration();
for (PropertyDefinition propertyDefinition : allDefinitions)
generateProperty(propertyDefinition, configuration);
return configuration;
}
private static void generateProperty(PropertyDefinition propertyDefinition, AbstractPropertyMap parentPropertyMap) {
Property property;
if (propertyDefinition instanceof PropertyDefinitionSimple) {
property = generatePropertySimple((PropertyDefinitionSimple) propertyDefinition);
} else if (propertyDefinition instanceof PropertyDefinitionMap) {
property = generatePropertyMap((PropertyDefinitionMap) propertyDefinition);
} else if (propertyDefinition instanceof PropertyDefinitionList) {
property = new PropertyList(propertyDefinition.getName());
PropertyDefinitionList propertyDefinitionList = (PropertyDefinitionList) propertyDefinition;
PropertyDefinition listMemberPropertyDefinition = propertyDefinitionList.getMemberDefinition();
// If the property is a List of Maps, add 10 members to it, then recursively populate them.
if (listMemberPropertyDefinition instanceof PropertyDefinitionMap) {
PropertyDefinitionMap propertyDefinitionMap = (PropertyDefinitionMap) listMemberPropertyDefinition;
PropertyList propertyList = (PropertyList) property;
for (int i = 0; i < 10; i++) {
PropertyMap memberProperty = generatePropertyMap(propertyDefinitionMap);
propertyList.add(memberProperty);
}
}
} else {
throw new IllegalStateException("Unsupported PropertyDefinition subclass: "
+ propertyDefinition.getClass().getName());
}
parentPropertyMap.put(property);
}
private static PropertySimple generatePropertySimple(PropertyDefinitionSimple propertyDefinitionSimple) {
String value;
if (propertyDefinitionSimple.getEnumeratedValues() != null
&& !propertyDefinitionSimple.getEnumeratedValues().isEmpty()) {
// pick the first one
value = propertyDefinitionSimple.getEnumeratedValues().get(0).getValue();
} else {
PropertySimpleType propType = propertyDefinitionSimple.getType();
switch (propType) {
case STRING:
value = "blah";
break;
case LONG_STRING:
value = "line 1\nline 2\nline 3\n";
break;
case PASSWORD:
value = "secret";
break;
case BOOLEAN:
value = "true";
break;
case INTEGER:
value = "42";
break;
case LONG:
value = "55555555555555555555555";
break;
case FLOAT:
value = "3.14";
break;
case DOUBLE:
value = "333333333333333333333333.0";
break;
case FILE:
value = "C:/autoexec.bat";
break;
case DIRECTORY:
value = "/usr/bin";
break;
default:
throw new IllegalStateException("Unsupported simple property type: " + propType);
}
}
return new PropertySimple(propertyDefinitionSimple.getName(), value);
}
private static PropertyMap generatePropertyMap(PropertyDefinitionMap propertyDefinitionMap) {
PropertyMap propertyMap = new PropertyMap(propertyDefinitionMap.getName());
Map<String, PropertyDefinition> childPropertyDefinitions = propertyDefinitionMap.getMap();
if (childPropertyDefinitions.isEmpty()) {
// open map
for (int i = 0; i < 10; i++) {
propertyMap.put(new PropertySimple("openMapMember" + i, "value" + i));
}
} else {
for (PropertyDefinition childPropertyDefinition : childPropertyDefinitions.values()) {
generateProperty(childPropertyDefinition, propertyMap);
}
}
return propertyMap;
}
}