- // Prevalence //////////////////////////////////////////////////////////////////////////////
-
- static final Hashtable prevaylers = new Hashtable();
- 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;
- 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 void init(ServletConfig sc) throws ServletException {
- try {
- cx = sc.getServletContext();
- synchronized(cx) {
- prevayler = (Prevayler)prevaylers.get(cx);
- if (prevalent == 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();
- }
- }
- prevalent = (JS)prevayler.prevalentSystem();
- } catch (Exception e) {
- throw new ServletException(e);
- }
- }
-
- public static class JSTransaction implements Transaction {
- 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 {
- 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); }
- }
- }
-