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;