From 59e1d7b4bf7843e12351004b64d6667abefd04c7 Mon Sep 17 00:00:00 2001 From: crawshaw Date: Thu, 25 Nov 2004 06:52:41 +0000 Subject: [PATCH] add redirect tag support darcs-hash:20041125065241-2eb37-fcbcaaf7a352ef86b557479097a2c4fe750e0646.gz --- src/java/org/ibex/xt/Servlet.java | 18 +++++++++++++----- src/java/org/ibex/xt/Template.java | 20 +++++++++++++++++++- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/java/org/ibex/xt/Servlet.java b/src/java/org/ibex/xt/Servlet.java index 53eb197..c05101a 100644 --- a/src/java/org/ibex/xt/Servlet.java +++ b/src/java/org/ibex/xt/Servlet.java @@ -5,7 +5,6 @@ import java.util.*; import javax.servlet.*; import javax.servlet.http.*; -import org.ibex.util.*; import org.ibex.util.Collections; import org.ibex.js.*; @@ -36,24 +35,33 @@ public class Servlet extends HttpServlet { public void doGet(HttpServletRequest rq, HttpServletResponse rs) throws IOException { String src = rq.getServletPath(); Servlet.Scope scope = new Servlet.Scope(cx, rq, rs, prevayler); + PrintWriter w = new PrintWriter(rs.getWriter()); try { while (src != null) { try { - StringWriter w = new StringWriter(); + StringWriter buffer = new StringWriter(); Template t = Template.parse(cx.getRealPath(src), scope); - Template.wrap(t, scope).out(w); - rs.getWriter().write(w.toString()); + Template.wrap(t, scope).out(buffer); + w.write(buffer.toString()); src = null; } catch (Template.RedirectSignal r) { src = r.getTarget(); } } } catch (Template.Signal s) { + // exit silently } catch (JSElement.Exn e) { - PrintWriter w = new PrintWriter(rs.getWriter()); 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) { System.out.println("Unexpected Exception:"); e.printStackTrace(); diff --git a/src/java/org/ibex/xt/Template.java b/src/java/org/ibex/xt/Template.java index 8456f61..ac29e8f 100644 --- a/src/java/org/ibex/xt/Template.java +++ b/src/java/org/ibex/xt/Template.java @@ -8,13 +8,14 @@ import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.io.IOException; +import java.io.FileNotFoundException; import java.util.*; import org.ibex.util.*; import org.ibex.js.*; public class Template extends JSElement { - public static Template parse(String path, Template.Scope s) throws IOException { + public static Template parse(String path, Template.Scope s) throws FileNotFoundException, IOException { Reader xmlreader = new BufferedReader(new InputStreamReader(new FileInputStream(path))); XML.Document doc = new XML.Document(); doc.parse(xmlreader); @@ -29,6 +30,7 @@ public class Template extends JSElement { case "js": e = new Template.JSTag(e); break; case "foreach": e = new Template.ForEach(e); break; case "children": e = new Template.Children(e); break; + case "redirect": e = new Template.Redirect(e); break; case "transaction": e = new Template.Transaction(e, s); break; //#end @@ -166,6 +168,22 @@ public class Template extends JSElement { public Children(XML.Element e) { super(e); } } + public static final class Redirect extends JSElement { + public Redirect(XML.Element e) { super(e); } + + public void out(Writer w) throws IOException { + loadAttr(); + + try { + Object p = get("page"); if (p != null) undeclare("page"); + if (p == null || !(p instanceof String) || ((String)p).trim().equals("")) + throw new JSElement.Exn("<"+getPrefix()+":redirect> requires 'page' "+ + "attribute to be a valid template path"); + throw new RedirectSignal((String)p); + } catch (JSExn e) { throw new JSElement.Exn(e); } + } + } + // TODO: finish public static final class Transaction extends JSElement { private final Template.Scope scope; // FIXME: HACK. unstatisise all tags, or do this to all -- 1.7.10.4