All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jodd.typeconverter.impl.ArrayConverter Maven / Gradle / Ivy

Go to download

Jodd Core tools and utilities, including type converters, JDateTime, cache etc.

There is a newer version: 5.3.0
Show newest version
// Copyright (c) 2003-2014, Jodd Team (jodd.org). All Rights Reserved.

package jodd.typeconverter.impl;

import jodd.typeconverter.TypeConverter;
import jodd.typeconverter.TypeConverterManagerBean;
import jodd.util.CsvUtil;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Converts given object to an array. This converter is specific, as it
 * is not directly registered to a type; but created when needed.
 * Conversion rules:
 * 
    *
  • null value is returned as null
  • *
  • source non-array value is checked for Collections
  • *
  • if non-array element can't be resolved, it is converted to single element array
  • *
  • source array is converted to target array, by converting each element
  • *
*/ @SuppressWarnings("unchecked") public class ArrayConverter implements TypeConverter { protected final TypeConverterManagerBean typeConverterManagerBean; protected final Class targetComponentType; public ArrayConverter(TypeConverterManagerBean typeConverterManagerBean, Class targetComponentType) { this.typeConverterManagerBean = typeConverterManagerBean; this.targetComponentType = targetComponentType; } public T[] convert(Object value) { if (value == null) { return null; } Class valueClass = value.getClass(); if (valueClass.isArray() == false) { // source is not an array return convertValueToArray(value); } // source is an array return convertArrayToArray(value); } /** * Converts type using type converter manager. */ protected T convertType(Object value) { return typeConverterManagerBean.convertType(value, targetComponentType); } /** * Creates new array of target component type. * Default implementation uses reflection to create * an array of target type. Override it for better performances. */ protected T[] createArray(int length) { return (T[]) Array.newInstance(targetComponentType, length); } /** * Creates an array with single element. */ protected T[] convertToSingleElementArray(Object value) { T[] singleElementArray = createArray(1); singleElementArray[0] = convertType(value); return singleElementArray; } /** * Converts non-array value to array. Detects various * collection types and iterates them to make conversion * and to create target array. */ protected T[] convertValueToArray(Object value) { if (value instanceof List) { List list = (List) value; T[] target = createArray(list.size()); for (int i = 0; i < list.size(); i++) { Object element = list.get(i); target[i] = convertType(element); } return target; } if (value instanceof Collection) { Collection collection = (Collection) value; T[] target = createArray(collection.size()); int i = 0; for (Object element : collection) { target[i] = convertType(element); i++; } return target; } if (value instanceof Iterable) { Iterable iterable = (Iterable) value; List list = new ArrayList(); for (Object element : iterable) { list.add(convertType(element)); } T[] target = createArray(list.size()); return list.toArray(target); } if (value instanceof CharSequence) { String[] strings = CsvUtil.toStringArray(value.toString()); return convertArrayToArray(strings); } // everything else: return convertToSingleElementArray(value); } /** * Converts array value to array. */ protected T[] convertArrayToArray(Object value) { Class valueComponentType = value.getClass().getComponentType(); if (valueComponentType == targetComponentType) { // equal types, no conversion needed return (T[]) value; } T[] result; if (valueComponentType.isPrimitive()) { // convert primitive array to target array result = convertPrimitiveArrayToArray(value, valueComponentType); } else { // convert object array to target array Object[] array = (Object[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } return result; } /** * Converts primitive array to target array. */ @SuppressWarnings("AutoBoxing") protected T[] convertPrimitiveArrayToArray(Object value, Class primitiveComponentType) { T[] result = null; if (primitiveComponentType == int.class) { int[] array = (int[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } else if (primitiveComponentType == long.class) { long[] array = (long[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } else if (primitiveComponentType == float.class) { float[] array = (float[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } else if (primitiveComponentType == double.class) { double[] array = (double[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } else if (primitiveComponentType == short.class) { short[] array = (short[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } else if (primitiveComponentType == byte.class) { byte[] array = (byte[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } else if (primitiveComponentType == char.class) { char[] array = (char[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } else if (primitiveComponentType == boolean.class) { boolean[] array = (boolean[]) value; result = createArray(array.length); for (int i = 0; i < array.length; i++) { result[i] = convertType(array[i]); } } return result; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy