introduce a signalling exception and improve error messages
[org.ibex.xt-crawshaw.git] / src / java / org / ibex / xt / Servlet.java
index 7402dd2..53eb197 100644 (file)
@@ -13,7 +13,6 @@ import org.prevayler.*;
 
 public class Servlet extends HttpServlet {
 
-    private String path;
     private Prevayler prevayler;
     private JS prevalent;
     private ServletContext cx = null;
@@ -35,12 +34,30 @@ 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.");
+        try {
+            while (src != null) {
+                try {
+                    StringWriter w = new StringWriter();
+                    Template t = Template.parse(cx.getRealPath(src), scope);
+                    Template.wrap(t, scope).out(w);
+                    rs.getWriter().write(w.toString());
+                    src = null;
+                } catch (Template.RedirectSignal r) {
+                    src = r.getTarget();
+                }
+            }
+        } catch (Template.Signal s) {
+        } catch (JSElement.Exn e) {
+            PrintWriter w = new PrintWriter(rs.getWriter());
+            w.print("\n"+src+": ");
+            w.println(e.getMessage());
+            System.out.println(e);
+        } catch (Exception e) {
+            System.out.println("Unexpected Exception:");
+            e.printStackTrace();
+        }
     }
 
     public static class Scope extends Template.Scope {