/*
* 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.bindings.util;
import java.util.LinkedHashMap;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;
import org.rhq.core.domain.configuration.Configuration;
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.PropertyDefinitionSimple;
/**
* @author Greg Hinkle
*/
public class ConfigurationClassBuilder {
/**
* @param def
* @return Map of propertyName to types for the config def
* @throws NotFoundException
*/
public static LinkedHashMap<String, CtClass> translateParameters(ClassPool cp, ConfigurationDefinition def)
throws NotFoundException {
LinkedHashMap<String, CtClass> result = new LinkedHashMap<String, CtClass>();
if (def == null || def.getPropertyDefinitions() == null) {
return result;
}
for (PropertyDefinition pd : def.getPropertyDefinitions().values()) {
if (pd instanceof PropertyDefinitionSimple) {
PropertyDefinitionSimple simple = (PropertyDefinitionSimple) pd;
String name = pd.getName();
CtClass paramType = getSimpleTypeClass(cp, simple);
result.put(name, paramType);
}
}
return result;
}
private static CtClass getSimpleTypeClass(ClassPool cp, PropertyDefinitionSimple simple) throws NotFoundException {
Class<?> paramType = null;
switch (simple.getType()) {
case STRING:
case LONG_STRING:
case PASSWORD:
case FILE:
case DIRECTORY:
paramType = String.class;
break;
case BOOLEAN:
paramType = Boolean.TYPE;
break;
case INTEGER:
paramType = Integer.TYPE;
break;
case LONG:
paramType = Long.TYPE;
break;
case FLOAT:
paramType = Float.TYPE;
break;
case DOUBLE:
paramType = Double.TYPE;
break;
}
return cp.get(paramType.getName());
}
public static CtClass translateConfiguration(ClassPool cp, ConfigurationDefinition def) throws NotFoundException {
if (def == null) {
return CtClass.voidType;
} else if (def.getPropertyDefinitionSimple("operationResult") != null) {
// Its a simple type
return getSimpleTypeClass(cp, def.getPropertyDefinitionSimple("operationResult"));
} else {
// TODO GH: Build a custom type?
return cp.get(Configuration.class.getName());
}
}
private static String simpleName(String name) {
return decapitalize(name.replaceAll("\\W", ""));
}
private static String decapitalize(String name) {
return Character.toLowerCase(name.charAt(0)) + name.substring(1, name.length());
}
public static Configuration translateParametersToConfig(ClassPool cp, ConfigurationDefinition parametersConfigurationDefinition,
Object[] args) throws NotFoundException {
LinkedHashMap<String, CtClass> translateParameters = translateParameters(cp, parametersConfigurationDefinition);
Configuration config = new Configuration();
int index = 0;
for (String key : translateParameters.keySet()) {
config.put(new PropertySimple(key, args[index++]));
}
return config;
}
public static Object translateResults(ClassPool cp, ConfigurationDefinition resultsConfigurationDefinition, Configuration result)
throws NotFoundException {
CtClass expectedReturn = translateConfiguration(cp, resultsConfigurationDefinition);
if (expectedReturn.equals(cp.get(Configuration.class.getName()))) {
return result;
} else {
//bail on translation if Configuration passed in is null
if (result == null)
return result;
PropertySimple simple = result.getSimple("operationResult");
if (simple != null) {
if (expectedReturn.getName().equals(String.class.getName())) {
return simple.getStringValue();
} else if (expectedReturn.getName().equals(Boolean.class.getName())
|| expectedReturn.getName().equals(Boolean.TYPE.getName())) {
return simple.getBooleanValue();
} else if (expectedReturn.getName().equals(Integer.class.getName())
|| expectedReturn.getName().equals(Integer.TYPE.getName())) {
return simple.getIntegerValue();
} else if (expectedReturn.getName().equals(Long.class.getName())
|| expectedReturn.getName().equals(Long.TYPE.getName())) {
return simple.getLongValue();
} else if (expectedReturn.getName().equals(Float.class.getName())
|| expectedReturn.getName().equals(Float.TYPE.getName())) {
return simple.getFloatValue();
} else if (expectedReturn.getName().equals(Double.class.getName())
|| expectedReturn.getName().equals(Double.TYPE.getName())) {
return simple.getDoubleValue();
} else if (expectedReturn.getName().equals(Boolean.class.getName())
|| expectedReturn.getName().equals(Boolean.TYPE.getName())) {
return simple.getBooleanValue();
}
}
}
return null;
}
}