X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fcore%2FProjectManager.java;h=2e28ab9b92fc8e2b3d324ed5a3e05d27b74fc95f;hb=c63257e8cc0ba1a5aca9364b22171abe7279d479;hp=5bb4c75cd96479bf323ecb7d4589229d4f810f51;hpb=8f4514995d6a8bc65b04b8062738faf334c8a189;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/core/ProjectManager.java b/src/net/pterodactylus/jsite/core/ProjectManager.java index 5bb4c75..2e28ab9 100644 --- a/src/net/pterodactylus/jsite/core/ProjectManager.java +++ b/src/net/pterodactylus/jsite/core/ProjectManager.java @@ -19,6 +19,8 @@ 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; @@ -29,6 +31,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Properties; +import java.util.Map.Entry; +import java.util.logging.Level; import java.util.logging.Logger; import net.pterodactylus.util.io.Closer; @@ -37,11 +41,10 @@ import net.pterodactylus.util.logging.Logging; /** * Manages projects, taking care of persistence, lifetime statistics, and other * things. - * + * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> - * @version $Id$ */ -public class ProjectManager { +public class ProjectManager implements PropertyChangeListener { /** Logger. */ private static final Logger logger = Logging.getLogger(ProjectManager.class.getName()); @@ -58,7 +61,7 @@ public class ProjectManager { /** * 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 */ @@ -72,7 +75,7 @@ public class ProjectManager { /** * Returns the directory the projects are loaded from and saved to. - * + * * @return The directory for storing the projects */ public String getDirectory() { @@ -81,7 +84,7 @@ public class ProjectManager { /** * Returns a list of all projects. - * + * * @return A list of all projects */ public List getProjects() { @@ -90,7 +93,7 @@ public class ProjectManager { /** * Sets the node manager to use. - * + * * @param nodeManager * The node manager to use */ @@ -104,7 +107,7 @@ public class ProjectManager { /** * Loads projects and statistics. - * + * * @throws IOException * if an I/O error occurs */ @@ -125,15 +128,34 @@ public class ProjectManager { 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"); Project project = new Project(); + project.setId(projectId); project.setName(projectName); project.setDescription(projectDescription); project.setPrivateKey(projectPrivateKey); 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")); + project.addFileOverride(filePath, override); + logger.log(Level.FINEST, "read override: " + filePath + ", " + override); + overrideIndex++; + } projects.add(project); logger.fine("loaded project “" + project.getName() + "”."); projectIndex++; @@ -142,7 +164,7 @@ public class ProjectManager { /** * Saves projects and statistics. - * + * * @throws IOException * if an I/O error occurs */ @@ -155,12 +177,24 @@ public class ProjectManager { } Properties projectProperties = new Properties(); int projectIndex = 0; - for (Project project: projects) { + 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()); + if (project.getNode() != null) { + projectProperties.setProperty(projectPrefix + ".node", project.getNode().getId()); + } + int overrideIndex = 0; + for (Entry overrideEntry : project.getFileOverrides().entrySet()) { + projectProperties.setProperty(projectPrefix + ".overrides." + overrideIndex + ".filePath", overrideEntry.getKey()); + projectProperties.setProperty(projectPrefix + ".overrides." + overrideIndex + ".override", overrideEntry.getValue().toString()); + overrideIndex++; + } projectIndex++; } File projectFile = new File(directoryFile, "projects.properties"); @@ -176,19 +210,81 @@ public class ProjectManager { /** * 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 - * @throws NoNodeException - * if no node is configured + * @throws JSiteException + * if there is a problem with the node */ - public Project createProject() throws IOException, NoNodeException { + public Project createProject() throws IOException, JSiteException { Project project = new Project(); String[] keyPair = nodeManager.generateKeyPair(); + project.setName(""); + project.setDescription(""); project.setPrivateKey(keyPair[0]); project.setPublicKey(keyPair[1]); + project.setBasePath(""); + project.setDefaultFile(""); projects.add(project); + project.addPropertyChangeListener(this); + try { + save(); + } catch (IOException ioe1) { + /* ignore. */ + } return project; } + + /** + * 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 + */ + public Project cloneProject(Project project) { + Project projectClone = new Project(project); + projects.add(projectClone); + projectClone.addPropertyChangeListener(this); + try { + save(); + } catch (IOException ioe1) { + /* ignore. */ + } + return projectClone; + } + + /** + * Removes the given project. + * + * @param project + * The project to remove + */ + public void removeProject(Project project) { + projects.remove(project); + try { + save(); + } catch (IOException ioe1) { + /* ignore. */ + } + } + + // + // INTERFACE PropertyChangeListener + // + + /** + * {@inheritDoc} + */ + public void propertyChange(PropertyChangeEvent propertyChangeEvent) { + try { + save(); + } catch (IOException ioe1) { + /* ignore. */ + } + } + }