feature/undertow #4

Merged
manuel merged 15 commits from feature/undertow into master 2023-04-08 22:40:46 +02:00
Showing only changes of commit f99efcdad7 - Show all commits

View file

@ -6,19 +6,11 @@ import io.undertow.Undertow;
import io.undertow.server.RoutingHandler; import io.undertow.server.RoutingHandler;
import io.undertow.server.handlers.RedirectHandler; import io.undertow.server.handlers.RedirectHandler;
import io.undertow.util.StatusCodes; import io.undertow.util.StatusCodes;
import io.vavr.collection.HashMap;
import io.vavr.collection.HashSet;
import io.vavr.collection.Map;
import io.vavr.collection.Set;
import io.vavr.collection.Stream;
import io.vavr.control.Option;
import io.vavr.control.Try; import io.vavr.control.Try;
import lombok.NonNull; import lombok.NonNull;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.Nullable;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.function.Function;
@Slf4j @Slf4j
public class LabyrinthServer { public class LabyrinthServer {
@ -31,7 +23,7 @@ public class LabyrinthServer {
return serverOption; return serverOption;
} }
public LabyrinthServer(@NonNull final ServerConfig config) { private LabyrinthServer(@NonNull final ServerConfig config) {
log.info("Starting Server at http://{}:{}/", config.getAddress().getHostAddress(), config.getPort()); log.info("Starting Server at http://{}:{}/", config.getAddress().getHostAddress(), config.getPort());
final RoutingHandler routingHandler = new RoutingHandler().get("/", new RedirectHandler("/create/text")) final RoutingHandler routingHandler = new RoutingHandler().get("/", new RedirectHandler("/create/text"))
.get("/create", new RedirectHandler("/create/text")) .get("/create", new RedirectHandler("/create/text"))
@ -49,7 +41,7 @@ public class LabyrinthServer {
.build(); .build();
} }
public void start() { private void start() {
Runtime.getRuntime().addShutdownHook(new Thread(this::stop, "listener-stopper")); Runtime.getRuntime().addShutdownHook(new Thread(this::stop, "listener-stopper"));
this.undertow.start(); this.undertow.start();
Try.of(() -> (InetSocketAddress) this.undertow.getListenerInfo().get(0).getAddress()) Try.of(() -> (InetSocketAddress) this.undertow.getListenerInfo().get(0).getAddress())
@ -57,7 +49,7 @@ public class LabyrinthServer {
.forEach(address -> log.info("Listening on http://{}:{}", address.getHostString(), address.getPort())); .forEach(address -> log.info("Listening on http://{}:{}", address.getHostString(), address.getPort()));
} }
public void stop() { private void stop() {
log.info("Stopping server ..."); log.info("Stopping server ...");
this.undertow.stop(); this.undertow.stop();
log.info("Server stopped."); log.info("Server stopped.");
@ -131,41 +123,41 @@ public class LabyrinthServer {
// }); // });
// } // }
@NonNull // @NonNull
private Map<RequestParameter, String> parseQueryString(@Nullable final String query) { // private Map<RequestParameter, String> parseQueryString(@Nullable final String query) {
if (query == null) { // if (query == null) {
return HashMap.empty(); // return HashMap.empty();
} // }
HashMap<RequestParameter, String> result = HashMap.empty(); // HashMap<RequestParameter, String> result = HashMap.empty();
final String[] parts = query.split("&"); // final String[] parts = query.split("&");
for (final String part : parts) { // for (final String part : parts) {
final int split = part.indexOf('='); // final int split = part.indexOf('=');
if (split == -1) { // if (split == -1) {
final Try<RequestParameter> tryKey = Try.of(() -> this.normalizeParameterName(part)); // final Try<RequestParameter> tryKey = Try.of(() -> this.normalizeParameterName(part));
if (tryKey.isSuccess()) { // if (tryKey.isSuccess()) {
result = result.put(tryKey.get(), null); // result = result.put(tryKey.get(), null);
} // }
} else { // } else {
final String key = part.substring(0, split); // final String key = part.substring(0, split);
final String value = part.substring(split + 1); // final String value = part.substring(split + 1);
final Try<RequestParameter> tryKey = Try.of(() -> this.normalizeParameterName(key)); // final Try<RequestParameter> tryKey = Try.of(() -> this.normalizeParameterName(key));
if (tryKey.isSuccess()) { // if (tryKey.isSuccess()) {
result = result.put(tryKey.get(), value); // result = result.put(tryKey.get(), value);
} // }
} // }
} // }
return result; // return result;
} // }
private RequestParameter normalizeParameterName(final String paramName) { // private RequestParameter normalizeParameterName(final String paramName) {
return RequestParameter.parseName(paramName).get(); // return RequestParameter.parseName(paramName).get();
} // }
private <T> T getOrDefault(@NonNull final Option<String> input, // private <T> T getOrDefault(@NonNull final Option<String> input,
@NonNull final Function<String, T> mapper, // @NonNull final Function<String, T> mapper,
@Nullable final T defaultValue) { // @Nullable final T defaultValue) {
return input.toTry().map(mapper).getOrElse(defaultValue); // return input.toTry().map(mapper).getOrElse(defaultValue);
} // }
// private void handleRender(final HttpExchange exchange) { // private void handleRender(final HttpExchange exchange) {
// this.executorService.submit(() -> { // this.executorService.submit(() -> {
@ -211,22 +203,22 @@ public class LabyrinthServer {
// }); // });
// } // }
private enum RequestParameter { // private enum RequestParameter {
WIDTH("w", "width"), // WIDTH("w", "width"),
HEIGHT("h", "height"), // HEIGHT("h", "height"),
ID("i", "id"), // ID("i", "id"),
OUTPUT("o", "output"); // OUTPUT("o", "output");
private final Set<String> names; // private final Set<String> names;
//
RequestParameter(@NonNull final String... names) { // RequestParameter(@NonNull final String... names) {
this.names = HashSet.of(names); // this.names = HashSet.of(names);
} // }
//
static Option<RequestParameter> parseName(@Nullable final String name) { // static Option<RequestParameter> parseName(@Nullable final String name) {
if (name == null) { // if (name == null) {
return Option.none(); // return Option.none();
} // }
return Stream.of(values()).find(param -> param.names.exists(name::equalsIgnoreCase)); // return Stream.of(values()).find(param -> param.names.exists(name::equalsIgnoreCase));
} // }
} // }
} }