package frame.data.meta;
|
|
import java.math.BigDecimal;
|
import java.sql.PreparedStatement;
|
import java.sql.ResultSetMetaData;
|
import java.sql.SQLException;
|
import java.text.ParseException;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.Map;
|
|
import org.apache.log4j.Logger;
|
|
import frame.data.convert.Convertor;
|
import frame.persist.SQLRunner;
|
import frame.persist.loader.ResultMetaFieldReader;
|
import frame.util.Util;
|
|
public class EntityMeta implements Iterable<Field> {
|
|
protected static Logger logger;
|
|
private String name;
|
private List<Field> fieldList;
|
private String[] names;
|
private String[] lowerNames;
|
private int index_key;
|
private Map<String, Integer> nameIndexMap;
|
|
static {
|
logger = Logger.getLogger(EntityMeta.class);
|
}
|
|
public static EntityMeta getInstance(String tableName) throws Exception {
|
return MetaContainer.get(tableName);
|
}
|
|
public static EntityMeta getInstance(String tableName, boolean refresh) throws Exception {
|
return MetaContainer.get(tableName, refresh);
|
}
|
|
public EntityMeta(String tableName, IFieldReader fieldReader) throws SQLException {
|
this.name = tableName;
|
nameIndexMap = new HashMap<String, Integer>();
|
fieldList = new ArrayList<Field>();
|
|
initFields(fieldReader);
|
}
|
|
public static EntityMeta getInstance(ResultSetMetaData metaData) throws Exception {
|
ResultMetaFieldReader fieldReader = new ResultMetaFieldReader(metaData);
|
return new EntityMeta("tablemeta", fieldReader);
|
}
|
|
private void initFields(IFieldReader fieldReader) throws SQLException {
|
String fieldName;
|
int columnType;
|
int fieldLength;
|
int nullable;
|
Field field;
|
|
fieldReader.first();
|
|
while (fieldReader.next()) {
|
fieldName = fieldReader.getFieldName();
|
columnType = fieldReader.getFieldType();
|
fieldLength = fieldReader.getFieldLength();
|
nullable = fieldReader.getNullable();
|
|
if (fieldName == null) {
|
continue;
|
}
|
|
field = new Field(fieldName);
|
fieldList.add(field);
|
|
field.setType(columnType);
|
field.setLength(fieldLength);
|
field.setNullable(nullable);
|
}
|
|
int fieldCount = fieldList.size();
|
names = new String[fieldCount];
|
lowerNames = new String[fieldCount];
|
|
String name;
|
for (int i = 0; i < fieldCount; i++) {
|
field = fieldList.get(i);
|
name = field.getName();
|
names[i] = name;
|
|
name = name.toLowerCase();
|
lowerNames[i] = name;
|
nameIndexMap.put(name, i);
|
}
|
}
|
|
public int getFieldCount() {
|
return fieldList.size();
|
}
|
|
public Iterator<Field> iterator() {
|
return fieldList.iterator();
|
}
|
|
public String getName() {
|
return name;
|
}
|
|
public void setPrimaryKey(String keyField) {
|
if (keyField == null) {
|
return;
|
}
|
|
Integer idx = nameIndexMap.get(keyField.toLowerCase());
|
|
if (idx != null) {
|
index_key = idx;
|
}
|
}
|
|
public List<Field> getFields() {
|
return fieldList;
|
}
|
|
public Field get(String name) {
|
if (name == null)
|
return null;
|
|
Integer idx = nameIndexMap.get(name.toLowerCase());
|
|
if (idx == null) {
|
return null;
|
}
|
|
return fieldList.get(idx);
|
}
|
|
public Field get(int idx) {
|
return fieldList.get(idx);
|
}
|
|
public synchronized String getFiledName_Key() throws Exception {
|
if (index_key >= 0) {
|
String keyName = SQLRunner.getPrimaryKeyField(null, name);
|
|
if (keyName == null) {
|
return null;
|
}
|
|
Integer idx = nameIndexMap.get(keyName.toLowerCase());
|
|
if (idx == null) {
|
return null;
|
}
|
}
|
|
if (index_key >= 0) {
|
Field field = fieldList.get(index_key);
|
return field.getName();
|
}
|
|
return "id";
|
}
|
|
public int getIndex_Key() {
|
return index_key;
|
}
|
|
public int getIndex(String fieldName) {
|
if (fieldName == null) {
|
return -2;
|
}
|
|
return nameIndexMap.get(fieldName.toLowerCase());
|
}
|
|
public String[] getLowerNames() {
|
return lowerNames;
|
}
|
|
public boolean contains(String name) {
|
if (name == null) {
|
return false;
|
}
|
|
name = name.toLowerCase();
|
return nameIndexMap.containsKey(name);
|
}
|
|
public void setObject(Object[] dataArray, String name, Object object) {
|
if (name == null) {
|
return;
|
}
|
|
name = name.toLowerCase();
|
Integer idx = nameIndexMap.get(name);
|
|
if (idx == null) {
|
return;
|
}
|
|
dataArray[idx] = object;
|
}
|
|
public void setString(Object[] dataArray, String name, String value) throws ParseException {
|
if (name == null) {
|
return;
|
}
|
|
name = name.toLowerCase();
|
Integer idx = nameIndexMap.get(name);
|
|
if (idx == null) {
|
return;
|
}
|
|
Field field = fieldList.get(idx);
|
Object obj = field.stringToObject(value);
|
|
dataArray[idx] = obj;
|
}
|
|
public String getString(Object[] dataArray, String name, String defaultValue) throws Exception {
|
if (name == null) {
|
return null;
|
}
|
|
name = name.toLowerCase();
|
Integer idx = nameIndexMap.get(name);
|
|
if (idx == null) {
|
return null;
|
}
|
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
if (obj == null) {
|
return defaultValue;
|
}
|
|
return field.objectToString(obj);
|
}
|
|
public String getString(Object[] dataArray, int idx, String defaultValue) throws Exception {
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
if (obj == null) {
|
return defaultValue;
|
}
|
|
return field.objectToString(obj);
|
}
|
|
public boolean getBoolean(Object[] dataArray, String name) {
|
if (name == null) {
|
return false;
|
}
|
|
name = name.toLowerCase();
|
Integer idx = nameIndexMap.get(name);
|
|
if (idx == null) {
|
return false;
|
}
|
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
return field.objectToBoolean(obj);
|
}
|
|
public Date getDate(Object[] dataArray, String name) throws ParseException {
|
if (name == null) {
|
return null;
|
}
|
|
name = name.toLowerCase();
|
Integer idx = nameIndexMap.get(name);
|
|
if (idx == null) {
|
return null;
|
}
|
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
return field.objectToDate(obj);
|
}
|
|
public Integer getInteger(Object[] dataArray, String name) {
|
if (name == null) {
|
return null;
|
}
|
|
name = name.toLowerCase();
|
Integer idx = nameIndexMap.get(name);
|
|
if (idx == null) {
|
return null;
|
}
|
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
return field.objectToInteger(obj);
|
}
|
|
public BigDecimal getBigDecimal(Object[] dataArray, String name) {
|
if (name == null) {
|
return null;
|
}
|
|
name = name.toLowerCase();
|
Integer idx = nameIndexMap.get(name);
|
|
if (idx == null) {
|
return null;
|
}
|
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
return field.objectToBigDecimal(obj);
|
}
|
|
public String getSchemaString(Object[] dataArray, int idx) throws Exception {
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
return field.objectToSchemaString(obj);
|
}
|
|
public String getJSONSString(Object[] dataArray, int idx) throws SQLException {
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
return field.objectToJSONSString(obj);
|
}
|
|
public String getSqlString(Object value, String name) throws Exception {
|
if (name == null) {
|
return null;
|
}
|
|
name = name.toLowerCase();
|
Integer idx = nameIndexMap.get(name);
|
|
if (idx == null) {
|
return null;
|
}
|
|
Field field = fieldList.get(idx);
|
return field.objectToSQLString(value);
|
}
|
|
public String getSQLString(Object[] dataArray, int idx) throws Exception {
|
Field field = fieldList.get(idx);
|
Object obj = dataArray[idx];
|
|
return field.objectToSQLString(obj);
|
}
|
|
public void setValueToStatement(Object[] dataArray, int dataIdx, PreparedStatement stmt, int paramIdx)
|
throws SQLException {
|
Field field = fieldList.get(dataIdx);
|
Object obj = dataArray[dataIdx];
|
|
field.setValueToStatement(obj, stmt, paramIdx);
|
}
|
|
public String getFieldNames() {
|
StringBuffer result = new StringBuffer();
|
|
boolean empty = true;
|
|
for (String name : names) {
|
if (!empty) {
|
result.append(", ");
|
}
|
|
result.append(name);
|
empty = false;
|
}
|
|
return result.toString();
|
}
|
|
public String getDoubleQuotedFieldNames() {
|
StringBuffer result = new StringBuffer();
|
|
boolean empty = true;
|
|
for (String name : names) {
|
if (!empty) {
|
result.append(", ");
|
}
|
|
result.append(Util.doubleQuotedStr(name));
|
empty = false;
|
}
|
|
return result.toString();
|
}
|
|
public Convertor getConvertor(int idx) {
|
// TODO Auto-generated method stub
|
return null;
|
}
|
|
}
|