package alien4cloud.utils.services;
import alien4cloud.exception.InvalidArgumentException;
import org.alien4cloud.tosca.model.definitions.PropertyDefinition;
import alien4cloud.paas.exception.NotSupportedException;
import alien4cloud.tosca.normative.IPropertyType;
import alien4cloud.tosca.normative.InvalidPropertyValueException;
import alien4cloud.tosca.normative.ScalarType;
import alien4cloud.tosca.normative.ScalarUnit;
import alien4cloud.tosca.normative.ToscaType;
import alien4cloud.utils.MapUtil;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class PropertyValueService {
/**
* Extract the value from a sub-path of a property.
*
* @param propertyValue The value of the property.
* @param path The path to get the value.
* @return The value at the given path or propertyValue if the path is null or empty.
*/
public static Object getValue(Object propertyValue, String path) {
if (path == null || path.isEmpty()) {
return propertyValue;
}
return MapUtil.get(propertyValue, path);
}
/**
* Get a property value in the given unit.
*
* @param propertyValue The property value from which to get the value in a specified unit
* @param unit The unit in which to get the value.
* @param propertyDefinition The property definition of the root property.
* @return The value in the correct unit.
*/
public static String getValueInUnit(Object propertyValue, String unit, boolean ceil, PropertyDefinition propertyDefinition) {
// TODO manage complex objects and sub-paths
// @param path The optional sub-path of the property (may be null or empty).
if (propertyValue instanceof String) {
return getValueInUnit((String) propertyValue, unit, ceil, propertyDefinition.getType());
} else if (propertyValue instanceof List) {
log.error("Conversion of unit is currently not supported for complex properties");
throw new NotSupportedException("Conversion of unit is currently not supported for complex properties");
} else if (propertyValue instanceof Map) {
log.error("Conversion of unit is currently not supported for complex properties");
throw new NotSupportedException("Conversion of unit is currently not supported for complex properties");
} else {
throw new InvalidArgumentException(
"Not expecting to receive unit conversion for other types than String, Map or List as " + propertyValue.getClass().getName());
}
}
private static String getValueInUnit(String propertyValue, String unit, boolean ceil, String toscaType) {
IPropertyType type = ToscaType.fromYamlTypeName(toscaType);
if (type instanceof ScalarType) {
try {
ScalarUnit scalarUnit = ((ScalarType) type).parse(propertyValue);
double convertedValue = scalarUnit.convert(unit);
if (ceil) {
convertedValue = Math.ceil(convertedValue);
}
return format(convertedValue);
} catch (InvalidPropertyValueException e) {
log.error("e");
throw new InvalidArgumentException(e.getMessage());
}
}
throw new InvalidArgumentException("Type is not a scalar type");
}
private static String format(double d) {
if (d == (long) d)
return String.format("%d", (long) d);
else
return String.format("%s", d);
}
}