Skip to content

Commit 852187b

Browse files
committed
find unused port, write port info to a file
1 parent 3df3a0d commit 852187b

File tree

4 files changed

+97
-38
lines changed

4 files changed

+97
-38
lines changed

jvm-assembler-server/pom.xml

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,6 @@
1010
<modelVersion>4.0.0</modelVersion>
1111

1212
<artifactId>jvm-assembler-server</artifactId>
13-
<packaging>war</packaging>
14-
15-
<build>
16-
<plugins>
17-
<plugin>
18-
<groupId>org.eclipse.jetty</groupId>
19-
<artifactId>jetty-maven-plugin</artifactId>
20-
</plugin>
21-
22-
<plugin>
23-
<artifactId>maven-war-plugin</artifactId>
24-
<configuration>
25-
<warName>jvm-assembler-core</warName>
26-
<failOnMissingWebXml>false</failOnMissingWebXml>
27-
</configuration>
28-
</plugin>
29-
</plugins>
30-
</build>
3113

3214
<dependencies>
3315

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.mmhelloworld.jvmassembler.server;
2+
3+
import javax.ws.rs.core.Application;
4+
import java.util.HashSet;
5+
import java.util.Set;
6+
7+
/**
8+
* User: marimuthu
9+
*/
10+
public class AssemblerApp extends Application {
11+
@Override
12+
public Set<Class<?>> getClasses() {
13+
Set<Class<?>> resources = new HashSet<>();
14+
resources.add(AssemblerResource.class);
15+
return resources;
16+
}
17+
}
Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,101 @@
11
package com.mmhelloworld.jvmassembler.server;
22

33
import org.eclipse.jetty.server.Server;
4+
import org.eclipse.jetty.server.ServerConnector;
45
import org.eclipse.jetty.servlet.ServletContextHandler;
56
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;
615

7-
/**
8-
*
9-
*/
1016
public class AssemblerServer {
1117
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 {
1231
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
1332
context.setContextPath("/");
1433

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, "/*");
2035
jerseyServlet.setInitOrder(0);
36+
jerseyServlet.setInitParameter("javax.ws.rs.Application", AssemblerApp.class.getCanonicalName());
2137

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

2741
try {
2842
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+
}));
2949
jettyServer.join();
3050
} finally {
3151
jettyServer.destroy();
3252
}
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+
}
3391

92+
private static File getWorkingDir() {
93+
final String userHome = System.getProperty("user.home");
94+
return new File(userHome, ".idrisjvm");
3495
}
96+
97+
private static int getPort(final Server jettyServer) {
98+
return ((ServerConnector) (jettyServer.getConnectors()[0])).getLocalPort();
99+
}
100+
35101
}

pom.xml

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,11 @@
2929
<source>1.8</source>
3030
<target>1.8</target>
3131
</configuration>
32-
</plugin>
32+
</plugin>
3333
<plugin>
3434
<groupId>org.eclipse.jetty</groupId>
3535
<artifactId>jetty-maven-plugin</artifactId>
36-
<version>9.3.11.v20160721</version>
37-
</plugin>
38-
39-
<plugin>
40-
<artifactId>maven-war-plugin</artifactId>
41-
<version>2.6</version>
36+
<version>${jetty.version}</version>
4237
</plugin>
4338
</plugins>
4439
</pluginManagement>
@@ -101,7 +96,6 @@
10196
<artifactId>asm-all</artifactId>
10297
<version>${asm.version}</version>
10398
</dependency>
104-
10599
</dependencies>
106100
</dependencyManagement>
107101

0 commit comments

Comments
 (0)