package com.ggasoftware.uitest.utils; import com.ggasoftware.uitest.control.base.annotations.Complex; import com.ggasoftware.uitest.control.base.map.MapArray; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import static com.ggasoftware.uitest.utils.LinqUtils.select; import static com.ggasoftware.uitest.utils.ReflectionUtils.*; import static java.lang.Integer.parseInt; import static java.lang.String.format; import static java.lang.reflect.Array.get; import static java.lang.reflect.Array.getLength; import static java.util.Arrays.asList; /** * Created by roman.i on 30.09.2014. */ public class PrintUtils { public static String print(Iterable<String> list) { return print(list, ", ", "%s"); } public static String print(Iterable<String> list, String separator) { return print(list, separator, "%s"); } public static <T extends Enum> String printEnum(List<T> enums) { return (enums != null) ? String.join(", ", select(enums, el -> format("%s", el))) : ""; } public static String print(Iterable<String> list, String separator, String format) { return (list != null) ? String.join(separator, select(list, el -> format(format, el))) : ""; } public static String print(String[] list) { return print(list, ", ", "%s"); } public static String print(String[] list, String separator) { return print(list, separator, "%s"); } public static String print(String[] list, String separator, String format) { return print(asList(list), separator, format); } public static String print(int[] list) { return print(list, ", ", "%s"); } public static String print(int[] list, String separator) { return print(list, separator, "%s"); } public static String print(int[] list, String separator, String format) { List<String> result = new ArrayList<>(); for (int i : list) result.add(i + ""); return print(result, separator, format); } public static String print(boolean[] list) { return print(list, ", ", "%s"); } public static String print(boolean[] list, String separator) { return print(list, separator, "%s"); } public static String print(boolean[] list, String separator, String format) { List<String> result = new ArrayList<>(); for (boolean i : list) result.add(i + ""); return print(result, separator, format); } public static String printFields(Object obj) { return printFields(obj, "; "); } public static String printFields(Object obj, String separator) { String className = obj.getClass().getSimpleName(); String params = print(select(getFields(obj, String.class), field -> format("%s: '%s'", field.getName(), getFieldValue(field, obj))), separator, "%s"); return format("%s(%s)", className, params); } private static String printObject(Object obj) { List<String> result = new ArrayList<>(); for (Field field : getFields(obj, Object.class)) { Object value = getFieldValue(field, obj); String strValue = null; if (value == null) strValue = "#NULL#"; else if (isClass(value.getClass(), String.class)) strValue = (String) value; else if (isClass(value.getClass(), Enum.class)) strValue = value.toString(); else if (field.isAnnotationPresent(Complex.class)) strValue = "#(#" + printObject(value) + "#)#"; if (strValue != null) result.add(format("%s#:#%s", field.getName(), strValue)); } return print(result, "#;#", "%s"); } public static MapArray<String, String> objToSetValue(Object obj) { return (obj == null) ? new MapArray<>() : parseObjectAsString(printObject(obj)); } public static String processValue(String input, List<String> values) { if (input.equals("#NULL#")) return null; if (input.matches("#VAL\\d*")) return values.get(parseInt(input.substring(4)) - 1); return input; } public static MapArray<String, String> parseObjectAsString(String obj) { if (obj == null) return null; MapArray<String, String> result = new MapArray<>(); List<String> values = new ArrayList<>(); int i = 1; while (obj.indexOf("#(#") > 0) { values.add(obj.substring(obj.indexOf("#(#") + 3, obj.indexOf("#)#"))); obj = obj.replaceAll("#\\(#.*#\\)#", "#VAL" + i++); } String[] fields = obj.split("#;#"); for (String field : fields) { String[] splitedField = field.split("#:#"); if (splitedField.length == 2) result.add(splitedField[0], processValue(splitedField[1], values)); } return result; } public static String printObjectAsArray(Object array) { List<String> elements = new ArrayList<>(); for (int i = 0; i <= getLength(array); i++) elements.add(get(array, i).toString()); return print(elements); } }