package foundation.object.reader; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public abstract class EntityReader implements IEntityReader { protected static Logger logger; protected static Set excludeMethods; private static Map, ObjectReader> objectReadercontainer; private static Map, MapReader> mapReaderContainer; private static Map, CollectionReader> collectionReaderContainer; protected Class clazz; static { logger = LogManager.getLogger(ObjectReader.class); createExcludeMethodSet(); objectReadercontainer = new HashMap, ObjectReader>(); mapReaderContainer = new HashMap, MapReader>(); collectionReaderContainer = new HashMap, CollectionReader>(); } protected EntityReader(Class clazz) { this.clazz = clazz; } public static IEntityReader getInstance(Class clazz) throws Exception { if (Collection.class.isAssignableFrom(clazz)) { return getCollectionInstance(clazz); } else if (Map.class.isAssignableFrom(clazz)) { return getMapInstance(clazz); } else { return getObjectInstance(clazz); } } public static ObjectReader getObjectInstance(Class clazz) throws Exception { ObjectReader result = objectReadercontainer.get(clazz); if (result == null) { synchronized (objectReadercontainer) { result = objectReadercontainer.get(clazz); if (result == null) { result = new ObjectReader(clazz); objectReadercontainer.put(clazz, result); } } } return result; } public static MapReader getMapInstance(Class clazz) throws Exception { MapReader result = mapReaderContainer.get(clazz); if (result == null) { synchronized (mapReaderContainer) { result = mapReaderContainer.get(clazz); if (result == null) { result = new MapReader(clazz); mapReaderContainer.put(clazz, result); } } } return result; } public static CollectionReader getCollectionInstance(Class clazz) throws Exception { CollectionReader result = collectionReaderContainer.get(clazz); if (result == null) { synchronized (collectionReaderContainer) { result = collectionReaderContainer.get(clazz); if (result == null) { result = new CollectionReader(clazz); collectionReaderContainer.put(clazz, result); } } } return result; } protected abstract void initValueReader(Class dataType) throws Exception; public abstract String getString(Object entity); public abstract String getJSONString(Object entity) throws Exception; public Class getEntityClass() { return clazz; } private static void createExcludeMethodSet() { excludeMethods = new HashSet(); excludeMethods.add("getclass"); excludeMethods.add("getnames"); excludeMethods.add("getsize"); excludeMethods.add("containsproperty"); excludeMethods.add("loaddata"); excludeMethods.add("setdata"); excludeMethods.add("setdataString"); excludeMethods.add("getdata"); excludeMethods.add("getString"); excludeMethods.add("getjsonString"); excludeMethods.add("getsqlString"); excludeMethods.add("getvalue"); excludeMethods.add("getdynamicdata"); excludeMethods.add("iterator"); excludeMethods.add("toString"); excludeMethods.add("finalize"); excludeMethods.add("wait"); excludeMethods.add("hashcode"); excludeMethods.add("clone"); excludeMethods.add("registernatives"); excludeMethods.add("equals"); excludeMethods.add("notify"); excludeMethods.add("notifyall"); excludeMethods.add("getinstance"); } }