comparison src/luan/modules/http/LuanHandler.java @ 1171:794ddcfbee20

remove http/impl
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 11 Feb 2018 02:41:23 -0700
parents src/luan/modules/http/impl/LuanHandler.java@3a0f58d09ee7
children 94cf2576a922
comparison
equal deleted inserted replaced
1170:3a0f58d09ee7 1171:794ddcfbee20
1 package luan.modules.http;
2
3 import java.io.Writer;
4 import java.io.PrintWriter;
5 import java.io.IOException;
6 import java.lang.reflect.Method;
7 import java.net.BindException;
8 import java.util.concurrent.locks.ReadWriteLock;
9 import java.util.concurrent.locks.ReentrantReadWriteLock;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12 import luan.webserver.Request;
13 import luan.webserver.Response;
14 import luan.webserver.Server;
15 import luan.webserver.Handler;
16 import luan.webserver.Status;
17 import luan.webserver.ResponseOutputStream;
18 import luan.Luan;
19 import luan.LuanState;
20 import luan.LuanTable;
21 import luan.LuanFunction;
22 import luan.LuanJavaFunction;
23 import luan.LuanCloner;
24 import luan.LuanException;
25 import luan.modules.PackageLuan;
26
27
28 public class LuanHandler implements Handler {
29 private final LuanState luanInit;
30 private final Logger logger;
31 private final ReadWriteLock lock = new ReentrantReadWriteLock();
32 private LuanState luan;
33
34 private static final Method resetLuanMethod;
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 )
46 loggerRoot = "";
47 logger = LoggerFactory.getLogger(loggerRoot+LuanHandler.class.getName());
48 try {
49 LuanTable Http = (LuanTable)PackageLuan.require(luanInit,"luan:http/Http.luan");
50 Http.rawPut( "reset_luan", new LuanJavaFunction(resetLuanMethod,this) );
51 } catch(LuanException e) {
52 throw new RuntimeException(e);
53 }
54 setLuan();
55 }
56
57 @Override public Response handle(Request request) {
58 if( request.path.endsWith("/") )
59 return null;
60 String modName = "site:" + request.path +".luan";
61 return handle(request,modName);
62 }
63
64 Response handle(Request request,String modName) {
65 Thread thread = Thread.currentThread();
66 String oldName = thread.getName();
67 thread.setName(request.headers.get("host")+request.path);
68 lock.readLock().lock();
69 try {
70 Response response = HttpServicer.service(luan,request,modName);
71 return response;
72 } catch(LuanException e) {
73 //e.printStackTrace();
74 String err = e.getLuanStackTraceString();
75 logger.error(err);
76 String msg = "Internel Server Error\n\n" + err;
77 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg );
78 } finally {
79 lock.readLock().unlock();
80 thread.setName(oldName);
81 }
82 }
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
91 @Override protected void doStop() throws Exception {
92 synchronized(luan) {
93 luan.close();
94 }
95 //System.out.println("qqqqqqqqqqqqqqqqqqqq doStop "+this);
96 super.doStop();
97 }
98 */
99 public Object call_rpc(String fnName,Object... args) throws LuanException {
100 lock.readLock().lock();
101 try {
102 LuanFunction fn;
103 LuanState luan = this.luan;
104 synchronized(luan) {
105 PackageLuan.enableLoad(luan,"luan:Rpc.luan");
106 LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
107 LuanTable fns = (LuanTable)rpc.get(luan,"functions");
108 fn = (LuanFunction)fns.get(luan,fnName);
109 if( fn == null )
110 throw new LuanException( "function not found: " + fnName );
111 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
112 luan = (LuanState)cloner.clone(luan);
113 fn = (LuanFunction)cloner.get(fn);
114 }
115 return fn.call(luan,args);
116 } finally {
117 lock.readLock().unlock();
118 }
119 }
120
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 {
151 LuanFunction fn = Luan.load(sourceText,sourceName);
152 synchronized(luan) {
153 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
154 LuanState luan = (LuanState)cloner.clone(this.luan);
155 return fn.call(luan);
156 }
157 }
158
159 public static void start(Server server) throws Exception {
160 try {
161 server.start();
162 } catch(BindException e) {
163 throw new LuanException(e.toString());
164 }
165 }
166
167 }