X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fjava%2Forg%2Fibex%2Fxt%2FServlet.java;h=c53ae4fefe1493bcb42f60e4a591a79dfc0c3a1b;hb=fc9f528e7acb1baf7c145b22dd0b6469968aaec0;hp=fcdbde2bdc9e5e35139d297706b7c3d99c951376;hpb=4f3ad62d8bc5e2f2cc1f6674935bb9a088fa400a;p=org.ibex.xt-crawshaw.git diff --git a/src/java/org/ibex/xt/Servlet.java b/src/java/org/ibex/xt/Servlet.java index fcdbde2..c53ae4f 100644 --- a/src/java/org/ibex/xt/Servlet.java +++ b/src/java/org/ibex/xt/Servlet.java @@ -1,21 +1,17 @@ package org.ibex.xt; import java.io.*; -import java.net.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; -import org.ibex.util.*; import org.ibex.util.Collections; import org.ibex.js.*; import org.prevayler.*; -import org.prevayler.implementation.snapshot.*; public class Servlet extends HttpServlet { - private String path; private Prevayler prevayler; private JS prevalent; private ServletContext cx = null; @@ -37,12 +33,42 @@ public class Servlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { doGet(request, response); } public void doGet(HttpServletRequest rq, HttpServletResponse rs) throws IOException { - String path = cx.getRealPath(rq.getServletPath()); + String src = rq.getServletPath(); Servlet.Scope scope = new Servlet.Scope(cx, rq, rs, prevayler); - rs.getWriter().write("beginning output..."); - try { Template.wrap(Template.parse(path, scope), scope).out(rs.getWriter()); } - catch (Exception e) { e.printStackTrace(); System.out.println("e = "+e); } - rs.getWriter().write("...output ends."); + PrintWriter w = new PrintWriter(rs.getWriter()); + try { + while (src != null) { + try { + StringWriter buffer = new StringWriter(); + Template t = Template.parse(cx.getRealPath(src), scope); + Template.wrap(t, scope).out(buffer); + + rs.setContentType("text/xml"); + w.write(buffer.toString()); + src = null; + } catch (Template.RedirectSignal r) { + src = r.getTarget(); + } + } + } catch (Template.Signal s) { + // exit silently + } catch (JSLeaf.Exn e) { + w.print("\n"+src+": "); + w.println(e.getMessage()); + System.out.println(e); + } catch (FileNotFoundException e) { + w.print("\nfile not found: "); + w.println(e.getMessage()); + System.out.println(e); + } catch (IOException e) { + w.print("\nio error: "); + w.println(e.getMessage()); + e.printStackTrace(); + } catch (Exception e) { + w.print("Unexpected error occurred."); + System.out.println("Unexpected Exception:"); + e.printStackTrace(); + } } public static class Scope extends Template.Scope { @@ -61,6 +87,31 @@ public class Servlet extends HttpServlet { catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } + private JS session = new JS() { + public Object get(Object key) throws JSExn { + //#switch(JS.toString(key)) + case "created": return new JSDate(request.getSession(true).getCreationTime()); + case "accessed": return new JSDate(request.getSession(true).getLastAccessedTime()); + case "invalidate": return METHOD; + //#end + return super.get(key); + } + public void put(Object key, Object val) throws JSExn { + //#switch(JS.toString(key)) + case "created": throw new JSExn("can not set session.created"); + case "accessed": throw new JSExn("can not set session.accessed"); + case "invalidate": throw new JSExn("can not set session.invalidate"); + //#end + super.put(key, val); + } + public Object callMethod(Object method, final Object a, final Object b, Object c, Object[] rest, int nargs) + throws JSExn { + //#switch(JS.toString(method)) + case "invalidate": request.getSession(true).invalidate(); return null; + //#end + return super.callMethod(method, a, b, c, rest, nargs); + } + }; private JS params = new JS() { private List keys = null; public Object get(Object key) { return request.getParameter(JS.toString(key)); } @@ -144,11 +195,7 @@ public class Servlet extends HttpServlet { case "request.path": return request.getPathInfo(); case "response": return getSub("response"); case "response.header": return responseHeader; - case "session": return getSub("session"); - case "session.attr": return sessionAttributes; - case "session.created": return new JSDate(request.getSession(true).getCreationTime()); - case "session.accessed": return new JSDate(request.getSession(true).getLastAccessedTime()); - case "session.invalidate": return METHOD; + case "session": return session; case "page": return getSub("page"); //case "page.lastmodified": return new JSDate(new File(path).lastModified()); FIXME case "context": return getSub("context");