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);