|
@@ -1,21 +1,87 @@ |
1 |
1 |
|
package org.litesoft.ddt; |
2 |
2 |
|
|
|
3 |
+ |
import org.eclipse.jetty.http.MimeTypes; |
3 |
4 |
|
import org.eclipse.jetty.server.Server; |
|
5 |
+ |
import org.eclipse.jetty.server.handler.ContextHandler; |
|
6 |
+ |
import org.eclipse.jetty.servlet.ServletContextHandler; |
4 |
7 |
|
import org.eclipse.jetty.servlet.ServletHandler; |
5 |
8 |
|
|
6 |
9 |
|
import javax.servlet.Servlet; |
|
10 |
+ |
import java.sql.Timestamp; |
7 |
11 |
|
|
8 |
|
- |
public class EmbeddedJetty extends Server { |
9 |
|
- |
public EmbeddedJetty(int port, Class<? extends Servlet > pServletClass, String pPathSpec) { |
|
12 |
+ |
public final class EmbeddedJetty extends Server { |
|
13 |
+ |
public EmbeddedJetty(int port, Class<? extends Servlet> pServletClass, String pPathSpec, String... pAdditionalMimeTypes) { |
10 |
14 |
|
super(port); |
11 |
|
- |
ServletHandler handler = new ServletHandler(); |
12 |
|
- |
setHandler(handler); |
13 |
|
- |
handler.addServletWithMapping(pServletClass, pPathSpec); |
|
15 |
+ |
|
|
16 |
+ |
ServletHandler zServletHandler = new ServletHandler(); |
|
17 |
+ |
zServletHandler.addServletWithMapping(pServletClass, pPathSpec); |
|
18 |
+ |
|
|
19 |
+ |
ContextHandler zContextHandler = new ServletContextHandler(); |
|
20 |
+ |
zContextHandler.setMimeTypes(getMimeTypes(pAdditionalMimeTypes)); |
|
21 |
+ |
zContextHandler.setHandler(zServletHandler); |
|
22 |
+ |
|
|
23 |
+ |
setHandler(zContextHandler); |
|
24 |
+ |
|
|
25 |
+ |
setStopTimeout(1000); |
|
26 |
+ |
setStopAtShutdown(true); |
|
27 |
+ |
} |
|
28 |
+ |
|
|
29 |
+ |
public int run() throws Exception { |
|
30 |
+ |
ServerKiller zKiller = new ServerKiller(); |
|
31 |
+ |
Shutdown.Instance.set(zKiller); |
|
32 |
+ |
start(); |
|
33 |
+ |
while (!isRunning()) { |
|
34 |
+ |
if (isStopped()) { |
|
35 |
+ |
throw new Error("Stopped on start!"); |
|
36 |
+ |
} |
|
37 |
+ |
if (isFailed()) { |
|
38 |
+ |
throw new Error("Failed on start!"); |
|
39 |
+ |
} |
|
40 |
+ |
Thread.sleep(50); |
|
41 |
+ |
} |
|
42 |
+ |
report("running", ""); |
|
43 |
+ |
join(); |
|
44 |
+ |
int zExitCode = zKiller.mExitCode; |
|
45 |
+ |
report("exiting", " with: " + zExitCode); |
|
46 |
+ |
return zExitCode; |
14 |
47 |
|
} |
15 |
48 |
|
|
16 |
|
- |
public static void main(String[] args) throws Exception { |
17 |
|
- |
EmbeddedJetty server = new EmbeddedJetty(8088, DeviceDesktopTestServlet.class, "/*"); |
18 |
|
- |
server.start(); |
19 |
|
- |
server.join(); |
|
49 |
+ |
private void report(String pWhat, String pTail) { |
|
50 |
+ |
System.out.println("EmbeddedJetty Server " + pWhat + " @ '" + new Timestamp(System.currentTimeMillis()) + "'" + pTail); |
|
51 |
+ |
} |
|
52 |
+ |
|
|
53 |
+ |
protected MimeTypes getMimeTypes(String... pAdditionalMimeTypes) { |
|
54 |
+ |
// Handle files encoded in UTF-8 |
|
55 |
+ |
MimeTypes zMimeTypes = new MimeTypes(); |
|
56 |
+ |
if (pAdditionalMimeTypes != null) { |
|
57 |
+ |
for (int i = 1; i < pAdditionalMimeTypes.length; i += 2) { |
|
58 |
+ |
String zExtension = pAdditionalMimeTypes[i - 1]; |
|
59 |
+ |
String zType = pAdditionalMimeTypes[i]; |
|
60 |
+ |
zMimeTypes.addMimeMapping(zExtension, zType); |
|
61 |
+ |
} |
|
62 |
+ |
} |
|
63 |
+ |
return zMimeTypes; |
|
64 |
+ |
} |
|
65 |
+ |
|
|
66 |
+ |
private class ServerKiller implements Shutdown { |
|
67 |
+ |
private volatile int mExitCode; |
|
68 |
+ |
|
|
69 |
+ |
@Override |
|
70 |
+ |
public void request(int pExitCode) { |
|
71 |
+ |
if (pExitCode != 0) { |
|
72 |
+ |
mExitCode = pExitCode; |
|
73 |
+ |
} |
|
74 |
+ |
new Thread(new Runnable() { |
|
75 |
+ |
@Override |
|
76 |
+ |
public void run() { |
|
77 |
+ |
try { |
|
78 |
+ |
Thread.sleep(100); |
|
79 |
+ |
stop(); |
|
80 |
+ |
} catch (Exception e) { |
|
81 |
+ |
e.printStackTrace(); |
|
82 |
+ |
} |
|
83 |
+ |
} |
|
84 |
+ |
}).start(); |
|
85 |
+ |
} |
20 |
86 |
|
} |
21 |
87 |
|
} |