Just to clarify, the dynamic code (the code compiled by Janino) have an intentional error. Locally I get the line number etc., which is great for the user. I cannot get this information on the app-engine. Sorry for the confusion.
Albert Attard Charles de Gaulle<http://www.brainyquote.com/quotes/authors/c/charles_de_gaulle.html> - "The better I get to know men, the more I find myself loving dogs." 2009/8/28 Albert Attard <[email protected]> > Hey Toby: > Thanks for your input. > > Following is the stack trace for the other problem I was talking about. > Locally Janino compiles this without any issues, but it's throwing the > following exception when executed on the app-engine. > > JaninoJavaAssessorHelper compile: THROW > java.security.AccessControlException: access denied > (java.lang.RuntimePermission accessDeclaredMembers) > at java.security.AccessControlContext.checkPermission(Unknown Source) > at java.security.AccessController.checkPermission(Unknown Source) > at java.lang.SecurityManager.checkPermission(Unknown Source) > at java.lang.SecurityManager.checkMemberAccess(Unknown Source) > at java.lang.Class.checkMemberAccess(Unknown Source) > at java.lang.Class.getDeclaredClasses(Unknown Source) > at > org.codehaus.janino.ReflectionIClass.getDeclaredIClasses2(ReflectionIClass.java:101) > at org.codehaus.janino.IClass.getDeclaredIClasses(IClass.java:252) > at org.codehaus.janino.IClass.findMemberType(IClass.java:617) > at org.codehaus.janino.IClass.findMemberType(IClass.java:634) > at org.codehaus.janino.IClass.findMemberType(IClass.java:604) > at > org.codehaus.janino.UnitCompiler.findMemberType(UnitCompiler.java:8011) > at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:4022) > at org.codehaus.janino.UnitCompiler.access$102(UnitCompiler.java:3990) > at > org.codehaus.janino.UnitCompiler$16.visitReferenceType(UnitCompiler.java:3936) > at org.codehaus.janino.Java$ReferenceType.accept(Java.java:1868) > at org.codehaus.janino.UnitCompiler.getType(UnitCompiler.java:3969) > at org.codehaus.janino.UnitCompiler.access$136(UnitCompiler.java:3927) > at > org.codehaus.janino.UnitCompiler$31.getParameterTypes(UnitCompiler.java:6674) > at org.codehaus.janino.IClass$IMethod.getDescriptor(IClass.java:762) > at org.codehaus.janino.IClass.getIMethods(IClass.java:180) > at org.codehaus.janino.IClass.getIMethods(IClass.java:169) > at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:328) > at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:313) > at > org.codehaus.janino.UnitCompiler$3.visitPackageMemberClassDeclaration(UnitCompiler.java:286) > at > org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:701) > at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:292) > at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:270) > at > org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:423) > at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:231) > at org.codehaus.janino.Cookable.cook(Cookable.java:72) > at org.codehaus.janino.Cookable.cook(Cookable.java:64) > at org.codehaus.janino.Cookable.cook(Cookable.java:114) > at > com.albertattard.askme.server.utils.JaninoJavaAssessorHelper.compile(JaninoJavaAssessorHelper.java:30) > at > com.albertattard.askme.server.BuilderServiceImpl.validateAssessor(BuilderServiceImpl.java:40) > 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) > 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) > > > Cheers, > Albert Attard > > Ogden Nash <http://www.brainyquote.com/quotes/authors/o/ogden_nash.html> - > "The trouble with a kitten is that when it grows up, it's always a cat." > > 2009/8/27 Toby Reyelts <[email protected]> > > Logger.throwing logs at Level.FINER. Do you have your logging configured to >> log at that level (or more fine)? >> >> >> On Thu, Aug 27, 2009 at 2:20 PM, Albert Attard <[email protected]>wrote: >> >>> Hey Toby: >>> I'm having some trouble with the logging functionality. I'm logging my >>> exceptions but nothing is showing on the logs. Following a simple class >>> which uses logging. >>> >>> private static final Logger log = >>> Logger.getLogger(MyClass.class.getName()); >>> >>> ... >>> }catch(Exception e) >>> log.throwing("MyClass", "MyMethod", e); >>> } >>> >>> Am I missing something? >>> >>> Regards, >>> Albert Attard >>> >>> Pablo >>> Picasso<http://www.brainyquote.com/quotes/authors/p/pablo_picasso.html> - >>> "Computers are useless. They can only give you answers." >>> >>> 2009/8/26 Toby Reyelts <[email protected]> >>> >>>> Can you provide the full stacktrace for the exception? >>>> >>>> >>>> On Wed, Aug 26, 2009 at 2:58 PM, Albert Attard >>>> <[email protected]>wrote: >>>> >>>>> Hey Toby: >>>>> Did as you instructed and worked. Thanks a lot Toby. Let me know should >>>>> you need anything. I'm glad to help. >>>>> >>>>> >>>>> Another question about Janino: I'm getting the following exception on >>>>> the live app-engine when the dynamic code (the code that is compiled by >>>>> janino) has a compilation error: >>>>> >>>>> An error occurred: java.security.AccessControlException: access denied >>>>> (java.lang.RuntimePermissions accessDeclaredMembers) >>>>> >>>>> >>>>> On the local environment, janino returns the line number where the >>>>> error occurred, which is very helpful for the students. >>>>> >>>>> Cheers, >>>>> Albert Attard >>>>> >>>>> Samuel >>>>> Goldwyn<http://www.brainyquote.com/quotes/authors/s/samuel_goldwyn.html> >>>>> - "I'm willing to admit that I may not always be right, but I am never >>>>> wrong." >>>>> >>>>> 2009/8/26 Toby Reyelts <[email protected]> >>>>> >>>>> >>>>>> Hey Albert, >>>>>> >>>>>> Even though I haven't actually seen the changes that you made, I >>>>>> believe they were unnecessary. (Go out on a limb with me here). I tracked >>>>>> the fault down to an error in our runtime that can be worked around by >>>>>> just >>>>>> recompiling the code. You should be able to confirm this on your end by >>>>>> recompiling Janino from source *without* any of the changes you made. >>>>>> Please make sure you've set the target version to 1.5 or 1.6. >>>>>> >>>>>> On Wed, Aug 26, 2009 at 4:51 AM, Albert Attard < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Hey Toby: >>>>>>> Janino api include classes that are not supported by the app-engine. >>>>>>> All I did is commented out the code that the app-engine didn't like in >>>>>>> janino and repackaged it. >>>>>>> >>>>>>> I did the following: >>>>>>> >>>>>>> - Downloaded the source for janino: >>>>>>> http://www.janino.net/download/janino-2.5.15.zip >>>>>>> - I've created a new Google Web Project in Eclipse >>>>>>> - I've copied the source into the Google Web Project >>>>>>> - Than I've *unsafely* commented out code that was not supported >>>>>>> by the Google app-engine >>>>>>> - Repackaged the edited code into a new jar and deployed it with >>>>>>> my project instead of the original one >>>>>>> - The simple proof of concept seams to work >>>>>>> >>>>>>> As you can see at the simple demo: http://ask-me.appspot.com/ the >>>>>>> code seams to work. Hope you manage to complete this question :) >>>>>>> >>>>>>> Cheers, >>>>>>> Albert Attard >>>>>>> >>>>>>> Stephen >>>>>>> Leacock<http://www.brainyquote.com/quotes/authors/s/stephen_leacock.html> >>>>>>> - "I detest life-insurance agents: they always argue that I shall some >>>>>>> day >>>>>>> die, which is not so." >>>>>>> >>>>>>> 2009/8/25 Toby Reyelts <[email protected]> >>>>>>> >>>>>>> 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 < >>>>>>>> [email protected]> 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 <[email protected]> >>>>>>>>> >>>>>>>>> >>>>>>>>>> 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 < >>>>>>>>>> [email protected]> 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 [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---
