/*
* 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.encoder;
import net.tooan.ynpay.third.jfinal.log.Logger;
import net.tooan.ynpay.third.mongodb.mapper.DataType;
import net.tooan.ynpay.third.mongodb.mapper.FieldUtil;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.Date;
/**
* @author Frank Wen(xbwen@hotmail.com)
*/
public abstract class AbstractEncoder implements Encoder {
private final static Logger logger = Logger.getLogger(AbstractEncoder.class);
protected Object obj;
protected Field field;
protected Object value;
protected AbstractEncoder(Object obj, Field field) {
this.obj = obj;
this.field = field;
Object objValue = FieldUtil.get(obj, field);
if (objValue == null) {
value = null;
} else {
Class<?> type = field.getType();
try {
if (type.isArray()) {
setArrayValue(type.getComponentType(), objValue);
} else {
setValue(type, objValue);
}
} catch (Exception ex) {
logger.error("Can not set field value to object", ex);
}
}
}
@Override
public boolean isNullField() {
return value == null;
}
private void setArrayValue(Class type, Object objValue) throws IllegalArgumentException, ArrayIndexOutOfBoundsException {
int len = Array.getLength(objValue);
if (DataType.isString(type)) {
String[] arr = new String[len];
for (int i = 0; i < len; i++) {
arr[i] = Array.get(objValue, i).toString();
}
value = arr;
} else if (DataType.isInteger(type) || DataType.isIntegerObject(type)) {
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
String s = Array.get(objValue, i).toString();
arr[i] = Integer.parseInt(s);
}
value = arr;
} else if (DataType.isLong(type) || DataType.isLongObject(type)) {
long[] arr = new long[len];
for (int i = 0; i < len; i++) {
String s = Array.get(objValue, i).toString();
arr[i] = Long.parseLong(s);
}
value = arr;
} else if (DataType.isShort(type) || DataType.isShortObject(type)) {
short[] arr = new short[len];
for (int i = 0; i < len; i++) {
String s = Array.get(objValue, i).toString();
arr[i] = Short.parseShort(s);
}
value = arr;
} else if (DataType.isFloat(type) || DataType.isFloatObject(type)) {
float[] arr = new float[len];
for (int i = 0; i < len; i++) {
String s = Array.get(objValue, i).toString();
arr[i] = Float.parseFloat(s);
}
value = arr;
} else if (DataType.isDouble(type) || DataType.isDoubleObject(type)) {
double[] arr = new double[len];
for (int i = 0; i < len; i++) {
String s = Array.get(objValue, i).toString();
arr[i] = Double.parseDouble(s);
}
value = arr;
} else if (DataType.isBoolean(type) || DataType.isBooleanObject(type)) {
boolean[] arr = new boolean[len];
for (int i = 0; i < len; i++) {
String s = Array.get(objValue, i).toString();
arr[i] = Boolean.parseBoolean(s);
}
value = arr;
} else if (DataType.isChar(type) || DataType.isCharObject(type)) {
String[] arr = new String[len];
for (int i = 0; i < len; i++) {
arr[i] = Array.get(objValue, i).toString();
}
value = arr;
} else if (DataType.isDate(type)) {
Date[] arr = new Date[len];
for (int i = 0; i < len; i++) {
arr[i] = (Date) (Array.get(objValue, i));
}
value = arr;
} else if (DataType.isTimestamp(type)) {
Timestamp[] arr = new Timestamp[len];
for (int i = 0; i < len; i++) {
arr[i] = (Timestamp) (Array.get(objValue, i));
}
value = arr;
} else {
value = objValue; //other object array, with @EmbedList or @RefList
}
}
private void setValue(Class type, Object objValue) throws IllegalArgumentException, IllegalAccessException {
if (DataType.isInteger(type)) {
value = field.getInt(obj);
} else if (DataType.isLong(type)) {
value = field.getLong(obj);
} else if (DataType.isShort(type)) {
value = field.getShort(obj);
} else if (DataType.isFloat(type)) {
value = field.getFloat(obj);
} else if (DataType.isDouble(type)) {
value = field.getDouble(obj);
} else if (DataType.isBoolean(type)) {
value = field.getBoolean(obj);
} else if (DataType.isChar(type)) {
value = String.valueOf(field.getChar(obj));
} else {
value = objValue; //List, Set, Map, Date, Timestamp, Integer, Long, Float, Double, Boolean and other object
}
}
}