+// Copyright 2000-2005 the Contributors, as shown in the revision logs.
+// Licensed under the Apache Public Source License 2.0 ("the License").
+// You may not use this file except in compliance with the License.
+
package org.ibex.xt;
import org.ibex.js.*;
import org.ibex.util.*;
public class Servlet extends HttpServlet {
+ public static final JS METHOD = new JS.Method();
private ServletScope servletscope = null;
private String path;
private Prevayler prevayler;
servletscope = new ServletScope(request, response, cx);
path = cx.getRealPath(((HttpServletRequest)request).getServletPath());
Reader xmlreader = new InputStreamReader(new FileInputStream(path));
- new Template(servletscope, new JSScope(servletscope), xmlreader).wrap(null).toXML(response.getWriter());
+ Writer w = response.getWriter();
+ new Template(servletscope, servletscope, xmlreader).wrap(null).toXML(w);
+ w.flush();
}
- public class ServletScope extends JSScope {
+ // ServletScope //////////////////////////////////////////////////////////////////////////////
+
+ public class ServletScope extends JSSubProperties {
HttpServletRequest request;
HttpServletResponse response;
+ HttpSession session;
ServletContext cx;
public String getRealPath(String s) { return cx.getRealPath(s); }
public ServletScope(ServletRequest request, ServletResponse response, ServletContext cx) {
- super(null);
+ super();
this.request = (HttpServletRequest)request;
this.response = (HttpServletResponse)response;
+ this.session = this.request.getSession();
this.cx = cx;
}
- private JS params = new JS() {
- public Object get(Object key) { return request.getParameter(JS.toString(key)); }
- public Enumeration keys() { return request.getParameterNames(); }
- };
- private JS cookies = new JS() {
- /*
- public Object get(Object key) { return request.getCookie(JS.toString(key)); }
- public Enumeration keys() { return request.getCookieNames(); }
- */
- };
- private JS sessionAttributes = new JS() {
- public Object get(Object key) { return request.getSession(true).getAttribute(JS.toString(key)); }
- public void put(Object key, Object val) {
- if (val == null) request.getSession(true).removeAttribute(JS.toString(key));
- else request.setAttribute(JS.toString(key), val); }
- public Enumeration keys() { return request.getSession(true).getAttributeNames(); }
- };
- private JS requestHeader = new JS() {
- public Object get(Object key) { return request.getHeader(JS.toString(key)); }
- public Enumeration keys() { return request.getHeaderNames(); }
- };
- private JS responseHeader = new JS() {
- public void put(Object key, Object val) { response.setHeader(JS.toString(key), JS.toString(val)); }
- };
+ // FIXME: setattributes, cookies
+ //#repeat params/requestHeader/attributes \
+ // getParameter/getHeader/getAttribute \
+ // getParameterNames/getHeaderNames/getAttributeNames \
+ // request/request/session/response \
+ // setAttribute/setAttribute/setAttribute
+ private JS params = new JS.Obj() {
+ public JS get(JS key) throws JSExn { return JSU.S(request.getParameter(JSU.toString(key)).toString()); }
+ public void put(JS key, JS val) throws JSExn { request.setAttribute(JSU.toString(key), JSU.toString(val)); }
+ public Enumeration keys() throws JSExn {
+ return new JS.Enumeration.JavaStringEnumeration(request.getParameterNames()); }
+ };
+ //#end
- /** lets us put multi-level get/put/call keys all in the same method */
- private class Sub extends JS {
- Object key;
- Sub(Object key) { this.key = key; }
- public void put(Object key, Object val) throws JSExn {
- ServletScope.this.put(JS.toString(this.key) + "." + JS.toString(key), val); }
- public Object get(Object key) throws JSExn {
- return ServletScope.this.get(JS.toString(this.key) + "." + JS.toString(key)); }
- public Object call(Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn {
- return ServletScope.this.callMethod(this.key, a0, a1, a2, rest, nargs);
- }
- public Object callMethod(Object method, Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn {
- return ServletScope.this.callMethod(JS.toString(this.key) + "."
- + JS.toString(method), a0, a1, a2, rest, nargs);
- }
- }
- private Sub getSub(String key) { return new Sub(key); }
-
- public Object callMethod(Object method, final Object a, final Object b, Object c, Object[] rest, int nargs) throws JSExn {
- //#switch(method)
- case "session.invalidate": request.getSession(true).invalidate(); return null;
- case "context.list":
- String path = JS.toString(a);
- if (path.indexOf("..") != -1) throw new JSExn("cannot use .. in paths");
- File f = new File(cx.getRealPath("/") + File.separatorChar + path);
- if (!f.isDirectory()) return null;
- String[] contents = f.list();
- JSArray ret = new JSArray(contents.length);
- for(int i=0; i<contents.length; i++) ret.addElement(contents[i]);
- return ret;
- //#end
- return null;
- }
- public Object get(Object key) throws JSExn {
- //#switch(key)
+ public JS _get(JS key) throws JSExn {
+ //#switch(JSU.toString(key))
case "body":
case "arg": return null;
- case "prevalent": return prevayler.prevalentSystem();
- case "request": return getSub("request");
- case "request.user": return request.getRemoteUser();
+ case "prevalent": return (JS)prevayler.prevalentSystem();
+ case "request": return SUBPROPERTY;
+ case "request.user": return JSU.S(request.getRemoteUser());
case "request.header": return requestHeader;
- case "request.method": return request.getMethod();
- case "request.remote": return getSub("request.remote");
- case "request.remote.ip": return request.getRemoteAddr();
- case "request.remote.host": return request.getRemoteHost();
- case "request.ssl": return request.isSecure();
- 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 "request.method": return JSU.S(request.getMethod());
+ case "request.remote": return SUBPROPERTY;
+ case "request.remote.ip": return JSU.S(request.getRemoteAddr());
+ case "request.remote.host": return JSU.S(request.getRemoteHost());
+ case "request.ssl": return JSU.B(request.isSecure());
+ case "request.path": return JSU.S(request.getPathInfo());
+ case "response": return SUBPROPERTY;
+ case "form": return SUBPROPERTY;
+ case "form.fields": return currentForm.fields();
+ case "session": return SUBPROPERTY;
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 "page": return getSub("page");
+ case "page": return SUBPROPERTY;
case "page.lastmodified": return new JSDate(new File(path).lastModified());
- case "context": return getSub("context");
+ case "context": return SUBPROPERTY;
case "context.list": return METHOD;
case "params": return params;
- case "cookie": return cookies;
//#end
+ // cookie, responseheader needed, session.attributes
return null;
}
- public void put(Object key, Object val) throws JSExn {
+
+ Form currentForm = null;
+
+ public void put(JS key, JS val) throws JSExn {
try {
- //#switch(JS.toString(key))
+ //#switch(JSU.toString(key))
+ case "response.code": response.setStatus(JSU.toInt(val));
+ case "response.redirect": response.sendRedirect(JSU.toString(val));
+ case "response.contentType": response.setContentType(JSU.toString(val));
case "transaction":
try { prevayler.execute(new Prevalence.JSTransaction((JS)val));
} catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); }
- 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
- } catch (IOException e) {
- throw new JSExn(e);
- }
+ } catch (IOException e) { throw new JSExn(JSU.S(e.toString())); }
+ }
+
+ public JS call(JS method, JS[] args) throws JSExn {
+ //#switch(JSU.toString(method))
+ case "session.invalidate": request.getSession(true).invalidate(); return null;
+ case "context.list":
+ String path = JSU.toString(args[0]);
+ if (path.indexOf("..") != -1) throw new JSExn("cannot use .. in paths");
+ File f = new File(cx.getRealPath("/") + File.separatorChar + path);
+ if (!f.isDirectory()) return null;
+ String[] contents = f.list();
+ JSArray ret = new JSArray(contents.length);
+ for(int i=0; i<contents.length; i++) ret.put(JSU.N(ret.size()), JSU.S(contents[i]));
+ return ret;
+ //#end
+ return null;
}
}