Improved SCGI server's handling of its environment.
[jsvc.git] / src / dolda / jsvc / scgi / DSContext.java
... / ...
CommitLineData
1package dolda.jsvc.scgi;
2
3import java.io.*;
4import java.net.*;
5import dolda.jsvc.*;
6import dolda.jsvc.util.*;
7
8public class DSContext extends SimpleContext {
9 public final long mtime;
10 public final ThreadContext tg;
11 private final Environment env;
12
13 private static String mangle(File f) {
14 String ret = f.getName();
15 int p = ret.lastIndexOf('.');
16 if(p > 0)
17 ret = ret.substring(0, p);
18 for(f = f.getParentFile(); f != null; f = f.getParentFile())
19 ret = f.getName() + "/" + ret;
20 return(ret);
21 }
22
23 private static URL makingmewanttokilljavac(File jar) {
24 try {
25 return(jar.toURI().toURL());
26 } catch(MalformedURLException e) {
27 throw(new RuntimeException(e));
28 }
29 }
30
31 public DSContext(File jar, Environment env) throws ThreadContext.CreateException {
32 super(URLClassLoader.newInstance(new URL[] {makingmewanttokilljavac(jar)}, env.libloader()), mangle(jar));
33 this.mtime = jar.lastModified();
34 this.env = env;
35 loadconfig();
36 this.tg = ThreadContext.create(this, loader);
37 }
38
39 private void loadconfig() {
40 if(env.root != null) {
41 File sroot = new File(new File(env.root, "store"), name());
42 sysconfig.put("jsvc.storage", "file:" + sroot.getPath());
43 }
44 sysconfig.putAll(env.sysconfig);
45 }
46
47 public RequestThread worker(Responder root, Request req, ThreadGroup tg, String name) {
48 java.net.Socket sk = ((ScgiRequest)req).sk;
49 if(req.path().equals("")) {
50 return(new ScgiReqThread(new RootRedirect(""), req, tg, name, sk));
51 } else {
52 return(new ScgiReqThread(root, RequestWrap.chpath(req, req.path().substring(1)), tg, name, sk));
53 }
54 }
55}