aboutsummaryrefslogtreecommitdiff
path: root/src/support/lombok/website/RunSite.java
blob: ad4a3731083fce5803fa98b0a9781a124c5d4dec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package lombok.website;

import static spark.Spark.*;

import java.awt.Desktop;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import spark.Request;
import spark.Response;
import spark.Route;
import spark.resource.InputStreamResource;

public class RunSite {
	private static final int DEFAULT_PORT = 4569;
	private final Path base;
	
	public RunSite(Path base) {
		this.base = base;
	}
	
	public static void main(String[] args) throws Exception {
		boolean open = args.length > 1 && args[1].equals("open");
		new RunSite(Paths.get(args[0])).go(open);
	}
	
	private void go(boolean open) throws Exception {
		port(DEFAULT_PORT);
		get("/", serve("main.html"));
		get("/setup/overview", serve("setup/main.html"));
		get("/setup", serve("setup/main.html"));
		get("/features", serve("features/index.html"));
		get("/features/all", serve("features/index.html"));
		get("/features/experimental/all", serve("features/experimental/index.html"));
		get("/features/experimental", serve("features/experimental/index.html"));
		
		serveDir("/", base);
		
		System.out.println("Serving page from " + base + " -- hit enter to stop");
		if (open) Opener.open("http://localhost:" + DEFAULT_PORT + "/");
		System.in.read();
		System.exit(0);
	}
	
	private void serveDir(String sub, Path dir) throws IOException {
		DirectoryStream<Path> ds = Files.newDirectoryStream(dir);
		try {
			for (Path c : ds) {
				String n = c.getFileName().toString();
				if (n.equals(".") || n.equals("..")) continue;
				if (Files.isDirectory(c)) {
					serveDir(sub + n + "/", c);
					continue;
				}
				String rel = base.relativize(c).toString();
				get(sub + n, serve(rel));
				if (n.endsWith(".html")) get(sub + n.substring(0, n.length() - 5), serve(rel));
			}
		} finally {
			ds.close();
		}
	}
	
	private static class Opener {
		public static void open(String url) throws Exception {
			Desktop.getDesktop().browse(new URI(url));
		}
	}
	
	private Route serve(final String path) {
		final Path tgt = base.resolve(path);
		
		return new Route() {
			@Override public Object handle(Request req, Response res) throws Exception {
				res.type(mapMime(path));
				return Files.readAllBytes(tgt);
			}
		};
	}
	
	private String mapMime(String path) {
		if (path.endsWith(".css")) return "text/css; charset=UTF-8";
		if (path.endsWith(".js")) return "text/javascript; charset=UTF-8";
		if (path.endsWith(".png")) return "image/png";
		if (path.endsWith(".gif")) return "image/gif";
		if (path.endsWith(".jpg")) return "image/jpeg";
		if (path.endsWith(".mp4")) return "video/mp4";
		if (path.endsWith(".m4v")) return "video/mp4";
		if (path.endsWith(".ogv")) return "video/ogg";
		if (path.endsWith(".webm")) return "video/webm";
		if (path.endsWith(".ico")) return "image/x-icon";
		if (path.endsWith(".pdf")) return "application/pdf";
		if (path.endsWith(".json")) return "application/json";
		if (path.endsWith(".xml")) return "text/xml";
		if (path.endsWith(".woff")) return "font/woff";
		if (path.endsWith(".woff2")) return "font/woff2";
		if (path.endsWith(".html")) return "text/html; charset=UTF-8";
		return "text/plain; charset=UTF-8";
	}
}