Mercurial Hosting > luan
annotate src/luan/modules/PackageLuan.java @ 1333:25746915a241
merge Luan and LuanState
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 12 Feb 2019 22:33:40 -0700 |
parents | f41919741100 |
children | e0cf0d108a77 |
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 |
1280 | 3 import java.io.Reader; |
4 import java.io.InputStreamReader; | |
75
aa7538ae5fb6
can now load modules from classpath
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
74
diff
changeset
|
5 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
|
6 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
|
7 import java.util.Collections; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 import luan.Luan; |
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; |
798 | 12 import luan.LuanCloner; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
13 import luan.LuanException; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 |
168
ebe9db183eb7
rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
167
diff
changeset
|
16 public final class PackageLuan { |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
17 |
186
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
18 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
|
19 static { |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
20 try { |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
21 requireFn = new LuanJavaFunction(PackageLuan.class.getMethod("require",Luan.class,String.class),null); |
186
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
22 } 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
|
23 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
|
24 } |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
25 } |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
26 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
27 public static LuanTable loaded(Luan luan) { |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
427
diff
changeset
|
28 LuanTable tbl = (LuanTable)luan.registry().get("Package.loaded"); |
299
a74559240b4f
simplify PackageLuan and remove IO loading param
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
29 if( tbl == null ) { |
1267 | 30 tbl = new LuanTable(luan); |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
427
diff
changeset
|
31 luan.registry().put("Package.loaded",tbl); |
299
a74559240b4f
simplify PackageLuan and remove IO loading param
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
32 } |
a74559240b4f
simplify PackageLuan and remove IO loading param
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
33 return tbl; |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
34 } |
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
35 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
36 public static Object require(Luan 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
|
37 Object mod = load(luan,modName); |
799
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
38 if( mod.equals(Boolean.FALSE) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
39 throw new LuanException( "module '"+modName+"' not found" ); |
175
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
40 return mod; |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
41 } |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
42 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
43 public static Object load(Luan luan,String modName) throws LuanException { |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
44 LuanTable loaded = loaded(luan); |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
411
diff
changeset
|
45 Object mod = loaded.rawGet(modName); |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
46 if( mod == null ) { |
1280 | 47 if( modName.equals("luan:Boot.luan") ) { |
48 String src; | |
49 try { | |
50 Reader in = new InputStreamReader(ClassLoader.getSystemResourceAsStream("luan/modules/Boot.luan")); | |
51 src = Utils.readAll(in); | |
52 in.close(); | |
53 } catch(IOException e) { | |
54 throw new RuntimeException(e); | |
55 } | |
56 LuanFunction loader = Luan.load(src,modName); | |
57 mod = Luan.first( | |
58 loader.call(luan,new Object[]{modName}) | |
59 ); | |
60 if( mod == null ) | |
61 throw new RuntimeException(); | |
62 } else if( modName.startsWith("java:") ) { | |
301
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
63 mod = JavaLuan.load(luan,modName.substring(5)); |
1108
f12c7cab0e14
fix handling of missing java class
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
64 if( mod == null ) |
f12c7cab0e14
fix handling of missing java class
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
65 mod = Boolean.FALSE; |
301
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
66 } else { |
693
ca169567ce07
module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
67 String src = read(luan,modName); |
799
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
68 if( src == null ) { |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
69 mod = Boolean.FALSE; |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
70 } else { |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
71 LuanFunction loader = Luan.load(src,modName); |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
72 mod = Luan.first( |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
73 loader.call(luan,new Object[]{modName}) |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
74 ); |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
75 if( mod == null ) { |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
76 mod = loaded.rawGet(modName); |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
77 if( mod != null ) |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
78 return mod; |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
79 throw new LuanException( "module '"+modName+"' returned nil" ); |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
80 } |
503 | 81 } |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
82 } |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
83 loaded.rawPut(modName,mod); |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
84 } |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
96
diff
changeset
|
85 return mod; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
86 } |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
87 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
88 static String read(Luan luan,String uri) { |
1320
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
89 LuanTable boot; |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
90 try { |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
91 boot = (LuanTable)luan.require("luan:Boot.luan"); |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
92 } catch(LuanException e) { |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
93 throw new RuntimeException(e); |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
94 } |
1330 | 95 Luan.Security security = Luan.setSecurity(luan,null); |
1320
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
96 try { |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
97 return (String)Luan.first(boot.call("read",uri)); |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
98 } catch(LuanException e) { |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
99 return null; |
1330 | 100 } finally { |
101 if( security != null ) | |
102 Luan.setSecurity(luan,security); | |
1320
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
103 } |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
104 } |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
105 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
106 public static void enableLoad(Luan luan,String... mods) throws LuanException { |
799
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
107 if( !luan.isLocked ) |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
108 return; |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
109 LuanTable loaded = loaded(luan); |
799
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
110 for( String mod : mods ) { |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
111 if( loaded.rawGet(mod) == null ) { |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
112 luan.isLocked = false; |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
113 luan.deepenClone(luan,new LuanCloner(LuanCloner.Type.COMPLETE)); |
9c13a15a4002
Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents:
798
diff
changeset
|
114 break; |
798 | 115 } |
116 } | |
117 } | |
118 | |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
119 } |