package org.jiucheng.util;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jiucheng.entity.BaseEntity;
/**
*
* @author 旧城(jiucheng.org@gmail.com)
*
*/
public class TableMapping implements Serializable{
private static final long serialVersionUID = -3319792150302540890L;
public final static String DEFAULT_PRIMARY_KEY = "id";
private final static Map strs = new HashMap();
private final static Map, TableMapping> pools = new HashMap, TableMapping>();
public final static String SET = "set";
public final static String GET = "get";
@SuppressWarnings("unused")
private Class extends BaseEntity> clazz;
private String tableName;
private String primaryKey;
private List columns;
public static class ColumnMapping implements Serializable{
private static final long serialVersionUID = -1042725024561237385L;
private String tableColumn;
private String clazzColumn;
private String getMethodName;
private String setMethodName;
private Class> clazzType;
public String getTableColumn() {
return tableColumn;
}
public String getGetMethodName() {
return getMethodName;
}
public String getSetMethodName() {
return setMethodName;
}
public Class> getClazzType() {
return clazzType;
}
public String getClazzColumn() {
return clazzColumn;
}
}
public static String getCacheStr(String str) {
String s = strs.get(str.hashCode());
if(s == null) {
strs.put(str.hashCode(), str);
s = str;
}
return s;
}
/**
* 获取GetMethod
* @param clazz
* @param columnName
* @return
*/
public static Method getGetMethod(Class extends BaseEntity> clazz, String columnName) {
TableMapping tm = getTableMapping(clazz);
for(ColumnMapping col : tm.columns) {
if(col.tableColumn.equals(columnName)) {
try {
return clazz.getMethod(col.getMethodName);
}catch(Exception e) {}
}
}
return null;
}
/**
* 获取SetMethod
* @param clazz
* @param columnName
* @return
*/
public static Method getSetMethod(Class extends BaseEntity> clazz, String columnName) {
TableMapping tm = getTableMapping(clazz);
for(ColumnMapping col : tm.columns) {
if(col.tableColumn.equals(columnName)) {
try {
return clazz.getMethod(col.setMethodName, col.clazzType);
}catch(Exception e) {}
}
}
return null;
}
/**
* 获取table.column
* @param clazz
* @param m
* @return
*/
public static String getColumn(Class extends BaseEntity> clazz, Method m) {
TableMapping tm = getTableMapping(clazz);
String methodName = m.getName();
for(ColumnMapping col : tm.columns) {
if(col.getMethodName.equals(methodName) || col.setMethodName.equals(methodName)) {
return col.tableColumn;
}
}
return null;
}
/**
* 获取表名
* @param clazz
* @return
*/
public static String getTableName(Class extends BaseEntity> clazz) {
return getTableMapping(clazz).tableName;
}
/**
* 获取表中主键字段
* @param clazz
* @return
*/
public static String getPrimaryKey(Class extends BaseEntity> clazz) {
return getTableMapping(clazz).primaryKey;
}
private static TableMapping getTableMapping(Class extends BaseEntity> clazz) {
TableMapping tm = pools.get(clazz);
if(tm == null) {
tm = load(clazz);
}
return tm;
}
private static TableMapping load(Class extends BaseEntity> clazz) {
TableMapping tm = new TableMapping(clazz);
TableMapping.pools.put(clazz, tm);
return tm;
}
private TableMapping(Class extends BaseEntity> clazz) {
init(clazz);
}
private void init(Class extends BaseEntity> clazz) {
this.columns = new ArrayList();
this.clazz = clazz;
this.tableName = getCacheStr(TableUtil.clazzToTableName(clazz));
this.primaryKey = getCacheStr(TableUtil.clazzToTableKey(clazz));
initColumns(clazz);
}
private void initColumns(Class extends BaseEntity> clazz) {
List ms = TableUtil.listMethod(clazz, "^set.+");
ColumnMapping col;
for(Method m : ms) {
col = new ColumnMapping();
col.tableColumn = getCacheStr(TableUtil.methodToColumnName(m));
col.clazzColumn = getCacheStr(TableUtil.setOrGetmethodToHump(m));
col.getMethodName = getCacheStr(m.getName().replaceFirst("set", "get"));
col.setMethodName = getCacheStr(m.getName());
col.clazzType = m.getParameterTypes()[0];
columns.add(col);
}
}
public static List getColumnMappings(Class extends BaseEntity> clazz) {
return getTableMapping(clazz).columns;
}
}