|
1 | 1 | package com.mmhelloworld.jvmassembler.server;
|
2 | 2 |
|
3 | 3 | import org.eclipse.jetty.server.Server;
|
| 4 | +import org.eclipse.jetty.server.ServerConnector; |
4 | 5 | import org.eclipse.jetty.servlet.ServletContextHandler;
|
5 | 6 | import org.eclipse.jetty.servlet.ServletHolder;
|
| 7 | +import org.glassfish.jersey.servlet.ServletContainer; |
| 8 | + |
| 9 | +import java.io.BufferedWriter; |
| 10 | +import java.io.File; |
| 11 | +import java.io.FileWriter; |
| 12 | +import java.io.IOException; |
| 13 | +import java.nio.file.Files; |
| 14 | +import java.util.Scanner; |
6 | 15 |
|
7 |
| -/** |
8 |
| - * |
9 |
| - */ |
10 | 16 | public class AssemblerServer {
|
11 | 17 | public static void main(String[] args) throws Exception {
|
| 18 | + int alreadyRunningPort = readPort(); |
| 19 | + if (alreadyRunningPort >= 0) { |
| 20 | + System.err.printf("A server may be already running on port %d.\n", alreadyRunningPort); |
| 21 | + System.out.println("Do you want to force start a new server? (y/n)"); |
| 22 | + final Scanner in = new Scanner(System.in); |
| 23 | + if (in.hasNext() && !in.nextLine().equalsIgnoreCase("y")) { |
| 24 | + System.exit(0); |
| 25 | + } |
| 26 | + } |
| 27 | + startServer(); |
| 28 | + } |
| 29 | + |
| 30 | + private static void startServer() throws Exception { |
12 | 31 | ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
|
13 | 32 | context.setContextPath("/");
|
14 | 33 |
|
15 |
| - Server jettyServer = new Server(8080); |
16 |
| - jettyServer.setHandler(context); |
17 |
| - |
18 |
| - ServletHolder jerseyServlet = context.addServlet( |
19 |
| - org.glassfish.jersey.servlet.ServletContainer.class, "/*"); |
| 34 | + ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/*"); |
20 | 35 | jerseyServlet.setInitOrder(0);
|
| 36 | + jerseyServlet.setInitParameter("javax.ws.rs.Application", AssemblerApp.class.getCanonicalName()); |
21 | 37 |
|
22 |
| - // Tells the Jersey Servlet which REST service/class to load. |
23 |
| - jerseyServlet.setInitParameter( |
24 |
| - "jersey.config.server.provider.classnames", |
25 |
| - AssemblerResource.class.getCanonicalName()); |
| 38 | + Server jettyServer = new Server(0); |
| 39 | + jettyServer.setHandler(context); |
26 | 40 |
|
27 | 41 | try {
|
28 | 42 | jettyServer.start();
|
| 43 | + int port = getPort(jettyServer); |
| 44 | + System.out.printf("Server started successfully and is running on port %s.\n", port); |
| 45 | + writePort(port); |
| 46 | + Runtime.getRuntime().addShutdownHook(new Thread(() -> { |
| 47 | + getInfoFile().delete(); |
| 48 | + })); |
29 | 49 | jettyServer.join();
|
30 | 50 | } finally {
|
31 | 51 | jettyServer.destroy();
|
32 | 52 | }
|
| 53 | + } |
| 54 | + |
| 55 | + private static void writePort(final int port) { |
| 56 | + final File portInfoFile = getInfoFile(); |
| 57 | + getWorkingDir().mkdir(); |
| 58 | + try (BufferedWriter out = new BufferedWriter(new FileWriter(portInfoFile))) { |
| 59 | + out.append(Integer.toString(port)); |
| 60 | + } catch (IOException e) { |
| 61 | + System.err.println("Cannot write port details to " + portInfoFile); |
| 62 | + e.printStackTrace(); |
| 63 | + } |
| 64 | + } |
| 65 | + |
| 66 | + private static int readPort() throws IOException { |
| 67 | + final File portInfoFile = getInfoFile(); |
| 68 | + if (portInfoFile.exists()) { |
| 69 | + return Files.lines(portInfoFile.toPath()) |
| 70 | + .findFirst() |
| 71 | + .map(s -> parseIntWithDefault(s, -1)) |
| 72 | + .orElse(-1); |
| 73 | + } else { |
| 74 | + return -1; |
| 75 | + } |
| 76 | + |
| 77 | + } |
| 78 | + |
| 79 | + private static File getInfoFile() { |
| 80 | + File idrisjvmWorkDir = getWorkingDir(); |
| 81 | + return new File(idrisjvmWorkDir, ".assembler"); |
| 82 | + } |
| 83 | + |
| 84 | + private static int parseIntWithDefault(String portStr, int dflt) { |
| 85 | + try { |
| 86 | + return Integer.parseInt(portStr); |
| 87 | + } catch (NumberFormatException e) { |
| 88 | + return dflt; |
| 89 | + } |
| 90 | + } |
33 | 91 |
|
| 92 | + private static File getWorkingDir() { |
| 93 | + final String userHome = System.getProperty("user.home"); |
| 94 | + return new File(userHome, ".idrisjvm"); |
34 | 95 | }
|
| 96 | + |
| 97 | + private static int getPort(final Server jettyServer) { |
| 98 | + return ((ServerConnector) (jettyServer.getConnectors()[0])).getLocalPort(); |
| 99 | + } |
| 100 | + |
35 | 101 | }
|
0 commit comments