package com.alexvasilkov.android.commons.converters; import android.util.Log; import java.lang.reflect.Array; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; public class ConvertUtils { /** * Converting value if it is not null */ public static <T, P extends Convertable<T>> T convert(P value) throws ParseException { return value == null ? null : value.convert(); } /** * Converting array of convertable items into ArrayList of target items. * Note: per item ParseException are ignored. * * @param array Array to convert */ public static <T, J extends Convertable<T>> ArrayList<T> convert(J[] array) { return convert(array == null ? null : Arrays.asList(array)); } /** * Converting collection of convertable items into ArrayList of target items. * Note: per item ParseException are ignored. * * @param collection Collection to convert */ public static <T, J extends Convertable<T>> ArrayList<T> convert(Collection<J> collection) { if (collection == null) return null; ArrayList<T> list = new ArrayList<T>(collection.size()); for (J json : collection) { try { T item = json == null ? null : json.convert(); if (item != null) list.add(item); } catch (ParseException e) { Log.e("ConvertUtils", "Error converting item (" + json.getClass().getSimpleName() + ") : " + e.getMessage()); } } return list; } /** * Converting array of convertable items into array of target items<br/> * Shortcut for {@link #toArray(java.util.Collection) toArray}({@link #convert(Convertable[]) convert(array)}) */ public static <T, J extends Convertable<T>> T[] convertToArray(J[] array) { return toArray(convert(array)); } /** * Converting array of convertable items into array of target items<br/> * Shortcut for {@link #toArray(java.util.Collection, Class) toArray}({@link #convert(Convertable[]) convert(array)}, <code>clazz</code>) */ public static <T, J extends Convertable<T>> T[] convertToArray(J[] array, Class<T> clazz) { return toArray(convert(array), clazz); } /** * Converting collection of convertable items into array of target items<br/> * Shortcut for {@link #toArray(java.util.Collection) toArray}({@link #convert(java.util.Collection) convert(collection)}) */ public static <T, J extends Convertable<T>> T[] convertToArray(Collection<J> collection) { return toArray(convert(collection)); } /** * Converting Collection of convertable items into array of target items<br/> * Shortcut for {@link #toArray(java.util.Collection, Class) toArray}({@link #convert(java.util.Collection) convert(array)}, <code>clazz</code>) */ public static <T, J extends Convertable<T>> T[] convertToArray(Collection<J> collection, Class<T> clazz) { return toArray(convert(collection), clazz); } /** * Searches for enum of given class with given name (case insensitive) * * @param type Enum class * @param name Enum constant name * @param defaultValue Default value if no enum constant with given name is found */ public static <T extends Enum<T>> T convert(Class<T> type, String name, T defaultValue) { if (name == null) return defaultValue; for (T e : type.getEnumConstants()) { if (e.name().equalsIgnoreCase(name)) return e; } return defaultValue; } /** * Creates output object using provided creator. Returns null if obj null. */ public static <IN, OUT> OUT create(IN obj, Creator<IN, OUT> creator) { return obj == null ? null : creator.create(obj); } /** * Creates list of output objects using provided creator */ public static <IN, OUT> List<OUT> create(IN[] arr, Creator<IN, OUT> creator) { if (arr == null) return null; ArrayList<OUT> list = new ArrayList<OUT>(arr.length); for (IN value : arr) { OUT item = value == null ? null : creator.create(value); if (item != null) list.add(item); } return list; } /** * Creates list of output objects using provided creator */ public static <IN, OUT> List<OUT> create(Collection<IN> collection, Creator<IN, OUT> creator) { if (collection == null) return null; ArrayList<OUT> list = new ArrayList<OUT>(collection.size()); for (IN value : collection) { OUT item = value == null ? null : creator.create(value); if (item != null) list.add(item); } return list; } /** * Converting {@link java.util.List List} into array<br/> * Note: array type is determined by class of the first non-null element in the list. * If there is no elements or all elements are null, null will be returned.<br/> * Elements in the list should be exactly of requested type, not it's descendants. */ @SuppressWarnings("unchecked") public static <T> T[] toArray(Collection<T> collection) { if (collection == null) return null; T item = null; for (T i : collection) { if (i != null) { item = i; break; } } return item == null ? null : toArray(collection, (Class<T>) item.getClass()); } /** * Converting {@link java.util.List List} into array of given type */ @SuppressWarnings("unchecked") public static <T> T[] toArray(Collection<T> collection, Class<T> clazz) { if (collection == null) return null; return collection.toArray((T[]) Array.newInstance(clazz, collection.size())); } }