From 5365f47787b1b4eeca31ad5da2373237371e264e Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 27 Sep 2004 07:51:02 +0000 Subject: [PATCH] first alpha release darcs-hash:20040927075102-5007d-25cda76e3993229931e6922232874cdd068f41d2.gz --- src/org/ibex/xml/JSRewriter.java | 48 --------- src/org/ibex/xt/Node.java | 166 +++++++++++++++++++++++++++++++ src/org/ibex/xt/Prevalence.java | 89 +++++++++++++++++ src/org/ibex/{xml => xt}/Servlet.java | 165 +++++++++---------------------- src/org/ibex/xt/Template.java | 174 +++++++++++++++++++++++++++++++++ 5 files changed, 473 insertions(+), 169 deletions(-) delete mode 100644 src/org/ibex/xml/JSRewriter.java create mode 100644 src/org/ibex/xt/Node.java create mode 100644 src/org/ibex/xt/Prevalence.java rename src/org/ibex/{xml => xt}/Servlet.java (55%) create mode 100644 src/org/ibex/xt/Template.java diff --git a/src/org/ibex/xml/JSRewriter.java b/src/org/ibex/xml/JSRewriter.java deleted file mode 100644 index d87afb3..0000000 --- a/src/org/ibex/xml/JSRewriter.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.ibex.xml; -import org.ibex.js.*; -import org.ibex.util.*; -import org.ibex.io.*; -import java.io.*; -import java.net.*; -import java.util.*; - -public class JSRewriter extends XML.Node.Stream { - - private XML.Node.Stream in; - private JSScope scope; - - public JSRewriter(XML.Node.Stream in) { this.in = in; this.scope = new JSScope(null); } - public JSRewriter(XML.Node.Stream in, JSScope scope) { this.in = in; this.scope = scope; } - - public boolean _next(int level, XML.Node n) { - if (!in.next(level, n)) return false; - if (n.cdata != null) n.cdata = eval(n.cdata); - else for(int i=1; i"); + } else { + w.write(">"); + while(n != null && n.delta > 0) n = toXML(w, n); + w.write(""); + } + } + if (n != null) n.delta++; + return n; + } + } +} diff --git a/src/org/ibex/xt/Prevalence.java b/src/org/ibex/xt/Prevalence.java new file mode 100644 index 0000000..ef87147 --- /dev/null +++ b/src/org/ibex/xt/Prevalence.java @@ -0,0 +1,89 @@ +package org.ibex.xt; +import org.ibex.js.*; +import org.ibex.util.*; +import org.ibex.io.*; +import java.io.*; +import java.net.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.http.*; +import com.thoughtworks.xstream.*; +import org.prevayler.*; +import org.prevayler.implementation.snapshot.*; + +public class Prevalence { + + static final Hashtable prevaylers = new Hashtable(); + + public static void destroy(ServletContext cx, Prevayler prevayler) { try { + prevaylers.remove(cx); + prevayler.takeSnapshot(); + prevayler.close(); + } catch (Exception e) { e.printStackTrace(); } } + + private static class SnapshotThread extends Thread { + ServletContext cx; + public SnapshotThread(ServletContext cx) { this.cx = cx; } + public void run() { + try { + Thread.sleep(10000); + Prevayler privatePrevayler = (Prevayler)prevaylers.get(cx); + if (privatePrevayler == null) return; + privatePrevayler.takeSnapshot(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static Prevayler getPrevayler(ServletContext cx) { + try { + Prevayler prevayler; + synchronized(cx) { + prevayler = (Prevayler)prevaylers.get(cx); + if (prevayler == null) { + PrevaylerFactory pf = new PrevaylerFactory(); + String base = cx.getRealPath("/") + "WEB-INF" + File.separatorChar + "prevalent"; + System.err.println("prevayling to " + base); + pf.configurePrevalenceBase(base); + XStreamSnapshotManager manager = new XStreamSnapshotManager(new JS(), base, null) { + protected XStream createXStream() { + XStream xstream = new XStream(); + xstream.alias("js", JS.class); + xstream.alias("jsdate", JSDate.class); + return xstream; + } + }; + System.err.println("configuring with " + manager); + pf.configureSnapshotManager(manager); + //pf.configureClassLoader(JSTransaction.class.getClassLoader()); + prevayler = pf.create(); + prevaylers.put(cx, prevayler); + new SnapshotThread(cx).start(); + } + } + return prevayler; + } catch (Exception e) { throw new RuntimeException(e); } } + + public static class JSTransaction implements Transaction { + public static final long serialVersionUid = 0xfb2aa281; + private JS js; + public JSTransaction(JS js) { this.js = js; } + public void executeOn(Object o, Date now) { + try { + js.call(o, new JSDate(now.getTime()), null, null, 2); + } catch (Exception e) { throw new RuntimeException(e); } + } + } + + public static class JSQuery implements Query { + public static final long serialVersionUid = 0xfb2aa282; + private JS js; + public JSQuery(JS js) { this.js = js; } + public Object query(Object o, Date now) { + try { + return js.call(o, new JSDate(now.getTime()), null, null, 2); + } catch (Exception e) { throw new RuntimeException(e); } + } + } +} diff --git a/src/org/ibex/xml/Servlet.java b/src/org/ibex/xt/Servlet.java similarity index 55% rename from src/org/ibex/xml/Servlet.java rename to src/org/ibex/xt/Servlet.java index 833f8fc..be36ac8 100644 --- a/src/org/ibex/xml/Servlet.java +++ b/src/org/ibex/xt/Servlet.java @@ -1,4 +1,4 @@ -package org.ibex.xml; +package org.ibex.xt; import org.ibex.js.*; import org.ibex.util.*; import org.ibex.io.*; @@ -11,42 +11,46 @@ import com.thoughtworks.xstream.*; import org.prevayler.*; import org.prevayler.implementation.snapshot.*; - public class Servlet extends HttpServlet { - private ServletResolver resolver = new ServletResolver(); - private class ServletResolver implements XML.Node.Stream.Resolver { - public XML.Node.Stream.Functor resolve(String uri) { - if (uri.indexOf(':') == -1) throw new RuntimeException("uri does not contain an method: " + uri); - String method = uri.substring(0, uri.indexOf(':')); - String rest = uri.substring(uri.indexOf(':'))+1; - //case "xtree": return XTree.tag(rest); - //#switch(method) - case "webinf": return new Template(cx.getRealPath(rest)); - case "java": try { return (XML.Node.Stream.Functor)Class.forName(rest).newInstance(); } - catch (Exception e) { throw new RuntimeException(e); } - //#end - throw new RuntimeException("unknown method " + method); + private ServletScope servletscope = null; + private String path; + private Prevayler prevayler; + private JS prevalent; + private ServletContext cx = null; + + public void destroy() { try { + synchronized(this.getClass()) { + Prevayler privatePrevayler = prevayler; + if (prevayler == null) return; + prevayler = null; + Prevalence.destroy(cx, prevayler); } + } catch (Exception e) { e.printStackTrace(); } } + + public void init(ServletConfig sc) throws ServletException { + cx = sc.getServletContext(); + prevayler = Prevalence.getPrevayler(cx); } + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { doGet(request, response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - JSScope scope = new ServletScope(request, response); - String path = cx.getRealPath(((HttpServletRequest)request).getServletPath()); + servletscope = new ServletScope(request, response, cx); + path = cx.getRealPath(((HttpServletRequest)request).getServletPath()); Reader xmlreader = new InputStreamReader(new FileInputStream(path)); - XML.Node.Stream s = new JSRewriter(XML.Node.Stream.in(xmlreader), scope); - s.out(response.getWriter()); + new Template(servletscope, new JSScope(servletscope), xmlreader).wrap(null).toXML(response.getWriter()); } - public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { doGet(request, response); } - public class ServletScope extends JSScope { HttpServletRequest request; HttpServletResponse response; - public ServletScope(ServletRequest request, ServletResponse response) { + ServletContext cx; + public String getRealPath(String s) { return cx.getRealPath(s); } + public ServletScope(ServletRequest request, ServletResponse response, ServletContext cx) { super(null); this.request = (HttpServletRequest)request; this.response = (HttpServletResponse)response; + this.cx = cx; } private JS params = new JS() { public Object get(Object key) { return request.getParameter(JS.toString(key)); } @@ -96,19 +100,21 @@ public class Servlet extends HttpServlet { //#switch(method) case "prevalent.query": try { - return prevayler.execute(new JSQuery(JS.cloneWithNewParentScope((JS)a, null))); + return prevayler.execute(new Prevalence.JSQuery(JS.cloneWithNewParentScope((JS)a, null))); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } - case "prevalent.execute": - try { - prevayler.execute(new JSTransaction(JS.cloneWithNewParentScope((JS)a, null))); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); } - case "session.invalidate": request.getSession(true).invalidate(); return null; + case "context.list": + String path = JS.toString(a); + if (path.indexOf("..") != -1) throw new JSExn("cannot use .. in paths"); + File f = new File(cx.getRealPath("/") + File.separatorChar + path); + if (!f.isDirectory()) return null; + String[] contents = f.list(); + JSArray ret = new JSArray(contents.length); + for(int i=0; i=nodes.length) return false; + n.copyFrom(nodes[i++]); + return true; + } }, scope2)), n).upstreamRead(n); + } + } + + private class DropTag implements Node.Stream.Functor { + public Node.Stream wrap(Node.Stream kids) { + return kids; + } } + + private class DropAll implements Node.Stream.Functor { + public Node.Stream wrap(Node.Stream kids) { + return new Node.Stream() { public boolean _read(Node n) { return false; } }; + } } + + private class JsTag implements Node.Stream.Functor { + JSScope scope; + public JsTag(JSScope scope) { this.scope = scope; } + public Node.Stream wrap(final Node.Stream s) { + return new Node.Stream() { + protected boolean _read(Node n) { + boolean ret = s.read(n); + if (ret && n.cdata != null) { + System.err.println("exec("+n.cdata+")"); + exec(n.cdata, scope); + return _read(n); + } + return ret; + } + }; + } + } +} -- 1.7.10.4