X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fcore%2FProjectManager.java;h=2619650f372425106e0618a281132c2653f1d727;hb=ceba2763ae5c5b11a928a331438fb49be0a84e1d;hp=80341896f5d06bc84d6da731e28d9d005088d57f;hpb=98585bac12bf6597d824a0123f25915f4abf0331;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/core/ProjectManager.java b/src/net/pterodactylus/jsite/core/ProjectManager.java index 8034189..2619650 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; @@ -26,34 +28,35 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collections; import java.util.List; -import java.util.Map; 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; +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()); /** The directory the projects are stored in. */ private final String directory; - /** The list of project names. */ - private final List projectNames = new ArrayList(); - - /** Mapping from project name to project. */ - private final Map projects = new HashMap(); + /** The node manager. */ + private NodeManager nodeManager; - /** Mapping from project to lifetime statistics. */ - @SuppressWarnings("unused") - private final Map projectLifetimes = new HashMap(); + /** All projects. */ + private final List projects = Collections.synchronizedList(new ArrayList()); /** * Creates a new project manager that saves and restores its state to/from @@ -80,16 +83,22 @@ public class ProjectManager { } /** - * Returns a list of all projects, sorted by their name. + * Returns a list of all projects. * * @return A list of all projects */ public List getProjects() { - List projects = new ArrayList(); - for (String projectName: projectNames) { - projects.add(this.projects.get(projectName)); - } - return projects; + return Collections.unmodifiableList(new ArrayList(projects)); + } + + /** + * Sets the node manager to use. + * + * @param nodeManager + * The node manager to use + */ + public void setNodeManager(NodeManager nodeManager) { + this.nodeManager = nodeManager; } // @@ -119,11 +128,36 @@ 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); - projectNames.add(projectName); - projects.put(projectName, project); + 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++; } } @@ -143,10 +177,24 @@ public class ProjectManager { } Properties projectProperties = new Properties(); int projectIndex = 0; - for (String projectName: projectNames) { + for (Project project : projects) { String projectPrefix = "projects." + projectIndex; - Project project = projects.get(projectName); - projectProperties.setProperty("projects." + projectPrefix + ".name", project.getName()); + 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"); @@ -159,4 +207,84 @@ 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 JSiteException + * if there is a problem with the node + */ + 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. */ + } + } + }