summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid A. Madore <david+git@madore.org>2014-10-09 20:40:26 +0200
committerDavid A. Madore <david+git@madore.org>2014-10-09 20:40:26 +0200
commitcde90f22cc34b898c684c9de78c5e93022dbd42a (patch)
tree39cbca2edfa3acdfb640e64ca9ff3803fdcd08cc
parent827925b57dc5ba84e480cf9c66ff2cb13a096780 (diff)
downloaddamlengine-cde90f22cc34b898c684c9de78c5e93022dbd42a.tar.gz
damlengine-cde90f22cc34b898c684c9de78c5e93022dbd42a.tar.bz2
damlengine-cde90f22cc34b898c684c9de78c5e93022dbd42a.zip
Add a "dynamic context" global state, and make WeblogSummary stale when too old.
-rw-r--r--org/madore/damlengine/Context.java6
-rw-r--r--org/madore/damlengine/DamlEngine.java24
-rw-r--r--org/madore/damlengine/TodoWXrefAttr.java2
-rw-r--r--org/madore/damlengine/TodoWeblogIndexSelectElement.java2
-rw-r--r--org/madore/damlengine/TodoWeblogSelectionElement.java2
-rw-r--r--org/madore/damlengine/TodoWrefAttr.java2
-rw-r--r--org/madore/damlengine/WeblogSelect.java9
-rw-r--r--org/madore/damlengine/WeblogServlet.java4
-rw-r--r--org/madore/damlengine/WeblogSummary.java7
9 files changed, 45 insertions, 13 deletions
diff --git a/org/madore/damlengine/Context.java b/org/madore/damlengine/Context.java
index 9249fe5..c1f0dce 100644
--- a/org/madore/damlengine/Context.java
+++ b/org/madore/damlengine/Context.java
@@ -68,6 +68,12 @@ public class Context implements Cloneable {
public WeblogSelectionContext wsc;
+ public static class DynamicContext {
+ public long modTime;
+ }
+
+ public DynamicContext dc;
+
public static class EntryContext {
public String year;
public String month;
diff --git a/org/madore/damlengine/DamlEngine.java b/org/madore/damlengine/DamlEngine.java
index cffd589..4826cf1 100644
--- a/org/madore/damlengine/DamlEngine.java
+++ b/org/madore/damlengine/DamlEngine.java
@@ -115,20 +115,28 @@ public final class DamlEngine {
}
public static void processDocument(Document doc,
- Context.WeblogSelectionContext wsc) {
+ Context.WeblogSelectionContext wsc,
+ Context.DynamicContext dc) {
TodoDeque todoDeque = new TodoDeque();
Context ctx = new Context(doc);
ctx.wsc = wsc;
+ ctx.dc = dc;
todoDeque.registerAtEnd(new RootTodo(ctx));
todoDeque.dispatchLoop();
}
+ public static void processDocument(Document doc,
+ Context.WeblogSelectionContext wsc) {
+ processDocument(doc, wsc, null);
+ }
+
public static void processDocument(Document doc) {
- processDocument(doc, null);
+ processDocument(doc, null, null);
}
public static void fullProcess(InputStream in, OutputStream out,
- Context.WeblogSelectionContext wsc)
+ Context.WeblogSelectionContext wsc,
+ Context.DynamicContext dc)
throws Exception {
final DOMImplementationLS domils
@@ -142,7 +150,7 @@ public final class DamlEngine {
LSInput input = domils.createLSInput();
input.setByteStream(in);
Document doc = par.parse(input);
- processDocument(doc, wsc);
+ processDocument(doc, wsc, dc);
doc.normalizeDocument();
Unparser unparser
= new Unparser(doc, new OutputStreamWriter(out, "UTF-8"),
@@ -151,9 +159,15 @@ public final class DamlEngine {
}
+ public static void fullProcess(InputStream in, OutputStream out,
+ Context.WeblogSelectionContext wsc)
+ throws Exception {
+ fullProcess(in, out, wsc, null);
+ }
+
public static void fullProcess(InputStream in, OutputStream out)
throws Exception {
- fullProcess(in, out, null);
+ fullProcess(in, out, null, null);
}
public static boolean runAsServlet = false;
diff --git a/org/madore/damlengine/TodoWXrefAttr.java b/org/madore/damlengine/TodoWXrefAttr.java
index dbc5511..5065465 100644
--- a/org/madore/damlengine/TodoWXrefAttr.java
+++ b/org/madore/damlengine/TodoWXrefAttr.java
@@ -26,7 +26,7 @@ public class TodoWXrefAttr extends TodoAttr {
if ( ctx.wsc == null )
throw new IllegalStateException("wxref attribute encountered with no weblog selection state");
int prev = ctx.wsc.sel.first() - 1;
- WeblogSummary sum = WeblogSummary.getSummary();
+ WeblogSummary sum = WeblogSummary.getSummary(ctx.dc);
if ( sum != null && sum.entries != null
&& sum.entries.containsKey(new Integer(prev)) ) {
WeblogSummary.EntrySummary ent
diff --git a/org/madore/damlengine/TodoWeblogIndexSelectElement.java b/org/madore/damlengine/TodoWeblogIndexSelectElement.java
index 004e330..21ed367 100644
--- a/org/madore/damlengine/TodoWeblogIndexSelectElement.java
+++ b/org/madore/damlengine/TodoWeblogIndexSelectElement.java
@@ -29,7 +29,7 @@ public final class TodoWeblogIndexSelectElement extends TodoDefaultElement {
@Override
public void handleNodeOnly() {
- WeblogSummary wsum = WeblogSummary.getSummary();
+ WeblogSummary wsum = WeblogSummary.getSummary(ctx.dc);
if ( wsum == null || wsum.entries == null ) {
throw new IllegalStateException("weblog-index-select element encountered with no weblog summary available");
}
diff --git a/org/madore/damlengine/TodoWeblogSelectionElement.java b/org/madore/damlengine/TodoWeblogSelectionElement.java
index 637bc85..9d557d4 100644
--- a/org/madore/damlengine/TodoWeblogSelectionElement.java
+++ b/org/madore/damlengine/TodoWeblogSelectionElement.java
@@ -159,7 +159,7 @@ public final class TodoWeblogSelectionElement extends TodoDefaultElement {
case SINGLE_TITLE:
if ( ! ( ctx.wsc instanceof Context.WeblogSingleSelectionContext ) )
throw new IllegalStateException("weblog-selection-single-title element encountered while not in weblog single entry selection state");
- WeblogSummary wsum = WeblogSummary.getSummary();
+ WeblogSummary wsum = WeblogSummary.getSummary(ctx.dc);
if ( wsum == null || wsum.entries == null )
throw new IllegalStateException("failed to obtain weblog summary for weblog-selection-single-title");
WeblogSummary.EntrySummary esum
diff --git a/org/madore/damlengine/TodoWrefAttr.java b/org/madore/damlengine/TodoWrefAttr.java
index 7f69a96..9341919 100644
--- a/org/madore/damlengine/TodoWrefAttr.java
+++ b/org/madore/damlengine/TodoWrefAttr.java
@@ -42,7 +42,7 @@ public class TodoWrefAttr extends TodoAttr {
}
String targetFile;
String targetStdDir = (ctx.gc.uriToTop==null)?"":(ctx.gc.uriToTop+"weblog/");
- WeblogSummary wsum = WeblogSummary.getSummary();
+ WeblogSummary wsum = WeblogSummary.getSummary(ctx.dc);
WeblogSummary.EntrySummary esum;
// Get entry for target link from weblog summary
if ( wsum != null && wsum.entries != null )
diff --git a/org/madore/damlengine/WeblogSelect.java b/org/madore/damlengine/WeblogSelect.java
index a15a672..4e759cc 100644
--- a/org/madore/damlengine/WeblogSelect.java
+++ b/org/madore/damlengine/WeblogSelect.java
@@ -15,6 +15,7 @@ public final class WeblogSelect {
}
public static void fullProcess(Context.WeblogSelectionContext wsc,
+ Context.DynamicContext dc,
OutputStream out)
throws Exception {
@@ -52,8 +53,14 @@ public final class WeblogSelect {
}
DamlEngine.fullProcess(Files.newInputStream(DamlEngine.templatePath.resolve(templateResourceName)),
- out, wsc);
+ out, wsc, dc);
}
+ public static void fullProcess(Context.WeblogSelectionContext wsc,
+ OutputStream out)
+ throws Exception {
+ fullProcess(wsc, null, out);
+ }
+
}
diff --git a/org/madore/damlengine/WeblogServlet.java b/org/madore/damlengine/WeblogServlet.java
index 2722616..b68f114 100644
--- a/org/madore/damlengine/WeblogServlet.java
+++ b/org/madore/damlengine/WeblogServlet.java
@@ -34,7 +34,7 @@ import javax.servlet.http.HttpServletResponse;
public class WeblogServlet extends HttpServlet {
- private static final long serialVersionUID = 2014100901L;
+ private static final long serialVersionUID = 2014100902L;
@Override
public void init(ServletConfig cfg)
@@ -137,6 +137,8 @@ public class WeblogServlet extends HttpServlet {
response.setCharacterEncoding("UTF-8");
OutputStream out = response.getOutputStream();
try {
+ Context.DynamicContext dc = new Context.DynamicContext();
+ dc.modTime = ((SingleBlogEntryPath)rp).lastModified;
WeblogSelect.fullProcess(new Context.WeblogSingleSelectionContext(number),
out);
} catch (Exception e) {
diff --git a/org/madore/damlengine/WeblogSummary.java b/org/madore/damlengine/WeblogSummary.java
index b067987..4f560e8 100644
--- a/org/madore/damlengine/WeblogSummary.java
+++ b/org/madore/damlengine/WeblogSummary.java
@@ -30,6 +30,7 @@ public final class WeblogSummary {
}
public HashMap<Integer,EntrySummary> entries;
+ private long obtainedTime;
private static WeblogSummary singleton;
@@ -37,11 +38,13 @@ public final class WeblogSummary {
this.entries = new HashMap<Integer,EntrySummary>();
}
- public static synchronized WeblogSummary getSummary() {
- if ( singleton != null )
+ public static synchronized WeblogSummary getSummary(Context.DynamicContext dc) {
+ if ( singleton != null
+ && ( dc == null || singleton.obtainedTime < dc.modTime ) )
return singleton;
singleton = new WeblogSummary();
try {
+ singleton.obtainedTime = System.currentTimeMillis();
final Connection conn = WeblogDatabaseConnection.getConnection();
final PreparedStatement selSt
= conn.prepareStatement("SELECT id , edate , lang , title , title_xml , do_single_page FROM entries");