diff src/luan/host/WebHandler.java @ 1315:5763597ca5c0

add DomainHandler
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 30 Jan 2019 01:21:49 -0700
parents 51a1987b55a3
children 307e76ccd0d6
line wrap: on
line diff
--- a/src/luan/host/WebHandler.java	Tue Jan 29 19:10:39 2019 -0700
+++ b/src/luan/host/WebHandler.java	Wed Jan 30 01:21:49 2019 -0700
@@ -1,70 +1,42 @@
 package luan.host;
 
 import java.io.File;
-import java.io.IOException;
-import java.lang.ref.Reference;
-import java.lang.ref.SoftReference;
-//import java.lang.ref.WeakReference;
-import java.lang.ref.ReferenceQueue;
-import java.util.Map;
-import java.util.HashMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import luan.webserver.Handler;
-import luan.webserver.Server;
 import luan.webserver.Request;
 import luan.webserver.Response;
-import luan.webserver.handlers.IndexHandler;
-import luan.webserver.handlers.ListHandler;
-import luan.Luan;
+import luan.webserver.handlers.DomainHandler;
 import luan.LuanState;
 import luan.LuanException;
 import luan.LuanTable;
-import luan.LuanFunction;
 import luan.modules.IoLuan;
 import luan.modules.JavaLuan;
-import luan.modules.PackageLuan;
 import luan.modules.http.LuanHandler;
 
 
 public class WebHandler implements Handler {
 	private static final Logger logger = LoggerFactory.getLogger(WebHandler.class);
 
-	private static class LuanRef {
-		private final Handler handler;
-		private final LuanHandler luanHandler;
-
-		private LuanRef(Handler handler,LuanHandler luanHandler) {
-			this.handler = handler;
-			this.luanHandler = luanHandler;
-		}
-	}
-
-	private static final ReferenceQueue<LuanRef> queue = new ReferenceQueue<LuanRef>();
-
-	private static class MyReference extends SoftReference<LuanRef> {
-		private LuanHandler luanHandler;
+	private static final DomainHandler.Factory factory = new DomainHandler.Factory() {
+		public Handler newHandler(String domain) {
+			File dir = new File(sitesDir,domain);
+			if( !dir.exists() /* && !recover(dir) */ )
+				return null;
+			String dirStr = dir.toString();
 
-		private MyReference(LuanRef lr) {
-			super(lr,queue);
-			this.luanHandler = lr.luanHandler;
-		}
-	}
+			String logDir = dirStr + "/site/private/local/logs/web";
+			new File(logDir).mkdirs();
 
-	private static void sweep() {
-		while(true) {
-			MyReference ref = (MyReference)queue.poll();
-			if( ref == null )
-				return;
-			//logger.info("sweep");
-			ref.luanHandler.close();
-			ref.luanHandler = null;
+			LuanState luan = new LuanState();
+			LuanTable init = initLuan(luan,dirStr,domain);
+			String loggerRoot = (String)init.rawGet("logger_root");
+			return new LuanHandler(luan,loggerRoot);
 		}
-	}
-
+	};
 
 	public static String allowJavaFileName = "allow_java";  // change for security
-	private static final Map<String,MyReference> siteMap = new HashMap<String,MyReference>();
+	private static final DomainHandler domainHandler = new DomainHandler(factory);
 	private static String sitesDir = null;
 
 	public static boolean isServing() {
@@ -79,45 +51,20 @@
 		sitesDir = dir;
 	}
 
-	public Response handle(Request request) {
-		String host = (String)request.headers.get("host");
-		int i = host.indexOf(':');
-		String domain = i == -1 ? host : host.substring(0,i);
-//		System.out.println("handle "+domain);
-		LuanRef lr = getSite(domain);
-		if( lr == null )
-			return null;
-		return lr.handler.handle(request);
+	@Override public Response handle(Request request) {
+		return domainHandler.handle(request);
 	}
 
 	public static Object runLuan(String domain,String sourceText,String sourceName) throws LuanException {
-		LuanRef lr = getSite(domain);
-		return lr.luanHandler.runLuan(sourceText,sourceName);
+		LuanHandler luanHandler = (LuanHandler)domainHandler.getHandler(domain);
+		return luanHandler.runLuan(sourceText,sourceName);
 	}
 
 	public static Object callSite(String domain,String fnName,Object... args) throws LuanException {
-		LuanRef lr = getSite(domain);
-		return lr.luanHandler.call_rpc(fnName,args);
+		LuanHandler luanHandler = (LuanHandler)domainHandler.getHandler(domain);
+		return luanHandler.call_rpc(fnName,args);
 	}
 
-	private static LuanRef getSite(String domain) {
-		synchronized(siteMap) {
-			Reference<LuanRef> ref = siteMap.get(domain);
-			LuanRef lr = ref==null ? null : ref.get();
-			if( lr == null ) {
-				//if(ref!=null) logger.info("gc "+domain);
-				if( sitesDir==null )
-					throw new NullPointerException("sitesDir");
-				File dir = new File(sitesDir,domain);
-				if( !dir.exists() /* && !recover(dir) */ )
-					return null;
-				sweep();
-				lr = newSite(dir.toString(),domain);
-				siteMap.put(domain,new MyReference(lr));
-			}
-			return lr;
-		}
-	}
 /*
 	private static boolean recover(File dir) {
 		File backups = new File(dir.getParentFile().getParentFile(),"backups");
@@ -157,34 +104,12 @@
 		return init;
 	}
 
-	private static LuanRef newSite(String dir,String domain) {
-		LuanState luan = new LuanState();
-		LuanTable init = initLuan(luan,dir,domain);
-
-		String loggerRoot = (String)init.rawGet("logger_root");
-		LuanHandler luanHandler = new LuanHandler(luan,loggerRoot);
-
-		Handler handler = luanHandler;
-		handler = new IndexHandler(handler);
-
-		String logDir = dir + "/site/private/local/logs/web";
-		new File(logDir).mkdirs();
-
-		return new LuanRef(handler,luanHandler);
-	}
-
-	public static void removeHandler(String domain) throws Exception {
-		synchronized(siteMap) {
-			Reference<LuanRef> ref = siteMap.remove(domain);
-			LuanRef lr = ref==null ? null : ref.get();
-			if( lr != null ) {
-				lr.luanHandler.close();
-			}
-		}
+	public static void removeHandler(String domain) {
+		domainHandler.removeHandler(domain);
 	}
 
 	public static void loadHandler(String domain) {
-		getSite(domain);
+		domainHandler.getHandler(domain);
 	}
 
 	private static final IoLuan.Security ioSecurity(String dir) {