diff --git a/engine/src/main/java/org/archive/crawler/framework/CrawlJob.java b/engine/src/main/java/org/archive/crawler/framework/CrawlJob.java index 90b8f528..b248a76c 100644 --- a/engine/src/main/java/org/archive/crawler/framework/CrawlJob.java +++ b/engine/src/main/java/org/archive/crawler/framework/CrawlJob.java @@ -484,6 +484,21 @@ public class CrawlJob implements Comparable, ApplicationListener { return cc.isPaused() || cc.isPausing(); } + /** + * Return the configured Checkpointer instance, if there is exactly + * one, otherwise null. + * + * @return Checkpointer + */ + @SuppressWarnings("unchecked") + public CheckpointService getCheckpointService() { + if(ac==null) { + return null; + } + Map beans = + getJobContext().getBeansOfType(CheckpointService.class); + return (beans.size() == 1) ? beans.values().iterator().next() : null; + } /** * Ensure a fresh start for any configuration changes or relaunches, * by stopping and discarding an existing ApplicationContext. diff --git a/engine/src/main/java/org/archive/crawler/restlet/JobResource.java b/engine/src/main/java/org/archive/crawler/restlet/JobResource.java index 18befddf..e2e634ff 100644 --- a/engine/src/main/java/org/archive/crawler/restlet/JobResource.java +++ b/engine/src/main/java/org/archive/crawler/restlet/JobResource.java @@ -30,6 +30,7 @@ import java.util.List; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; +import org.archive.crawler.framework.Checkpoint; import org.archive.crawler.framework.CrawlJob; import org.archive.crawler.framework.Engine; import org.archive.crawler.reporting.AlertHandler; @@ -145,15 +146,16 @@ public class JobResource extends Resource { pw.println(" disabled "); } pw.println(" type='submit' name='action' value='unpause'/>"); - pw.println(""); } - pw.println(" type='submit' name='action' value='checkpoint'/>   "); - // TERMINATE, RESET - pw.println("
"); + + // display checkpoint options + if(cj.getCheckpointService()!=null) { + Checkpoint recoveryCheckpoint = cj.getCheckpointService().getRecoveryCheckpoint(); + if(recoveryCheckpoint!=null) { + pw.println("recover from "+recoveryCheckpoint.getName()+""); + } else if (cj.getCheckpointService().hasAvailableCheckpoints()) { + pw.println("select an available checkpoint before launch to recover:"); + pw.println(""); + } + } + pw.println(""); + // configuration pw.println("configuration: "); @@ -411,6 +430,10 @@ public class JobResource extends Resource { AlertThreadGroup.setThreadLogger(cj.getJobLogger()); String action = form.getFirstValue("action"); if("launch".equals(action)) { + String selectedCheckpoint = form.getFirstValue("checkpoint"); + if(StringUtils.isNotEmpty(selectedCheckpoint)) { + cj.getCheckpointService().setRecoveryCheckpointByName(selectedCheckpoint); + } cj.launch(); } else if("checkXML".equals(action)) { cj.checkXML(); @@ -426,6 +449,13 @@ public class JobResource extends Resource { cj.getCrawlController().requestCrawlPause(); } else if("unpause".equals(action)) { cj.getCrawlController().requestCrawlResume(); + } else if("checkpoint".equals(action)) { + String cp = cj.getCheckpointService().requestCrawlCheckpoint(); + if(StringUtils.isNotEmpty(cp)) { + Flash.addFlash(getResponse(), "Checkpoint "+cp+" saved",Flash.Kind.ACK); + } else { + Flash.addFlash(getResponse(), "Checkpoint not made; check logs",Flash.Kind.NACK); + } } else if("terminate".equals(action)) { cj.terminate(); }