X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Ftodesbaum%2Fjsite%2Fapplication%2FProjectInserter.java;h=dd85bf343e88b292b6267f9f35b019e881406dc9;hb=9eafefbca8ddf6c20500a78789a474000cdfe457;hp=3a68ea03a188112ebcff74056c423c032ec42b08;hpb=91dcc42ab8695f77c853f6d84aa96ba6a53b1cfb;p=jSite.git diff --git a/src/main/java/de/todesbaum/jsite/application/ProjectInserter.java b/src/main/java/de/todesbaum/jsite/application/ProjectInserter.java index 3a68ea0..dd85bf3 100644 --- a/src/main/java/de/todesbaum/jsite/application/ProjectInserter.java +++ b/src/main/java/de/todesbaum/jsite/application/ProjectInserter.java @@ -1,5 +1,5 @@ /* - * jSite - ProjectInserter.java - Copyright © 2006–2012 David Roden + * jSite - ProjectInserter.java - Copyright © 2006–2014 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 @@ -32,6 +32,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -43,7 +44,6 @@ import de.todesbaum.jsite.gui.FileScanner.ScannedFile; import de.todesbaum.jsite.gui.FileScannerListener; import de.todesbaum.util.freenet.fcp2.Client; import de.todesbaum.util.freenet.fcp2.ClientPutComplexDir; -import de.todesbaum.util.freenet.fcp2.ClientPutDir.ManifestPutter; import de.todesbaum.util.freenet.fcp2.Connection; import de.todesbaum.util.freenet.fcp2.DirectFileEntry; import de.todesbaum.util.freenet.fcp2.FileEntry; @@ -66,10 +66,9 @@ public class ProjectInserter implements FileScannerListener, Runnable { private static final int random = (int) (Math.random() * Integer.MAX_VALUE); /** Counter for FCP connection identifier. */ - private static int counter = 0; + private static final AtomicInteger counter = new AtomicInteger(); - /** The list of insert listeners. */ - private List insertListeners = new ArrayList(); + private final ProjectInsertListeners projectInsertListeners = new ProjectInsertListeners(); /** The freenet interface. */ private Freenet7Interface freenetInterface; @@ -101,9 +100,6 @@ public class ProjectInserter implements FileScannerListener, Runnable { /** The insert priority. */ private PriorityClass priority; - /** The manifest putter. */ - private ManifestPutter manifestPutter; - /** * Adds a listener to the list of registered listeners. * @@ -111,91 +107,7 @@ public class ProjectInserter implements FileScannerListener, Runnable { * The listener to add */ public void addInsertListener(InsertListener insertListener) { - insertListeners.add(insertListener); - } - - /** - * Removes a listener from the list of registered listeners. - * - * @param insertListener - * The listener to remove - */ - public void removeInsertListener(InsertListener insertListener) { - insertListeners.remove(insertListener); - } - - /** - * Notifies all listeners that the project insert has started. - * - * @see InsertListener#projectInsertStarted(Project) - */ - protected void fireProjectInsertStarted() { - for (InsertListener insertListener : insertListeners) { - insertListener.projectInsertStarted(project); - } - } - - /** - * Notifies all listeners that the insert has generated a URI. - * - * @see InsertListener#projectURIGenerated(Project, String) - * @param uri - * The generated URI - */ - protected void fireProjectURIGenerated(String uri) { - for (InsertListener insertListener : insertListeners) { - insertListener.projectURIGenerated(project, uri); - } - } - - /** - * Notifies all listeners that the insert has made some progress. - * - * @see InsertListener#projectUploadFinished(Project) - */ - protected void fireProjectUploadFinished() { - for (InsertListener insertListener : insertListeners) { - insertListener.projectUploadFinished(project); - } - } - - /** - * Notifies all listeners that the insert has made some progress. - * - * @see InsertListener#projectInsertProgress(Project, int, int, int, int, - * boolean) - * @param succeeded - * The number of succeeded blocks - * @param failed - * The number of failed blocks - * @param fatal - * The number of fatally failed blocks - * @param total - * The total number of blocks - * @param finalized - * true if the total number of blocks has already - * been finalized, false otherwise - */ - protected void fireProjectInsertProgress(int succeeded, int failed, int fatal, int total, boolean finalized) { - for (InsertListener insertListener : insertListeners) { - insertListener.projectInsertProgress(project, succeeded, failed, fatal, total, finalized); - } - } - - /** - * Notifies all listeners the project insert has finished. - * - * @see InsertListener#projectInsertFinished(Project, boolean, Throwable) - * @param success - * true if the project was inserted successfully, - * false if it failed - * @param cause - * The cause of the failure, if any - */ - protected void fireProjectInsertFinished(boolean success, Throwable cause) { - for (InsertListener insertListener : insertListeners) { - insertListener.projectInsertFinished(project, success, cause); - } + projectInsertListeners.addInsertListener(insertListener); } /** @@ -251,16 +163,6 @@ public class ProjectInserter implements FileScannerListener, Runnable { } /** - * Sets the manifest putter to use for inserts. - * - * @param manifestPutter - * The manifest putter to use - */ - public void setManifestPutter(ManifestPutter manifestPutter) { - this.manifestPutter = manifestPutter; - } - - /** * Starts the insert. * * @param progressListener @@ -271,7 +173,7 @@ public class ProjectInserter implements FileScannerListener, Runnable { this.progressListener = progressListener; fileScanner = new FileScanner(project); fileScanner.addFileScannerListener(this); - new Thread(fileScanner).start(); + fileScanner.startInBackground(); } /** @@ -291,12 +193,10 @@ public class ProjectInserter implements FileScannerListener, Runnable { * {@link ClientPutComplexDir#addFileEntry(FileEntry)}. * * @param file - * The name and hash of the file to insert - * @param edition - * The current edition + * The name and hash of the file to insert * @return A file entry for the given file */ - private FileEntry createFileEntry(ScannedFile file, int edition) { + private FileEntry createFileEntry(ScannedFile file) { String filename = file.getFilename(); FileOption fileOption = project.getFileOption(filename); if (fileOption.isInsert()) { @@ -397,7 +297,7 @@ public class ProjectInserter implements FileScannerListener, Runnable { completionLatch.countDown(); } }); - new Thread(fileScanner).start(); + fileScanner.startInBackground(); while (completionLatch.getCount() > 0) { try { completionLatch.await(); @@ -424,12 +324,12 @@ public class ProjectInserter implements FileScannerListener, Runnable { */ @Override public void run() { - fireProjectInsertStarted(); + projectInsertListeners.fireProjectInsertStarted(project); List files = fileScanner.getFiles(); /* create connection to node */ synchronized (lockObject) { - connection = freenetInterface.getConnection("project-insert-" + random + counter++); + connection = freenetInterface.getConnection("project-insert-" + random + counter.getAndIncrement()); } connection.setTempDirectory(tempDirectory); boolean connected = false; @@ -441,7 +341,7 @@ public class ProjectInserter implements FileScannerListener, Runnable { } if (!connected || cancelled) { - fireProjectInsertFinished(false, cancelled ? new AbortedException() : cause); + projectInsertListeners.fireProjectInsertFinished(project, false, cancelled ? new AbortedException() : cause); return; } @@ -450,22 +350,27 @@ public class ProjectInserter implements FileScannerListener, Runnable { /* collect files */ int edition = project.getEdition(); String dirURI = "USK@" + project.getInsertURI() + "/" + project.getPath() + "/" + edition + "/"; - ClientPutComplexDir putDir = new ClientPutComplexDir("dir-" + counter++, dirURI, tempDirectory); + ClientPutComplexDir putDir = new ClientPutComplexDir("dir-" + counter.getAndIncrement(), dirURI, tempDirectory); if ((project.getIndexFile() != null) && (project.getIndexFile().length() > 0)) { - putDir.setDefaultName(project.getIndexFile()); + FileOption indexFileOption = project.getFileOption(project.getIndexFile()); + Optional changedName = indexFileOption.getChangedName(); + if (changedName.isPresent()) { + putDir.setDefaultName(changedName.get()); + } else { + putDir.setDefaultName(project.getIndexFile()); + } } putDir.setVerbosity(Verbosity.ALL); putDir.setMaxRetries(-1); putDir.setEarlyEncode(useEarlyEncode); putDir.setPriorityClass(priority); - putDir.setManifestPutter(manifestPutter); for (ScannedFile file : files) { - FileEntry fileEntry = createFileEntry(file, edition); + FileEntry fileEntry = createFileEntry(file); if (fileEntry != null) { try { putDir.addFileEntry(fileEntry); } catch (IOException ioe1) { - fireProjectInsertFinished(false, ioe1); + projectInsertListeners.fireProjectInsertFinished(project, false, ioe1); return; } } @@ -474,9 +379,9 @@ public class ProjectInserter implements FileScannerListener, Runnable { /* start request */ try { client.execute(putDir, progressListener); - fireProjectUploadFinished(); + projectInsertListeners.fireProjectUploadFinished(project); } catch (IOException ioe1) { - fireProjectInsertFinished(false, ioe1); + projectInsertListeners.fireProjectInsertFinished(project, false, ioe1); return; } @@ -494,7 +399,7 @@ public class ProjectInserter implements FileScannerListener, Runnable { String messageName = message.getName(); if ("URIGenerated".equals(messageName)) { finalURI = message.get("URI"); - fireProjectURIGenerated(finalURI); + projectInsertListeners.fireProjectURIGenerated(project, finalURI); } if ("SimpleProgress".equals(messageName)) { int total = Integer.parseInt(message.get("Total")); @@ -502,7 +407,7 @@ public class ProjectInserter implements FileScannerListener, Runnable { int fatal = Integer.parseInt(message.get("FatallyFailed")); int failed = Integer.parseInt(message.get("Failed")); boolean finalized = Boolean.parseBoolean(message.get("FinalizedTotal")); - fireProjectInsertProgress(succeeded, failed, fatal, total, finalized); + projectInsertListeners.fireProjectInsertProgress(project, succeeded, failed, fatal, total, finalized); } success |= "PutSuccessful".equals(messageName); finished = (success && (finalURI != null)) || "PutFailed".equals(messageName) || messageName.endsWith("Error"); @@ -518,7 +423,7 @@ public class ProjectInserter implements FileScannerListener, Runnable { project.setLastInsertionTime(System.currentTimeMillis()); project.onSuccessfulInsert(); } - fireProjectInsertFinished(success, cancelled ? new AbortedException() : (disconnected ? new IOException("Connection terminated") : null)); + projectInsertListeners.fireProjectInsertFinished(project, success, cancelled ? new AbortedException() : (disconnected ? new IOException("Connection terminated") : null)); } // @@ -533,7 +438,7 @@ public class ProjectInserter implements FileScannerListener, Runnable { if (!fileScanner.isError()) { new Thread(this).start(); } else { - fireProjectInsertFinished(false, null); + projectInsertListeners.fireProjectInsertFinished(project, false, null); } fileScanner.removeFileScannerListener(this); }