/*
- * jSite -
- * Copyright (C) 2006 David Roden
+ * jSite - CLI.java - Copyright © 2006–2011 David Roden
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
import java.io.PrintWriter;
-import de.todesbaum.jsite.application.EditionProject;
import de.todesbaum.jsite.application.Freenet7Interface;
import de.todesbaum.jsite.application.InsertListener;
import de.todesbaum.jsite.application.Node;
import de.todesbaum.jsite.application.Project;
import de.todesbaum.jsite.application.ProjectInserter;
+import de.todesbaum.util.io.StreamCopier.ProgressListener;
/**
- * @author David Roden <droden@gmail.com>
- * @version $Id$
+ * Command-line interface for jSite.
+ *
+ * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
*/
public class CLI implements InsertListener {
+ /** Object used for synchronization. */
private Object lockObject = new Object();
+
+ /** Writer for the console. */
private PrintWriter outputWriter = new PrintWriter(System.out, true);
+
+ /** The freenet interface. */
private Freenet7Interface freenetInterface;
+
+ /** The project inserter. */
private ProjectInserter projectInserter = new ProjectInserter();
+
+ /** The list of nodes. */
private Node[] nodes;
+
+ /** The projects. */
private Project[] projects;
+
+ /** Whether the insert has finished. */
private boolean finished = false;
+
+ /** Whether the insert finished successfully. */
private boolean success;
+ /**
+ * Creates a new command-line interface.
+ *
+ * @param args
+ * The command-line arguments
+ */
private CLI(String[] args) {
if ((args.length == 0) || args[0].equals("-h") || args[0].equals("--help")) {
outputWriter.println("\nParameters:\n");
+ outputWriter.println(" --config-file=<configuration file>");
outputWriter.println(" --node=<node name>");
outputWriter.println(" --project=<project name>");
outputWriter.println(" --local-directory=<local directory>");
return;
}
- Configuration configuration = new Configuration();
- if (!configuration.createLockFile()) {
- outputWriter.println("Lock file found!");
- return;
+ String configFile = System.getProperty("user.home") + "/.jSite/config7";
+ for (String argument : args) {
+ String value = argument.substring(argument.indexOf('=') + 1).trim();
+ if (argument.startsWith("--config-file=")) {
+ configFile = value;
+ }
+ }
+
+ ConfigurationLocator configurationLocator = new ConfigurationLocator();
+ if (configFile != null) {
+ configurationLocator.setCustomLocation(configFile);
}
+ Configuration configuration = new Configuration(configurationLocator, configurationLocator.findPreferredLocation());
projectInserter.addInsertListener(this);
projects = configuration.getProjects();
projectInserter.setFreenetInterface(freenetInterface);
Project currentProject = null;
- for (String argument: args) {
+ for (String argument : args) {
+ if (argument.startsWith("--config-file=")) {
+ /* we already parsed this one. */
+ continue;
+ }
String value = argument.substring(argument.indexOf('=') + 1).trim();
if (argument.startsWith("--node=")) {
Node newNode = getNode(value);
outputWriter.println("You can't specify --edition before --project.");
return;
}
- if (currentProject instanceof EditionProject) {
- ((EditionProject) currentProject).setEdition(Integer.parseInt(value));
- } else {
- outputWriter.println("Project \"" + currentProject.getName() + "\" is not an edition-based project.");
- return;
- }
+ currentProject.setEdition(Integer.parseInt(value));
} else {
outputWriter.println("Unknown parameter: " + argument);
return;
}
}
+ int errorCode = 1;
if (currentProject != null) {
if (insertProject(currentProject)) {
outputWriter.println("Project \"" + currentProject.getName() + "\" successfully inserted.");
+ errorCode = 0;
} else {
outputWriter.println("Project \"" + currentProject.getName() + "\" was not successfully inserted.");
}
configuration.setProjects(projects);
configuration.save();
+
+ System.exit(errorCode);
}
+ /**
+ * Returns the project with the given name.
+ *
+ * @param name
+ * The name of the project
+ * @return The project, or <code>null</code> if no project could be found
+ */
private Project getProject(String name) {
- for (Project project: projects) {
+ for (Project project : projects) {
if (project.getName().equals(name)) {
return project;
}
return null;
}
+ /**
+ * Returns the node with the given name.
+ *
+ * @param name
+ * The name of the node
+ * @return The node, or <code>null</code> if no node could be found
+ */
private Node getNode(String name) {
- for (Node node: nodes) {
+ for (Node node : nodes) {
if (node.getName().equals(name)) {
return node;
}
return null;
}
+ /**
+ * Inserts the given project.
+ *
+ * @param currentProject
+ * The project to insert
+ * @return <code>true</code> if the insert finished successfully,
+ * <code>false</code> otherwise
+ */
private boolean insertProject(Project currentProject) {
if (!freenetInterface.hasNode()) {
outputWriter.println("Node is not running!");
return false;
}
projectInserter.setProject(currentProject);
- projectInserter.start();
+ projectInserter.start(new ProgressListener() {
+
+ public void onProgress(long copied, long length) {
+ System.out.print("Uploaded: " + copied + " / " + length + " bytes...\r");
+ }
+ });
synchronized (lockObject) {
while (!finished) {
try {
lockObject.wait();
} catch (InterruptedException e) {
+ /* ignore, we're in a loop. */
}
}
}
outputWriter.println("Starting Insert of project \"" + project.getName() + "\".");
}
+ /**
+ * {@inheritDoc}
+ */
+ public void projectUploadFinished(Project project) {
+ outputWriter.println("Project \"" + project.getName() + "\" has been uploaded, starting insert...");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public void projectURIGenerated(Project project, String uri) {
outputWriter.println("URI: " + uri);
}
public void projectInsertFinished(Project project, boolean success, Throwable cause) {
outputWriter.println("Request URI: " + project.getFinalRequestURI(0));
finished = true;
- if (success) {
- if (project instanceof EditionProject) {
- ((EditionProject) project).setEdition(((EditionProject) project).getEdition() + 1);
- }
- }
this.success = success;
synchronized (lockObject) {
lockObject.notify();
// MAIN
//
+ /**
+ * Creates a new command-line interface with the given arguments.
+ *
+ * @param args
+ * The command-line arguments
+ */
public static void main(String[] args) {
new CLI(args);
}