Mercurial Hosting > luan
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) {