diff --git a/.drone.yml b/.drone.yml index a282745..c88694f 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/feature/** + - refs/heads/main + - refs/heads/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: @@ -45,11 +45,11 @@ steps: from_secret: docker-token repo: gittr.ch/java/a-maze-r tags: - - latest + - latest-snapshot dockerfile: docker/Dockerfile when: branch: - - master + - main event: exclude: - pull_request diff --git a/docker/Dockerfile b/docker/Dockerfile index 74a2661..e8e3c6a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,8 +1,6 @@ -FROM eclipse-temurin:21-jre +FROM eclipse-temurin:25-jre-alpine -COPY target/maze-server-*.jar /app/ -RUN rm /app/*-sources.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 00b72a6..1fdd14f 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 + 0.3.0 + 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 @@ -43,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 @@ -55,9 +56,9 @@ - 0.3.0 - 4.0.0-M8 - 2.3.18.Final + 0.5.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 @@ -121,6 +121,7 @@ + maze-server-shaded 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)