Mercurial Hosting > luan
diff web/src/luan/modules/web/HttpLuan.java @ 222:b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
git-svn-id: https://luan-java.googlecode.com/svn/trunk@223 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Mon, 21 Jul 2014 02:23:05 +0000 |
parents | ec016471c6eb |
children | a9fe265dbac3 |
line wrap: on
line diff
--- a/web/src/luan/modules/web/HttpLuan.java Thu Jul 17 07:49:26 2014 +0000 +++ b/web/src/luan/modules/web/HttpLuan.java Mon Jul 21 02:23:05 2014 +0000 @@ -3,8 +3,10 @@ import java.io.PrintWriter; import java.io.IOException; import java.util.Map; +import java.util.AbstractMap; import java.util.Set; import java.util.Arrays; +import java.util.Iterator; import java.util.Enumeration; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; @@ -17,11 +19,13 @@ import luan.LuanElement; import luan.LuanException; import luan.LuanTable; +import luan.AbstractLuanTable; import luan.LuanJavaFunction; import luan.LuanExitException; import luan.DeepCloner; import luan.modules.PackageLuan; import luan.modules.IoLuan; +import luan.modules.TableLuan; public final class HttpLuan { @@ -116,10 +120,37 @@ private LuanTable requestTable() throws NoSuchMethodException { LuanTable tbl = Luan.newTable(); tbl.put("java",request); - add( tbl, "get_parameter", String.class ); - tbl.put( "get_header", new LuanJavaFunction( - HttpServletRequest.class.getMethod("getHeader",String.class), request - ) ); + LuanTable parameters = new NameTable() { + + @Override Object get(String name) { + return request.getParameter(name); + } + + @Override Iterator<String> names() { + return new EnumerationIterator(request.getParameterNames()); + } + + @Override protected String type() { + return "request.parameters-table"; + } + }; + tbl.put( "parameters", parameters ); + add( tbl, "get_parameter_values", String.class ); + LuanTable headers = new NameTable() { + + @Override Object get(String name) { + return request.getHeader(name); + } + + @Override Iterator<String> names() { + return new EnumerationIterator(request.getHeaderNames()); + } + + @Override protected String type() { + return "request.headers-table"; + } + }; + tbl.put( "headers", headers ); tbl.put( "get_method", new LuanJavaFunction( HttpServletRequest.class.getMethod("getMethod"), request ) ); @@ -147,6 +178,23 @@ tbl.put( "set_header", new LuanJavaFunction( HttpServletResponse.class.getMethod("setHeader",String.class,String.class), response ) ); +/* + LuanTable headers = new NameTable() { + + @Override Object get(String name) { + return response.getHeader(name); + } + + @Override Iterator<String> names() { + return response.getHeaderNames().iterator(); + } + + @Override protected String type() { + return "response.headers-table"; + } + }; + tbl.put( "headers", headers ); +*/ tbl.put( "set_content_type", new LuanJavaFunction( HttpServletResponse.class.getMethod("setContentType",String.class), response ) ); @@ -173,12 +221,29 @@ private LuanTable sessionTable() throws NoSuchMethodException { LuanTable tbl = Luan.newTable(); - tbl.put( "get_attribute", new LuanJavaFunction( - HttpLuan.class.getMethod("get_session_attribute",String.class), this - ) ); - tbl.put( "set_attribute", new LuanJavaFunction( - HttpLuan.class.getMethod("set_session_attribute",String.class, Object.class), this - ) ); + LuanTable attributes = new NameTable() { + + @Override Object get(String name) { + return request.getSession().getAttribute(name); + } + + @Override Iterator<String> names() { + return new EnumerationIterator(request.getSession().getAttributeNames()); + } + + @Override public Object put(Object key,Object val) { + if( !(key instanceof String) ) + throw new IllegalArgumentException("key must be string for session attributes table"); + String name = (String)key; + request.getSession().setAttribute(name,val); + return null; + } + + @Override protected String type() { + return "session.attributes-table"; + } + }; + tbl.put( "attributes", attributes ); return tbl; } @@ -198,9 +263,9 @@ return IoLuan.textWriter(response.getWriter()); } - public Object get_parameter(String name) { - String[] a = request.getParameterValues(name); - return a==null ? null : a.length==1 ? a[0] : a; + public LuanTable get_parameter_values(String name) { + Object[] a = request.getParameterValues(name); + return a==null ? null : TableLuan.pack(a); } public String get_cookie(String name) { @@ -233,14 +298,6 @@ removeCookie(request,response,name,domain); } - public Object get_session_attribute(String name) { - return request.getSession().getAttribute(name); - } - - public void set_session_attribute(String name,Object value) { - request.getSession().setAttribute(name,value); - } - // static utils @@ -344,4 +401,59 @@ } } + + + // util classes + + static final class EnumerationIterator<E> implements Iterator<E> { + private final Enumeration<E> en; + + EnumerationIterator(Enumeration<E> en) { + this.en = en; + } + + @Override public boolean hasNext() { + return en.hasMoreElements(); + } + + @Override public E next() { + return en.nextElement(); + } + + @Override public void remove() { + throw new UnsupportedOperationException(); + } + } + + private static abstract class NameTable extends AbstractLuanTable { + abstract Object get(String name); + abstract Iterator<String> names(); + + @Override public final Object get(Object key) { + if( !(key instanceof String) ) + return null; + String name = (String)key; + return get(name); + } + + @Override public final Iterator<Map.Entry<Object,Object>> iterator() { + return new Iterator<Map.Entry<Object,Object>>() { + Iterator<String> names = names(); + + @Override public boolean hasNext() { + return names.hasNext(); + } + @Override public Map.Entry<Object,Object> next() { + String name = names.next(); + Object val = get(name); + return new AbstractMap.SimpleEntry<Object,Object>(name,val); + } + @Override public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + }; + + }