X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fproject%2FProjectManager.java;h=35436cace337e08120e7802d0358caab48f470e6;hb=d6015942121ba0e43177da20c3559126e9c6dafe;hp=616ea239aec0347cc53bd24e24362c24ceb7518d;hpb=cf127faffabd3f07b0acc6de9ea746059d571b56;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/project/ProjectManager.java b/src/net/pterodactylus/jsite/project/ProjectManager.java index 616ea23..35436ca 100644 --- a/src/net/pterodactylus/jsite/project/ProjectManager.java +++ b/src/net/pterodactylus/jsite/project/ProjectManager.java @@ -32,6 +32,8 @@ import java.util.Collections; import java.util.List; import java.util.Properties; import java.util.Random; +import java.util.Map.Entry; +import java.util.logging.Level; import java.util.logging.Logger; import net.pterodactylus.jsite.core.JSiteException; @@ -43,7 +45,7 @@ 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 { @@ -66,7 +68,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 */ @@ -80,7 +82,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() { @@ -89,7 +91,7 @@ public class ProjectManager implements PropertyChangeListener { /** * Returns a list of all projects. - * + * * @return A list of all projects */ public List getProjects() { @@ -98,7 +100,7 @@ public class ProjectManager implements PropertyChangeListener { /** * Sets the node manager to use. - * + * * @param nodeManager * The node manager to use */ @@ -112,7 +114,7 @@ public class ProjectManager implements PropertyChangeListener { /** * Loads projects and statistics. - * + * * @throws IOException * if an I/O error occurs */ @@ -139,6 +141,7 @@ public class ProjectManager implements PropertyChangeListener { String projectPrivateKey = projectProperties.getProperty(projectPrefix + ".privateKey"); String projectPublicKey = projectProperties.getProperty(projectPrefix + ".publicKey"); String projectBasePath = projectProperties.getProperty(projectPrefix + ".basePath"); + String projectDefaultFile = projectProperties.getProperty(projectPrefix + ".defaultFile"); Project project = new Project(); project.setId(projectId); project.setName(projectName); @@ -146,7 +149,15 @@ public class ProjectManager implements PropertyChangeListener { project.setPrivateKey(projectPrivateKey); project.setPublicKey(projectPublicKey); project.setBasePath(projectBasePath); - project.rescanBasePath(); + project.setDefaultFile(projectDefaultFile); + 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++; @@ -155,7 +166,7 @@ public class ProjectManager implements PropertyChangeListener { /** * Saves projects and statistics. - * + * * @throws IOException * if an I/O error occurs */ @@ -168,7 +179,7 @@ public class ProjectManager implements PropertyChangeListener { } 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()); @@ -176,6 +187,13 @@ public class ProjectManager implements PropertyChangeListener { projectProperties.setProperty(projectPrefix + ".privateKey", project.getPrivateKey()); projectProperties.setProperty(projectPrefix + ".publicKey", project.getPublicKey()); projectProperties.setProperty(projectPrefix + ".basePath", project.getBasePath()); + projectProperties.setProperty(projectPrefix + ".defaultFile", project.getDefaultFile()); + 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"); @@ -191,7 +209,7 @@ public class ProjectManager implements PropertyChangeListener { /** * 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 @@ -201,13 +219,13 @@ public class ProjectManager implements PropertyChangeListener { public Project createProject() throws IOException, JSiteException { Project project = new Project(); String[] keyPair = nodeManager.generateKeyPair(); - byte[] idBytes = new byte[16]; - random.nextBytes(idBytes); - project.setId(Hex.toHex(idBytes)); + project.setId(generateId()); project.setName(""); project.setDescription(""); project.setPrivateKey(keyPair[0]); project.setPublicKey(keyPair[1]); + project.setBasePath(""); + project.setDefaultFile(""); projects.add(project); project.addPropertyChangeListener(this); try { @@ -218,6 +236,59 @@ public class ProjectManager implements PropertyChangeListener { 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 //