package foundation.dao; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.meta.field.FieldsRuntime; import foundation.data.object.DataObject; import foundation.util.ContentBuilder; import foundation.util.Util; public class PackageStringMap implements Map { protected static Logger logger; public static String Spliter = "__"; private DataPackage dataPackage; private String nullResult; private DataSource dataSource; private Map aliasMap; private List replaceList; static { logger = LogManager.getLogger(PackageStringMap.class); } public PackageStringMap(DataPackage dataPackage) { this.dataPackage = dataPackage; this.nullResult = null; this.dataSource = DataSource.DB; } public void setNullResult(String nullResult) { this.nullResult = nullResult; } public String onNullResult(String key) { if (nullResult == null) { return null; } logger.debug("get 【{}】, result is null", key); return nullResult; } @Override public int size() { return dataPackage.allItems.size(); } @Override public boolean isEmpty() { return dataPackage.isEmpty(DataSource.DB); } @Override public boolean containsKey(Object key) { if (key == null) { return nullResult != null; } ValueName valueName = new ValueName(String.valueOf(key)); PackageItem item = getPackageItem(valueName.itemName); if (item == null) { return nullResult != null; } try { DataObject dataObject = item.getDataObject(); FieldsRuntime fields = dataObject.getTableFieldMetas(); return fields.contains(valueName.fieldName) || (nullResult != null); } catch (Exception e) { return false; } } @Override public boolean containsValue(Object value) { return false; } @Override public String get(Object key) { if (key == null) { return nullResult; } String name = String.valueOf(key); ValueName valueName = new ValueName(name); PackageItem item = getPackageItem(valueName.itemName); if (item == null) { return onNullResult(name); } String result = null; if (item.isEntity(dataSource)) { Entity entity = item.getEntity(dataSource); result = getStringValue(entity, valueName.fieldName); } else if (item.isEntitySet(dataSource)) { ContentBuilder builder = new ContentBuilder(","); EntitySet entitySet = item.getEntitySet(dataSource); for (Entity entity: entitySet) { String value = entity.getString(valueName.fieldName); if (value == null) { value = onNullResult(name); } builder.append(value); } result = builder.toString(); } if (result == null) { result = onNullResult(name); } return result; } private PackageItem getPackageItem(String itemName) { if (aliasMap != null) { String original = aliasMap.get(itemName); if (!Util.isEmpty(original)) { itemName = original; } } PackageItem result = dataPackage.getItem(itemName); return result; } private String getStringValue(Entity entity, String fieldName) { if (Util.isEmpty(fieldName)) { return null; } if (replaceList != null) { for (ReplaceObject replace: replaceList) { fieldName = fieldName.replace(replace.original, replace.to); } } String result = entity.getString(fieldName); return result; } public void addAlias(String original, String alias) { if (Util.isEmpty(original) || Util.isEmpty(alias)) { return; } if (aliasMap == null) { synchronized (this) { if (aliasMap == null) { aliasMap = new HashMap(); } } } original = original.toLowerCase(); aliasMap.put(alias, original); } public void addReplace(String original, String replace) { if (Util.isEmpty(original)) { return; } if (replaceList == null) { synchronized (this) { if (replaceList == null) { replaceList = new ArrayList(); } } } ReplaceObject object = new ReplaceObject(original, replace); replaceList.add(object); } @Override public String put(String key, String value) { return value; } @Override public String remove(Object key) { return null; } @Override public void putAll(Map m) { } @Override public void clear() { } @Override public Set keySet() { return null; } @Override public Collection values() { return null; } @Override public Set> entrySet() { return null; } public static class ValueName { private String itemName; private String fieldName; public ValueName(String name) { int pos = name.indexOf(Spliter); if (pos > 0) { itemName = name.substring(0, pos); fieldName = name.substring(pos + Spliter.length()); } } public boolean isValid() { return !Util.isEmpty(itemName) && !Util.isEmpty(fieldName); } } public static class ReplaceObject { private String original; private String to; public ReplaceObject(String original, String to) { this.original = original; this.to = to; } } }