/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.scripting;
import java.util.List;
import org.apache.commons.lang3.StringEscapeUtils;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.TypedDatum;
import de.rcenvironment.core.datamodel.api.TypedDatumFactory;
import de.rcenvironment.core.datamodel.types.api.BooleanTD;
import de.rcenvironment.core.datamodel.types.api.FloatTD;
import de.rcenvironment.core.datamodel.types.api.IntegerTD;
import de.rcenvironment.core.datamodel.types.api.ShortTextTD;
/**
* Helper clss for data type related methods in all scripting bundles. Used for e.g. converting a given {@link TypedDatum} into an java
* object.
*
* @author Sascha Zur
*/
public final class ScriptDataTypeHelper {
@Deprecated
private ScriptDataTypeHelper() {
}
/**
* Reads the value of a given {@link TypedDatum} and returns it as a java {@link Object}. Used for Python and Jython scripts.
*
* @param typedDatumOfCell to read
* @return Object containing the value in its correct java type
*/
public static Object getObjectOfEntryForPythonOrJython(TypedDatum typedDatumOfCell) {
Object returnValue = null;
if (typedDatumOfCell == null || typedDatumOfCell.getDataType() == DataType.Empty) {
return "None";
}
switch (typedDatumOfCell.getDataType()) {
case Boolean:
boolean bool = (((BooleanTD) typedDatumOfCell).getBooleanValue());
if (bool) {
returnValue = "True";
} else {
returnValue = "False";
}
break;
case ShortText:
returnValue = StringEscapeUtils.escapeJava(((ShortTextTD) typedDatumOfCell).getShortTextValue());
break;
case Integer:
returnValue = ((IntegerTD) typedDatumOfCell).getIntValue();
break;
case Float:
returnValue = ((FloatTD) typedDatumOfCell).getFloatValue();
break;
default:
returnValue = typedDatumOfCell.toString();
break;
}
return returnValue;
}
/**
* Returns a {@link TypedDatum} that fits the java class of the given value.
*
* @param value to create the TypedDatum from
* @param typedDatumFactory :
* @return :
*/
public static TypedDatum getTypedDatum(Object value, TypedDatumFactory typedDatumFactory) {
TypedDatum returnValue = null;
if (value == null) {
returnValue = typedDatumFactory.createEmpty();
} else if (value.getClass().equals(Integer.class)) {
returnValue = typedDatumFactory.createInteger((Integer) value);
} else if (value.getClass().equals(Long.class)) {
returnValue = typedDatumFactory.createInteger((Long) value);
} else if (value.getClass().equals(Double.class)) {
returnValue = typedDatumFactory.createFloat((Double) value);
} else if (value.getClass().equals(Float.class)) {
returnValue = typedDatumFactory.createFloat((Float) value);
} else if (value.getClass().equals(String.class)) {
returnValue = typedDatumFactory.createShortText((String) value);
} else if (value.getClass().equals(Boolean.class)) {
returnValue = typedDatumFactory.createBoolean((Boolean) value);
} else if (value instanceof List) {
@SuppressWarnings("unchecked") List<Object> list = (List<Object>) value;
boolean allFloat = true;
boolean allList = true;
for (Object o : list) {
if (!(o instanceof Double || o instanceof Float || o instanceof Integer)) {
allFloat = false;
}
if (!(o instanceof List)) {
allList = false;
}
}
if (allFloat) {
FloatTD[] values = new FloatTD[list.size()];
for (int i = 0; i < list.size(); i++) {
if (list.get(i) instanceof Double) {
values[i] = typedDatumFactory.createFloat((Double) list.get(i));
} else {
values[i] = typedDatumFactory.createFloat((Integer) list.get(i));
}
}
returnValue = typedDatumFactory.createVector(values);
}
if (allList) {
FloatTD[][] values = new FloatTD[list.size()][];
for (int i = 0; i < list.size(); i++) {
@SuppressWarnings("unchecked") List<Object> row = (List<Object>) list.get(i);
values[i] = new FloatTD[row.size()];
for (int j = 0; j < row.size(); j++) {
if (row.get(j) instanceof Double) {
values[i][j] = typedDatumFactory.createFloat((Double) row.get(j));
} else {
values[i][j] = typedDatumFactory.createFloat((Integer) row.get(j));
}
}
}
returnValue = typedDatumFactory.createMatrix(values);
}
} else {
returnValue = typedDatumFactory.createShortText(value.toString());
}
return returnValue;
}
}