package frame.object.data; import java.math.BigDecimal; import java.util.Arrays; import java.util.Date; import java.util.List; import chat.server.call.IJSONWriter; import chat.server.call.IJsonProvider; import frame.object.meta.EntityMeta; import frame.util.Util; import frame.variant.IVariantsConsumer; import frame.variant.IVariantsProvider; import frame.variant.ValueType; import frame.variant.VariantLink; import frame.variant.translator.ITranslator; import frame.variant.translator.StringTranslator; import frame.variant.translator.Translator; public class Entity implements IVariantsConsumer, IVariantsProvider, IJsonProvider { private boolean deleted = false; private EntityMeta entityMeta; private Object[] dataArray; public Entity(EntityMeta tableMeta) { this.entityMeta = tableMeta; dataArray = new Object[tableMeta.getFieldCount()]; } public void set(int i, Object object) { dataArray[i] = object; } public Entity set(String name, Object value) throws Exception { Integer idx = entityMeta.getIndex(name); if (idx == null) { return this; } if (value == null) { dataArray[idx] = null; } else { ITranslator translator = entityMeta.getTranslator(idx); Object obj = Translator.toTranslatorTypeValue(value, translator.getDataClass()); dataArray[idx] = obj; } return this; } public ID getID() { return new ID(getVarinatValue("id")); } public void setID(ID id) throws Exception { set("id", id.getValue()); } public Object getVarinatValue(String field) { int idx = entityMeta.getIndex(field); return dataArray[idx]; } public ValueType getValueType(int idx) { return entityMeta.getValueType(idx); } public Object getValue(int idx) { return dataArray[idx]; } public Object getValue(String fieldName) { Integer idx = entityMeta.getIndex(fieldName); if (idx == null) { return null; } return dataArray[idx]; } public String getString(String fieldName) { Integer idx = entityMeta.getIndex(fieldName); if (idx == null) { return null; } return getString(idx, null); } public String getString(String fieldName, String defaultValue) { int idx = entityMeta.getIndex(fieldName); return getString(idx, defaultValue); } public String getString(int idx, String defaultValue) { try { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); return translator.toString(value); } catch (Exception e) { return "error"; } } public String getQuotedString(String fieldName) { int idx = entityMeta.getIndex(fieldName); return getQuotedString(idx, null); } public String getQuotedString(String fieldName, String defaultValue) { int idx = entityMeta.getIndex(fieldName); return getQuotedString(idx, defaultValue); } public String getQuotedString(int idx, String defaultValue) { String result = getString(idx, defaultValue); return Util.quotedStr(result); } public String getJSONString(String fieldName) throws Exception { int idx = entityMeta.getIndex(fieldName); return getJSONString(idx); } public String getJSONString(String fieldName, String defaultValue) { int idx = entityMeta.getIndex(fieldName); return getJSONString(idx, defaultValue); } public String getJSONString(int idx, String defaultValue) { try { return getJSONString(idx); } catch (Exception e) { e.printStackTrace(); return "\"error\""; } } public String getJSONString(int idx) throws Exception { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); if (translator == null) { translator = new StringTranslator(); } return translator.toJSONString(value); } public String getSQLString(String fieldName) throws Exception { int idx = entityMeta.getIndex(fieldName); return getSQLString(idx); } public String getSQLString(int idx) throws Exception { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); return translator.toSqlString(value); } public String getSQLString(int idx, String defaultValue) { try { String result = getSQLString(idx); return result; } catch(Exception e) { return defaultValue; } } public String getSchemaString(String fieldName) throws Exception { int idx = entityMeta.getIndex(fieldName); return getSchemaString(idx); } public String getSchemaString(int idx) throws Exception { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); return translator.toSchemaString(value); } public boolean getBoolean(String fieldName) throws Exception { int idx = entityMeta.getIndex(fieldName); return getBoolean(idx, false); } public boolean getBoolean(String fieldName, boolean defaultValue) { Integer idx = entityMeta.getIndex(fieldName); if (idx == null) { return defaultValue; } return getBoolean(idx, defaultValue); } public boolean getBoolean(int idx, boolean defaultValue) { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); return translator.toBoolean(value, defaultValue); } public Date getDate(String fieldName) throws Exception { int idx = entityMeta.getIndex(fieldName); return getDate(idx, null); } public Date getDate(String fieldName, Date defaultValue) { Integer idx = entityMeta.getIndex(fieldName); if (idx == null) { return defaultValue; } try { return getDate(idx, defaultValue); } catch (Exception e) { return defaultValue; } } public Date getDate(int idx, Date defaultValue) throws Exception { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); return translator.toDate(value, defaultValue); } public Integer getInteger(String fieldName) throws Exception { int idx = entityMeta.getIndex(fieldName); return getInteger(idx, 0); } public Integer getInteger(String fieldName, int defaultValue) { int idx = entityMeta.getIndex(fieldName); return getInteger(idx, defaultValue); } public Integer getInteger(int idx, int defaultValue) { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); return translator.toInteger(value, defaultValue); } public BigDecimal getBigDecimal(String fieldName) throws Exception { int idx = entityMeta.getIndex(fieldName); return getBigDecimal(idx, BigDecimal.ZERO); } public BigDecimal getBigDecimal(String fieldName, BigDecimal defaultValue) { int idx = entityMeta.getIndex(fieldName); return getBigDecimal(idx, defaultValue); } public BigDecimal getBigDecimal(int idx, BigDecimal defaultValue) { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); return translator.toBigDecimal(value, defaultValue); } public double getDouble(String fieldName) throws Exception { int idx = entityMeta.getIndex(fieldName); return getDouble(idx, 0); } public double getDouble(String fieldName, double defaultValue) { int idx = entityMeta.getIndex(fieldName); return getDouble(idx, defaultValue); } public double getDouble(int idx, double defaultValue) { Object value = dataArray[idx]; ITranslator translator = entityMeta.getTranslator(idx); return translator.toDouble(value, defaultValue); } public String getSQLTypeCode(String typeField, String lengthField) { Object type = getValue(typeField); Object length = getValue(lengthField); return Translator.toSQLTypeCode(type, length); } public String getSQLNullCode(String fieldName) { Object nullable = getValue(fieldName); return Translator.toSQLNullCode(nullable); } public int getFieldCount() { return entityMeta.getFieldCount(); } public String[] getLowerNames() { return entityMeta.getLowerNames(); } public EntityMeta getEntityMeta() { return entityMeta; } public boolean isEmptyValue(String fieldName) { Integer idx = entityMeta.getIndex(fieldName); if (idx == null) { return true; } return isEmptyValue(idx); } public boolean isEmptyValue(int idx) { return dataArray[idx] == null; } @Override public List getVariantNameList() { String[] lowerNames = entityMeta.getLowerNames(); return Arrays.asList(lowerNames); } @Override public boolean containsVariant(String name) { return entityMeta.contains(name); } public void setVariant(String name, Object value) throws Exception { set(name, value); } public boolean valueEquals(String field, Object anotherValue) { Object value = getVarinatValue(field); if (value == null) { if (anotherValue == null) { return true; } return false; } if (anotherValue == null) { return false; } if (value.getClass().equals(anotherValue.getClass())) { return value.equals(anotherValue); } String valueStr = Translator.toString(value, ""); String anotherStr = Translator.toString(anotherValue, ""); return valueStr.equals(anotherStr); } public boolean isEmpty() { for (int i = 0; i < dataArray.length; i++) { if (dataArray[i] != null) { return false; } } return true; } public void setDeleted() { deleted = true; } public boolean isDeleted() { return deleted; } public String getTableName() { return entityMeta.getTableName(); } @Override public void writeJSONObject(IJSONWriter writer) { writer.beginObject(); writeJSONData(writer); writer.endObject(); } @Override public void writeJSONData(IJSONWriter writer) { String[] propertyNames = entityMeta.getLowerNames(); int cnt = propertyNames.length; for (int i = 0; i < cnt; i++) { writer.writeJSON(propertyNames[i], getJSONString(i, "\"error\"")); } } @Override public void setVariants(IVariantsProvider... providers) throws Exception { VariantLink.moveOnConsumer(this, providers); } @Override public Object getVariantValue(String name) { return getValue(name); } @Override public boolean isVariantNull(String name) { return isEmptyValue(name); } public boolean fieldExists(String fieldName) { return entityMeta.contains(fieldName); } }