view src/luan/modules/http/LuanHandler.java @ 775:1a68fc55a80c

simplify dir structure
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 26 Aug 2016 14:36:40 -0600
parents http/src/luan/modules/http/LuanHandler.java@3f461f85243d
children 1460d297e960
line wrap: on
line source

package luan.modules.http;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import luan.LuanState;
import luan.LuanTable;
import luan.LuanFunction;
import luan.DeepCloner;
import luan.LuanException;
import luan.modules.PackageLuan;


public class LuanHandler extends AbstractHandler {
	private final LuanState luan;
	private final Logger logger;
	private String welcomeFile = "index.html";

	public LuanHandler(LuanState luan,String loggerRoot) {
		this.luan = luan;
		if( loggerRoot==null )
			loggerRoot = "";
		logger = LoggerFactory.getLogger(loggerRoot+LuanHandler.class.getName());
	}

	@Override public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) 
		throws IOException
	{
		if( target.endsWith("/") )
			target += welcomeFile;
		try {
			if( !HttpServicer.service(luan,request,response,"site:"+target+".luan") )
				return;
		} catch(LuanException e) {
			String err = e.getFullMessage();
			logger.error(err);
			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,err);
		}
		baseRequest.setHandled(true);
	}

	public void setWelcomeFile(String welcomeFile) {
		this.welcomeFile = welcomeFile;
	}

	@Override protected void doStop() throws Exception {
		synchronized(luan) {
			luan.close();
		}
//System.out.println("qqqqqqqqqqqqqqqqqqqq doStop "+this);
		super.doStop();
	}
/*
	@Override public void destroy() {
System.out.println("qqqqqqqqqqqqqqqqqqqq destroy "+this);
		super.destroy();
	}
*/

	public Object call_rpc(String fnName,Object... args) throws LuanException {
		return callRpc(luan,fnName,args);
	}

	public static Object callRpc(LuanState luan,String fnName,Object... args) throws LuanException {
		synchronized(luan) {
			DeepCloner cloner = new DeepCloner();
			luan = (LuanState)cloner.deepClone(luan);
		}
		LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
		LuanTable fns = (LuanTable)rpc.get(luan,"functions");
		LuanFunction fn = (LuanFunction)fns.get(luan,fnName);
		if( fn == null )
			throw new LuanException( "function not found: " + fnName );
		return fn.call(luan,args);
	}

}