/*
* Copyright (c) www.bugull.com
*
* 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 net.tooan.ynpay.third.mongodb.decoder;
import com.mongodb.DBObject;
import net.tooan.ynpay.third.jfinal.log.Logger;
import net.tooan.ynpay.third.mongodb.annotations.Default;
import net.tooan.ynpay.third.mongodb.annotations.Property;
import net.tooan.ynpay.third.mongodb.mapper.DataType;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.*;
/**
* @author Frank Wen(xbwen@hotmail.com)
*/
@SuppressWarnings("unchecked")
public class PropertyDecoder extends AbstractDecoder {
private final static Logger logger = Logger.getLogger(PropertyDecoder.class);
public PropertyDecoder(Field field, DBObject dbo) {
super(field);
String fieldName = field.getName();
Property property = field.getAnnotation(Property.class);
if (property != null) {
String name = property.name();
if (!name.equals(Default.NAME)) {
fieldName = name;
}
}
value = dbo.get(fieldName);
}
@Override
public void decode(Object obj) {
Class<?> type = field.getType();
try {
if (type.isArray()) {
decodeArray(obj, (ArrayList) value, type.getComponentType());
} else {
decodePrimitive(obj, type);
}
} catch (IllegalArgumentException ex) {
logger.error("Something is wrong when parse the field's value", ex);
} catch (IllegalAccessException ex) {
logger.error("Something is wrong when parse the field's value", ex);
}
}
private void decodeArray(Object obj, ArrayList list, Class type) throws IllegalArgumentException, IllegalAccessException {
int size = list.size();
if (DataType.isString(type)) {
String[] arr = new String[size];
for (int i = 0; i < size; i++) {
arr[i] = list.get(i).toString();
}
field.set(obj, arr);
} else if (DataType.isInteger(type)) {
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = Integer.parseInt(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isIntegerObject(type)) {
Integer[] arr = new Integer[size];
for (int i = 0; i < size; i++) {
arr[i] = Integer.parseInt(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isLong(type)) {
long[] arr = new long[size];
for (int i = 0; i < size; i++) {
arr[i] = Long.parseLong(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isLongObject(type)) {
Long[] arr = new Long[size];
for (int i = 0; i < size; i++) {
arr[i] = Long.parseLong(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isShort(type)) {
short[] arr = new short[size];
for (int i = 0; i < size; i++) {
arr[i] = Short.parseShort(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isShortObject(type)) {
Short[] arr = new Short[size];
for (int i = 0; i < size; i++) {
arr[i] = Short.parseShort(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isFloat(type)) {
float[] arr = new float[size];
for (int i = 0; i < size; i++) {
arr[i] = Float.parseFloat(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isFloatObject(type)) {
Float[] arr = new Float[size];
for (int i = 0; i < size; i++) {
arr[i] = Float.parseFloat(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isDouble(type)) {
double[] arr = new double[size];
for (int i = 0; i < size; i++) {
arr[i] = Double.parseDouble(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isDoubleObject(type)) {
Double[] arr = new Double[size];
for (int i = 0; i < size; i++) {
arr[i] = Double.parseDouble(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isBoolean(type)) {
boolean[] arr = new boolean[size];
for (int i = 0; i < size; i++) {
arr[i] = Boolean.parseBoolean(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isBooleanObject(type)) {
Boolean[] arr = new Boolean[size];
for (int i = 0; i < size; i++) {
arr[i] = Boolean.parseBoolean(list.get(i).toString());
}
field.set(obj, arr);
} else if (DataType.isChar(type)) {
char[] arr = new char[size];
for (int i = 0; i < size; i++) {
arr[i] = list.get(i).toString().charAt(0);
}
field.set(obj, arr);
} else if (DataType.isCharObject(type)) {
Character[] arr = new Character[size];
for (int i = 0; i < size; i++) {
arr[i] = list.get(i).toString().charAt(0);
}
field.set(obj, arr);
} else if (DataType.isDate(type)) {
Date[] arr = new Date[size];
for (int i = 0; i < size; i++) {
arr[i] = (Date) list.get(i);
}
field.set(obj, arr);
} else if (DataType.isTimestamp(type)) {
Timestamp[] arr = new Timestamp[size];
for (int i = 0; i < size; i++) {
arr[i] = (Timestamp) list.get(i);
}
field.set(obj, arr);
}
}
private void decodePrimitive(Object obj, Class type) throws IllegalArgumentException, IllegalAccessException {
if (DataType.isInteger(type)) {
field.setInt(obj, Integer.parseInt(value.toString()));
} else if (DataType.isLong(type)) {
field.setLong(obj, Long.parseLong(value.toString()));
} else if (DataType.isShort(type)) {
field.setShort(obj, Short.parseShort(value.toString()));
} else if (DataType.isFloat(type)) {
field.setFloat(obj, Float.parseFloat(value.toString()));
} else if (DataType.isDouble(type)) {
field.setDouble(obj, Double.parseDouble(value.toString()));
} else if (DataType.isBoolean(type)) {
field.setBoolean(obj, Boolean.parseBoolean(value.toString()));
} else if (DataType.isChar(type)) {
field.setChar(obj, value.toString().charAt(0));
} else if (DataType.isSet(type)) {
List list = (ArrayList) value;
Set set = new HashSet(list);
field.set(obj, set);
} else if (DataType.isTimestamp(type)) {
Date date = (Date) value;
Timestamp ts = new Timestamp(date.getTime());
field.set(obj, ts);
} else {
field.set(obj, value); //List, Map, Date, Integer, Long, Float, Double and so on
}
}
}