/**
* Copyright 2013-2016 Guoqiang Chen, Shanghai, China. All rights reserved.
*
* Author: Guoqiang Chen
* Email: subchen@gmail.com
* WebURL: https://github.com/subchen
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrick.typecast.support;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import jetbrick.collection.ListUtils;
import jetbrick.typecast.Convertor;
import jetbrick.util.StringUtils;
@SuppressWarnings("unchecked")
public final class PrimitiveArrayConvertor<T> implements Convertor<T> {
public static final PrimitiveArrayConvertor<byte[]> BYTE_ARRAY_CONVERTOR = new PrimitiveArrayConvertor<byte[]>(Byte.TYPE);
public static final PrimitiveArrayConvertor<short[]> SHORT_ARRAY_CONVERTOR = new PrimitiveArrayConvertor<short[]>(Short.TYPE);
public static final PrimitiveArrayConvertor<int[]> INTEGER_ARRAY_CONVERTOR = new PrimitiveArrayConvertor<int[]>(Integer.TYPE);
public static final PrimitiveArrayConvertor<long[]> LONG_ARRAY_CONVERTOR = new PrimitiveArrayConvertor<long[]>(Long.TYPE);
public static final PrimitiveArrayConvertor<float[]> FLOAT_ARRAY_CONVERTOR = new PrimitiveArrayConvertor<float[]>(Float.TYPE);
public static final PrimitiveArrayConvertor<double[]> DOUBLE_ARRAY_CONVERTOR = new PrimitiveArrayConvertor<double[]>(Double.TYPE);
public static final PrimitiveArrayConvertor<char[]> CHAR_ARRAY_CONVERTOR = new PrimitiveArrayConvertor<char[]>(Character.TYPE);
public static final PrimitiveArrayConvertor<boolean[]> BOOLEAN_ARRAY_CONVERTOR = new PrimitiveArrayConvertor<boolean[]>(Boolean.TYPE);
private final Class<?> elementType;
public PrimitiveArrayConvertor(Class<?> elementType) {
this.elementType = elementType;
}
@Override
public T convert(String value) {
if (value == null) {
return null;
}
String[] values = StringUtils.split(value.toString(), ',');
return convertToArray(values);
}
@Override
public T convert(Object value) {
if (value == null) {
return null;
}
if (value.getClass().isArray()) {
if (elementType == value.getClass().getComponentType()) {
return (T) value;
}
Object[] arrays = ArrayConvertor.toObjectArray(value);
return convertToArray(arrays);
}
if (value instanceof Iterable) {
List<?> results = ListUtils.asList((Iterable<?>) value);
return convertToArray(results.toArray());
}
if (value instanceof Iterator) {
List<?> results = ListUtils.asList((Iterator<?>) value);
return convertToArray(results.toArray());
}
if (value instanceof Enumeration) {
List<?> results = ListUtils.asList((Enumeration<?>) value);
return convertToArray(results.toArray());
}
return convert(value.toString());
}
private T convertToArray(Object[] arrays) {
if (elementType == Integer.TYPE) {
return (T) convertToIntArray(arrays);
} else if (elementType == Long.TYPE) {
return (T) convertToLongArray(arrays);
} else if (elementType == Float.TYPE) {
return (T) convertToFloatArray(arrays);
} else if (elementType == Double.TYPE) {
return (T) convertToDoubleArray(arrays);
} else if (elementType == Boolean.TYPE) {
return (T) convertToBooleanArray(arrays);
} else if (elementType == Byte.TYPE) {
return (T) convertToByteArray(arrays);
} else if (elementType == Short.TYPE) {
return (T) convertToShortArray(arrays);
} else if (elementType == Character.TYPE) {
return (T) convertToCharArray(arrays);
}
throw new IllegalStateException("Unreachable code");
}
private int[] convertToIntArray(Object[] items) {
int[] results = new int[items.length];
for (int i = 0; i < items.length; i++) {
Object value = items[i];
if (value == null) {
throw new NullPointerException();
} else {
results[i] = IntegerConvertor.INSTANCE.convert(value);
}
}
return results;
}
private long[] convertToLongArray(Object[] items) {
long[] results = new long[items.length];
for (int i = 0; i < items.length; i++) {
Object value = items[i];
if (value == null) {
throw new NullPointerException();
} else {
results[i] = LongConvertor.INSTANCE.convert(value);
}
}
return results;
}
private byte[] convertToByteArray(Object[] items) {
byte[] results = new byte[items.length];
for (int i = 0; i < items.length; i++) {
Object value = items[i];
if (value == null) {
throw new NullPointerException();
} else {
results[i] = ByteConvertor.INSTANCE.convert(value);
}
}
return results;
}
private short[] convertToShortArray(Object[] items) {
short[] results = new short[items.length];
for (int i = 0; i < items.length; i++) {
Object value = items[i];
if (value == null) {
throw new NullPointerException();
} else {
results[i] = ShortConvertor.INSTANCE.convert(value);
}
}
return results;
}
private float[] convertToFloatArray(Object[] items) {
float[] results = new float[items.length];
for (int i = 0; i < items.length; i++) {
Object value = items[i];
if (value == null) {
throw new NullPointerException();
} else {
results[i] = FloatConvertor.INSTANCE.convert(value);
}
}
return results;
}
private double[] convertToDoubleArray(Object[] items) {
double[] results = new double[items.length];
for (int i = 0; i < items.length; i++) {
Object value = items[i];
if (value == null) {
throw new NullPointerException();
} else {
results[i] = DoubleConvertor.INSTANCE.convert(value);
}
}
return results;
}
private boolean[] convertToBooleanArray(Object[] items) {
boolean[] results = new boolean[items.length];
for (int i = 0; i < items.length; i++) {
Object value = items[i];
if (value == null) {
throw new NullPointerException();
} else {
results[i] = BooleanConvertor.INSTANCE.convert(value);
}
}
return results;
}
private char[] convertToCharArray(Object[] items) {
char[] results = new char[items.length];
for (int i = 0; i < items.length; i++) {
Object value = items[i];
if (value == null) {
throw new NullPointerException();
} else {
results[i] = CharacterConvertor.INSTANCE.convert(value);
}
}
return results;
}
}