X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fproject%2FProjectManager.java;h=2cad1e430b79761c306ab5365d03cff3a14ed8da;hb=1b87930e43eb7d14068a21ed0b488f28cc6ce49b;hp=fd620612250400418371fa590229c2a585aff610;hpb=10b165ebaa51eccec487500b32f0c7b3106923af;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/project/ProjectManager.java b/src/net/pterodactylus/jsite/project/ProjectManager.java index fd62061..2cad1e4 100644 --- a/src/net/pterodactylus/jsite/project/ProjectManager.java +++ b/src/net/pterodactylus/jsite/project/ProjectManager.java @@ -19,6 +19,8 @@ package net.pterodactylus.jsite.project; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -29,25 +31,29 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Properties; +import java.util.Random; import java.util.logging.Logger; import net.pterodactylus.jsite.core.JSiteException; import net.pterodactylus.jsite.core.NodeManager; 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> - * @version $Id$ */ -public class ProjectManager { +public class ProjectManager implements PropertyChangeListener { /** Logger. */ private static final Logger logger = Logging.getLogger(ProjectManager.class.getName()); + /** The RNG used to create project IDs. */ + private static final Random random = new Random(); + /** The directory the projects are stored in. */ private final String directory; @@ -127,15 +133,20 @@ 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"); Project project = new Project(); + project.setId(projectId); project.setName(projectName); project.setDescription(projectDescription); project.setPrivateKey(projectPrivateKey); project.setPublicKey(projectPublicKey); + project.setBasePath(projectBasePath); + project.rescanBasePath(); projects.add(project); logger.fine("loaded project “" + project.getName() + "”."); projectIndex++; @@ -159,10 +170,12 @@ public class ProjectManager { 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()); projectIndex++; } File projectFile = new File(directoryFile, "projects.properties"); @@ -188,9 +201,88 @@ public class ProjectManager { public Project createProject() throws IOException, JSiteException { Project project = new Project(); String[] keyPair = nodeManager.generateKeyPair(); + project.setId(generateId()); + project.setName(""); + project.setDescription(""); project.setPrivateKey(keyPair[0]); project.setPublicKey(keyPair[1]); + project.setBasePath(""); 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.setId(generateId()); + 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. */ + } + } + + // + // PRIVATE METHODS + // + + /** + * Generates a new random ID, consisting of 16 random bytes converted to a + * hexadecimal number. + * + * @return The new ID + */ + private static String generateId() { + byte[] idBytes = new byte[16]; + random.nextBytes(idBytes); + return Hex.toHex(idBytes); + } + + // + // INTERFACE PropertyChangeListener + // + + /** + * {@inheritDoc} + */ + public void propertyChange(PropertyChangeEvent propertyChangeEvent) { + try { + save(); + } catch (IOException ioe1) { + /* ignore. */ + } + } + }