From 803f9ca979feedbb66eb8a36634fb7f51cf018db Mon Sep 17 00:00:00 2001 From: Noah Levitt Date: Thu, 19 Jan 2012 13:31:57 -0800 Subject: [PATCH] HER-1984 save script state - implement by adding a map to the application context for arbitrary use, and make sure the app context is available in all scripting environments * PathSharingContext.java new member variable ConcurrentHashMap data and accessor getData() * ScriptedProcessor.java, ScriptedDecideRule.java make appCtx available to scripts; also remove unused member sharedMap * ActionDirectory.java formatting fix --- .../org/archive/spring/PathSharingContext.java | 15 +++++++++++++++ .../crawler/framework/ActionDirectory.java | 2 +- .../org/archive/modules/ScriptedProcessor.java | 6 ++---- .../modules/deciderules/ScriptedDecideRule.java | 6 ++---- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/commons/src/main/java/org/archive/spring/PathSharingContext.java b/commons/src/main/java/org/archive/spring/PathSharingContext.java index f8348c70..3a182960 100644 --- a/commons/src/main/java/org/archive/spring/PathSharingContext.java +++ b/commons/src/main/java/org/archive/spring/PathSharingContext.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -178,4 +179,18 @@ public class PathSharingContext extends FileSystemXmlApplicationContext { } super.initLifecycleProcessor(); } + + protected ConcurrentHashMap data; + + /** + * @return a shared map for arbitrary use during a crawl; for example, could + * be used for state persisting for the duration of the crawl, + * shared among ScriptedProcessor, scripting console, etc scripts + */ + public ConcurrentHashMap getData() { + if (data == null) { + data = new ConcurrentHashMap(); + } + return data; + } } diff --git a/engine/src/main/java/org/archive/crawler/framework/ActionDirectory.java b/engine/src/main/java/org/archive/crawler/framework/ActionDirectory.java index 7e492a62..56fe41dc 100644 --- a/engine/src/main/java/org/archive/crawler/framework/ActionDirectory.java +++ b/engine/src/main/java/org/archive/crawler/framework/ActionDirectory.java @@ -312,7 +312,7 @@ public class ActionDirectory implements ApplicationContextAware, Lifecycle, Runn PrintWriter rawOut = new PrintWriter(rawString); Exception ex = null; engine.put("rawOut", rawOut); - engine.put("appCtx",appCtx); + engine.put("appCtx", appCtx); // evaluate and record any exception try { diff --git a/modules/src/main/java/org/archive/modules/ScriptedProcessor.java b/modules/src/main/java/org/archive/modules/ScriptedProcessor.java index 951fedb7..802de482 100644 --- a/modules/src/main/java/org/archive/modules/ScriptedProcessor.java +++ b/modules/src/main/java/org/archive/modules/ScriptedProcessor.java @@ -20,8 +20,6 @@ package org.archive.modules; import java.io.Reader; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -106,8 +104,6 @@ implements ApplicationContextAware, InitializingBean { transient protected ThreadLocal threadEngine = new ThreadLocal(); protected ScriptEngine sharedEngine; - /** map for optional use by scripts */ - public Map sharedMap = new ConcurrentHashMap(); /** * Constructor. @@ -135,12 +131,14 @@ implements ApplicationContextAware, InitializingBean { // synchronization is harmless for local thread engine, // necessary for shared engine engine.put("curi",curi); + engine.put("appCtx", appCtx); try { engine.eval("process(curi)"); } catch (ScriptException e) { logger.log(Level.WARNING,e.getMessage(),e); } finally { engine.put("curi", null); + engine.put("appCtx", null); } } } diff --git a/modules/src/main/java/org/archive/modules/deciderules/ScriptedDecideRule.java b/modules/src/main/java/org/archive/modules/deciderules/ScriptedDecideRule.java index 290f881c..448ca3c4 100644 --- a/modules/src/main/java/org/archive/modules/deciderules/ScriptedDecideRule.java +++ b/modules/src/main/java/org/archive/modules/deciderules/ScriptedDecideRule.java @@ -20,8 +20,6 @@ package org.archive.modules.deciderules; import java.io.Reader; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -106,8 +104,6 @@ implements ApplicationContextAware, InitializingBean { transient protected ThreadLocal threadEngine = new ThreadLocal(); transient protected ScriptEngine sharedEngine; - /** map for optional use by scripts */ - public Map sharedMap = new ConcurrentHashMap(); public ScriptedDecideRule() { } @@ -128,12 +124,14 @@ implements ApplicationContextAware, InitializingBean { // necessary for shared engine try { engine.put("object",uri); + engine.put("appCtx", appCtx); return (DecideResult)engine.eval("decisionFor(object)"); } catch (ScriptException e) { logger.log(Level.WARNING,e.getMessage(),e); return DecideResult.NONE; } finally { engine.put("object", null); + engine.put("appCtx", null); } } }