X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fjava%2Forg%2Fibex%2Fxt%2FServlet.java;h=78d1d916e4c57545963fb295df50a4ecee30b0fe;hb=HEAD;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..78d1d91 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 Object 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 + return 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)); } @@ -77,9 +128,10 @@ public class Servlet extends HttpServlet { private List keys = null; public Object get(Object key) { return request.getSession(true).getAttribute(JS.toString(key)); } - public void put(Object key, Object val) { + public Object put(Object key, Object val) { if (val == null) request.getSession(true).removeAttribute(JS.toString(key)); - else request.setAttribute(JS.toString(key), val); } + else request.setAttribute(JS.toString(key), val); + return null; } public Collection keys() { return keys == null ? keys = Collections.list(request.getSession(true).getAttributeNames()) : keys; } }; @@ -90,8 +142,8 @@ public class Servlet extends HttpServlet { return keys == null ? keys = Collections.list(request.getHeaderNames()) : keys; } }; private JS responseHeader = new JS() { - public void put(Object key, Object val) { - response.setHeader(JS.toString(key), JS.toString(val)); } + public Object put(Object key, Object val) { + response.setHeader(JS.toString(key), JS.toString(val)); return null; } }; @@ -99,8 +151,8 @@ public class Servlet extends HttpServlet { private class Sub extends JS { Object key; Sub(Object key) { this.key = key; } - public void put(Object key, Object val) throws JSExn { - Scope.this.put(JS.toString(this.key) + "." + JS.toString(key), val); } + public Object put(Object key, Object val) throws JSExn { + return Scope.this.put(JS.toString(this.key) + "." + JS.toString(key), val); } public Object get(Object key) throws JSExn { return Scope.this.get(JS.toString(this.key) + "." + JS.toString(key)); } public Object call(Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn { @@ -144,11 +196,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"); @@ -159,14 +207,14 @@ public class Servlet extends HttpServlet { //#end return null; } - public void put(Object key, Object val) throws JSExn { + public Object put(Object key, Object val) throws JSExn { try { //#switch(JS.toString(key)) - case "transaction": transaction((JS)val); case "response.code": response.setStatus(JS.toInt(val)); case "response.redirect": response.sendRedirect(JS.toString(val)); case "response.contentType": response.setContentType(JS.toString(val)); //#end + return null; } catch (IOException e) { throw new JSExn(e); }