changeset 138:06159094b802

replace WebRun.java with web_run.luan git-svn-id: https://luan-java.googlecode.com/svn/trunk@139 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 12 Jun 2014 08:20:48 +0000
parents 573ce091ae00
children 3b384dc5ca91
files src/luan/lib/HttpLib.java src/luan/lib/PackageLib.java src/luan/lib/StringLib.java src/luan/tools/WebRun.java src/luan/tools/web_run.luan
diffstat 5 files changed, 51 insertions(+), 96 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/lib/HttpLib.java	Thu Jun 12 03:54:52 2014 +0000
+++ b/src/luan/lib/HttpLib.java	Thu Jun 12 08:20:48 2014 +0000
@@ -33,16 +33,15 @@
 	public static void service(LuanState luan,HttpServletRequest request,HttpServletResponse response,String modName)
 		throws LuanException
 	{
-		LuanState newLuan;
-		LuanFunction newFn;
+		LuanFunction fn;
 		synchronized(luan) {
 			Object mod = PackageLib.require(luan,modName);
 			if( !(mod instanceof LuanFunction) )
 				throw luan.exception( "module '"+modName+"' must return a function" );
-			LuanFunction fn = (LuanFunction)mod;
+			fn = (LuanFunction)mod;
 			DeepCloner cloner = new DeepCloner();
-			newLuan = cloner.deepClone(luan);
-			newFn = cloner.get(fn);
+			luan = cloner.deepClone(luan);
+			fn = cloner.get(fn);
 		}
 
 		LuanTable module = (LuanTable)luan.loaded().get(NAME);
@@ -52,21 +51,23 @@
 		try {
 			module.put( "request", lib.requestTable() );
 			module.put( "response", lib.responseTable() );
+/*
 			module.put( "write", new LuanJavaFunction(
 				HttpLib.class.getMethod( "text_write", LuanState.class, new Object[0].getClass() ), lib
 			) );
+*/
 		} catch(NoSuchMethodException e) {
 			throw new RuntimeException(e);
 		}
 
-		newLuan.call(newFn,"<http>");
+		luan.call(fn,"<http>");
 	}
 
 
 
 	private final HttpServletRequest request;
 	private final HttpServletResponse response;
-	private PrintWriter writer = null;
+//	private PrintWriter writer = null;
 //	private ServletOutputStream sos = null;
 
 	private HttpLib(HttpServletRequest request,HttpServletResponse response) {
@@ -98,13 +99,15 @@
 		resp.put( "set_header", new LuanJavaFunction(HttpServletResponse.class.getMethod("setHeader",String.class,String.class),response) );
 		add( resp, "set_cookie", String.class, String.class, Boolean.TYPE, String.class );
 		add( resp, "remove_cookie", String.class, String.class );
+		resp.put( "set_content_type", new LuanJavaFunction(HttpServletResponse.class.getMethod("setContentType",String.class),response) );
+		add( resp, "text_writer" );
 		return resp;
 	}
 
 	private void add(LuanTable t,String method,Class<?>... parameterTypes) throws NoSuchMethodException {
 		t.put( method, new LuanJavaFunction(HttpLib.class.getMethod(method,parameterTypes),this) );
 	}
