Mercurial Hosting > luan
annotate src/luan/modules/PackageLuan.java @ 1802:ca98dee04e08 default tip
add Parsers.json_null
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 21 Apr 2024 21:25:15 -0600 |
parents | a37ffe2d1b14 |
children |
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; |
1578 | 8 import java.util.Map; |
9 import java.util.HashMap; | |
1509 | 10 import goodjava.io.IoUtils; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 import luan.Luan; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
12 import luan.LuanTable; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
13 import luan.LuanFunction; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 import luan.LuanJavaFunction; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 import luan.LuanException; |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
17 |
168
ebe9db183eb7
rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
167
diff
changeset
|
18 public final class PackageLuan { |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
19 |
1335 | 20 public static LuanFunction requireFn(Luan luan) { |
21 LuanFunction fn = (LuanFunction)luan.registry().get("Package.require"); | |
22 if( fn == null ) { | |
23 try { | |
1580 | 24 fn = new LuanJavaFunction(PackageLuan.class.getMethod("require",Luan.class,String.class,LuanTable.class),null); |
1335 | 25 } catch(NoSuchMethodException e) { |
26 throw new RuntimeException(e); | |
27 } | |
28 luan.registry().put("Package.require",fn); | |
186
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
29 } |
1335 | 30 return fn; |
186
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
31 } |
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
175
diff
changeset
|
32 |
1578 | 33 public static Map loaded(Luan luan) { |
34 Map map = (Map)luan.registry().get("Package.loaded"); | |
35 if( map == null ) { | |
36 map = new HashMap(); | |
37 luan.registry().put("Package.loaded",map); | |
299
a74559240b4f
simplify PackageLuan and remove IO loading param
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
38 } |
1578 | 39 return map; |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
40 } |
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
41 |
1580 | 42 public static Object require(Luan luan,String modName,LuanTable options) throws LuanException { |
1353
8d95711f6615
replace java() with require "java"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
43 if( "java".equals(modName) ) { |
8d95711f6615
replace java() with require "java"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
44 JavaLuan.java(luan); |
8d95711f6615
replace java() with require "java"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
45 return true; |
8d95711f6615
replace java() with require "java"
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
46 } |
1580 | 47 Object mod = load(luan,modName,options); |
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
|
48 if( mod.equals(Boolean.FALSE) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
49 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
|
50 return mod; |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
51 } |
bdbd4740121f
finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
52 |
1580 | 53 public static Object load(Luan luan,String modName,LuanTable options) throws LuanException { |
1578 | 54 Map loaded = loaded(luan); |
55 Object mod = loaded.get(modName); | |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
56 if( mod == null ) { |
1280 | 57 if( modName.equals("luan:Boot.luan") ) { |
58 String src; | |
59 try { | |
60 Reader in = new InputStreamReader(ClassLoader.getSystemResourceAsStream("luan/modules/Boot.luan")); | |
1509 | 61 src = IoUtils.readAll(in); |
1280 | 62 in.close(); |
63 } catch(IOException e) { | |
64 throw new RuntimeException(e); | |
65 } | |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1353
diff
changeset
|
66 LuanFunction loader = luan.load(src,modName,true); |
1280 | 67 mod = Luan.first( |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
68 loader.call(luan,modName) |
1280 | 69 ); |
70 if( mod == null ) | |
71 throw new RuntimeException(); | |
72 } 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
|
73 mod = JavaLuan.load(luan,modName.substring(5)); |
1108
f12c7cab0e14
fix handling of missing java class
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
74 if( mod == null ) |
f12c7cab0e14
fix handling of missing java class
Franklin Schmidt <fschmidt@gmail.com>
parents:
1080
diff
changeset
|
75 mod = Boolean.FALSE; |
301
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
299
diff
changeset
|
76 } else { |
1580 | 77 String src = read(luan,modName,options); |
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
|
78 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
|
79 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
|
80 } else { |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1353
diff
changeset
|
81 LuanFunction loader = luan.load(src,modName,true); |
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
|
82 mod = Luan.first( |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
83 loader.call(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
|
84 ); |
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
|
85 if( mod == null ) { |
1578 | 86 mod = loaded.get(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
|
87 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
|
88 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
|
89 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
|
90 } |
503 | 91 } |
136
7e160d2f6d9c
update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
135
diff
changeset
|
92 } |
1578 | 93 loaded.put(modName,mod); |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
94 } |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
96
diff
changeset
|
95 return mod; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
96 } |
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
97 |
1580 | 98 static String read(Luan luan,String uri,LuanTable options) { |
1320
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
99 LuanTable boot; |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
100 try { |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
101 boot = (LuanTable)luan.require("luan:Boot.luan"); |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
102 } catch(LuanException e) { |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
103 throw new RuntimeException(e); |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
104 } |
1330 | 105 Luan.Security security = Luan.setSecurity(luan,null); |
1320
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
106 try { |
1618
a37ffe2d1b14
fix not_found_handler
Franklin Schmidt <fschmidt@gmail.com>
parents:
1580
diff
changeset
|
107 return (String)Luan.first(boot.fn(luan,"read").call(luan,uri,options)); |
1320
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
108 } catch(LuanException e) { |
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
109 return null; |
1330 | 110 } finally { |
111 if( security != null ) | |
112 Luan.setSecurity(luan,security); | |
1320
2c8d1d76a82a
PackageLuan.read() returns null for exceptions
Franklin Schmidt <fschmidt@gmail.com>
parents:
1283
diff
changeset
|
113 } |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
114 } |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
115 |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
116 } |