comparison core/src/luan/modules/JavaLuan.java @ 300:9fb523472035

add java() to control java access git-svn-id: https://luan-java.googlecode.com/svn/trunk@301 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 16 Dec 2014 13:13:33 +0000
parents a74559240b4f
children a6bf8ff720f8
comparison
equal deleted inserted replaced
299:a74559240b4f 300:9fb523472035
25 import luan.LuanElement; 25 import luan.LuanElement;
26 26
27 27
28 public final class JavaLuan { 28 public final class JavaLuan {
29 29
30 public static void java(LuanState luan) {
31 luan.currentEnvironment().setJava();
32 }
33
34 public static final LuanFunction javaFn;
35 static {
36 try {
37 javaFn = new LuanJavaFunction(JavaLuan.class.getMethod("java",LuanState.class),null);
38 } catch(NoSuchMethodException e) {
39 throw new RuntimeException(e);
40 }
41 }
42
43 private static void checkJava(LuanState luan) throws LuanException {
44 if( !luan.currentEnvironment().hasJava() )
45 throw luan.exception("Java isn't allowed");
46 }
47
30 private static boolean isLoaded(LuanState luan) { 48 private static boolean isLoaded(LuanState luan) {
31 // return PackageLuan.loaded(luan).get("luan:Java") != null; 49 // return PackageLuan.loaded(luan).get("luan:Java") != null;
32 return true; 50 return true;
33 } 51 }
34 52
35 public static Object __index(LuanState luan,Object obj,Object key) throws LuanException { 53 public static Object __index(LuanState luan,Object obj,Object key) throws LuanException {
54 if( !luan.currentEnvironment().hasJava() )
55 return null;
36 if( obj instanceof Static ) { 56 if( obj instanceof Static ) {
37 if( key instanceof String ) { 57 if( key instanceof String ) {
38 String name = (String)key; 58 String name = (String)key;
39 Static st = (Static)obj; 59 Static st = (Static)obj;
40 Class cls = st.cls; 60 Class cls = st.cls;
80 if( "instanceof".equals(name) ) { 100 if( "instanceof".equals(name) ) {
81 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); 101 return new LuanJavaFunction(instanceOf,new InstanceOf(obj));
82 } else { 102 } else {
83 List<Member> members = getMembers(cls,name); 103 List<Member> members = getMembers(cls,name);
84 if( !members.isEmpty() ) { 104 if( !members.isEmpty() ) {
85 if( name.equals("getClass") && !isLoaded(luan) )
86 return null; // security
87 return member(obj,members); 105 return member(obj,members);
88 } 106 }
89 } 107 }
90 } 108 }
91 // throw luan.exception("invalid member '"+key+"' for java object: "+obj); 109 // throw luan.exception("invalid member '"+key+"' for java object: "+obj);
119 throw new RuntimeException(e); 137 throw new RuntimeException(e);
120 } 138 }
121 } 139 }
122 140
123 public static void __newindex(LuanState luan,Object obj,Object key,Object value) throws LuanException { 141 public static void __newindex(LuanState luan,Object obj,Object key,Object value) throws LuanException {
142 checkJava(luan);
124 if( obj instanceof Static ) { 143 if( obj instanceof Static ) {
125 if( key instanceof String ) { 144 if( key instanceof String ) {
126 String name = (String)key; 145 String name = (String)key;
127 Static st = (Static)obj; 146 Static st = (Static)obj;
128 Class cls = st.cls; 147 Class cls = st.cls;
289 return cls.isSynthetic(); 308 return cls.isSynthetic();
290 } 309 }
291 } 310 }
292 311
293 public static Static load(LuanState luan,String name) throws LuanException { 312 public static Static load(LuanState luan,String name) throws LuanException {
313 checkJava(luan);
294 @SuppressWarnings("unchecked") 314 @SuppressWarnings("unchecked")
295 Map<String,Static> loaded = (Map<String,Static>)luan.registry().get("Java.loaded"); 315 Map<String,Static> loaded = (Map<String,Static>)luan.registry().get("Java.loaded");
296 if( loaded == null ) { 316 if( loaded == null ) {
297 loaded = new HashMap<String,Static>(); 317 loaded = new HashMap<String,Static>();
298 luan.registry().put("Java.loaded",loaded); 318 luan.registry().put("Java.loaded",loaded);
316 return null; 336 return null;
317 } 337 }
318 } 338 }
319 return new Static(cls); 339 return new Static(cls);
320 } 340 }
321 /* 341
322 public static void importClass(LuanState luan,String name) throws LuanException { 342 private static class AmbiguousJavaFunction extends LuanFunction {
323 luan.currentEnvironment().put( name.substring(name.lastIndexOf('.')+1), getClass(luan,name) );
324 }
325 */
326 static class AmbiguousJavaFunction extends LuanFunction {
327 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); 343 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>();
328 344
329 AmbiguousJavaFunction(List<LuanJavaFunction> fns) { 345 AmbiguousJavaFunction(List<LuanJavaFunction> fns) {
330 for( LuanJavaFunction fn : fns ) { 346 for( LuanJavaFunction fn : fns ) {
331 Integer n = fn.getParameterTypes().length; 347 Integer n = fn.getParameterTypes().length;