annotate core/src/luan/modules/PackageLuan.java @ 200:9fb218211763

add Package.block(); add LuanException.getFullMessage(); git-svn-id: https://luan-java.googlecode.com/svn/trunk@201 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 03 Jul 2014 22:22:16 +0000
parents be0275bda373
children 75750ceb45ee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
167
4c0131c2b650 merge luan/lib into modules
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 163
diff changeset
1 package luan.modules;
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
2
75
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
3 import java.io.IOException;
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
4 import java.util.Arrays;
86
6db8f286fa6c _ENV is per module, not global
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 84
diff changeset
5 import java.util.Collections;
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
6 import java.util.List;
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
7 import luan.Luan;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
8 import luan.LuanState;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
9 import luan.LuanTable;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
10 import luan.LuanFunction;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
11 import luan.LuanJavaFunction;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
12 import luan.LuanElement;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
13 import luan.LuanException;
196
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 195
diff changeset
14 import luan.MetatableGetter;
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
15
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
16
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
17 public final class PackageLuan {
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
18
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
19 private static final String jpath = "luan.modules.?Luan.LOADER";
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
20
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
21 public static final LuanFunction LOADER = new LuanFunction() {
111
2428ecfed375 change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 108
diff changeset
22 @Override public Object call(LuanState luan,Object[] args) {
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
23 LuanTable module = new LuanTable();
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 75
diff changeset
24 module.put("loaded",luan.loaded());
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 75
diff changeset
25 module.put("preload",luan.preload());
144
2e92f0a6fcac add Reactionary.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 143
diff changeset
26 module.put("path","?.luan;java:luan/modules/?.luan");
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
27 module.put("jpath",jpath);
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
28 try {
186
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
29 module.put("require",requireFn);
200
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
30 add( module, "block_lib", LuanState.class, String.class );
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
31 add( module, "load", LuanState.class, String.class );
200
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
32 add( module, "load_lib", LuanState.class, String.class );
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
33 add( module, "search_path", String.class, String.class );
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
34 add( module, "search", LuanState.class, String.class );
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
35 } catch(NoSuchMethodException e) {
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
36 throw new RuntimeException(e);
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
37 }
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
38 LuanTable searchers = luan.searchers();
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
39 searchers.add(preloadSearcher);
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
40 searchers.add(fileSearcher);
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
41 searchers.add(javaSearcher);
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
42 module.put("searchers",searchers);
111
2428ecfed375 change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 108
diff changeset
43 return module;
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
44 }
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
45 };
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
46
186
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
47 public static final LuanFunction requireFn;
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
48 static {
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
49 try {
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
50 requireFn = new LuanJavaFunction(PackageLuan.class.getMethod("require",LuanState.class,String.class),null);
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
51 } catch(NoSuchMethodException e) {
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
52 throw new RuntimeException(e);
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
53 }
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
54 }
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
55
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
56 private static void add(LuanTable t,String method,Class<?>... parameterTypes) throws NoSuchMethodException {
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
57 t.put( method, new LuanJavaFunction(PackageLuan.class.getMethod(method,parameterTypes),null) );
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
58 }
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
59
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
60 public static Object require(LuanState luan,String modName) throws LuanException {
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
61 Object mod = load(luan,modName);
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
62 if( mod==null )
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
63 throw luan.exception( "module '"+modName+"' not found" );
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
64 return mod;
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
65 }
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
66
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
67 public static Object load(LuanState luan,String modName) throws LuanException {
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
68 LuanTable loaded = luan.loaded();
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
69 Object mod = loaded.get(modName);
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
70 if( mod == null ) {
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
71 Object[] a = search(luan,modName);
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
72 if( a == null )
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
73 return null;
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
74 LuanFunction loader = (LuanFunction)a[0];
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
75 a[0] = modName;
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
76 mod = Luan.first(luan.call(loader,"<require \""+modName+"\">",a));
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
77 if( mod != null ) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
78 loaded.put(modName,mod);
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
79 } else {
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
80 mod = loaded.get(modName);
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
81 if( mod==null ) {
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
82 mod = true;
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
83 loaded.put(modName,mod);
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
84 }
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
85 }
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
86 }
195
24ede40ee0aa make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 186
diff changeset
87 if( mod instanceof LuanTable ) {
24ede40ee0aa make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 186
diff changeset
88 LuanTable modTbl = (LuanTable)mod;
196
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 195
diff changeset
89 MetatableGetter mg = (MetatableGetter)modTbl.get(MetatableGetter.KEY);
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 195
diff changeset
90 if( mg != null )
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 195
diff changeset
91 luan.addMetatableGetter(mg);
195
24ede40ee0aa make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 186
diff changeset
92 }
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
93 return mod;
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
94 }
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
95
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
96 public static Object[] search(LuanState luan,String modName) throws LuanException {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
97 List<Object> list = null;
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
98 LuanTable searchers = (LuanTable)luan.get("Package.searchers");
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
99 if( searchers == null ) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
100 list = Collections.<Object>singletonList(javaSearcher);
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
101 } else {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
102 list = searchers.asList();
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
103 }
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
104 for( Object s : list ) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
105 LuanFunction searcher = (LuanFunction)s;
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
106 Object[] a = Luan.array(luan.call(searcher,"<searcher>",new Object[]{modName}));
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
107 if( a.length >= 1 && a[0] instanceof LuanFunction )
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
108 return a;
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
109 }
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
110 return null;
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
111 }
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
112
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
113 public static final LuanFunction preloadSearcher = new LuanFunction() {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
114 @Override public Object call(LuanState luan,Object[] args) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
115 String modName = (String)args[0];
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
116 return luan.preload().get(modName);
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
117 }
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
118 };
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
119
74
f003338d503b improve package lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 73
diff changeset
120 public static String search_path(String name,String path) {
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
121 for( String s : path.split(";") ) {
74
f003338d503b improve package lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 73
diff changeset
122 String file = s.replaceAll("\\?",name);
143
fcb81fa2df0d handle urls and java resources as files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 142
diff changeset
123 if( Utils.exists(file) )
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
124 return file;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
125 }
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
126 return null;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
127 }
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
128
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
129 public static final LuanFunction fileLoader = new LuanFunction() {
111
2428ecfed375 change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 108
diff changeset
130 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
131 String fileName = (String)args[1];
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
132 LuanFunction fn = BasicLuan.load_file(luan,fileName);
111
2428ecfed375 change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 108
diff changeset
133 return fn.call(luan,args);
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
134 }
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
135 };
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
136
75
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
137 public static final LuanFunction fileSearcher = new LuanFunction() {
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
138 @Override public Object[] call(LuanState luan,Object[] args) {
75
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
139 String modName = (String)args[0];
90
b1e87f1bcc13 make module names uppercase;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
140 String path = (String)luan.get("Package.path");
75
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
141 if( path==null )
123
d7be9b3abf1a minor - rename LuanFunction.EMPTY to NOTHING
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 112
diff changeset
142 return LuanFunction.NOTHING;
75
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
143 String file = search_path(modName,path);
123
d7be9b3abf1a minor - rename LuanFunction.EMPTY to NOTHING
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 112
diff changeset
144 return file==null ? LuanFunction.NOTHING : new Object[]{fileLoader,file};
75
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
145 }
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
146 };
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
147
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
148
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
149 public static final LuanFunction javaLoader = new LuanFunction() {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
150 @Override public Object call(LuanState luan,Object[] args) throws LuanException {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
151 try {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
152 String objName = (String)args[1];
200
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
153 LuanFunction fn = load_lib(luan,objName);
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
154 return fn.call(luan,args);
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
155 } catch(ClassNotFoundException e) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
156 throw new RuntimeException(e);
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
157 } catch(NoSuchFieldException e) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
158 throw new RuntimeException(e);
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
159 } catch(IllegalAccessException e) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
160 throw new RuntimeException(e);
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
161 }
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
162 }
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
163 };
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
164
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
165 public static final LuanFunction javaSearcher = new LuanFunction() {
200
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
166 @Override public Object[] call(LuanState luan,Object[] args)
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
167 throws LuanException
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
168 {
75
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
169 String modName = (String)args[0];
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
170 modName = modName.replace('/','.');
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
171 String path = (String)luan.get("Package.jpath");
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
172 if( path==null )
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
173 path = jpath;
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
174 for( String s : path.split(";") ) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
175 String objName = s.replaceAll("\\?",modName);
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
176 try {
200
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
177 load_lib(luan,objName); // throws exception if not found
161
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
178 return new Object[]{javaLoader,objName};
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
179 } catch(ClassNotFoundException e) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
180 } catch(NoSuchFieldException e) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
181 } catch(IllegalAccessException e) {
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
182 }
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
183 }
d310ebf4d6e7 add javaSearcher
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 144
diff changeset
184 return LuanFunction.NOTHING;
75
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
185 }
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
186 };
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
187
aa7538ae5fb6 can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 74
diff changeset
188
200
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
189 public static void block_lib(LuanState luan,String path) {
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
190 luan.blocked.add(path);
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
191 }
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
192
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
193 public static LuanFunction load_lib(LuanState luan,String path)
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
194 throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, LuanException
141
c2ee8a717b73 move loading of standard modules to luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
195 {
200
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
196 if( luan.blocked.contains(path) )
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 196
diff changeset
197 throw luan.exception(path+" is blocked");
141
c2ee8a717b73 move loading of standard modules to luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
198 int i = path.lastIndexOf('.');
c2ee8a717b73 move loading of standard modules to luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
199 String clsPath = path.substring(0,i);
c2ee8a717b73 move loading of standard modules to luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
200 String fld = path.substring(i+1);
c2ee8a717b73 move loading of standard modules to luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
201 Class cls = Class.forName(clsPath);
c2ee8a717b73 move loading of standard modules to luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
202 return (LuanFunction)cls.getField(fld).get(null);
c2ee8a717b73 move loading of standard modules to luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
203 }
c2ee8a717b73 move loading of standard modules to luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
204
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
205 }