Skip to content

Commit

Permalink
Testing local report viewer
Browse files Browse the repository at this point in the history
  • Loading branch information
dfuchss committed Jul 5, 2023
1 parent 39d7957 commit fd89367
Show file tree
Hide file tree
Showing 6 changed files with 152 additions and 3 deletions.
17 changes: 16 additions & 1 deletion cli/src/main/java/de/jplag/cli/CLI.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
import static picocli.CommandLine.Model.UsageMessageSpec.SECTION_KEY_FOOTER;
import static picocli.CommandLine.Model.UsageMessageSpec.SECTION_KEY_OPTION_LIST;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.security.SecureRandom;
import java.util.HashSet;
import java.util.List;
Expand Down Expand Up @@ -72,8 +75,20 @@ public static void main(String[] args) {
JPlagResult result = JPlag.run(options);
ReportObjectFactory reportObjectFactory = new ReportObjectFactory();
reportObjectFactory.createAndSaveReport(result, cli.getResultFolder());

// ReportViewer
ReportViewer reportViewer = new ReportViewer();
int port = reportViewer.start();
logger.info("ReportViewer started on port http://localhost:{}", port);
Desktop.getDesktop().browse(URI.create("http://localhost:" + port + "/"));

// Wait for input of user
System.out.println("Press any key to exit...");
System.in.read();
reportViewer.stop();

}
} catch (ExitException exception) {
} catch (ExitException | IOException exception) {
logger.error(exception.getMessage()); // do not pass exception here to keep log clean
finalizeLogger();
System.exit(1);
Expand Down
95 changes: 95 additions & 0 deletions cli/src/main/java/de/jplag/cli/ReportViewer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package de.jplag.cli;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class ReportViewer implements HttpHandler {
private static final Logger logger = LoggerFactory.getLogger(ReportViewer.class);
private static final int SUCCESS_RESPONSE = 200;
private static final int METHOD_NOT_ALLOWED_RESPONSE = 405;
private static final int NOT_FOUND_RESPONSE = 404;
private final Map<String, byte[]> cache = new HashMap<>();

private HttpServer server;

public int start() throws IOException {
if (server != null) {
throw new IllegalStateException("Server already started");
}
server = HttpServer.create(new InetSocketAddress(0), 0);
server.createContext("/", this);
server.setExecutor(null);
server.start();

return server.getAddress().getPort();
}

public void stop() {
server.stop(0);
}

public void handle(HttpExchange exchange) throws IOException {
if (!exchange.getRequestMethod().equals("GET")) {
exchange.sendResponseHeaders(METHOD_NOT_ALLOWED_RESPONSE, 0);
exchange.getResponseBody().close();
return;
}

String path = exchange.getRequestURI().getPath();
path = path.endsWith("/") ? path + "index.html" : path;

logger.debug("Serving {}", path);

byte[] data = cache.get(path);
if (data == null) {
InputStream stream = getClass().getResourceAsStream(path);
if (stream != null) {
try (stream) {
data = stream.readAllBytes();
}
cache.put(path, data);
}
}

if (data != null) {
String fileEnding = path.substring(path.lastIndexOf('.'));
String contentType = switch (fileEnding) {
case ".html" -> "text/html; charset=utf-8";
case ".js" -> "application/javascript; charset=utf-8";
case ".css" -> "text/css; charset=utf-8";
case ".png" -> "image/png";
default -> "text/plain; charset=utf-8";
};

Headers responseHeaders = exchange.getResponseHeaders();
responseHeaders.add("Accept-Ranges", "bytes");
responseHeaders.add("Content-Type", contentType);
exchange.sendResponseHeaders(SUCCESS_RESPONSE, 0);

OutputStream outputStream = exchange.getResponseBody();
ByteArrayInputStream dataStream = new ByteArrayInputStream(data);
dataStream.transferTo(outputStream);

outputStream.flush();
outputStream.close();
dataStream.close();
return;
}

exchange.sendResponseHeaders(NOT_FOUND_RESPONSE, 0);
exchange.getResponseBody().close();
}
}
1 change: 1 addition & 0 deletions cli/src/main/resources/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Copy ReportViewer to a directory called `JPlag`
9 changes: 9 additions & 0 deletions cli/src/main/resources/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<html lang="en">
<head>
<title>JPlag Report Viewer</title>
<meta http-equiv="refresh" content="0; url=/JPlag/">
</head>
<body>
This page has moved. Moving to <a href="/JPlag/">/JPlag/</a>
</body>
</html>
29 changes: 29 additions & 0 deletions cli/src/test/java/de/jplag/cli/ReportViewerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package de.jplag.cli;

import static org.junit.jupiter.api.Assumptions.assumeTrue;

import java.awt.*;
import java.net.URI;
import java.util.concurrent.TimeUnit;

import javax.swing.*;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;

@Timeout(value = 5, unit = TimeUnit.MINUTES)
class ReportViewerTest {
@Test
void testStartViewer() throws Exception {
assumeTrue(Desktop.isDesktopSupported());
ReportViewer viewer = new ReportViewer();

int port = viewer.start();
Desktop.getDesktop().browse(URI.create("http://localhost:" + port));

// Open Dialog to keep the test running
JOptionPane.showMessageDialog(null, "Press OK to stop the server");
viewer.stop();
}

}
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@
<!--suppress UnresolvedMavenProperty -->
<sonar.coverage.jacoco.xmlReportPaths>${maven.multiModuleProjectDirectory}/coverage-report/target/site/jacoco-aggregate/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>

<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>20</maven.compiler.source>
<maven.compiler.target>20</maven.compiler.target>
<spotless.version>2.37.0</spotless.version>
<slf4j.version>2.0.7</slf4j.version>
<junit.version>5.9.3</junit.version>
Expand Down

0 comments on commit fd89367

Please sign in to comment.