Hey Albert, That code should actually work ok, but you've managed to tickle a bug in our runtime. I've filed an issue<http://code.google.com/p/googleappengine/issues/detail?id=2028>for you here. The fix for this probably won't make the next release, but it should come shortly thereafter.
On Tue, Aug 25, 2009 at 6:33 AM, Albert Attard <albertatt...@gmail.com>wrote: > Hi Toby: > Thanks for you feedback. > > I've did a small prototype: http://ask-me.appspot.com/ . It's working fine > locally, but it's throwing the following exception when executed on the > app-engine: > > javax.servlet.ServletContext log: Exception while dispatching incoming RPC > call > com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public > abstract com.albertattard.askme.client.utils.AssessmentTO > com.albertattard.askme.client.AssessorService.assessCode(java.lang.String)' > threw an unexpected exception: java.lang.VerifyError: (class: > org/codehaus/janino/ByteArrayClassLoader, method: findClass signature: > (Ljava/lang/String;)Ljava/lang/Class;) Illegal type in constant pool > at > com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:360) > at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:546) > at > com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166) > at > com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) > at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) > at > com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) > at > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) > at > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) > at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) > at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) > at > com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:237) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) > at org.mortbay.jetty.Server.handle(Server.java:313) > at > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) > at > org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830) > at > com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) > at > com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:139) > at > com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235) > at > com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4823) > at > com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4821) > at > com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24) > at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:359) > at com.google.net.rpc.impl.Server$2.run(Server.java:820) > at > com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) > at > com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:516) > at com.google.net.rpc.impl.Server.startRpc(Server.java:775) > at com.google.net.rpc.impl.Server.processRequest(Server.java:348) > at > com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:436) > at > com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319) > at > com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290) > at com.google.net.async.Connection.handleReadEvent(Connection.java:428) > at > com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:762) > at > com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207) > at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101) > at > com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251) > at > com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:374) > at java.lang.Thread.run(Unknown Source) > Caused by: java.lang.VerifyError: (class: > org/codehaus/janino/ByteArrayClassLoader, method: findClass signature: > (Ljava/lang/String;)Ljava/lang/Class;) Illegal type in constant pool > at > org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java) > at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java) > at org.codehaus.janino.Cookable.cook(Cookable.java) > at org.codehaus.janino.Cookable.cook(Cookable.java) > at org.codehaus.janino.Cookable.cook(Cookable.java) > at > com.albertattard.askme.server.DemoSwapAssessor.assess(DemoSwapAssessor.java:21) > at > com.albertattard.askme.server.AssessorServiceImpl.assessCode(AssessorServiceImpl.java:15) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > at java.lang.reflect.Method.invoke(Unknown Source) > at > com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$3.run(Method_.java:149) > at java.security.AccessController.doPrivileged(Native Method) > at > com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.privilegedInvoke(Method_.java:147) > at > com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke(Method_.java:120) > at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527) > ... 43 more > > > The janino ByteArrayClassLoader is not working well (not accepted) on the > app-engine :( > > Any other options? > > Cheers, > Albert Attard > > Marie von > Ebner-Eschenbach<http://www.brainyquote.com/quotes/authors/m/marie_von_ebnereschenbac.html> > - "Even a stopped clock is right twice a day." > > 2009/8/14 Toby Reyelts <to...@google.com> > > >> We don't have any near term plans to whitelist javax.tools. Do you think >> something like janino <http://www.janino.net/> might work for you? >> >> >> On Fri, Aug 14, 2009 at 2:50 AM, Albert Attard <albertatt...@gmail.com>wrote: >> >>> Hi everyone: >>> >>> Background about the problem: >>> I'm a Java lecturer and would like to create an automated question >>> web application similar to a multiple choice questions and answers but where >>> the students can practice coding instead of simply selecting an answer. >>> >>> Multiple choice questions are very popular in web exams as these >>> are fully automated. You do the test and the system corrects it for you and >>> gives you the results there and then. I would like to go one step further >>> and have the student to supply a code fragment or even a class(es) and have >>> the system automatically correcting it in a similar fashion to the multiple >>> choice questions. >>> >>> Example (in a nutshell): >>> The student is asked to write a method: that given an array of int >>> and two indices of type int (between 0 and the size of the array - 1), this >>> method will swap the elements at the given indices. The student >>> will write the method in the provided text area and submit it. Then the >>> system will include this method into a class, compile it and by >>> using reflection executes it with an array of values (similar to JUnit) to >>> ensure that it is working as expected. During this process the system will >>> be awarding the student marks and will display the final result together >>> with comments as required. >>> >>> Google Appengine >>> I have a prototype and it works great on Tomcat. Yes I know that it >>> is subject to Java code injection but that's not an issue at this >>> stage. This issue can be fixed at a later stage. Unfortunately I cannot >>> implement it on the Google Appengine as most of the >>> required functionality, such as writing to a file or JavaCompiler is >>> disabled . I've managed to compile the classes to database (without writing >>> to the file system) and load classes from database (without reading from the >>> file system), which can integrate well with the provided datastore. >>> Is there a way (or a procedure) of implementing such a system on >>> the Google Appengine? This application will be a free education tool >>> for everyone who would like to use it. >>> >>> Thanks in advance, >>> Albert Attard >>> >>> Ted Turner <http://www.brainyquote.com/quotes/authors/t/ted_turner.html> - >>> "Sports is like a war without the killing." >>> >>> >>> >> >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---