Add project manager as property change listener when loading projects.
[jSite2.git] / src / net / pterodactylus / jsite / core / ProjectManager.java
index 782a5d6..dd124fb 100644 (file)
@@ -22,28 +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.jsite.util.IdGenerator;
+import net.pterodactylus.util.collection.MapWriter;
 import net.pterodactylus.util.io.Closer;
 import net.pterodactylus.util.logging.Logging;
-import net.pterodactylus.util.number.Hex;
 
 /**
  * Manages projects, taking care of persistence, lifetime statistics, and other
  * things.
- * 
+ *
  * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
  */
 public class ProjectManager implements PropertyChangeListener {
@@ -63,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
         */
@@ -77,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() {
@@ -86,7 +86,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Returns a list of all projects.
-        * 
+        *
         * @return A list of all projects
         */
        public List<Project> getProjects() {
@@ -95,7 +95,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Sets the node manager to use.
-        * 
+        *
         * @param nodeManager
         *            The node manager to use
         */
@@ -109,7 +109,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Loads projects and statistics.
-        * 
+        *
         * @throws IOException
         *             if an I/O error occurs
         */
@@ -119,24 +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 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);
@@ -145,14 +147,19 @@ public class ProjectManager implements PropertyChangeListener {
                        project.setPublicKey(projectPublicKey);
                        project.setBasePath(projectBasePath);
                        project.setDefaultFile(projectDefaultFile);
+                       if (projectNode != null) {
+                               Node node = nodeManager.getNode(projectNode);
+                               project.setNode(node);
+                       }
                        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++;
@@ -161,7 +168,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Saves projects and statistics.
-        * 
+        *
         * @throws IOException
         *             if an I/O error occurs
         */
@@ -172,39 +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.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
@@ -214,7 +224,6 @@ public class ProjectManager implements PropertyChangeListener {
        public Project createProject() throws IOException, JSiteException {
                Project project = new Project();
                String[] keyPair = nodeManager.generateKeyPair();
-               project.setId(Hex.toHex(IdGenerator.generateId()));
                project.setName("");
                project.setDescription("");
                project.setPrivateKey(keyPair[0]);
@@ -235,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
@@ -243,7 +252,6 @@ public class ProjectManager implements PropertyChangeListener {
        public Project cloneProject(Project project) {
                Project projectClone = new Project(project);
                projects.add(projectClone);
-               projectClone.setId(Hex.toHex(IdGenerator.generateId()));
                projectClone.addPropertyChangeListener(this);
                try {
                        save();
@@ -255,7 +263,7 @@ public class ProjectManager implements PropertyChangeListener {
 
        /**
         * Removes the given project.
-        * 
+        *
         * @param project
         *            The project to remove
         */