package frame.object.meta; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import frame.persist.loader.ResultMetaFieldReader; import frame.variant.ValueType; import frame.variant.translator.ITranslator; import frame.variant.translator.Translator; public class EntityMeta implements Iterable { protected static Logger logger; protected String tableName; protected List fieldList; protected String[] names; protected String[] lowerNames; protected Map nameIndexMap; protected ITranslator[] translators; static { logger = Logger.getLogger(EntityMeta.class); } protected EntityMeta() { } public EntityMeta(String tableName, IFieldReader fieldReader) throws SQLException { this.tableName = tableName; nameIndexMap = new HashMap(); fieldList = new ArrayList(); initFields(fieldReader); } public static EntityMeta getInstance(String tableName) throws Exception { EntityMetaLoader loader = new EntityMetaLoader(); return loader.getEntityMetaByTable(tableName); } 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; //1. fields 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); } //2. names 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); } //3. translators translators = new ITranslator[fieldCount]; for (int i = 0; i < fieldCount; i++) { field = fieldList.get(i); ValueType valueType = field.getValueType(); ITranslator translator = Translator.getInstance(valueType); translators[i] = translator; field.setTranslator(translator); } } public int getFieldCount() { return fieldList.size(); } public Iterator iterator() { return fieldList.iterator(); } public String getTableName() { return tableName; } public List getFields() { return fieldList; } public Field getField(String name) { if (name == null) return null; Integer idx = nameIndexMap.get(name.toLowerCase()); if (idx == null) { return null; } return fieldList.get(idx); } public Field getField(int idx) { return fieldList.get(idx); } public ValueType getValueType(int idx) { Field field = fieldList.get(idx); return field.getValueType(); } public Integer getIndex(String fieldName) { if (fieldName == null) { return null; } try { return nameIndexMap.get(fieldName.toLowerCase()); } catch (Exception e) { return null; } } public String[] getLowerNames() { return lowerNames; } public String[] getFieldNames() { return names; } public boolean contains(String name) { if (name == null) { return false; } name = name.toLowerCase(); return nameIndexMap.containsKey(name); } public ITranslator getTranslator(int idx) { return translators[idx]; } public ITranslator getTranslator(String name) { name = name.toLowerCase(); Integer idx = nameIndexMap.get(name); if (idx == null) { return null; } return translators[idx]; } }