Mercurial Hosting > luan
comparison src/luan/lib/JavaLib.java @ 49:8ede219cd111
add WebShell
git-svn-id: https://luan-java.googlecode.com/svn/trunk@50 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 28 Dec 2012 19:35:04 +0000 |
parents | 64ecb7a3aad7 |
children | 272b6f1d7dac |
comparison
equal
deleted
inserted
replaced
48:64ecb7a3aad7 | 49:8ede219cd111 |
---|---|
21 import luan.LuanElement; | 21 import luan.LuanElement; |
22 | 22 |
23 | 23 |
24 public final class JavaLib { | 24 public final class JavaLib { |
25 | 25 |
26 public static void register(LuanState lua) { | 26 public static void register(LuanState luan) { |
27 lua.addMetatableGetter(mg); | 27 luan.addMetatableGetter(mg); |
28 LuanTable module = new LuanTable(); | 28 LuanTable module = new LuanTable(); |
29 LuanTable global = lua.global(); | 29 LuanTable global = luan.global(); |
30 global.put("java",module); | 30 global.put("java",module); |
31 try { | 31 try { |
32 global.put( "import", new LuanJavaFunction(JavaLib.class.getMethod("importClass",LuanState.class,String.class),null) ); | 32 global.put( "import", new LuanJavaFunction(JavaLib.class.getMethod("importClass",LuanState.class,String.class),null) ); |
33 module.put( "class", new LuanJavaFunction(JavaLib.class.getMethod("getClass",LuanState.class,String.class),null) ); | 33 module.put( "class", new LuanJavaFunction(JavaLib.class.getMethod("getClass",LuanState.class,String.class),null) ); |
34 } catch(NoSuchMethodException e) { | 34 } catch(NoSuchMethodException e) { |
55 return null; | 55 return null; |
56 return mt; | 56 return mt; |
57 } | 57 } |
58 }; | 58 }; |
59 | 59 |
60 public static Object __index(LuanState lua,Object obj,Object key) throws LuanException { | 60 public static Object __index(LuanState luan,Object obj,Object key) throws LuanException { |
61 if( obj instanceof Static ) { | 61 if( obj instanceof Static ) { |
62 if( key instanceof String ) { | 62 if( key instanceof String ) { |
63 String name = (String)key; | 63 String name = (String)key; |
64 Static st = (Static)obj; | 64 Static st = (Static)obj; |
65 Class cls = st.cls; | 65 Class cls = st.cls; |
83 if( !members.isEmpty() ) { | 83 if( !members.isEmpty() ) { |
84 return member(null,members); | 84 return member(null,members); |
85 } | 85 } |
86 } | 86 } |
87 } | 87 } |
88 throw new LuanException(lua,LuanElement.JAVA,"invalid index for java class: "+key); | 88 throw new LuanException(luan,LuanElement.JAVA,"invalid index for java class: "+key); |
89 } | 89 } |
90 Class cls = obj.getClass(); | 90 Class cls = obj.getClass(); |
91 if( cls.isArray() ) { | 91 if( cls.isArray() ) { |
92 if( "length".equals(key) ) { | 92 if( "length".equals(key) ) { |
93 return Array.getLength(obj); | 93 return Array.getLength(obj); |
94 } | 94 } |
95 Integer i = Luan.asInteger(key); | 95 Integer i = Luan.asInteger(key); |
96 if( i != null ) { | 96 if( i != null ) { |
97 return Array.get(obj,i); | 97 return Array.get(obj,i); |
98 } | 98 } |
99 throw new LuanException(lua,LuanElement.JAVA,"invalid index for java array: "+key); | 99 throw new LuanException(luan,LuanElement.JAVA,"invalid index for java array: "+key); |
100 } | 100 } |
101 if( key instanceof String ) { | 101 if( key instanceof String ) { |
102 String name = (String)key; | 102 String name = (String)key; |
103 if( "instanceof".equals(name) ) { | 103 if( "instanceof".equals(name) ) { |
104 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); | 104 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); |
107 if( !members.isEmpty() ) { | 107 if( !members.isEmpty() ) { |
108 return member(obj,members); | 108 return member(obj,members); |
109 } | 109 } |
110 } | 110 } |
111 } | 111 } |
112 throw new LuanException(lua,LuanElement.JAVA,"invalid index for java object: "+key); | 112 throw new LuanException(luan,LuanElement.JAVA,"invalid index for java object: "+key); |
113 } | 113 } |
114 | 114 |
115 private static Object member(Object obj,List<Member> members) throws LuanException { | 115 private static Object member(Object obj,List<Member> members) throws LuanException { |
116 try { | 116 try { |
117 if( members.size()==1 ) { | 117 if( members.size()==1 ) { |
180 Static(Class cls) { | 180 Static(Class cls) { |
181 this.cls = cls; | 181 this.cls = cls; |
182 } | 182 } |
183 } | 183 } |
184 | 184 |
185 public static Static getClass(LuanState lua,String name) throws LuanException { | 185 public static Static getClass(LuanState luan,String name) throws LuanException { |
186 try { | 186 try { |
187 return new Static( Class.forName(name) ); | 187 return new Static( Class.forName(name) ); |
188 } catch(ClassNotFoundException e) { | 188 } catch(ClassNotFoundException e) { |
189 throw new LuanException(lua,LuanElement.JAVA,e); | 189 throw new LuanException(luan,LuanElement.JAVA,e); |
190 } | 190 } |
191 } | 191 } |
192 | 192 |
193 public static void importClass(LuanState lua,String name) throws LuanException { | 193 public static void importClass(LuanState luan,String name) throws LuanException { |
194 lua.global().put( name.substring(name.lastIndexOf('.')+1), getClass(lua,name) ); | 194 luan.global().put( name.substring(name.lastIndexOf('.')+1), getClass(luan,name) ); |
195 } | 195 } |
196 | 196 |
197 static class AmbiguousJavaFunction extends LuanFunction { | 197 static class AmbiguousJavaFunction extends LuanFunction { |
198 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); | 198 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); |
199 | 199 |
207 } | 207 } |
208 list.add(fn); | 208 list.add(fn); |
209 } | 209 } |
210 } | 210 } |
211 | 211 |
212 @Override public Object[] call(LuanState lua,Object[] args) throws LuanException { | 212 @Override public Object[] call(LuanState luan,Object[] args) throws LuanException { |
213 for( LuanJavaFunction fn : fnMap.get(args.length) ) { | 213 for( LuanJavaFunction fn : fnMap.get(args.length) ) { |
214 try { | 214 try { |
215 return fn.call(lua,args); | 215 return fn.call(luan,args); |
216 } catch(IllegalArgumentException e) {} | 216 } catch(IllegalArgumentException e) {} |
217 } | 217 } |
218 throw new LuanException(lua,LuanElement.JAVA,"no method matched args"); | 218 throw new LuanException(luan,LuanElement.JAVA,"no method matched args"); |
219 } | 219 } |
220 } | 220 } |
221 | 221 |
222 private static class InstanceOf { | 222 private static class InstanceOf { |
223 private final Object obj; | 223 private final Object obj; |