annotate src/luan/modules/PackageLuan.java @ 787:c49980cdece6

use incremental cloning to serve web pages
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 04 Sep 2016 00:18:00 -0600
parents 1a68fc55a80c
children 9eccfede1094
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;
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
6 import luan.Luan;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
7 import luan.LuanState;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
8 import luan.LuanTable;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
9 import luan.LuanFunction;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
10 import luan.LuanJavaFunction;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
11 import luan.LuanException;
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
12
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
13
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
14 public final class PackageLuan {
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
15
186
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
16 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
17 static {
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
18 try {
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
19 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
20 } 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
21 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
22 }
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
23 }
cf939124461a don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 175
diff changeset
24
202
75750ceb45ee add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 200
diff changeset
25 public static LuanTable loaded(LuanState luan) {
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 427
diff changeset
26 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
27 if( tbl == null ) {
411
23b99a5039b5 remove Luan.newTable()
Franklin Schmidt <fschmidt@gmail.com>
parents: 339
diff changeset
28 tbl = new LuanTable();
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 427
diff changeset
29 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
30 }
a74559240b4f simplify PackageLuan and remove IO loading param
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
31 return tbl;
202
75750ceb45ee add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 200
diff changeset
32 }
75750ceb45ee add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 200
diff changeset
33
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
34 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
35 Object mod = load(luan,modName);
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
36 if( mod==null )
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 645
diff changeset
37 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
38 return mod;
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
39 }
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
40
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
41 public static Object load(LuanState 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
42 LuanTable loaded = loaded(luan);
426
23a93c118042 fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 411
diff changeset
43 Object mod = loaded.rawGet(modName);
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
44 if( mod == null ) {
301
a6bf8ff720f8 add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 299
diff changeset
45 if( modName.startsWith("java:") ) {
a6bf8ff720f8 add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 299
diff changeset
46 mod = JavaLuan.load(luan,modName.substring(5));
a6bf8ff720f8 add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 299
diff changeset
47 } else {
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
48 String src = read(luan,modName);
301
a6bf8ff720f8 add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 299
diff changeset
49 if( src == null )
a6bf8ff720f8 add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 299
diff changeset
50 return null;
694
b620b8e1010f remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents: 693
diff changeset
51 LuanFunction loader = Luan.load(src,modName);
503
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 462
diff changeset
52 mod = Luan.first(
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
53 loader.call(luan,new Object[]{modName})
339
673eebd83b74 remove circular package loading
Franklin Schmidt <fschmidt@gmail.com>
parents: 327
diff changeset
54 );
503
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 462
diff changeset
55 if( mod == null ) {
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 462
diff changeset
56 mod = loaded.rawGet(modName);
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 462
diff changeset
57 if( mod != null )
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 462
diff changeset
58 return mod;
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 645
diff changeset
59 throw new LuanException( "module '"+modName+"' returned nil" );
503
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 462
diff changeset
60 }
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
61 }
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
62 loaded.rawPut(modName,mod);
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
63 }
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 96
diff changeset
64 return mod;
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
65 }
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
66
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
67 static String read(LuanState luan,String uri) throws LuanException {
722
647602e8291a add url options
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
68 LuanTable t = IoLuan.uri(luan,uri,null);
264
9e0d4452e649 implement URL style module names
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 260
diff changeset
69 if( t == null )
9e0d4452e649 implement URL style module names
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 260
diff changeset
70 return null;
787
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
71 /*
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
72 LuanFunction existsFn = (LuanFunction)t.get(luan,"exists");
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
73 boolean exists = (Boolean)Luan.first(existsFn.call(luan));
301
a6bf8ff720f8 add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 299
diff changeset
74 if( !exists )
a6bf8ff720f8 add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 299
diff changeset
75 return null;
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
76 LuanFunction reader = (LuanFunction)t.get(luan,"read_text");
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
77 return (String)Luan.first(reader.call(luan));
787
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
78 */
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
79 IoLuan.LuanIn in = (IoLuan.LuanIn)t.rawGet("java");
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
80 try {
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
81 if( !in.exists() )
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
82 return null;
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
83 return in.read_text();
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
84 } catch(IOException e) {
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
85 throw new LuanException(e);
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
86 }
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
87 }
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
88
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
89 public static boolean wouldLoad(LuanState luan,String modName) throws LuanException {
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
90 LuanTable loaded = loaded(luan);
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
91 if( loaded.rawGet(modName) != null )
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
92 return false;
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
93 if( modName.startsWith("java:") )
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
94 return true;
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
95 LuanTable t = IoLuan.uri(luan,modName,null);
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
96 if( t == null )
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
97 return false;
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
98 IoLuan.LuanIn in = (IoLuan.LuanIn)t.rawGet("java");
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
99 try {
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
100 return in.exists();
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
101 } catch(IOException e) {
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
102 throw new LuanException(e);
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
103 }
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
104 }
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
105
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
106 }