From dfacba51e507b866eebf4b4d841fcf0f4317595c Mon Sep 17 00:00:00 2001 From: gojomo Date: Fri, 20 Nov 2009 01:02:14 +0000 Subject: [PATCH] [HER-1546] Springify(5): Update checkpointing to work smoothly with spring-configured crawls UI support * JobResource.java enable 'checkpoint' button as appropriate display active recovery-checkpoint or select bos of recovery-options when available * CrawlJob.java (getCheckpointService) accessor --- .../archive/crawler/framework/CrawlJob.java | 15 +++++++ .../archive/crawler/restlet/JobResource.java | 42 ++++++++++++++++--- 2 files changed, 51 insertions(+), 6 deletions(-) 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(); }