Add project manager as property change listener when loading projects.
[jSite2.git] / src / net / pterodactylus / jsite / core / ProjectManager.java
index 2619650..dd124fb 100644 (file)
@@ -22,26 +22,28 @@ package net.pterodactylus.jsite.core;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Properties;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import net.pterodactylus.util.collection.MapWriter;
 import net.pterodactylus.util.io.Closer;
 import net.pterodactylus.util.logging.Logging;
 
 /**
  * Manages projects, taking care of persistence, lifetime statistics, and other
  * things.
- * 
+ *
  * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
  */
 public class ProjectManager implements PropertyChangeListener {
@@ -61,7 +63,7 @@ public class ProjectManager implements PropertyChangeListener {
        /**
         * Creates a new project manager that saves and restores its state to/from
         * the given directory.
-        * 
+        *
         * @param directory
         *            The directory to save and restore states to/from
         */
@@ -75,7 +77,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Returns the directory the projects are loaded from and saved to.
-        * 
+        *
         * @return The directory for storing the projects
         */
        public String getDirectory() {
@@ -84,7 +86,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Returns a list of all projects.
-        * 
+        *
         * @return A list of all projects
         */
        public List<Project> getProjects() {
@@ -93,7 +95,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Sets the node manager to use.
-        * 
+        *
         * @param nodeManager
         *            The node manager to use
         */
@@ -107,7 +109,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Loads projects and statistics.
-        * 
+        *
         * @throws IOException
         *             if an I/O error occurs
         */
@@ -117,25 +119,26 @@ public class ProjectManager implements PropertyChangeListener {
                if (!projectFile.exists() || !projectFile.isFile() || !projectFile.canRead()) {
                        return;
                }
-               Properties projectProperties = new Properties();
-               InputStream projectInputStream = null;
+               logger.log(Level.INFO, "Loading projects from “" + projectFile + "”...");
+               Map<String, String> projectProperties;
+               Reader reader = null;
                try {
-                       projectInputStream = new FileInputStream(projectFile);
-                       projectProperties.load(projectInputStream);
+                       reader = new FileReader(projectFile);
+                       projectProperties = MapWriter.read(reader);
                } finally {
-                       Closer.close(projectInputStream);
+                       Closer.close(reader);
                }
                int projectIndex = 0;
                while (projectProperties.containsKey("projects." + projectIndex + ".name")) {
                        String projectPrefix = "projects." + projectIndex;
-                       String projectId = projectProperties.getProperty(projectPrefix + ".id");
-                       String projectName = projectProperties.getProperty(projectPrefix + ".name");
-                       String projectDescription = projectProperties.getProperty(projectPrefix + ".description");
-                       String projectPrivateKey = projectProperties.getProperty(projectPrefix + ".privateKey");
-                       String projectPublicKey = projectProperties.getProperty(projectPrefix + ".publicKey");
-                       String projectBasePath = projectProperties.getProperty(projectPrefix + ".basePath");
-                       String projectDefaultFile = projectProperties.getProperty(projectPrefix + ".defaultFile");
-                       String projectNode = projectProperties.getProperty(projectPrefix + ".node");
+                       String projectId = projectProperties.get(projectPrefix + ".id");
+                       String projectName = projectProperties.get(projectPrefix + ".name");
+                       String projectDescription = projectProperties.get(projectPrefix + ".description");
+                       String projectPrivateKey = projectProperties.get(projectPrefix + ".privateKey");
+                       String projectPublicKey = projectProperties.get(projectPrefix + ".publicKey");
+                       String projectBasePath = projectProperties.get(projectPrefix + ".basePath");
+                       String projectDefaultFile = projectProperties.get(projectPrefix + ".defaultFile");
+                       String projectNode = projectProperties.get(projectPrefix + ".node");
                        Project project = new Project();
                        project.setId(projectId);
                        project.setName(projectName);
@@ -150,12 +153,13 @@ public class ProjectManager implements PropertyChangeListener {
                        }
                        int overrideIndex = 0;
                        while (projectProperties.containsKey(projectPrefix + ".overrides." + overrideIndex + ".override")) {
-                               String filePath = projectProperties.getProperty(projectPrefix + ".overrides." + overrideIndex + ".filePath");
-                               FileOverride override = FileOverride.valueOf(projectProperties.getProperty(projectPrefix + ".overrides." + overrideIndex + ".override"));
+                               String filePath = projectProperties.get(projectPrefix + ".overrides." + overrideIndex + ".filePath");
+                               FileOverride override = FileOverride.valueOf(projectProperties.get(projectPrefix + ".overrides." + overrideIndex + ".override"));
                                project.addFileOverride(filePath, override);
                                logger.log(Level.FINEST, "read override: " + filePath + ", " + override);
                                overrideIndex++;
                        }
+                       project.addPropertyChangeListener(this);
                        projects.add(project);
                        logger.fine("loaded project “" + project.getName() + "”.");
                        projectIndex++;
@@ -164,7 +168,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Saves projects and statistics.
-        * 
+        *
         * @throws IOException
         *             if an I/O error occurs
         */
@@ -175,42 +179,42 @@ public class ProjectManager implements PropertyChangeListener {
                                throw new IOException("could not create directory: " + directory);
                        }
                }
-               Properties projectProperties = new Properties();
+               Map<String, String> projectProperties = new HashMap<String, String>();
                int projectIndex = 0;
                for (Project project : projects) {
                        String projectPrefix = "projects." + projectIndex;
-                       projectProperties.setProperty(projectPrefix + ".id", project.getId());
-                       projectProperties.setProperty(projectPrefix + ".name", project.getName());
-                       projectProperties.setProperty(projectPrefix + ".description", project.getDescription());
-                       projectProperties.setProperty(projectPrefix + ".privateKey", project.getPrivateKey());
-                       projectProperties.setProperty(projectPrefix + ".publicKey", project.getPublicKey());
-                       projectProperties.setProperty(projectPrefix + ".basePath", project.getBasePath());
-                       projectProperties.setProperty(projectPrefix + ".defaultFile", project.getDefaultFile());
+                       projectProperties.put(projectPrefix + ".id", project.getId());
+                       projectProperties.put(projectPrefix + ".name", project.getName());
+                       projectProperties.put(projectPrefix + ".description", project.getDescription());
+                       projectProperties.put(projectPrefix + ".privateKey", project.getPrivateKey());
+                       projectProperties.put(projectPrefix + ".publicKey", project.getPublicKey());
+                       projectProperties.put(projectPrefix + ".basePath", project.getBasePath());
+                       projectProperties.put(projectPrefix + ".defaultFile", project.getDefaultFile());
                        if (project.getNode() != null) {
-                               projectProperties.setProperty(projectPrefix + ".node", project.getNode().getId());
+                               projectProperties.put(projectPrefix + ".node", project.getNode().getId());
                        }
                        int overrideIndex = 0;
                        for (Entry<String, FileOverride> overrideEntry : project.getFileOverrides().entrySet()) {
-                               projectProperties.setProperty(projectPrefix + ".overrides." + overrideIndex + ".filePath", overrideEntry.getKey());
-                               projectProperties.setProperty(projectPrefix + ".overrides." + overrideIndex + ".override", overrideEntry.getValue().toString());
+                               projectProperties.put(projectPrefix + ".overrides." + overrideIndex + ".filePath", overrideEntry.getKey());
+                               projectProperties.put(projectPrefix + ".overrides." + overrideIndex + ".override", overrideEntry.getValue().toString());
                                overrideIndex++;
                        }
                        projectIndex++;
                }
                File projectFile = new File(directoryFile, "projects.properties");
-               OutputStream projectOutputStream = null;
+               Writer writer = null;
                try {
-                       projectOutputStream = new FileOutputStream(projectFile);
-                       projectProperties.store(projectOutputStream, "jSite projects");
+                       writer = new FileWriter(projectFile);
+                       MapWriter.write(writer, projectProperties);
                } finally {
-                       Closer.close(projectOutputStream);
+                       Closer.close(writer);
                }
        }
 
        /**
         * Creates a new project. The returned {@link Project} will contain a newly
         * generated key pair.
-        * 
+        *
         * @return A newly created project
         * @throws IOException
         *             if an I/O error occured communicating with the node
@@ -240,7 +244,7 @@ public class ProjectManager implements PropertyChangeListener {
         * Clones the given project and returns the clone. The clone will be
         * identical in all user-exposed fields, except for the project’s
         * {@link Project#getId ID}.
-        * 
+        *
         * @param project
         *            The project to clone
         * @return The cloned project
@@ -259,7 +263,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Removes the given project.
-        * 
+        *
         * @param project
         *            The project to remove
         */