javax.script support on Appengine

241 views
Skip to first unread message

Faisal Iqbal

unread,
Dec 1, 2013, 11:43:22 AM12/1/13
to google-a...@googlegroups.com

Dears,

I am having issue in running javax.script when deployed on Google Appengine. Please note local DEV environment is working just fine. I am pasting a hello world servlet below which has issue.

Thanks in advance.
Faisal Iqbal

********************************************************************************************************************************************************************************
import java.io.IOException;
import javax.servlet.http.*;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.ScriptEngine;

@SuppressWarnings("serial")
public class MyScriptServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/plain");
         // create a script engine manager
        ScriptEngineManager factory = new ScriptEngineManager();
        // create a JavaScript engine
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        // evaluate JavaScript code from String
        try {
            engine.put("rs", resp);
            engine.eval("rs.getWriter().println('This is from script')");
        } catch (ScriptException e) {
            resp.getWriter().println("Exception Catched");
            e.printStackTrace();
        }
        resp.getWriter().println("Hello, Faisal Iqbal");
    }
}
************************************************************************************************************************************************************

Vinny P

unread,
Dec 5, 2013, 10:05:02 PM12/5/13
to google-a...@googlegroups.com
On Sun, Dec 1, 2013 at 10:43 AM, Faisal Iqbal <faisal...@gmail.com> wrote:
I am having issue in running javax.script when deployed on Google Appengine. Please note local DEV environment is working just fine. I am pasting a hello world servlet below which has issue.



Can you post the contents of the exception message and the full stack trace of the exception? They'll be written into logging, which you can access by going to the Logs page in the admin console.


-----------------
-Vinny P
Technology & Media Advisor
Chicago, IL

App Engine Code Samples: http://www.learntogoogleit.com
Message has been deleted

Randy Balaban

unread,
Apr 20, 2014, 7:44:11 PM4/20/14
to google-a...@googlegroups.com

I am having a similar issue where I always get a 0 value returned when I try to use the ScriptEngine eval. By using Logger, I was able to determine that there are NullPointerExceptions being generated. After further inspection, it appears that GAE doesn't always return a valid script engine (if ever), because it throws an exception when you try to use it.

My code looks like:

public double myEval(String JsFormulaStr ) {
    double solutionValue = 0;
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine eng = mgr.getEngineByName("JavaScript");
    if(eng == null) {  // Added this block of code to prevent java.lang.NullPointerException...
        log.severe("Unable to get Script Engine." );
        return 0;
    }
    try {
        Object jsResults = eng.eval(JsFormulaStr);
        solutionValue = Double.parseDouble(jsResults.toString());
        return solutionValue;
    } catch(Exception e) {
        log.severe("[ERROR] in getCalculatedSolution_FromJS_ToDouble()::\n\t" +
                "Formula String is: " + JsFormulaStr + "\n\t" + e);
        return 0;
    }     
}

Everything works fine if I run it locally as a WebApp (Both in Eclipse & Netbeans. And within Tomcat & Glassfish 4.0).

Some of the strings which I tried to eval:

  • 62.0 / 100
  • 0.0 * 352.0
  • (0 - 428) * 1000
  • (0 - 597) * 1000
  • 73.0 / 100

NOTE: The 0's or 0.0's are from other evaluations which have failed in previous calls. Since this function returns 0 on error.

According to Google's JRE Class Whitelist the ScriptEngineManager and ScriptEngine classes are allowed. So I don't understand why it isn't working as expected.

Any suggestions?

Thanks in advance,

Randy

Randy Balaban

unread,
Apr 22, 2014, 4:39:00 PM4/22/14
to google-a...@googlegroups.com
I deployed the app to Amazon's Elastic Beanstalk server with no issues at all. :(

-Randy

Faisal Iqbal

unread,
Jun 14, 2014, 11:18:10 AM6/14/14
to google-a...@googlegroups.com
Thanks Vinny for your response. I moved to groovy after that. Can you please review stack trace below.

  1. java.lang.NullPointerException
    	at asbaat.MyScriptServlet.doGet(MyScriptServlet.java:18)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    	at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:254)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:326)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    	at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    	at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
    	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:188)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
    	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    	at java.lang.Thread.run(Thread.java:724)
    
  2. C 2014-06-14 08:04:24.114
    Uncaught exception from servlet
    java.lang.NullPointerException
    	at asbaat.MyScriptServlet.doGet(MyScriptServlet.java:18)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    	at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:254)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:326)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    	at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    	at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
    	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:188)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
    	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    	at java.lang.Thread.run(Thread.java:724)
    

Faisal Iqbal

unread,
Jun 14, 2014, 1:06:02 PM6/14/14
to google-a...@googlegroups.com

I believe google have not implemented any ScriptEngine. As ScriptEngine engine = factory.getEngineByName("
JavaScript") always return null...

poke

unread,
Jun 15, 2014, 9:33:56 PM6/15/14
to google-a...@googlegroups.com
Yes , sure it return null .
You need to using rhino to use javascript in appengine .

Vinny P

unread,
Jun 16, 2014, 3:51:13 AM6/16/14
to google-a...@googlegroups.com
On Sat, Jun 14, 2014 at 12:06 PM, Faisal Iqbal <faisal...@gmail.com> wrote:
I believe google have not implemented any ScriptEngine. As ScriptEngine engine = factory.getEngineByName("
JavaScript") always return null...


You have to package the Rhino JARs and use the APIs directly. See an example here:

Faisal Iqbal

unread,
Jun 19, 2014, 5:12:10 PM6/19/14
to google-a...@googlegroups.com
Hello Vinny, Thanks a lot for your response. I will check and will update
 the post

Randy Balaban

unread,
Apr 16, 2015, 8:49:14 PM4/16/15
to google-a...@googlegroups.com
This post has a deleted post.  I believe it was mine.  Does anyone have a copy of what I typed?
Reply all
Reply to author
Forward
0 new messages