From 100e2aec8c92f88f62684c81a8a112cc21946f02 Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Fri, 23 Jan 2026 23:59:15 +0100 Subject: [PATCH 01/11] Update tons of dependencies. --- pom.xml | 14 ++++---- .../ch/fritteli/maze/server/Algorithm.java | 18 +++++----- .../maze/server/ConfigurationException.java | 2 +- .../InvalidRequestParameterException.java | 4 +-- .../java/ch/fritteli/maze/server/Main.java | 2 +- .../ch/fritteli/maze/server/MazeServer.java | 12 +++---- .../ch/fritteli/maze/server/OutputType.java | 30 ++++++++-------- .../ch/fritteli/maze/server/ServerConfig.java | 34 +++++++++---------- .../server/handler/AbstractHttpHandler.java | 8 ++--- .../maze/server/handler/CreateHandler.java | 13 +++---- .../handler/ParametersToMazeExtractor.java | 16 ++++----- .../maze/server/handler/RenderV1Handler.java | 8 ++--- .../maze/server/handler/RenderV2Handler.java | 8 ++--- .../maze/server/handler/RenderV3Handler.java | 8 ++--- .../maze/server/handler/RenderVxHandler.java | 14 ++++---- .../maze/server/handler/RequestParameter.java | 18 +++++----- 16 files changed, 105 insertions(+), 104 deletions(-) diff --git a/pom.xml b/pom.xml index 00b72a6..a0f87c3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,13 +5,14 @@ ch.fritteli fritteli-build-parent - 5.1.0 + 6.1.0 ch.fritteli.a-maze-r maze-server 0.2.1-SNAPSHOT + A-Maze-R Server The A-Maze-R server, offering a REST endpoint to access the Maze Generator. https://manuel.friedli.info/maze.html 2022 @@ -55,9 +56,9 @@ - 0.3.0 - 4.0.0-M8 - 2.3.18.Final + 0.4.0 + 4.0.0-M16 + 2.3.22.Final @@ -75,8 +76,8 @@ lombok - org.jetbrains - annotations + org.jspecify + jspecify org.slf4j @@ -98,7 +99,6 @@ org.assertj assertj-core - test diff --git a/src/main/java/ch/fritteli/maze/server/Algorithm.java b/src/main/java/ch/fritteli/maze/server/Algorithm.java index 6d4f29f..1cd5d95 100644 --- a/src/main/java/ch/fritteli/maze/server/Algorithm.java +++ b/src/main/java/ch/fritteli/maze/server/Algorithm.java @@ -8,8 +8,8 @@ import io.vavr.collection.List; import io.vavr.collection.Stream; import io.vavr.control.Option; import lombok.Getter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.function.Function; @@ -17,20 +17,20 @@ public enum Algorithm { RANDOM_DEPTH_FIRST(RandomDepthFirst::new, "random", "random-depth-first"), WILSON(Wilson::new, "wilson"); - @NotNull + @NonNull private final Function creator; @Getter - @NotNull + @NonNull private final List names; - Algorithm(@NotNull final Function creator, - @NotNull final String... names) { + Algorithm(@NonNull final Function creator, + @NonNull final String... names) { this.creator = creator; this.names = List.of(names); } - @NotNull + @NonNull public static Option ofString(@Nullable final String name) { return Option.of(name) .map(String::toLowerCase) @@ -38,8 +38,8 @@ public enum Algorithm { .find(algorithm -> algorithm.getNames().contains(nameLC))); } - @NotNull - public MazeGeneratorAlgorithm createAlgorithm(@NotNull final Maze maze) { + @NonNull + public MazeGeneratorAlgorithm createAlgorithm(@NonNull final Maze maze) { return this.creator.apply(maze); } } diff --git a/src/main/java/ch/fritteli/maze/server/ConfigurationException.java b/src/main/java/ch/fritteli/maze/server/ConfigurationException.java index 1159634..d1d659a 100644 --- a/src/main/java/ch/fritteli/maze/server/ConfigurationException.java +++ b/src/main/java/ch/fritteli/maze/server/ConfigurationException.java @@ -1,6 +1,6 @@ package ch.fritteli.maze.server; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class ConfigurationException extends RuntimeException { public ConfigurationException(@Nullable final String message) { diff --git a/src/main/java/ch/fritteli/maze/server/InvalidRequestParameterException.java b/src/main/java/ch/fritteli/maze/server/InvalidRequestParameterException.java index a103796..dff5ff0 100644 --- a/src/main/java/ch/fritteli/maze/server/InvalidRequestParameterException.java +++ b/src/main/java/ch/fritteli/maze/server/InvalidRequestParameterException.java @@ -1,9 +1,9 @@ package ch.fritteli.maze.server; -import org.wildfly.common.annotation.NotNull; +import org.jspecify.annotations.NonNull; public class InvalidRequestParameterException extends RuntimeException { - public InvalidRequestParameterException(@NotNull final String s) { + public InvalidRequestParameterException(@NonNull final String s) { super(s); } } diff --git a/src/main/java/ch/fritteli/maze/server/Main.java b/src/main/java/ch/fritteli/maze/server/Main.java index 687fa4d..9781817 100644 --- a/src/main/java/ch/fritteli/maze/server/Main.java +++ b/src/main/java/ch/fritteli/maze/server/Main.java @@ -7,7 +7,7 @@ import lombok.extern.slf4j.Slf4j; @UtilityClass public class Main { - public static void main(String[] args) { + static void main() { MazeServer.createAndStartServer() .onFailure(e -> log.error("Failed to create server. Stopping.", e)); } diff --git a/src/main/java/ch/fritteli/maze/server/MazeServer.java b/src/main/java/ch/fritteli/maze/server/MazeServer.java index f864975..4a22f68 100644 --- a/src/main/java/ch/fritteli/maze/server/MazeServer.java +++ b/src/main/java/ch/fritteli/maze/server/MazeServer.java @@ -9,17 +9,17 @@ import io.undertow.Undertow; import io.undertow.server.RoutingHandler; import io.vavr.control.Try; import lombok.extern.slf4j.Slf4j; -import org.wildfly.common.annotation.NotNull; +import org.jspecify.annotations.NonNull; import java.net.InetSocketAddress; @Slf4j public class MazeServer { - @NotNull + @NonNull private final Undertow undertow; - private MazeServer(@NotNull final ServerConfig config) { + private MazeServer(@NonNull final ServerConfig config) { final String hostAddress = config.address().getHostAddress(); final int port = config.port(); log.info("Starting Server at http://{}:{}/", hostAddress, port); @@ -36,14 +36,14 @@ public class MazeServer { .build(); } - @NotNull + @NonNull public static Try createAndStartServer() { return Try.of(ServerConfig::init) .flatMapTry(MazeServer::createAndStartServer); } - @NotNull - public static Try createAndStartServer(@NotNull final ServerConfig config) { + @NonNull + public static Try createAndStartServer(@NonNull final ServerConfig config) { return Try.of(() -> new MazeServer(config)) .peek(MazeServer::start); } diff --git a/src/main/java/ch/fritteli/maze/server/OutputType.java b/src/main/java/ch/fritteli/maze/server/OutputType.java index ad8d25d..3c637e9 100644 --- a/src/main/java/ch/fritteli/maze/server/OutputType.java +++ b/src/main/java/ch/fritteli/maze/server/OutputType.java @@ -12,8 +12,8 @@ import io.vavr.collection.List; import io.vavr.collection.Stream; import io.vavr.control.Option; import lombok.Getter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.nio.charset.StandardCharsets; import java.util.function.Function; @@ -75,24 +75,24 @@ public enum OutputType { "3", "binaryv3"); @Getter - @NotNull + @NonNull private final String contentType; @Getter - @NotNull + @NonNull private final String fileExtension; - @NotNull - private final Function render; + @NonNull + private final Function<@NonNull Maze, byte @NonNull []> render; @Getter private final boolean attachment; @Getter - @NotNull + @NonNull private final List names; - OutputType(@NotNull final String contentType, - @NotNull final String fileExtension, - @NotNull final Function render, + OutputType(@NonNull final String contentType, + @NonNull final String fileExtension, + @NonNull final Function render, final boolean attachment, - @NotNull final String... names) { + @NonNull final String... names) { this.contentType = contentType; this.render = render; this.fileExtension = fileExtension; @@ -100,7 +100,7 @@ public enum OutputType { this.names = List.of(names); } - @NotNull + @NonNull public static Option ofString(@Nullable final String name) { return Option.of(name) .map(String::toLowerCase) @@ -109,14 +109,14 @@ public enum OutputType { } - @NotNull + @NonNull @Override public String toString() { return this.names.last(); } - @NotNull - public byte[] render(@NotNull final Maze maze) { + @NonNull + public byte[] render(@NonNull final Maze maze) { return this.render.apply(maze); } } diff --git a/src/main/java/ch/fritteli/maze/server/ServerConfig.java b/src/main/java/ch/fritteli/maze/server/ServerConfig.java index 401fd6d..645589b 100644 --- a/src/main/java/ch/fritteli/maze/server/ServerConfig.java +++ b/src/main/java/ch/fritteli/maze/server/ServerConfig.java @@ -3,25 +3,25 @@ package ch.fritteli.maze.server; import io.vavr.control.Option; import io.vavr.control.Try; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.net.InetAddress; @Slf4j -public record ServerConfig(@NotNull InetAddress address, +public record ServerConfig(@NonNull InetAddress address, int port, - @NotNull Option maxMazeHeight, - @NotNull Option maxMazeWidth) { + @NonNull Option maxMazeHeight, + @NonNull Option maxMazeWidth) { public static final String SYSPROP_HOST = "fritteli.maze.server.host"; public static final String SYSPROP_PORT = "fritteli.maze.server.port"; public static final String SYSPROP_MAX_MAZE_HEIGHT = "fritteli.maze.maxheight"; public static final String SYSPROP_MAX_MAZE_WIDTH = "fritteli.maze.maxwidth"; - public ServerConfig(@NotNull final InetAddress address, + public ServerConfig(@NonNull final InetAddress address, final int port, - @NotNull final Option maxMazeHeight, - @NotNull final Option maxMazeWidth) { + @NonNull final Option maxMazeHeight, + @NonNull final Option maxMazeWidth) { this.address = address; this.port = validatePort(port); this.maxMazeHeight = validateDimension(maxMazeHeight, "height"); @@ -31,13 +31,13 @@ public record ServerConfig(@NotNull InetAddress address, public ServerConfig(@Nullable final String address, final int port, - @NotNull final Option maxMazeHeight, - @NotNull final Option maxMazeWidth) + @NonNull final Option maxMazeHeight, + @NonNull final Option maxMazeWidth) throws ConfigurationException { this(validateAddress(address), port, maxMazeHeight, maxMazeWidth); } - @NotNull + @NonNull public static ServerConfig init() throws ConfigurationException { final String host = System.getProperty(SYSPROP_HOST); final String portString = System.getProperty(SYSPROP_PORT); @@ -49,7 +49,7 @@ public record ServerConfig(@NotNull InetAddress address, return new ServerConfig(host, port, maxMazeHeight, maxMazeWidth); } - @NotNull + @NonNull private static InetAddress validateAddress(@Nullable final String address) throws ConfigurationException { return Try.of(() -> InetAddress.getByName(address)) .getOrElseThrow(cause -> new ConfigurationException( @@ -77,9 +77,9 @@ public record ServerConfig(@NotNull InetAddress address, )); } - @NotNull - private static Option validateDimension(@NotNull final Option dimension, - @NotNull final String identifier) { + @NonNull + private static Option validateDimension(@NonNull final Option dimension, + @NonNull final String identifier) { if (dimension.exists(d -> d <= 1)) { throw new ConfigurationException("Maximum %s must be greater than 1: %s" .formatted(identifier, dimension.get())); @@ -88,8 +88,8 @@ public record ServerConfig(@NotNull InetAddress address, } private static Option validateDimension(@Nullable final String dimensionString, - @NotNull final String identifier, - @NotNull final String syspropName) { + @NonNull final String identifier, + @NonNull final String syspropName) { if (dimensionString == null) { log.info("No maximum {} configured; using default (unlimited).", identifier); return Option.none(); diff --git a/src/main/java/ch/fritteli/maze/server/handler/AbstractHttpHandler.java b/src/main/java/ch/fritteli/maze/server/handler/AbstractHttpHandler.java index f129b5f..c96a668 100644 --- a/src/main/java/ch/fritteli/maze/server/handler/AbstractHttpHandler.java +++ b/src/main/java/ch/fritteli/maze/server/handler/AbstractHttpHandler.java @@ -4,7 +4,7 @@ import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; import io.undertow.util.StatusCodes; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import org.slf4j.MDC; import java.time.Instant; @@ -14,9 +14,9 @@ import java.util.UUID; @Slf4j public abstract class AbstractHttpHandler implements HttpHandler { @Override - public final void handleRequest(@NotNull final HttpServerExchange exchange) { + public final void handleRequest(@NonNull final HttpServerExchange exchange) { final Instant start = Instant.now(); - try (final MDC.MDCCloseable closeable = MDC.putCloseable("correlationId", UUID.randomUUID().toString())) { + try (final MDC.MDCCloseable _ = MDC.putCloseable("correlationId", UUID.randomUUID().toString())) { if (exchange.isInIoThread()) { log.debug("Dispatching request"); @@ -35,5 +35,5 @@ public abstract class AbstractHttpHandler implements HttpHandler { } } - protected abstract void handle(@NotNull final HttpServerExchange exchange) throws Exception; + protected abstract void handle(@NonNull final HttpServerExchange exchange) throws Exception; } diff --git a/src/main/java/ch/fritteli/maze/server/handler/CreateHandler.java b/src/main/java/ch/fritteli/maze/server/handler/CreateHandler.java index 8eb8f0f..f082dbc 100644 --- a/src/main/java/ch/fritteli/maze/server/handler/CreateHandler.java +++ b/src/main/java/ch/fritteli/maze/server/handler/CreateHandler.java @@ -10,7 +10,7 @@ import io.undertow.util.StatusCodes; import io.vavr.control.Option; import io.vavr.control.Try; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import org.slf4j.MDC; import java.nio.ByteBuffer; @@ -23,18 +23,18 @@ import java.util.Map; public class CreateHandler extends AbstractHttpHandler { public static final String PATH_TEMPLATE = "/create/{output}"; - @NotNull + @NonNull private final Option maxHeight; - @NotNull + @NonNull private final Option maxWidth; - public CreateHandler(@NotNull final Option maxHeight, @NotNull final Option maxWidth) { + public CreateHandler(@NonNull final Option maxHeight, @NonNull final Option maxWidth) { this.maxHeight = maxHeight; this.maxWidth = maxWidth; } @Override - protected void handle(@NotNull final HttpServerExchange exchange) { + protected void handle(@NonNull final HttpServerExchange exchange) { final Instant start = Instant.now(); log.debug("Handling create request"); this.createMazeFromRequestParameters(exchange.getQueryParameters()) @@ -65,6 +65,7 @@ public class CreateHandler extends AbstractHttpHandler { final long durationMillis = start.until(Instant.now(), ChronoUnit.MILLIS); exchange.getResponseHeaders() .put(Headers.CONTENT_TYPE, outputType.getContentType()) + .put(HttpString.tryFromString("Access-Control-Allow-Origin"), "*") .put(HttpString.tryFromString("X-Maze-ID"), String.valueOf(maze.getRandomSeed())) .put(HttpString.tryFromString("X-Maze-Width"), String.valueOf(maze.getWidth())) .put(HttpString.tryFromString("X-Maze-Height"), String.valueOf(maze.getHeight())) @@ -84,7 +85,7 @@ public class CreateHandler extends AbstractHttpHandler { }); } - @NotNull + @NonNull private Try createMazeFromRequestParameters(final Map> queryParameters) { return new ParametersToMazeExtractor(queryParameters, this.maxHeight, this.maxWidth).createMaze(); } diff --git a/src/main/java/ch/fritteli/maze/server/handler/ParametersToMazeExtractor.java b/src/main/java/ch/fritteli/maze/server/handler/ParametersToMazeExtractor.java index 93f9964..d844be1 100644 --- a/src/main/java/ch/fritteli/maze/server/handler/ParametersToMazeExtractor.java +++ b/src/main/java/ch/fritteli/maze/server/handler/ParametersToMazeExtractor.java @@ -10,7 +10,7 @@ import io.vavr.collection.Stream; import io.vavr.control.Option; import io.vavr.control.Try; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import java.util.Deque; import java.util.Map; @@ -19,14 +19,14 @@ import java.util.Random; @RequiredArgsConstructor class ParametersToMazeExtractor { - @NotNull + @NonNull private final Map> queryParameters; - @NotNull + @NonNull private final Option maxHeight; - @NotNull + @NonNull private final Option maxWidth; - @NotNull + @NonNull Try createMaze() { final Option output = getParameterValue(RequestParameter.OUTPUT); final Option width = getParameterValue(RequestParameter.WIDTH); @@ -87,11 +87,11 @@ class ParametersToMazeExtractor { }); } - @NotNull - private Option getParameterValue(@NotNull final RequestParameter parameter) { + @NonNull + private Option getParameterValue(@NonNull final RequestParameter parameter) { return parameter.getParameterValue(this.queryParameters); } - public record GeneratedMaze(@NotNull Maze maze, @NotNull OutputType outputType) { + public record GeneratedMaze(@NonNull Maze maze, @NonNull OutputType outputType) { } } diff --git a/src/main/java/ch/fritteli/maze/server/handler/RenderV1Handler.java b/src/main/java/ch/fritteli/maze/server/handler/RenderV1Handler.java index 82165df..47aa5ca 100644 --- a/src/main/java/ch/fritteli/maze/server/handler/RenderV1Handler.java +++ b/src/main/java/ch/fritteli/maze/server/handler/RenderV1Handler.java @@ -8,7 +8,7 @@ import io.undertow.util.HeaderValues; import io.undertow.util.Headers; import io.undertow.util.StatusCodes; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; @@ -18,7 +18,7 @@ public class RenderV1Handler extends AbstractHttpHandler { public static final String PATH_TEMPLATE = "/render/v1/{output}"; @Override - public void handle(@NotNull final HttpServerExchange exchange) { + public void handle(@NonNull final HttpServerExchange exchange) { log.debug("Handling render request"); if (exchange.isInIoThread()) { @@ -47,8 +47,8 @@ public class RenderV1Handler extends AbstractHttpHandler { }); } - @NotNull - private OutputType getOutputType(@NotNull final HttpServerExchange httpServerExchange) { + @NonNull + private OutputType getOutputType(@NonNull final HttpServerExchange httpServerExchange) { return RequestParameter.OUTPUT.getParameterValue(httpServerExchange.getQueryParameters()) .getOrElse(() -> { final HeaderValues accept = httpServerExchange.getRequestHeaders().get(Headers.ACCEPT); diff --git a/src/main/java/ch/fritteli/maze/server/handler/RenderV2Handler.java b/src/main/java/ch/fritteli/maze/server/handler/RenderV2Handler.java index bd4a856..9d97787 100644 --- a/src/main/java/ch/fritteli/maze/server/handler/RenderV2Handler.java +++ b/src/main/java/ch/fritteli/maze/server/handler/RenderV2Handler.java @@ -8,7 +8,7 @@ import io.undertow.util.HeaderValues; import io.undertow.util.Headers; import io.undertow.util.StatusCodes; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; @@ -18,7 +18,7 @@ public class RenderV2Handler extends AbstractHttpHandler { public static final String PATH_TEMPLATE = "/render/v2/{output}"; @Override - public void handle(@NotNull final HttpServerExchange exchange) { + public void handle(@NonNull final HttpServerExchange exchange) { log.debug("Handling render request"); if (exchange.isInIoThread()) { @@ -47,8 +47,8 @@ public class RenderV2Handler extends AbstractHttpHandler { }); } - @NotNull - private OutputType getOutputType(@NotNull final HttpServerExchange httpServerExchange) { + @NonNull + private OutputType getOutputType(@NonNull final HttpServerExchange httpServerExchange) { return RequestParameter.OUTPUT.getParameterValue(httpServerExchange.getQueryParameters()) .getOrElse(() -> { final HeaderValues accept = httpServerExchange.getRequestHeaders().get(Headers.ACCEPT); diff --git a/src/main/java/ch/fritteli/maze/server/handler/RenderV3Handler.java b/src/main/java/ch/fritteli/maze/server/handler/RenderV3Handler.java index 0b8987e..f83b0ae 100644 --- a/src/main/java/ch/fritteli/maze/server/handler/RenderV3Handler.java +++ b/src/main/java/ch/fritteli/maze/server/handler/RenderV3Handler.java @@ -8,7 +8,7 @@ import io.undertow.util.HeaderValues; import io.undertow.util.Headers; import io.undertow.util.StatusCodes; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; @@ -18,7 +18,7 @@ public class RenderV3Handler extends AbstractHttpHandler { public static final String PATH_TEMPLATE = "/render/v3/{output}"; @Override - public void handle(@NotNull final HttpServerExchange exchange) { + public void handle(@NonNull final HttpServerExchange exchange) { log.debug("Handling render request"); if (exchange.isInIoThread()) { @@ -47,8 +47,8 @@ public class RenderV3Handler extends AbstractHttpHandler { }); } - @NotNull - private OutputType getOutputType(@NotNull final HttpServerExchange httpServerExchange) { + @NonNull + private OutputType getOutputType(@NonNull final HttpServerExchange httpServerExchange) { return RequestParameter.OUTPUT.getParameterValue(httpServerExchange.getQueryParameters()) .getOrElse(() -> { final HeaderValues accept = httpServerExchange.getRequestHeaders().get(Headers.ACCEPT); diff --git a/src/main/java/ch/fritteli/maze/server/handler/RenderVxHandler.java b/src/main/java/ch/fritteli/maze/server/handler/RenderVxHandler.java index 5db984f..8b09118 100644 --- a/src/main/java/ch/fritteli/maze/server/handler/RenderVxHandler.java +++ b/src/main/java/ch/fritteli/maze/server/handler/RenderVxHandler.java @@ -12,7 +12,7 @@ import io.undertow.util.HeaderValues; import io.undertow.util.Headers; import io.undertow.util.StatusCodes; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; @@ -21,7 +21,7 @@ public class RenderVxHandler implements HttpHandler { public static final String PATH_TEMPLATE = "/render/dyn/{output}"; @Override - public void handleRequest(@NotNull final HttpServerExchange exchange) { + public void handleRequest(@NonNull final HttpServerExchange exchange) { log.debug("Handling render request"); if (exchange.isInIoThread()) { @@ -55,8 +55,8 @@ public class RenderVxHandler implements HttpHandler { }); } - @NotNull - private Version getVersion(@NotNull final byte[] bytes) throws IllegalArgumentException { + @NonNull + private Version getVersion(final byte @NonNull [] bytes) throws IllegalArgumentException { if (bytes.length < 3) { throw new IllegalArgumentException("Invalid input: too short"); } @@ -73,8 +73,8 @@ public class RenderVxHandler implements HttpHandler { } } - @NotNull - private OutputType getOutputType(@NotNull final HttpServerExchange httpServerExchange) { + @NonNull + private OutputType getOutputType(@NonNull final HttpServerExchange httpServerExchange) { return RequestParameter.OUTPUT.getParameterValue(httpServerExchange.getQueryParameters()) .getOrElse(() -> { final HeaderValues accept = httpServerExchange.getRequestHeaders().get(Headers.ACCEPT); @@ -86,6 +86,6 @@ public class RenderVxHandler implements HttpHandler { } private enum Version { - V1, V2, V3; + V1, V2, V3 } } diff --git a/src/main/java/ch/fritteli/maze/server/handler/RequestParameter.java b/src/main/java/ch/fritteli/maze/server/handler/RequestParameter.java index 5cdd893..b1d39c2 100644 --- a/src/main/java/ch/fritteli/maze/server/handler/RequestParameter.java +++ b/src/main/java/ch/fritteli/maze/server/handler/RequestParameter.java @@ -11,7 +11,7 @@ import io.vavr.control.Option; import io.vavr.control.Try; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import java.util.Deque; import java.util.Map; @@ -25,7 +25,7 @@ enum RequestParameter { HEIGHT(p -> Try.of(() -> Integer.parseInt(p)) .toOption() .onEmpty(() -> log.debug("Unparseable value for parameter 'height': '{}'", p)), "h", "height"), - ID(p -> Try.of(() -> Long.parseLong(p)) + ID(p -> Try.of(() -> Long.parseUnsignedLong(p, 16)) .toOption() .onEmpty(() -> log.debug("Unparseable value for parameter 'id': '{}'", p)), "i", "id"), OUTPUT(p -> OutputType.ofString(p) @@ -48,24 +48,24 @@ enum RequestParameter { .onEmpty(() -> log.debug("Unparseable value for parameter 'end': '{}'", p)), "e", "end"), ALGORITHM(p -> Algorithm.ofString(p) .onEmpty(() -> log.debug("Unparseable value for parameter 'algorithm': '{}'", p)), "a", "algorithm"); - @NotNull + @NonNull private final Function> extractor; @Getter - @NotNull + @NonNull private final Set names; - RequestParameter(@NotNull final Function> extractor, @NotNull final String... names) { + RequestParameter(@NonNull final Function> extractor, @NonNull final String... names) { this.extractor = extractor; this.names = HashSet.of(names); } - @NotNull - Option extractParameterValue(@NotNull final String parameter) { + @NonNull + Option extractParameterValue(@NonNull final String parameter) { return this.extractor.apply(parameter); } - @NotNull - public Option getParameterValue(@NotNull final Map> queryParameters) { + @NonNull + public Option getParameterValue(@NonNull final Map> queryParameters) { return (Option) HashMap.ofAll(queryParameters) .filterKeys(this.names::contains) .flatMap(Tuple2::_2) From e945a12a6e882b8979bedcf6a5a8ec096fc76dd6 Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 00:13:36 +0100 Subject: [PATCH 02/11] Switch to main branch and use Java25 as build image; also use Java25b as base docker image. --- .drone.yml | 40 ++++++++++++++++++++-------------------- docker/Dockerfile | 4 ++-- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.drone.yml b/.drone.yml index a282745..17a564c 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,39 +3,39 @@ type: docker name: default steps: - name: build - image: maven:3.9-eclipse-temurin-21 + image: maven:3.9-eclipse-temurin-25 commands: - mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V when: ref: include: - - refs/head/master + - refs/head/main - refs/head/feature/** - refs/tags/** - name: test - image: maven:3.9-eclipse-temurin-21 + image: maven:3.9-eclipse-temurin-25 commands: - mvn test -B when: branch: include: - - master + - main - feature/* - - name: deploy - image: maven:3.9-eclipse-temurin-21 - environment: - REPO_TOKEN: - from_secret: repo-token - REPO_TOKEN_OSSRH: - from_secret: repo-token-ossrh - commands: - - mvn -s maven-settings.xml deploy -DskipTests=true - when: - branch: - - master - event: - exclude: - - pull_request +# - name: deploy +# image: maven:3.9-eclipse-temurin-25 +# environment: +# REPO_TOKEN: +# from_secret: repo-token +# REPO_TOKEN_OSSRH: +# from_secret: repo-token-ossrh +# commands: +# - mvn -s maven-settings.xml deploy -DskipTests=true +# when: +# branch: +# - main +# event: +# exclude: +# - pull_request - name: build_docker_image image: plugins/docker settings: @@ -49,7 +49,7 @@ steps: dockerfile: docker/Dockerfile when: branch: - - master + - main event: exclude: - pull_request diff --git a/docker/Dockerfile b/docker/Dockerfile index 74a2661..0c6ac00 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,7 +1,7 @@ -FROM eclipse-temurin:21-jre +FROM eclipse-temurin:25-jre-alpine COPY target/maze-server-*.jar /app/ -RUN rm /app/*-sources.jar +RUN rm /app/*-sources.jar /app/*-javadoc.jar RUN mv /app/*.jar /app/app.jar CMD java \ From 9b0c25fb8f46e95b7f3ed63c2d13244d7ff3c556 Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 01:29:22 +0100 Subject: [PATCH 03/11] Try and fix docker build --- .drone.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 17a564c..0df419b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -7,10 +7,12 @@ steps: commands: - mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V when: + branch: + include: + - main + - feature/* ref: include: - - refs/head/main - - refs/head/feature/** - refs/tags/** - name: test image: maven:3.9-eclipse-temurin-25 From 18a68cae2ef180fe17ed08497c6f308b58d3ff4f Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 01:32:31 +0100 Subject: [PATCH 04/11] Conditions? --- .drone.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index 0df419b..9075895 100644 --- a/.drone.yml +++ b/.drone.yml @@ -11,9 +11,6 @@ steps: include: - main - feature/* - ref: - include: - - refs/tags/** - name: test image: maven:3.9-eclipse-temurin-25 commands: From 707acbefd956c8b14cfce9496553213a732c936b Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 01:34:00 +0100 Subject: [PATCH 05/11] Plural ... --- .drone.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index 9075895..b13a7ce 100644 --- a/.drone.yml +++ b/.drone.yml @@ -7,10 +7,11 @@ steps: commands: - mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V when: - branch: + ref: include: - - main - - feature/* + - refs/heads/main + - refs/heads/feature/** + - refs/tags/** - name: test image: maven:3.9-eclipse-temurin-25 commands: From 1ee2b684710cc886f1ecfa4c93da32bb7ec9b2c4 Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 01:40:07 +0100 Subject: [PATCH 06/11] Make copying resources to the doecker image more robust. --- docker/Dockerfile | 4 +--- pom.xml | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 0c6ac00..e8e3c6a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,8 +1,6 @@ FROM eclipse-temurin:25-jre-alpine -COPY target/maze-server-*.jar /app/ -RUN rm /app/*-sources.jar /app/*-javadoc.jar -RUN mv /app/*.jar /app/app.jar +COPY target/maze-server-shaded.jar /app/app.jar CMD java \ -Dfritteli.maze.server.host=0.0.0.0 \ diff --git a/pom.xml b/pom.xml index a0f87c3..dbeab26 100644 --- a/pom.xml +++ b/pom.xml @@ -121,6 +121,7 @@ + maze-server-shaded From 6fcdc62d9e37fb43ad3a034353b1e4dd9ab0413c Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 01:43:00 +0100 Subject: [PATCH 07/11] [maven-release-plugin] prepare release v0.2.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index dbeab26..e7d8760 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ ch.fritteli.a-maze-r maze-server - 0.2.1-SNAPSHOT + 0.2.1 A-Maze-R Server The A-Maze-R server, offering a REST endpoint to access the Maze Generator. @@ -44,7 +44,7 @@ scm:git:https://gittr.ch/java/maze-server.git scm:git:ssh://git@gittr.ch/java/maze-server.git https://gittr.ch/java/maze-server - HEAD + v0.2.1 From 2cdf51e9967ddbe973164a10136cd9e8200bc602 Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 01:43:03 +0100 Subject: [PATCH 08/11] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e7d8760..b4b337b 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ ch.fritteli.a-maze-r maze-server - 0.2.1 + 0.2.2-SNAPSHOT A-Maze-R Server The A-Maze-R server, offering a REST endpoint to access the Maze Generator. @@ -44,7 +44,7 @@ scm:git:https://gittr.ch/java/maze-server.git scm:git:ssh://git@gittr.ch/java/maze-server.git https://gittr.ch/java/maze-server - v0.2.1 + HEAD From 123ff8ec9f8d17fc9ede06f497f8f098924dadca Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 01:45:49 +0100 Subject: [PATCH 09/11] use tag "latest-snapshot" for dev builds (docker image) --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index b13a7ce..c88694f 100644 --- a/.drone.yml +++ b/.drone.yml @@ -45,7 +45,7 @@ steps: from_secret: docker-token repo: gittr.ch/java/a-maze-r tags: - - latest + - latest-snapshot dockerfile: docker/Dockerfile when: branch: From e5823a940818873ffde1474a5cd3fe73e6f9b4dc Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 04:42:51 +0100 Subject: [PATCH 10/11] PDF output: Always generate an A4 page. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b4b337b..7f609d1 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ - 0.4.0 + 0.5.0 4.0.0-M16 2.3.22.Final From a115fae3abe612d4e128e6e5ed9620331df7c266 Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Sat, 24 Jan 2026 04:43:37 +0100 Subject: [PATCH 11/11] [maven-release-plugin] prepare release v0.3.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7f609d1..1fdd14f 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ ch.fritteli.a-maze-r maze-server - 0.2.2-SNAPSHOT + 0.3.0 A-Maze-R Server The A-Maze-R server, offering a REST endpoint to access the Maze Generator. @@ -44,7 +44,7 @@ scm:git:https://gittr.ch/java/maze-server.git scm:git:ssh://git@gittr.ch/java/maze-server.git https://gittr.ch/java/maze-server - HEAD + v0.3.0