-
+/*
 	public void text_write(LuanState luan,Object... args) throws LuanException, IOException {
 		if( writer == null )
 			writer = response.getWriter();
@@ -112,6 +115,10 @@
 			writer.print( luan.toString(obj) );
 		}
 	}
+*/
+	public LuanTable text_writer() throws IOException {
+		return IoLib.textWriter(response.getWriter());
+	}
 
 	public String get_cookie_value(String name) {
 		return getCookieValue(request, name);
--- a/src/luan/lib/PackageLib.java	Thu Jun 12 03:54:52 2014 +0000
+++ b/src/luan/lib/PackageLib.java	Thu Jun 12 08:20:48 2014 +0000
@@ -131,9 +131,10 @@
 	public static final LuanFunction javaFileLoader = new LuanFunction() {
 		@Override public Object call(LuanState luan,Object[] args) throws LuanException {
 			String urlStr = (String)args[1];
+			String path = (String)args[2];
 			try {
 				String src = new IoLib.LuanUrl(urlStr).read_text();
-				LuanFunction fn = BasicLib.load(luan,src,urlStr,false,false);
+				LuanFunction fn = BasicLib.load(luan,src,path,false,false);
 				return fn.call(luan,args);
 			} catch(IOException e) {
 				throw luan.exception(e);
@@ -146,7 +147,7 @@
 			String path = (String)args[0];
 			String url = IoLib.java_resource_to_url(path);
 			if( url != null ) {
-				return new Object[]{javaFileLoader,url};
+				return new Object[]{javaFileLoader,url,path};
 			}
 			return LuanFunction.NOTHING;
 		}
--- a/src/luan/lib/StringLib.java	Thu Jun 12 03:54:52 2014 +0000
+++ b/src/luan/lib/StringLib.java	Thu Jun 12 08:20:48 2014 +0000
@@ -189,7 +189,7 @@
 					return m.group();
 				String[] rtn = new String[n];
 				for( int i=0; i<n; i++ ) {
-					rtn[i] = m.group(i);
+					rtn[i] = m.group(i+1);
 				}
 				return rtn;
 			}
--- a/src/luan/tools/WebRun.java	Thu Jun 12 03:54:52 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-package luan.tools;
-
-import java.io.IOException;
-import java.io.PrintStream;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import luan.LuanState;
-import luan.LuanTable;
-import luan.LuanException;
-import luan.lib.HtmlLib;
-import luan.lib.IoLib;
-
-
-public class WebRun extends HttpServlet {
-	private static final Logger logger = LoggerFactory.getLogger(WebRun.class);
-
-	protected LuanState newLuanState() throws LuanException {
-		return LuanState.newStandard();
-	}
-
-	protected void service(HttpServletRequest request,HttpServletResponse response)
-		throws ServletException, IOException
-	{
-		ServletOutputStream sout = response.getOutputStream();
-		PrintStream out = new PrintStream(sout);
-		String contentType = request.getParameter("content_type");
-		if( contentType != null )
-			response.setContentType("text/plain");
-		String code = request.getParameter("code");
-		try {
-			LuanState luan = newLuanState();
-			luan.set( "Io.stdout", IoLib.textWriter(out) );
-			LuanTable env = luan.global();
-			env.put("request",request);
-			env.put("response",response);
-			luan.eval(code);
-		} catch(LuanException e) {
-			logger.error(null,e);
-			response.reset();
-			response.setHeader("Content-Type","text/html");
-			out.println( "<html>" );
-			out.println( "<body>" );
-			out.println( "<pre>" );
-			out.println( e );
-			out.println();
-			out.println( addLineNumbers(HtmlLib.encode(code)) );
-			out.println( "</pre>" );
-			out.println( "</body>" );
-			out.println( "</html>" );
-		}
-	}
-
-	public static String addLineNumbers(String s) {
-		StringBuilder buf = new StringBuilder();
-		int line = 1;
-		int i = 0;
-		while(true) {
-			buf.append( fmt(line++,3) );
-			buf.append("  ");
-			int i2 = s.indexOf('\n',i);
-			if( i2 == -1 ) {
-				buf.append( s.substring(i) );
-				break;
-			}
-			buf.append( s.substring(i,i2+1) );
-			i = i2 + 1;
-		}
-		return buf.toString();
-	}
-
-	private static String fmt(int i,int w) {
-		StringBuilder buf = new StringBuilder();
-		buf.append(i);
-		while( buf.length() < w ) {
-			buf.insert(0,' ');
-		}
-		return buf.toString();
-	}
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/tools/web_run.luan	Thu Jun 12 08:20:48 2014 +0000
@@ -0,0 +1,32 @@
+import "Http"
+
+local function lines(s)
+	local matcher = String.gmatch(s,"([^\n]*)\n|([^\n])+$")
+	return function()
+		local m1, m2 = matcher()
+		return m1 or m2
+	end
+end
+
+local function print_with_line_numbers(s)
+	i = 1
+	for line in lines(s) do
+		print(i,line)
+		i = i + 1
+	end
+end
+
+return function()
+	Http.response.set_content_type "text/plain"
+	Io.stdout = Http.response.text_writer()
+	local code = Http.request.get_parameter "code"
+	try
+		local fn = load(code,"<web_run>")
+		fn()
+	catch e do
+		print(e)
+		print()
+		print()
+		print_with_line_numbers(code)
+	end
+end