package jef.database.annotation;
import java.lang.annotation.Annotation;
import jef.database.routing.function.KeyFunction;
import jef.json.JSONCustom;
import jef.json.JsonTypeSerializer;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.ObjectSerializer;
/**
* 默认的PartitionKey实现,用于非Annotation场合下使用。
*
* @author Administrator
*
*/
@JSONCustom(serializer = PartitionKeyImpl.class)//, fieldAccess = true
@SuppressWarnings("all")
public class PartitionKeyImpl implements PartitionKey {
int sourceDesc;
/**
* 字段名
*/
public String field;
/**
* 后缀生成 长度
*/
public int length = 0;
/**
* 后缀生成 函数(预制)
*/
public KeyFunction function = KeyFunction.RAW;
/**
* 后缀生成 函数(自定义)
*/
public Class<? extends PartitionFunction> funcClass = PartitionFunction.class;
/**
* 后缀生成 函数(构造参数)
*/
public String[] funcParams = ArrayUtils.EMPTY_STRING_ARRAY;
/**
* 后缀作为数据源名称?
*/
public boolean isDbName = false;
/**
* 如果字段为空时的默认值
*/
public String defaultWhenFieldIsNull = "";
/**
* 生成后缀如果长度不够的填充字符
*/
public char filler = '0';
/**
* 不能删除此方法,因为Gson在反序列化此对象时需要用到(无论此构造是否为public)。
* 如果删除,则因为缺少空构造会使用虚拟机字节码等技术来创建对象,此时将不调用<INIT>方法造成无法初始化所有变量。
*/
private PartitionKeyImpl() {
}
public Class<? extends Annotation> annotationType() {
return PartitionKey.class;
}
public PartitionKeyImpl(String name, int sourceDesc) {
this.field = name;
this.sourceDesc = sourceDesc;
}
public String field() {
return field;
}
public int sourceDesc() {
return sourceDesc;
}
public KeyFunction function() {
return function;
}
public Class<? extends PartitionFunction> functionClass() {
return funcClass;
}
/*
* (non-Javadoc)
*
* @see
* jef.database.annotation.PartitionKey#functionClassConstructorParams()
*/
public String[] functionConstructorParams() {
return funcParams;
}
/*
* (non-Javadoc)
*
* @see jef.database.annotation.PartitionKey#isDbName()
*/
public boolean isDbName() {
return isDbName;
}
/*
* (non-Javadoc)
*
* @see jef.database.annotation.PartitionKey#defaultWhenFieldIsNull()
*/
public String defaultWhenFieldIsNull() {
return defaultWhenFieldIsNull;
}
/*
* (non-Javadoc)
*
* @see jef.database.annotation.PartitionKey#length()
*/
public int length() {
return length;
}
/*
* (non-Javadoc)
*
* @see jef.database.annotation.PartitionKey#filler()
*/
public char filler() {
return filler;
}
public static PartitionKeyImpl create(PartitionKey k) {
if (k instanceof PartitionKeyImpl) {
return (PartitionKeyImpl) k;
}
PartitionKeyImpl key = new PartitionKeyImpl(k.field(), k.sourceDesc());
key.defaultWhenFieldIsNull = k.defaultWhenFieldIsNull();
key.filler = k.filler();
key.funcClass = k.functionClass();
key.function = k.function();
key.funcParams = k.functionConstructorParams();
key.isDbName = k.isDbName();
key.length = k.length();
return key;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
public static ObjectSerializer getSerializer() {
return new Ser();
}
private static class Ser extends JsonTypeSerializer<PartitionKeyImpl> implements ObjectSerializer {
@Override
protected Object processToJson(PartitionKeyImpl src) {
JSONObject jo = new JSONObject();
jo.put("field", src.field);
jo.put("length", src.length);
if (src.sourceDesc != 0) {
jo.put("sourceDesc", src.sourceDesc);
}
if (src.funcClass != PartitionFunction.class) {
jo.put("funcClass", src.funcClass);
}
if (src.function != KeyFunction.RAW) {
jo.put("function", src.function);
}
if (src.defaultWhenFieldIsNull.length() > 0) {
jo.put("defaultWhenFieldIsNull", src.defaultWhenFieldIsNull);
}
if (src.funcParams.length > 0) {
jo.put("funcParams", src.funcParams);
}
if (src.filler != '0') {
jo.put("filler", src.filler);
}
if (src.isDbName) {
jo.put("isDbName", true);
}
return jo;
}
}
}