view src/luan/tools/WebServlet.java @ 81:9df729fa4419

minor git-svn-id: https://luan-java.googlecode.com/svn/trunk@82 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Sat, 16 Feb 2013 06:58:00 +0000
parents 4bf3d0c0b6b9
children cca4f8522893
line wrap: on
line source

package luan.tools;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import luan.LuanState;
import luan.LuanException;
import luan.LuanRuntimeException;
import luan.LuanFunction;
import luan.LuanElement;
import luan.interp.LuanCompiler;
import luan.lib.HttpLib;
import luan.lib.BasicLib;
import luan.lib.PackageLib;
import luan.lib.MathLib;
import luan.lib.StringLib;
import luan.lib.TableLib;
import luan.lib.HtmlLib;


public class WebServlet extends HttpServlet {

	public static final String HTTP_SERVER = "http_server";

	protected LuanState luanState = null;

	protected void loadLibs(LuanState luan) throws LuanException {
		luan.load(BasicLib.LOADER,BasicLib.NAME);
		luan.load(PackageLib.LOADER,PackageLib.NAME);
		luan.load(MathLib.LOADER,MathLib.NAME);
		luan.load(StringLib.LOADER,StringLib.NAME);
		luan.load(TableLib.LOADER,TableLib.NAME);
		luan.load(HtmlLib.LOADER,HtmlLib.NAME);
	}

	protected void loadLuan(LuanState luan) throws LuanException {
		PackageLib.require(luan,HTTP_SERVER);
		Object fn = luan.global().get(HttpLib.FN_NAME);
		if( !(fn instanceof LuanFunction) )
			throw new LuanException( luan, LuanElement.JAVA, "function '"+HttpLib.FN_NAME+"' not defined" );
	}

	protected LuanState newLuanState() throws LuanException {
		LuanState luan = LuanCompiler.newLuanState();
		loadLibs(luan);
		loadLuan(luan);
		return luan;
	}

	protected  LuanState getLuanState(HttpServletRequest request) throws LuanException {
		synchronized(this) {
			if( luanState == null )
				luanState = newLuanState();
		}
		return luanState.deepClone();
	}

	protected void service(HttpServletRequest request,HttpServletResponse response)
		throws ServletException, IOException
	{
		try {
			LuanState luan = getLuanState(request);
			HttpLib.service(luan,request,response);
		} catch(LuanException e) {
			throw new LuanRuntimeException(e);
		}
	}

}