/**
* Berlin Brown
*/
import java.io.*;
import java.text.*;
import java.util.List;
import java.util.ArrayList;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.armedbear.lisp.Interpreter;
import org.armedbear.lisp.LispThread;
import org.armedbear.lisp.Lisp;
import org.armedbear.lisp.ConditionThrowable;
import org.armedbear.lisp.JavaObject;
import org.armedbear.lisp.Symbol;
import org.armedbear.lisp.LispObject;
import org.armedbear.lisp.Load;
import org.armedbear.lisp.Packages;
/**
* Lisp Execute
* @author Berlin Brown
*/
public class LispExecute extends HttpServlet {
Interpreter interpreter;
Servlet lispServlet = null;
LispObject debuggerHook = null;
/**
* Init.
*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
interpreter = Interpreter.getInstance();
if (interpreter == null) {
log("making new interpreter");
interpreter = Interpreter.createInstance();
Interpreter.initializeLisp(false);
}
try {
LispThread thread = LispThread.currentThread();
org.armedbear.lisp.Package swank = Packages.findPackage("SWANK");
if (swank != null) {
debuggerHook = swank.findAccessibleSymbol("SWANK-DEBUGGER-HOOK").getSymbolFunction();
log("using swank debugger hook");
} else {
Symbol dbgrhkfunSym = Lisp.PACKAGE_SYS.findAccessibleSymbol("%DEBUGGER-HOOK-FUNCTION");
debuggerHook = dbgrhkfunSym.getSymbolFunction();
log("using throwing debugger hook");
}
thread.bindSpecial(Lisp._DEBUGGER_HOOK_, debuggerHook);
Load.load(config.getServletContext().getRealPath("WEB-INF/lisp/servlet-loader.lisp"));
JavaObject svletJO = (JavaObject)Lisp.PACKAGE_CL_USER.findAccessibleSymbol("*SERVLET*").getSymbolValue();
if (svletJO != null)
lispServlet = (Servlet)svletJO.getObject();
} catch(ConditionThrowable e) {
try {
System.out.print(e.getCondition().writeToString());
} catch (ConditionThrowable e2)
{}
}
}
/**
* Do Get
*/
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
if (interpreter == null || lispServlet == null) {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body><h1>error:");
if (interpreter == null)
out.println("no interpreter");
else out.println("no servlet");
out.println("</h1></body></html>");
} else {
LispThread thread = LispThread.currentThread();
thread.bindSpecial(Lisp._DEBUGGER_HOOK_, debuggerHook);
lispServlet.service(request, response);
}
}
/**
* Do Post
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
if (interpreter == null || lispServlet == null) {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body><h1>error:");
if (interpreter == null)
out.println("no interpreter");
else out.println("no servlet");
out.println("</h1></body></html>");
} else {
LispThread thread = LispThread.currentThread();
thread.bindSpecial(Lisp._DEBUGGER_HOOK_, debuggerHook);
lispServlet.service(request, response);
}
}
}