package com.constellio.model.utils; import java.util.HashMap; import java.util.Map; import org.jdom2.Document; import com.constellio.data.dao.managers.config.ConfigManager; import com.constellio.data.dao.managers.config.ConfigManagerException.OptimisticLockingConfiguration; import com.constellio.data.dao.managers.config.DocumentAlteration; import com.constellio.data.dao.managers.config.events.ConfigUpdatedEventListener; import com.constellio.data.dao.managers.config.values.XMLConfiguration; import com.constellio.model.services.collections.CollectionsListManager; import com.constellio.model.services.collections.CollectionsListManagerListener; public class OneXMLConfigPerCollectionManager<T> implements ConfigUpdatedEventListener, CollectionsListManagerListener { private final String collectionFolderRelativeConfigPath; private final XMLConfigReader<T> configReader; private final ConfigManager configManager; private final CollectionsListManager collectionsListManager; private final Map<String, T> cache = new HashMap<>(); private final OneXMLConfigPerCollectionManagerListener<T> listener; private final DocumentAlteration newDocumentAlteration; public OneXMLConfigPerCollectionManager( ConfigManager configManager, CollectionsListManager collectionsListManager, String collectionFolderRelativeConfigPath, XMLConfigReader<T> configReader, OneXMLConfigPerCollectionManagerListener<T> listener) { this(configManager, collectionsListManager, collectionFolderRelativeConfigPath, configReader, listener, null); } public OneXMLConfigPerCollectionManager( ConfigManager configManager, CollectionsListManager collectionsListManager, String collectionFolderRelativeConfigPath, XMLConfigReader<T> configReader, OneXMLConfigPerCollectionManagerListener<T> listener, DocumentAlteration newDocumentAlteration) { this.newDocumentAlteration = newDocumentAlteration; this.configReader = configReader; this.configManager = configManager; this.collectionsListManager = collectionsListManager; this.listener = listener; if (!collectionFolderRelativeConfigPath.startsWith("/")) { this.collectionFolderRelativeConfigPath = "/" + collectionFolderRelativeConfigPath; } else { this.collectionFolderRelativeConfigPath = collectionFolderRelativeConfigPath; } collectionsListManager.registerCollectionsListener(this); for (String collection : collectionsListManager.getCollections()) { registerCollectionConfigAndLoad(collection); } } private void registerCollectionConfigAndLoad(String collection) { String configPath = getConfigPath(collection); configManager.registerListener(configPath, this); load(collection, configPath); } public String getConfigPath(String collectionCode) { return "/" + collectionCode + collectionFolderRelativeConfigPath; } public String getCollectionCode(String configPath) { return configPath.split("/")[1]; } public void updateXML(String collection, DocumentAlteration documentAlteration) { String configPath = getConfigPath(collection); configManager.updateXML(configPath, documentAlteration); load(collection, configPath); } public void update(String collection, String hash, Document document) throws OptimisticLockingConfiguration { String configPath = getConfigPath(collection); configManager.update(configPath, hash, document); //load(collection, configPath); } public T get(String collection) { return cache.get(collection); } public void reload(String collection) { cache.remove(collection); String configPath = getConfigPath(collection); load(collection, configPath); } void load(String collection, String configPath) { XMLConfiguration config = configManager.getXML(configPath); if (config == null) { configManager.createXMLDocumentIfInexistent(configPath, newDocumentAlteration); config = configManager.getXML(configPath); } T value = parse(collection, config); cache.put(collection, value); } protected T parse(String collection, XMLConfiguration xmlConfiguration) { Document document = xmlConfiguration.getDocument(); return configReader.read(collection, document); } @Override public void onConfigUpdated(String configPath) { String collection = getCollectionCode(configPath); load(collection, configPath); listener.onValueModified(collection, get(collection)); } @Override public void onCollectionCreated(final String collection) { String configPath = getConfigPath(collection); registerCollectionConfigAndLoad(collection); } @Override public void onCollectionDeleted(String collection) { cache.remove(collection); } public void createCollectionFile(final String collection, DocumentAlteration documentAlteration) { String configPath = getConfigPath(collection); configManager.createXMLDocumentIfInexistent(configPath, documentAlteration); load(collection, configPath); } }