diff src/luan/modules/http/LuanHandler.java @ 1263:382c444a6c77

add Http.eval_in_root and Http.handle_error
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 24 Sep 2018 22:06:25 -0600
parents e38f5869e9df
children d41997776788
line wrap: on
line diff
--- a/src/luan/modules/http/LuanHandler.java	Mon Sep 24 14:48:59 2018 -0600
+++ b/src/luan/modules/http/LuanHandler.java	Mon Sep 24 22:06:25 2018 -0600
@@ -6,8 +6,6 @@
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.BindException;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import luan.webserver.Request;
@@ -23,25 +21,26 @@
 import luan.LuanCloner;
 import luan.LuanException;
 import luan.modules.PackageLuan;
+import luan.modules.BasicLuan;
 
 
-public class LuanHandler implements Handler, Closeable {
+public final class LuanHandler implements Handler, Closeable {
 	private final LuanState luanInit;
 	private final Logger logger;
-	private final HttpServicer httpServicer;
-	private final ReadWriteLock lock = new ReentrantReadWriteLock();
-	private LuanState luan;
+	private volatile LuanState luan;
 
 	private static final Method resetLuanMethod;
+	private static final Method evalInRootMethod;
 	static {
 		try {
-			resetLuanMethod = LuanHandler.class.getMethod("reset_luan");
+			resetLuanMethod = LuanHandler.class.getMethod( "reset_luan" );
+			evalInRootMethod = LuanHandler.class.getMethod( "eval_in_root", String.class );
 		} catch(NoSuchMethodException e) {
 			throw new RuntimeException(e);
 		}
 	}
 
-	public LuanHandler(LuanState luanInit,String loggerRoot,HttpServicer httpServicer) {
+	public LuanHandler(LuanState luanInit,String loggerRoot) {
 		this.luanInit = luanInit;
 		if( loggerRoot==null )
 			loggerRoot = "";
@@ -49,10 +48,10 @@
 		try {
 			LuanTable Http = (LuanTable)PackageLuan.require(luanInit,"luan:http/Http.luan");
 			Http.rawPut( "reset_luan", new LuanJavaFunction(resetLuanMethod,this) );
+			Http.rawPut( "eval_in_root", new LuanJavaFunction(evalInRootMethod,this) );
 		} catch(LuanException e) {
 			throw new RuntimeException(e);
 		}
-		this.httpServicer = httpServicer!=null ? httpServicer : new HttpServicer();
 		setLuan();
 		luanInit.onClose(this);
 	}
@@ -83,11 +82,9 @@
 		Thread thread = Thread.currentThread();
 		String oldName = thread.getName();
 		thread.setName(request.headers.get("host")+request.path);
-		lock.readLock().lock();
 		try {
-			return httpServicer.service(luan,request,modName);
+			return HttpServicer.service(luan,request,modName);
 		} finally {
-			lock.readLock().unlock();
 			thread.setName(oldName);
 		}
 	}
@@ -99,41 +96,24 @@
 	}
 
 	public Object call_rpc(String fnName,Object... args) throws LuanException {
-		lock.readLock().lock();
-		try {
-			LuanFunction fn;
-			LuanState luan = this.luan;
-			synchronized(luan) {
-				PackageLuan.enableLoad(luan,"luan:Rpc.luan");
-				LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
-				LuanTable fns = (LuanTable)rpc.get(luan,"functions");
-				fn = (LuanFunction)fns.get(luan,fnName);
-				if( fn == null )
-					throw new LuanException( "function not found: " + fnName );
-				LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
-				luan = (LuanState)cloner.clone(luan);
-				fn = (LuanFunction)cloner.get(fn);
-			}
-			return fn.call(luan,args);
-		} finally {
-			lock.readLock().unlock();
+		LuanFunction fn;
+		LuanState luan = this.luan;
+		synchronized(luan) {
+			PackageLuan.enableLoad(luan,"luan:Rpc.luan");
+			LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
+			LuanTable fns = (LuanTable)rpc.get(luan,"functions");
+			fn = (LuanFunction)fns.get(luan,fnName);
+			if( fn == null )
+				throw new LuanException( "function not found: " + fnName );
+			LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
+			luan = (LuanState)cloner.clone(luan);
+			fn = (LuanFunction)cloner.get(fn);
 		}
+		return fn.call(luan,args);
 	}
 
 	public void reset_luan() {
-		new Thread() {
-			public void run() {
-				lock.writeLock().lock();
-				try {
-					synchronized(luan) {
-						luan.close();
-						setLuan();
-					}
-				} finally {
-					lock.writeLock().unlock();
-				}
-			}
-		}.start();
+		setLuan();
 	}
 
 	public Object runLuan(String sourceText,String sourceName) throws LuanException {
@@ -145,6 +125,16 @@
 		}
 	}
 
+	public void eval_in_root(String text) throws LuanException {
+		LuanState luan;
+		synchronized(this.luan) {
+			LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
+			luan = (LuanState)cloner.clone(this.luan);
+		}
+		BasicLuan.load(text,"<eval_in_root>",null).call(luan);
+		this.luan = luan;
+	}
+
 	public static void start(Server server) throws Exception {
 		try {
 			server.start();