blob: 58554221d4ebf4165038aae06402341059f30c57 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 RBEI and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v. 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Adhith Gopal - Initial API and Implementation
*******************************************************************************/
package org.eclipse.blockchain.core;
import java.math.BigInteger;
import org.web3j.utils.Numeric;
/**
* This class is used to cast the string inputs into their correspomding java
* classes
*/
public class SolidityDynamicValueCaster {
private SolidityDynamicValueCaster() {
}
/**
* This method is used to perform dynamic value casting of params that
* should be used while invvoking smart contract methods
*
* @param valueToCast
* - The String value obtained from the user
* @param type
* - The actual type to which the object should be casted to
* @return - Casted value
*/
public static Object castValue(final String valueToCast,
final Class<?> type) {
/**
* Boolean Data types
*/
if (type.getName().equals(Boolean.class.getName())) {
return Boolean.parseBoolean(valueToCast);
} else if (type.getName().equals(Byte.class.getName())) {
return Byte.parseByte(valueToCast);
} else if (type.getName().equals(Short.class.getName())) {
return Short.parseShort(valueToCast);
} else if (type.getName().equals(Integer.class.getName())) {
return Integer.parseInt(valueToCast);
} else if (type.getName().equals(Long.class.getName())) {
return Long.parseLong(valueToCast);
} else if (type.getName().equals(Float.class.getName())) {
return Float.parseFloat(valueToCast);
} else if (type.getName().equals(Double.class.getName())) {
return Double.parseDouble(valueToCast);
} else if (type.getName().equals(String.class.getName())) {
return valueToCast;
} else if (type.getName().equals(Character.class)) {
return Character.valueOf(valueToCast.charAt(0));
} else if (type.getName().equals(BigInteger.class.getName())) {
/**
* Non-Primitive Data types
*/
return new BigInteger(valueToCast);
} else {
return null;
}
}
/**
* @param valueToCast
* - This is a comma separated value
* @param type
* - The class type to cast to
* @param dimensionDepth
* - The level of array
* @return - array
*/
public static Object castArrayArgs(final String valueToCast,
final Class<?> type) {
Object obj = null;
MultidimensionalArrayValueCreator multidimensionalArrayValueCreator = new MultidimensionalArrayValueCreator();
String values = valueToCast.split(":")[1];
String dimensions = valueToCast.split(":")[0];
if (type.getName().equals("byte")) {// only for this list of byte array
// - multidimensional array in this
// has to be
// checked
String[] vals = values.split(",");
Object[] byteObjects = new Object[vals.length];
for (int i = 0; i < vals.length; i++) {
byteObjects[i] = getByteArray(vals[i]);
}
obj = multidimensionalArrayValueCreator.getValuesAsList(byteObjects,
dimensions);
} else {
obj = multidimensionalArrayValueCreator
.getValuesAsList(getArray(type, values), dimensions);
}
return obj;
}
/**
* @param value
* @return
*/
public static byte[] getByteArray(final String value) {
return Numeric.hexStringToByteArray(value);
}
private static Object[] getArray(final Class<?> classType,
final String values) {
Object[] objArray = null;
String[] vals = values.split(",");
String type = classType.getName();
if (type.contains("Short")) {
Short[] sh = new Short[vals.length];
for (int i = 0; i < vals.length; i++) {
sh[i] = (Short) castValue(vals[i], classType);
}
objArray = sh;
} else if (type.contains("BigInteger")) {
BigInteger[] bg = new BigInteger[vals.length];
for (int i = 0; i < vals.length; i++) {
bg[i] = (BigInteger) castValue(vals[i], classType);
}
objArray = bg;
} else if (type.contains("Integer")) {
Integer[] it = new Integer[vals.length];
for (int i = 0; i < vals.length; i++) {
it[i] = (Integer) castValue(vals[i], classType);
}
objArray = it;
} else if (type.contains("Long")) {
Long[] lg = new Long[vals.length];
for (int i = 0; i < vals.length; i++) {
lg[i] = (Long) castValue(vals[i], classType);
}
objArray = lg;
} else if (type.contains("Float")) {
Float[] ft = new Float[vals.length];
for (int i = 0; i < vals.length; i++) {
ft[i] = (Float) castValue(vals[i], classType);
}
objArray = ft;
} else if (type.contains("Double")) {
Double[] db = new Double[vals.length];
for (int i = 0; i < vals.length; i++) {
db[i] = (Double) castValue(vals[i], classType);
}
objArray = db;
} else if (type.contains("String")) {
String[] st = new String[vals.length];
for (int i = 0; i < vals.length; i++) {
st[i] = (String) castValue(vals[i], classType);
}
objArray = st;
} else if (type.contains("Boolean")) {
Boolean[] bool = new Boolean[vals.length];
for (int i = 0; i < vals.length; i++) {
bool[i] = (Boolean) castValue(vals[i], classType);
}
objArray = bool;
} else if (type.contains("Character")) {
Character[] chars = new Character[vals.length];
for (int i = 0; i < vals.length; i++) {
chars[i] = (Character) castValue(vals[i], classType);
}
}
return objArray;
}
}