package br.uff.ic.dyevc.utils; //~--- non-JDK imports -------------------------------------------------------- import br.uff.ic.dyevc.application.DyeVC; import br.uff.ic.dyevc.beans.ApplicationSettingsBean; import br.uff.ic.dyevc.gui.core.MessageManager; import br.uff.ic.dyevc.model.MonitoredRepositories; import br.uff.ic.dyevc.model.MonitoredRepository; import org.slf4j.LoggerFactory; //~--- JDK imports ------------------------------------------------------------ import java.util.Date; import java.util.Iterator; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; /** * Utilities to load and store application preferences using java Preferences * API. * * @author Cristiano */ public final class PreferencesManager { /** * Name of node to store general settings. */ private static final String NODE_GENERAL_SETTINGS = "generalsettings"; /** * Name of node to store monitored repositories configuration. */ private static final String NODE_MONITORED_REPOSITORIES = "monitoredrepositories"; /** * Default interval between checks, in seconds. Defaults to 10 minutes. */ private static final int DEFAULT_CHECK_INTERVAL = 600; /** * Singleton persistence manager */ private static PreferencesManager instance; /** * Creates a persistence manager loading the persisted elements */ private PreferencesManager() { pref = Preferences.userNodeForPackage(DyeVC.class); } /** * Provides the singleton instance * @return the singleton instance. */ public synchronized static PreferencesManager getInstance() { if (instance == null) { instance = new PreferencesManager(); } return instance; } /** * Object the points to a preferences instance. */ private final Preferences pref; /** * Bean containing application general preferences. */ private ApplicationSettingsBean settingsBean; private MonitoredRepository saveRepository(MonitoredRepository repositoryBean, Preferences nodeToStore) { nodeToStore.node(repositoryBean.getId()).put("systemName", repositoryBean.getSystemName()); nodeToStore.node(repositoryBean.getId()).put("name", repositoryBean.getName()); nodeToStore.node(repositoryBean.getId()).put("cloneaddress", repositoryBean.getCloneAddress()); nodeToStore.node(repositoryBean.getId()).putBoolean("markedForDeletion", repositoryBean.isMarkedForDeletion()); if (repositoryBean.getLastChanged() != null) { nodeToStore.node(repositoryBean.getId()).putLong("lastChanged", repositoryBean.getLastChanged().getTime()); } return repositoryBean; } /** * Stores general preferences using java Preferences API. * * @param bean the bean to be stored. */ public void storePreferences(ApplicationSettingsBean bean) { Preferences nodeToStore = pref.node(NODE_GENERAL_SETTINGS); nodeToStore.putInt(ApplicationSettingsBean.PROP_REFRESHINTERVAL, bean.getRefreshInterval()); nodeToStore.putBoolean(ApplicationSettingsBean.PROP_PERFORMANCE_MODE, bean.isPerformanceMode()); nodeToStore.put(ApplicationSettingsBean.PROP_LAST_USED_PATH, bean.getLastUsedPath()); nodeToStore.put(ApplicationSettingsBean.PROP_DATABASE_PATH, bean.getDatabasePath()); nodeToStore.put(ApplicationSettingsBean.PROP_APP_KEY, bean.getAppKey()); if (bean.getLastApplicationVersionUsed() != null) { nodeToStore.put(ApplicationSettingsBean.PROP_LAST_APP_VERSION_USED, bean.getLastApplicationVersionUsed()); } settingsBean = bean; } /** * Loads general preferences using java Preferences API. * * @return the bean containing loaded general preferences. */ public ApplicationSettingsBean loadPreferences() { if (settingsBean == null) { Preferences nodeToLoad = pref.node(NODE_GENERAL_SETTINGS); ApplicationSettingsBean bean = new ApplicationSettingsBean(); bean.setRefreshInterval(nodeToLoad.getInt(ApplicationSettingsBean.PROP_REFRESHINTERVAL, DEFAULT_CHECK_INTERVAL)); bean.setPerformanceMode(nodeToLoad.getBoolean(ApplicationSettingsBean.PROP_PERFORMANCE_MODE, false)); bean.setLastUsedPath(nodeToLoad.get(ApplicationSettingsBean.PROP_LAST_USED_PATH, "")); bean.setLastApplicationVersionUsed(nodeToLoad.get(ApplicationSettingsBean.PROP_LAST_APP_VERSION_USED, "0.0")); bean.setDatabasePath(nodeToLoad.get(ApplicationSettingsBean.PROP_DATABASE_PATH, "")); bean.setAppKey(nodeToLoad.get(ApplicationSettingsBean.PROP_APP_KEY, "")); settingsBean = bean; } return settingsBean; } /** * Stores the configuration for all monitored repositories into user * preferences. * * @see MonitoredRepositories */ public void persistRepositories() { try { if (pref.nodeExists(NODE_MONITORED_REPOSITORIES)) { pref.node(NODE_MONITORED_REPOSITORIES).removeNode(); pref.flush(); } } catch (BackingStoreException ex) { LoggerFactory.getLogger(PreferencesManager.class).error("Error saving repository to preferences store.", ex); MessageManager.getInstance().addMessage("Error saving repository to preferences store."); } Preferences nodeToStore = pref.node(NODE_MONITORED_REPOSITORIES); for (Iterator<MonitoredRepository> it = MonitoredRepositories.getMonitoredProjects().iterator(); it.hasNext(); ) { MonitoredRepository repositoryBean = it.next(); saveRepository(repositoryBean, nodeToStore); } for (Iterator<MonitoredRepository> it = MonitoredRepositories.getMarkedForDeletion().iterator(); it.hasNext(); ) { MonitoredRepository repositoryBean = it.next(); saveRepository(repositoryBean, nodeToStore); } } /** * Loads a list of monitored repositories from user preferences. * * @return a list of monitored repositories configuration */ public MonitoredRepositories loadMonitoredRepositories() { MonitoredRepositories monBean = MonitoredRepositories.getInstance(); try { if (pref.nodeExists(NODE_MONITORED_REPOSITORIES)) { Preferences nodeToStore = pref.node(NODE_MONITORED_REPOSITORIES); String[] reps = nodeToStore.childrenNames(); for (String rep : reps) { Preferences repNode = nodeToStore.node(rep); MonitoredRepository bean = new MonitoredRepository(repNode.name()); bean.setSystemName(repNode.get("systemName", "no name")); bean.setName(repNode.get("name", "no name")); bean.setCloneAddress(repNode.get("cloneaddress", "no cloneaddress")); bean.setMarkedForDeletion(repNode.getBoolean("markedForDeletion", false)); long lastChanged = repNode.getLong("lastChanged", 0); if (lastChanged != 0) { bean.setLastChanged(new Date(lastChanged)); } monBean.addMonitoredRepository(bean); } } } catch (BackingStoreException ex) { LoggerFactory.getLogger(PreferencesManager.class).error( "Error reading repository info from preferences store.", ex); MessageManager.getInstance().addMessage("Error loading repository info from preferences store."); } return monBean; } }