package org.jmeld.util.conf; import org.jmeld.util.*; import java.io.*; import java.util.*; public class ConfigurationManager { private static ConfigurationManager instance = new ConfigurationManager(); private Map<String, AbstractConfiguration> configurations; private Map<String, WeakHashSet<ConfigurationListenerIF>> listenerMap; private ConfigurationManager() { configurations = new HashMap<>(); listenerMap = new HashMap<>(); } public static ConfigurationManager getInstance() { return instance; } public boolean reload(File file, Class clazz) { AbstractConfiguration configuration; configuration = load(clazz, file); if (configuration == null) { return false; } // Set the new filename AFTER the load was succesfull! configuration.setConfigurationFile(file); configurations.put(clazz.getName(), configuration); // Let everybody know that there is a new configuration! fireChanged(clazz); return true; } public AbstractConfiguration get(Class clazz) { AbstractConfiguration configuration; String key; key = clazz.getName(); configuration = configurations.get(key); if (configuration == null) { configuration = load(clazz); if (configuration == null) { try { configuration = (AbstractConfiguration) clazz.newInstance(); configuration.disableFireChanged(true); configuration.init(); configuration.disableFireChanged(false); } catch (Exception ex) { ex.printStackTrace(); } } configurations.put(key, configuration); } return configuration; } private AbstractConfiguration load(Class clazz) { ConfigurationPreference preference; File file; preference = new ConfigurationPreference(clazz); file = preference.getFile(); return load(clazz, file); } private AbstractConfiguration load(Class clazz, File file) { if (file.exists()) { try { return ConfigurationPersister.getInstance().load(clazz, file); } catch (Exception ex) { ex.printStackTrace(); } } return null; } void addConfigurationListener(Class clazz, ConfigurationListenerIF listener) { WeakHashSet<ConfigurationListenerIF> listeners; String key; key = clazz.getName(); listeners = listenerMap.get(key); if (listeners == null) { listeners = new WeakHashSet<>(); listenerMap.put(key, listeners); } listeners.add(listener); } void removeConfigurationListener(Class clazz, ConfigurationListenerIF listener) { Set<ConfigurationListenerIF> listeners; listeners = listenerMap.get(clazz.getName()); if (listeners != null) { listeners.remove(listener); } } void fireChanged(Class clazz) { Set<ConfigurationListenerIF> listeners; listeners = listenerMap.get(clazz.getName()); if (listeners != null) { try { //Don't communicate changes to components created by this fireChanged invokation Set<ConfigurationListenerIF> isolateListeners = new WeakHashSet<>(listeners); for (ConfigurationListenerIF listener : isolateListeners) { listener.configurationChanged(); } } catch (ConcurrentModificationException e) { e.printStackTrace(); } } } }