package foundation.io.define; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.dao.DataPackage; import foundation.data.meta.MetaMonitor; import foundation.data.meta.ReloadCheckResult; import foundation.io.IOLoader; import foundation.io.mapping.IOMappings; import foundation.util.MapList; import foundation.util.Util; public class DataIOContainer { protected static Logger logger; public static boolean Debug = true; private static DataIOContainer instance; private static Object locker = new Object(); private MapList taskList; private MapList mappingsList; private MetaMonitor ioMonitor; private MetaMonitor mappingsMonitor; static { logger = LogManager.getLogger(DataPackage.class); } private DataIOContainer() { taskList = new MapList(); mappingsList = new MapList(); ioMonitor = new MetaMonitor("getIOTaskLastUpdateTime"); mappingsMonitor = new MetaMonitor("getMappingListByParentId"); } public static DataIOContainer getInstance() { if (instance == null) { synchronized (locker) { if (instance == null) { instance = new DataIOContainer(); } } } return instance; } public IOTask getIOTask(String name) throws Exception { if (Util.isEmpty(name)) { return null; } synchronized (this) { ioMonitor.setParam("taskName", name); ReloadCheckResult checkResult = ioMonitor.getReloadCheckResult(); if (checkResult.isNeedReload()) { reloadIOTask(name); } } IOTask ioTask = taskList.get(name); return ioTask; } public IOMappings getIOMappings(String name) throws Exception { if (Util.isEmpty(name)) { return new IOMappings(IOSource.AutoCreate); } synchronized (this) { mappingsMonitor.setParam("mappingId", name); ReloadCheckResult checkResult = mappingsMonitor.getReloadCheckResult(); if (checkResult.isNeedReload()) { reloadIOMappings(name); } } IOMappings mappings = mappingsList.get(name); if (mappings == null) { mappings = new IOMappings(IOSource.AutoCreate); } return mappings; } private IOTask reloadIOTask(String name) throws Exception { IOTask ioTask = taskList.get(name); ioTask = IOLoader.loadOneIOTask(name, ioTask); taskList.set(name, ioTask); return ioTask; } private IOMappings reloadIOMappings(String name) throws Exception { IOMappings mappings = mappingsList.get(name); mappings = IOLoader.loadOneIOMappings(name, mappings); mappingsList.set(name, mappings); return mappings; } public void clear() { taskList.clear(); mappingsList.clear(); } }