From dd892ee7ff0f2c9a4c35d120abc215bc221740d6 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Tue, 6 Jan 2009 23:36:56 +0000 Subject: [PATCH] Add sample applet that runs scripts colocated with the document root. --- src/sample/org/luaj/sample/SampleApplet.java | 152 +++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/sample/org/luaj/sample/SampleApplet.java diff --git a/src/sample/org/luaj/sample/SampleApplet.java b/src/sample/org/luaj/sample/SampleApplet.java new file mode 100644 index 00000000..09e5bc74 --- /dev/null +++ b/src/sample/org/luaj/sample/SampleApplet.java @@ -0,0 +1,152 @@ +/******************************************************************************* +* Copyright (c) 2009 LuaJ. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +******************************************************************************/ +package org.luaj.sample; + +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; + +import javax.swing.JApplet; + +import org.luaj.lib.j2se.CoerceJavaToLua; +import org.luaj.lib.j2se.J2seIoLib; +import org.luaj.platform.J2sePlatform; +import org.luaj.vm.LValue; +import org.luaj.vm.LuaState; +import org.luaj.vm.Platform; + +/** + * Sample JApplet that runs a lua script in the init phase, and calls + * global functions for applet lifecycle events. + * + * The script(s) should be located relative to the document root in order + * for the lua scripts to be loaded. + * + * The functions init(), start(), stop() and destroy() and the script itself + * are called with the applet as the first argument, so that the + * lua script can perform whatever operations it needs to using the applet + * as the main context. + * + * The applet looks runs the script identified by the applet parameter 'script' + * or 'main.lua' if there is no value for 'script' provided. + */ +public class SampleApplet extends JApplet { + private static final long serialVersionUID = 1L; + + // the script will be loaded as a resource + private static final String DEFAULT_SCRIPT = "main.lua"; + + private LuaState vm; + private String base; + + private final LValue lthis = CoerceJavaToLua.coerce(this); + + public synchronized void init() { + System.out.println("init() called"); + super.init(); + if ( vm == null ) { + + // get the script as an app property + String script = this.getParameter("script"); + if ( script == null ) + script = DEFAULT_SCRIPT; + base = tobase( getDocumentBase().toExternalForm() ); + System.out.println("script: "+script); + System.out.println("base: "+base); + + // set up the j2me platform. files will be loaded as resources + Platform.setInstance( new J2sePlatform() { + public InputStream openFile(String fileName) { + // System.out.println("openFile('"+fileName+"')"); + URLConnection c = null; + try { + URL u = new URL(base + fileName); + c = u.openConnection(); + return c.getInputStream(); + } catch ( Exception e ) { + e.printStackTrace( System.out ); + if ( c instanceof HttpURLConnection ) + ((HttpURLConnection)c).disconnect(); + return null; + } + } + }); + vm = Platform.newLuaState(); + + // extend the basic vm to include the compiler and io packages + org.luaj.compiler.LuaC.install(); + J2seIoLib.install(vm._G); + + // run the script + try { + vm.getglobal( "loadfile" ); + vm.pushstring( script ); + vm.call( 1, 1 ); + vm.pushlvalue( lthis ); + vm.call( 1, 0 ); + } catch ( Throwable t ) { + t.printStackTrace( System.err ); + } + } + callFunction( "init" ); + } + + private String tobase(String path) { + int i = path.lastIndexOf('/'); + return i>=0? path.substring(0,i+1): path; + } + + private boolean callFunction( String name ) { + try { + vm.getglobal( name ); + if ( ! vm.isfunction(-1) ) { + vm.pop(1); + return false; + } + else { + vm.pushlvalue( lthis ); + vm.call( 1, 0 ); + return true; + } + } catch ( Throwable t ) { + System.out.println(name+"():"); + t.printStackTrace( System.err ); + return true; + } + } + + public synchronized void start() { + super.start(); + callFunction( "start" ); + } + + public synchronized void stop() { + callFunction( "stop" ); + super.stop(); + } + + public synchronized void destroy() { + callFunction( "destroy" ); + super.destroy(); + } +}