Basic server working.
This commit is contained in:
parent
274f2efb2e
commit
ef56eebf7b
49
build.gradle
49
build.gradle
@ -1,5 +1,6 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'com.jessebrault.ssg' version '0.4.0'
|
id 'com.jessebrault.ssg' version '0.4.0'
|
||||||
|
id 'distribution'
|
||||||
}
|
}
|
||||||
|
|
||||||
group = 'com.jessebrault'
|
group = 'com.jessebrault'
|
||||||
@ -10,7 +11,51 @@ repositories {
|
|||||||
mavenLocal()
|
mavenLocal()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
configurations {
|
||||||
implementation 'org.apache.groovy:groovy:4.0.21'
|
server
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
server
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation 'org.apache.groovy:groovy:4.0.21'
|
||||||
|
|
||||||
|
serverImplementation 'org.eclipse.jetty:jetty-server:12.0.9'
|
||||||
|
serverImplementation 'info.picocli:picocli:4.7.6'
|
||||||
|
serverRuntimeOnly 'org.apache.logging.log4j:log4j-slf4j2-impl:2.23.1'
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register('serverJar', Jar) {
|
||||||
|
group = 'build'
|
||||||
|
archiveBaseName = 'jb-ssg-site-server'
|
||||||
|
from sourceSets.server.java.classesDirectory
|
||||||
|
from sourceSets.server.resources.files
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register('serverStartScripts', CreateStartScripts) {
|
||||||
|
applicationName = 'JbServer'
|
||||||
|
mainClass = 'com.jessebrault.site.JbServer'
|
||||||
|
classpath = files(configurations.serverRuntimeClasspath.files.collect {
|
||||||
|
java.nio.file.Path.of('lib', it.name).toFile()
|
||||||
|
})
|
||||||
|
classpath += files(tasks.named('serverJar', Jar).get().outputs.files.collect { it.name })
|
||||||
|
outputDir = file('build/tmp/serverStartScripts')
|
||||||
|
}
|
||||||
|
|
||||||
|
distributions {
|
||||||
|
server {
|
||||||
|
contents {
|
||||||
|
from(serverStartScripts) {
|
||||||
|
into 'bin'
|
||||||
|
}
|
||||||
|
from(serverJar) {
|
||||||
|
into 'lib'
|
||||||
|
}
|
||||||
|
from(configurations.serverRuntimeClasspath.files) {
|
||||||
|
into 'lib'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
64
src/server/java/com/jessebrault/site/JbHandler.java
Normal file
64
src/server/java/com/jessebrault/site/JbHandler.java
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
package com.jessebrault.site;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.Request;
|
||||||
|
import org.eclipse.jetty.server.Response;
|
||||||
|
import org.eclipse.jetty.util.Callback;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public final class JbHandler extends Handler.Abstract {
|
||||||
|
|
||||||
|
private static final Pattern extensionPattern = Pattern.compile("\\.(?<extension>.+)$");
|
||||||
|
|
||||||
|
private static String getExtension(String path) {
|
||||||
|
final var m = extensionPattern.matcher(path);
|
||||||
|
if (m.matches()) {
|
||||||
|
return m.group("extension");
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Path base;
|
||||||
|
|
||||||
|
public JbHandler(Path base) {
|
||||||
|
this.base = base;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handle(Request request, Response response, Callback callback) throws Exception {
|
||||||
|
final String path = request.getHttpURI().getDecodedPath();
|
||||||
|
String relative;
|
||||||
|
if (path.length() > 1) {
|
||||||
|
final String withoutStartSlash = path.substring(1);
|
||||||
|
if (withoutStartSlash.endsWith("/")) {
|
||||||
|
relative = withoutStartSlash + "index.html";
|
||||||
|
} else {
|
||||||
|
relative = withoutStartSlash;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
relative = "index.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
final String extension = getExtension(relative);
|
||||||
|
if (extension == null) {
|
||||||
|
relative = relative + ".html";
|
||||||
|
}
|
||||||
|
|
||||||
|
final Path resolved = base.resolve(relative);
|
||||||
|
if (!Files.exists(resolved)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
try (final var inputStream = Files.newInputStream(resolved)) {
|
||||||
|
final ByteBuffer byteBuffer = ByteBuffer.wrap(inputStream.readAllBytes());
|
||||||
|
response.write(true, byteBuffer, callback);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
60
src/server/java/com/jessebrault/site/JbServer.java
Normal file
60
src/server/java/com/jessebrault/site/JbServer.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package com.jessebrault.site;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.handler.DefaultHandler;
|
||||||
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import picocli.CommandLine;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
@CommandLine.Command(
|
||||||
|
name = "jbServer",
|
||||||
|
description = "The main server for jessebrault.com.",
|
||||||
|
mixinStandardHelpOptions = true
|
||||||
|
)
|
||||||
|
public class JbServer implements Runnable {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new CommandLine(new JbServer()).execute(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(JbServer.class);
|
||||||
|
|
||||||
|
@CommandLine.Option(names = "--watch")
|
||||||
|
private boolean watch;
|
||||||
|
|
||||||
|
@CommandLine.Option(names = { "-p", "--port" }, defaultValue = "8080")
|
||||||
|
private int port;
|
||||||
|
|
||||||
|
@CommandLine.Option(names = { "-b", "--base" }, defaultValue = "dist/default")
|
||||||
|
private Path base;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final var queuedThreadPool = new QueuedThreadPool();
|
||||||
|
queuedThreadPool.setName("jbServer");
|
||||||
|
|
||||||
|
final var server = new Server(queuedThreadPool);
|
||||||
|
|
||||||
|
final var connector = new ServerConnector(server);
|
||||||
|
connector.setPort(this.port);
|
||||||
|
server.addConnector(connector);
|
||||||
|
|
||||||
|
final Handler.Sequence sequence = new Handler.Sequence();
|
||||||
|
sequence.addHandler(new JbHandler(this.base));
|
||||||
|
sequence.addHandler(new DefaultHandler());
|
||||||
|
server.setHandler(sequence);
|
||||||
|
|
||||||
|
try {
|
||||||
|
server.start();
|
||||||
|
logger.info("Server started on port {}.", this.port);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
17
src/server/resources/log4j2.xml
Normal file
17
src/server/resources/log4j2.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config">
|
||||||
|
<Appenders>
|
||||||
|
<Console name="root">
|
||||||
|
<PatternLayout>
|
||||||
|
<LevelPatternSelector defaultPattern="[%t] %-5level %logger{1.} %msg%n">
|
||||||
|
<PatternMatch key="DEBUG" pattern="[%t] %-5level %logger{1.}.%M() %msg%n" />
|
||||||
|
</LevelPatternSelector>
|
||||||
|
</PatternLayout>
|
||||||
|
</Console>
|
||||||
|
</Appenders>
|
||||||
|
<Loggers>
|
||||||
|
<Root level="INFO">
|
||||||
|
<AppenderRef ref="root" />
|
||||||
|
</Root>
|
||||||
|
</Loggers>
|
||||||
|
</Configuration>
|
Loading…
Reference in New Issue
Block a user