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 fc15f6ab..e8e81ee5 100644 --- a/engine/src/main/java/org/archive/crawler/framework/CrawlJob.java +++ b/engine/src/main/java/org/archive/crawler/framework/CrawlJob.java @@ -214,19 +214,22 @@ public class CrawlJob implements Comparable, ApplicationListener { } public void writeHtmlTo(PrintWriter pw, String uriPrefix) { pw.println(""); - if(isRunning()) { - pw.println("ACTIVE; "+getCrawlController().getState()+":"); - } +// if(isRunning()) { +// pw.println("ACTIVE; "+getCrawlController().getState()+":"); +// } pw.println(""+getShortName()+""); if(isProfile()) { pw.println("(profile)"); } + if(hasApplicationContext()) { + pw.println("«"+getJobStatusDescription()+"»"); + } if (true == isLaunchInfoPartial) { pw.print(" at least "); } else { pw.print(" "); } - pw.println(getLaunchCount() + " launches"); + pw.println(getLaunchCount() + " launches"); pw.println("
"); pw.println(getPrimaryConfig()); pw.println("
"); @@ -897,4 +900,16 @@ public class CrawlJob implements Comparable, ApplicationListener { return null; } } + + public String getJobStatusDescription() { + if(!hasApplicationContext()) { + return "Unbuilt"; + } else if(isRunning()) { + return "Active: "+getCrawlController().getState(); + } else if(isLaunchable()){ + return "Ready"; + } else { + return "Finished: "+getCrawlController().getCrawlExitStatus(); + } + } }//EOC diff --git a/engine/src/main/java/org/archive/crawler/restlet/EngineResource.java b/engine/src/main/java/org/archive/crawler/restlet/EngineResource.java index 5d28bb42..e918a601 100644 --- a/engine/src/main/java/org/archive/crawler/restlet/EngineResource.java +++ b/engine/src/main/java/org/archive/crawler/restlet/EngineResource.java @@ -26,6 +26,7 @@ import java.io.Writer; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -142,12 +143,45 @@ public class EngineResource extends BaseResource { } } } + } else if ("Exit Java Process".equals(action)) { + boolean cancel = false; + if(!"on".equals(form.getFirstValue("I'm sure"))) { + Flash.addFlash( + getResponse(), + "You must tick \"I'm sure\" to trigger exit", + Flash.Kind.NACK); + cancel = true; + } + for(Map.Entry entry : getBuiltJobs().entrySet()) { + if(!"on".equals(form.getFirstValue("ignore__"+entry.getKey()))) { + Flash.addFlash( + getResponse(), + "Job '"+entry.getKey()+"' still «" + +entry.getValue().getJobStatusDescription() + +"»", + Flash.Kind.NACK); + cancel = true; + } + } + if(!cancel) { + System.exit(0); + } } // default: redirect to GET self getResponse().redirectSeeOther(getRequest().getOriginalRef()); } + protected HashMap getBuiltJobs() { + HashMap builtJobs = new HashMap(); + for(Map.Entry entry : getEngine().getJobConfigs().entrySet()) { + if(entry.getValue().hasApplicationContext()) { + builtJobs.put(entry.getKey(),entry.getValue()); + } + } + return builtJobs; + } + protected List getAvailableActions() { List actions = new LinkedList(); actions.add("rescan"); @@ -268,6 +302,26 @@ public class EngineResource extends BaseResource { "'rescan' button above to make it appear in this interface. Or, " + "use the 'copy' functionality at the botton of any existing " + "job's detail page."); + + pw.println("

Exit Java

"); + + pw.println( + "This exits the Java process running Heritrix. To restart " + + "will then require access to the hosting machine. You should " + + "cleanly terminate and teardown any jobs in progress first.
"); + pw.println("
"); + for(Map.Entry entry : getBuiltJobs().entrySet()) { + pw.println("
Job '"+entry.getKey()+"' still «" + +entry.getValue().getJobStatusDescription() + +"»
"); + String checkName = "ignore__"+entry.getKey(); + pw.println("
"); + } + pw.println("
"); + pw.println(""); + pw.println(""); pw.println(""); pw.flush(); } diff --git a/engine/src/main/java/org/archive/crawler/restlet/Flash.java b/engine/src/main/java/org/archive/crawler/restlet/Flash.java index a043e838..f8b219d7 100644 --- a/engine/src/main/java/org/archive/crawler/restlet/Flash.java +++ b/engine/src/main/java/org/archive/crawler/restlet/Flash.java @@ -62,18 +62,29 @@ public class Flash { public static void addFlash(Response response, String message, Kind kind) { dropboxes.put(nextdrop,new Flash(message, kind)); Series cookies = response.getCookieSettings(); - cookies.add(new CookieSetting("flashdrop",Long.toString(nextdrop))); + CookieSetting flashdrop = null; + for(CookieSetting cs : cookies) { + if(cs.getName().equals("flashdrop")) { + flashdrop = cs; + } + } + if(flashdrop == null) { + cookies.add(new CookieSetting("flashdrop",Long.toString(nextdrop))); + } else { + flashdrop.setValue(flashdrop.getValue()+","+Long.toString(nextdrop)); + } nextdrop++; } public static List getFlashes(Request request) { List flashes = new LinkedList(); Series cookies = request.getCookies(); - String dropbox = cookies.getFirstValue("flashdrop"); - if(dropbox!=null) { - Flash flash = dropboxes.remove(Long.parseLong(dropbox)); - if(flash!=null) { - flashes.add(flash); + for (String dropbox : cookies.getFirstValue("flashdrop").split(",")) { + if(dropbox!=null) { + Flash flash = dropboxes.remove(Long.parseLong(dropbox)); + if(flash!=null) { + flashes.add(flash); + } } } return flashes; 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 71563fe2..bbb25ab9 100644 --- a/engine/src/main/java/org/archive/crawler/restlet/JobResource.java +++ b/engine/src/main/java/org/archive/crawler/restlet/JobResource.java @@ -132,7 +132,7 @@ public class JobResource extends BaseResource { info.put("crawlExitStatus", cj.getCrawlController().getCrawlExitStatus()); } } - info.put("statusDescription", getJobStatusDescription()); + info.put("statusDescription", cj.getJobStatusDescription()); info.put("availableActions", getAvailableActions()); info.put("launchCount", cj.getLaunchCount()); @@ -220,7 +220,7 @@ public class JobResource extends BaseResource { protected void writeHtml(Writer writer) { PrintWriter pw = new PrintWriter(writer); String jobTitle = cj.getShortName() + " - " - + getJobStatusDescription() + + cj.getJobStatusDescription() + " - Job main page"; String baseRef = getRequest().getResourceRef().getBaseRef().toString(); if(!baseRef.endsWith("/")) { @@ -360,7 +360,7 @@ public class JobResource extends BaseResource { } pw.println(""); - pw.println("

Job is "+getJobStatusDescription()+"

"); + pw.println("

Job is "+cj.getJobStatusDescription()+"

"); if(cj.hasApplicationContext()) { pw.println("Totals
  "); @@ -480,18 +480,6 @@ public class JobResource extends BaseResource { ""); pw.println("
"); } - - public String getJobStatusDescription() { - if(!cj.hasApplicationContext()) { - return "Unbuilt"; - } else if(cj.isRunning()) { - return "Active: "+cj.getCrawlController().getState(); - } else if(cj.isLaunchable()){ - return "Ready"; - } else { - return "Finished: "+cj.getCrawlController().getCrawlExitStatus(); - } - } /** * Print a link to the given File