01: // Copyright (c) 2001 Per M.A. Bothner and Brainfood Inc.
02: // This is free software; for terms and warranty disclaimer see ./COPYING.
03:
04: package gnu.kawa.servlet;
05:
06: import javax.servlet.*;
07: import javax.servlet.http.*;
08: import gnu.mapping.*;
09: import gnu.xml.*;
10: import java.io.IOException;
11: import gnu.text.Path;
12:
13: public abstract class KawaServlet extends HttpServlet {
14: public abstract void run(CallContext ctx) throws Throwable;
15:
16: public void doPost(HttpServletRequest request,
17: HttpServletResponse response) throws ServletException,
18: IOException {
19: doGet(request, response);
20: }
21:
22: public void doGet(HttpServletRequest request,
23: HttpServletResponse response) throws ServletException,
24: IOException {
25: CallContext ct = CallContext.getOnlyInstance();
26: ServletCallContext ctx;
27: if (ct instanceof ServletCallContext) {
28: ctx = (ServletCallContext) ct;
29: } else {
30: ctx = new ServletCallContext();
31: CallContext.setInstance(ctx);
32: }
33: ctx.consumer = new ServletPrinter(response); // FIXME - should re-use
34: ctx.request = request;
35: ctx.response = response;
36: Path.setCurrentPath(Path.valueOf(request.getRequestURL()
37: .toString()));
38: ctx.servlet = this ;
39: ctx.values = Values.noArgs;
40:
41: /* FIXME should use fluid binding - or ThreadLocation!
42: gnu.expr.Language language = gnu.expr.Language.getDefaultLanguage();
43: String lang = language.getName();
44: Environment env = Environment.getCurrent();
45: if (lang == "XQuery")
46: {
47: env.defineValue("request", request);
48: env.defineValue("response", response);
49: env.defineValue("servlet", this);
50: env.defineValue("out", out);
51: }
52: else
53: {
54: env.defineValue("*request*", request);
55: env.defineValue("*response*", response);
56: env.defineValue("*servlet*", this);
57: env.defineValue("*out*", out);
58: }
59: */
60:
61: ctx.consumer.startDocument();
62: try {
63: run(ctx);
64: } catch (Throwable throwable) {
65: // Clear partial output on an error.
66: response.resetBuffer();
67: if (throwable instanceof WrappedException) {
68: Throwable cause = ((WrappedException) throwable)
69: .getCause();
70: if (cause != null)
71: throwable = cause;
72: }
73: throw new ServletException(throwable);
74: }
75: ctx.consumer.endDocument();
76: }
77: }
|