Mercurial Hosting > luan
comparison src/luan/modules/http/LuanHandler.java @ 1185:94cf2576a922
implement WebHandler for nginx
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 21 Feb 2018 21:22:16 -0700 |
parents | 794ddcfbee20 |
children | ef8cd42e23d5 |
comparison
equal
deleted
inserted
replaced
1184:2eba58842bbb | 1185:94cf2576a922 |
---|---|
24 import luan.LuanException; | 24 import luan.LuanException; |
25 import luan.modules.PackageLuan; | 25 import luan.modules.PackageLuan; |
26 | 26 |
27 | 27 |
28 public class LuanHandler implements Handler { | 28 public class LuanHandler implements Handler { |
29 private final LuanState luanInit; | |
30 private final Logger logger; | 29 private final Logger logger; |
31 private final ReadWriteLock lock = new ReentrantReadWriteLock(); | 30 private final ReadWriteLock lock = new ReentrantReadWriteLock(); |
32 private LuanState luan; | 31 private final LuanState luan; |
33 | 32 |
34 private static final Method resetLuanMethod; | 33 public LuanHandler(LuanState luanInit,String loggerRoot) { |
35 static { | |
36 try { | |
37 resetLuanMethod = LuanHandler.class.getMethod("reset_luan"); | |
38 } catch(NoSuchMethodException e) { | |
39 throw new RuntimeException(e); | |
40 } | |
41 } | |
42 | |
43 public LuanHandler(LuanState luan,String loggerRoot) { | |
44 this.luanInit = luan; | |
45 if( loggerRoot==null ) | 34 if( loggerRoot==null ) |
46 loggerRoot = ""; | 35 loggerRoot = ""; |
47 logger = LoggerFactory.getLogger(loggerRoot+LuanHandler.class.getName()); | 36 logger = LoggerFactory.getLogger(loggerRoot+LuanHandler.class.getName()); |
37 | |
38 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); | |
39 this.luan = (LuanState)cloner.clone(luanInit); | |
48 try { | 40 try { |
49 LuanTable Http = (LuanTable)PackageLuan.require(luanInit,"luan:http/Http.luan"); | 41 PackageLuan.load(luan,"site:/init.luan"); |
50 Http.rawPut( "reset_luan", new LuanJavaFunction(resetLuanMethod,this) ); | |
51 } catch(LuanException e) { | 42 } catch(LuanException e) { |
52 throw new RuntimeException(e); | 43 String err = e.getLuanStackTraceString(); |
44 logger.error(err); | |
53 } | 45 } |
54 setLuan(); | |
55 } | 46 } |
56 | 47 |
57 @Override public Response handle(Request request) { | 48 @Override public Response handle(Request request) { |
58 if( request.path.endsWith("/") ) | 49 if( request.path.endsWith("/") ) |
59 return null; | 50 return null; |
78 } finally { | 69 } finally { |
79 lock.readLock().unlock(); | 70 lock.readLock().unlock(); |
80 thread.setName(oldName); | 71 thread.setName(oldName); |
81 } | 72 } |
82 } | 73 } |
83 /* | |
84 @Override protected void doStart() throws Exception { | |
85 // Thread.dumpStack(); | |
86 //System.out.println("qqqqqqqqqqqqqqqqqqqq doStart "+this); | |
87 setLuan(); | |
88 super.doStart(); | |
89 } | |
90 | 74 |
91 @Override protected void doStop() throws Exception { | 75 public void close() throws IOException { |
92 synchronized(luan) { | 76 synchronized(luan) { |
93 luan.close(); | 77 luan.close(); |
94 } | 78 } |
95 //System.out.println("qqqqqqqqqqqqqqqqqqqq doStop "+this); | |
96 super.doStop(); | |
97 } | 79 } |
98 */ | 80 |
99 public Object call_rpc(String fnName,Object... args) throws LuanException { | 81 public Object call_rpc(String fnName,Object... args) throws LuanException { |
100 lock.readLock().lock(); | 82 lock.readLock().lock(); |
101 try { | 83 try { |
102 LuanFunction fn; | 84 LuanFunction fn; |
103 LuanState luan = this.luan; | 85 LuanState luan = this.luan; |
116 } finally { | 98 } finally { |
117 lock.readLock().unlock(); | 99 lock.readLock().unlock(); |
118 } | 100 } |
119 } | 101 } |
120 | 102 |
121 public void reset_luan() { | |
122 new Thread() { | |
123 public void run() { | |
124 lock.writeLock().lock(); | |
125 try { | |
126 synchronized(luan) { | |
127 luan.close(); | |
128 setLuan(); | |
129 } | |
130 } catch(IOException e) { | |
131 logger.error("reset_luan failed",e); | |
132 } finally { | |
133 lock.writeLock().unlock(); | |
134 } | |
135 } | |
136 }.start(); | |
137 } | |
138 | |
139 private void setLuan() { | |
140 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); | |
141 luan = (LuanState)cloner.clone(luanInit); | |
142 try { | |
143 PackageLuan.load(luan,"site:/init.luan"); | |
144 } catch(LuanException e) { | |
145 String err = e.getLuanStackTraceString(); | |
146 logger.error(err); | |
147 } | |
148 } | |
149 | |
150 public Object runLuan(String sourceText,String sourceName) throws LuanException { | 103 public Object runLuan(String sourceText,String sourceName) throws LuanException { |
151 LuanFunction fn = Luan.load(sourceText,sourceName); | 104 LuanFunction fn = Luan.load(sourceText,sourceName); |
152 synchronized(luan) { | 105 synchronized(luan) { |
153 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); | 106 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
154 LuanState luan = (LuanState)cloner.clone(this.luan); | 107 LuanState luan = (LuanState)cloner.clone(this.luan); |