/** * */ package cz.cuni.mff.peckam.java.origamist.configuration; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; import cz.cuni.mff.peckam.java.origamist.math.AngleUnit; import cz.cuni.mff.peckam.java.origamist.model.UnitDimension; import cz.cuni.mff.peckam.java.origamist.model.jaxb.Unit; import cz.cuni.mff.peckam.java.origamist.services.Service; import cz.cuni.mff.peckam.java.origamist.services.interfaces.ConfigurationManager; import cz.cuni.mff.peckam.java.origamist.utils.LocaleConverter; import cz.cuni.mff.peckam.java.origamist.utils.UnitDimensionWithLabel; /** * A default implementation of a configuration manager that stores the configuration in Preferences. * * @author Martin Pecka */ public class ConfigurationManagerImpl extends Service implements ConfigurationManager { /** The active configuration. */ protected Configuration configuration = null; /** The preferences node associated with this configuration manager. */ protected Preferences prefs = null; /** * Load the configuration from the preferences. If the configuration is already loaded, this reloads the values from * the properties into the active configuration (and will fire appropriate <code>PropertyChangeEvent</code>s). */ public void load() { if (configuration == null) configuration = new Configuration(); Locale locale = null; Locale diagramLocale = null; File lastExportPath = null; File lastOpenPath = null; URL lastOpenURL = null; Unit preferredUnit = null; String defaultAuthorName = null; String defaultAuthorHomepage = null; List<UnitDimensionWithLabel> papers = new LinkedList<UnitDimensionWithLabel>(); AngleUnit preferredAngleUnit = null; try { prefs = Preferences.userNodeForPackage(ConfigurationManager.class); locale = LocaleConverter.parse(prefs.get("locale", null)); diagramLocale = LocaleConverter.parse(prefs.get("diagramLocale", null)); lastExportPath = new File(prefs.get("lastExportPath", System.getProperty("user.dir"))); lastOpenPath = new File(prefs.get("lastOpenPath", System.getProperty("user.dir"))); try { lastOpenURL = new URL(prefs.get("lastOpenURL", ".")); } catch (MalformedURLException e1) { try { lastOpenURL = new URL("."); } catch (MalformedURLException e) {} } try { preferredUnit = Enum.valueOf(Unit.class, prefs.get("preferredUnit", null)); } catch (NullPointerException e) {} catch (IllegalArgumentException e) {} try { preferredAngleUnit = Enum.valueOf(AngleUnit.class, prefs.get("preferredAngleUnit", null)); } catch (NullPointerException e) {} catch (IllegalArgumentException e) {} defaultAuthorName = prefs.get("defaultAuthorName", System.getProperty("user.name", "")); defaultAuthorHomepage = prefs.get("defaultAuthorHomepage", ""); int numPapers = prefs.getInt("papers.count", 0); for (int i = 0; i < numPapers; i++) { String prefix = "papers." + i + "."; String label = prefs.get(prefix + "label", ""); double width = prefs.getDouble(prefix + "width", 0d); double height = prefs.getDouble(prefix + "height", 0d); Unit unit = Unit.values()[0]; try { unit = Enum.valueOf(Unit.class, prefs.get(prefix + "unit", unit.toString())); } catch (NullPointerException e) {} catch (IllegalArgumentException e) {} double refLength = prefs.getDouble(prefix + "refLength", 0d); Unit refUnit = null; try { refUnit = Enum.valueOf(Unit.class, prefs.get(prefix + "unit", null)); } catch (NullPointerException e) {} catch (IllegalArgumentException e) {} UnitDimension dim = new UnitDimension(); dim.setWidth(width); dim.setHeight(height); dim.setUnit(unit); dim.setReference(refUnit, refLength); UnitDimensionWithLabel paper = new UnitDimensionWithLabel(dim, label); papers.add(paper); } } catch (SecurityException e) { System.err .println("Couldn't load configuration because of security constraints. Using default configuration."); // the default configuration will be loaded further, because all values will remain null } if (locale == null) locale = Locale.getDefault(); configuration.setLocale(locale); if (diagramLocale == null) diagramLocale = Locale.getDefault(); configuration.setDiagramLocale(diagramLocale); configuration.setLastExportPath(lastExportPath); configuration.setLastOpenPath(lastOpenPath); configuration.setLastOpenURL(lastOpenURL); configuration.setPreferredUnit(preferredUnit); configuration.setPreferredAngleUnit(preferredAngleUnit); configuration.setDefaultAuthorName(defaultAuthorName); configuration.setDefaultAuthorHomepage(defaultAuthorHomepage); configuration.getPapers().clear(); configuration.getPapers().addAll(papers); } @Override public Configuration get() { if (configuration == null) load(); return configuration; } @Override public void persist() throws BackingStoreException { if (prefs == null || configuration == null) return; String tmp = LocaleConverter.print(configuration.getLocale()); prefs.put("locale", tmp == null ? "" : tmp); tmp = LocaleConverter.print(configuration.getDiagramLocale()); prefs.put("diagramLocale", tmp == null ? "" : tmp); prefs.put("lastExportPath", configuration.getLastExportPath().toString()); prefs.put("lastOpenPath", configuration.getLastOpenPath().toString()); if (configuration.getLastOpenURL() == null) { prefs.remove("lastOpenURL"); } else { prefs.put("lastOpenURL", configuration.getLastOpenURL().toString()); } if (configuration.getPreferredUnit() == null) { prefs.remove("preferredUnit"); } else { prefs.put("preferredUnit", configuration.getPreferredUnit().toString()); } if (configuration.getPreferredAngleUnit() == null) { prefs.remove("preferredAngleUnit"); } else { prefs.put("preferredAngleUnit", configuration.getPreferredAngleUnit().toString()); } prefs.put("defaultAuthorName", configuration.getDefaultAuthorName()); prefs.put("defaultAuthorHomepage", configuration.getDefaultAuthorHomepage()); List<UnitDimensionWithLabel> papers = configuration.getPapers(); prefs.putInt("papers.count", papers.size()); for (int i = 0; i < papers.size(); i++) { UnitDimensionWithLabel paper = papers.get(i); String prefix = "papers." + i + "."; prefs.put(prefix + "label", paper.getLabel()); prefs.putDouble(prefix + "width", paper.getDimension().getWidth()); prefs.putDouble(prefix + "height", paper.getDimension().getHeight()); prefs.put(prefix + "unit", paper.getDimension().getUnit().toString()); if (paper.getDimension().getReferenceLength() != null) prefs.putDouble(prefix + "refLength", paper.getDimension().getReferenceLength()); if (paper.getDimension().getReferenceUnit() != null) prefs.put(prefix + "refUnit", paper.getDimension().getReferenceUnit().toString()); } prefs.flush(); } }