Mercurial Hosting > luan
view core/src/luan/modules/PackageLuan.java @ 301:a6bf8ff720f8
add java security
git-svn-id: https://luan-java.googlecode.com/svn/trunk@302 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Wed, 17 Dec 2014 12:35:57 +0000 |
parents | a74559240b4f |
children | d34be4588556 |
line wrap: on
line source
package luan.modules; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; import luan.Luan; import luan.LuanState; import luan.LuanTable; import luan.LuanFunction; import luan.LuanJavaFunction; import luan.LuanElement; import luan.LuanException; public final class PackageLuan { public static final LuanFunction requireFn; static { try { requireFn = new LuanJavaFunction(PackageLuan.class.getMethod("require",LuanState.class,String.class),null); } catch(NoSuchMethodException e) { throw new RuntimeException(e); } } public static LuanTable loaded(LuanState luan) { LuanTable tbl = (LuanTable)luan.registry().get("Package.loaded"); if( tbl == null ) { tbl = Luan.newTable(); luan.registry().put("Package.loaded",tbl); } return tbl; } public static Object require(LuanState luan,String modName) throws LuanException { Object mod = load(luan,modName); if( mod==null ) throw luan.exception( "module '"+modName+"' not found" ); return mod; } public static Object load(LuanState luan,String modName) throws LuanException { LuanTable loaded = loaded(luan); Object mod = loaded.get(modName); if( mod == null ) { if( modName.startsWith("java:") ) { mod = JavaLuan.load(luan,modName.substring(5)); } else { String src = read(luan,modName+".luan"); if( src == null ) return null; LuanFunction loader = BasicLuan.load(luan,src,modName,null,false); mod = Luan.first( luan.call(loader,"<require \""+modName+"\">",new Object[]{modName}) ); } if( mod != null ) { loaded.put(modName,mod); } else { mod = loaded.get(modName); if( mod==null ) { mod = true; loaded.put(modName,mod); } } } return mod; } static String read(LuanState luan,String uri) throws LuanException { LuanTable t = IoLuan.Uri(luan,uri); if( t == null ) return null; LuanFunction existsFn = (LuanFunction)t.get("exists"); boolean exists = (Boolean)Luan.first(luan.call(existsFn)); if( !exists ) return null; LuanFunction reader = (LuanFunction)t.get("read_text"); return (String)Luan.first(luan.call(reader)); } }