<%@page import="javax.script.*" %>
<%@page import="php.java.script.servlet.PhpServletScriptContext" %>

<%!
    //use one engine per thread
  private ThreadLocal<CompiledScript> scriptCached = new ThreadLocal<CompiledScript>();
  private CompiledScript getScript(Servlet servlet, ServletContext application, HttpServletRequest request, HttpServletResponse response) throws ScriptException {

  // create or re-use a php script engine
  ScriptEngine engine = (scriptCached.get()!=null) ? scriptCached.get().getEngine() : new ScriptEngineManager().getEngineByName("php");

  // attach the current servlet context to it
  engine.setContext(new PhpServletScriptContext(engine.getContext(),servlet,application,request,response));

  // create a script file, if necessary.
  if (scriptCached.get()==null) {
    scriptCached.set(((Compilable)engine).compile("<?php echo 'Hello '.java_context()->get('hello').'!<br>\n'; function f($v){return (string)$v+1;};?>"));
  }

  return scriptCached.get();
}
%>

<%
CompiledScript script = null;
try {
  // create a custom ScriptContext to connect the engine to the ContextLoaderListener's FastCGI runner
  script = getScript(this, application, request, response);

  // display hello world
  script.getEngine().put("hello", "eval1: " + Thread.currentThread());
  script.eval();
  out.println(((Invocable)script.getEngine()).invokeFunction("f", new Object[]{1})+"<br>\n");
  script.getEngine().put("hello", "eval2: " + Thread.currentThread());
  script.eval();
  out.println(((Invocable)script.getEngine()).invokeFunction("f", new Object[]{2})+"<br>\n");
  script.getEngine().put("hello", "eval3: " + Thread.currentThread());
  script.eval();
  out.println(((Invocable)script.getEngine()).invokeFunction("f", new Object[]{3})+"<br>\n");
  script.getEngine().put("hello", "eval4: " + Thread.currentThread());
  script.eval();
  out.println(((Invocable)script.getEngine()).invokeFunction("f", new Object[]{4})+"<br>\n");
  out.println("thread ended: " + Thread.currentThread());
} catch (Exception ex) {
  out.println("Could not evaluate script: "+ex);
} finally {
    if (script!=null) ((java.io.Closeable)script.getEngine()).close();
}
%>