From 2ceace7ce78209e02fde4e9764273b81da061f5f Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Thu, 15 May 2025 14:31:36 +0000 Subject: [PATCH 01/54] chore: prepare for next development iteration [skip ci] --- pom.xml | 4 ++-- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 1501e62..1d03e52 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.0 + 1.0.1-SNAPSHOT pom @@ -70,7 +70,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.0 + HEAD diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index f918d10..282883e 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.0 + 1.0.1-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 75bfe33..7584321 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.0 + 1.0.1-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 48389f8..e619b25 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.0 + 1.0.1-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index bc4dd84..51104bb 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.0 + 1.0.1-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index b81e68d..42454a7 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.0 + 1.0.1-SNAPSHOT quarkus-uuid-generator From 75a778296c1f990dd941e05c60ca50952faf30a6 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 18 Jun 2025 01:39:59 +0200 Subject: [PATCH 02/54] feat(deps): update quarkus.platform.version to 3.23.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d03e52..63a16b0 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ quarkus-bom io.quarkus.platform - 3.22.3 + 3.23.3 3.14.0 From db0026b7236a3ea4744406fdd7355c1e636273d5 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 18 Jun 2025 01:40:26 +0200 Subject: [PATCH 03/54] feat(tracing): add quarkus-tracing-service module --- pom.xml | 1 + quarkus-tracing-service/pom.xml | 44 ++++ .../tracing/LowerCaseStringConverter.java | 10 + .../commons/tracing/TracingConfiguration.java | 40 ++++ .../commons/tracing/TracingConstants.java | 18 ++ .../commons/tracing/TracingRequestFilter.java | 139 ++++++++++++ .../commons/tracing/TracingService.java | 24 +++ .../commons/tracing/TracingServiceImpl.java | 69 ++++++ .../quarkus/commons/tracing/ActorTest.java | 44 ++++ .../quarkus/commons/tracing/RawPathTest.java | 46 ++++ .../commons/tracing/RoutePatternTest.java | 204 ++++++++++++++++++ .../quarkus/commons/tracing/Test2Profile.java | 11 + .../resource/AuthenticatedResource.java | 15 ++ .../tracing/resource/BlankResource.java | 25 +++ .../LeadingAndNoTrailingResource.java | 29 +++ .../resource/LeadingAndTrailingResource.java | 29 +++ .../NoLeadingAndNoTrailingResource.java | 29 +++ .../NoLeadingAndTrailingResource.java | 29 +++ .../tracing/resource/SlashResource.java | 23 ++ .../src/test/resources/application.yaml | 38 ++++ 20 files changed, 867 insertions(+) create mode 100644 quarkus-tracing-service/pom.xml create mode 100644 quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/LowerCaseStringConverter.java create mode 100644 quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java create mode 100644 quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConstants.java create mode 100644 quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java create mode 100644 quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java create mode 100644 quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/Test2Profile.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/AuthenticatedResource.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/BlankResource.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndNoTrailingResource.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndTrailingResource.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndNoTrailingResource.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndTrailingResource.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java create mode 100644 quarkus-tracing-service/src/test/resources/application.yaml diff --git a/pom.xml b/pom.xml index 63a16b0..70703dc 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ quarkus-json-service quarkus-message-digest-service quarkus-random-number-generator + quarkus-tracing-service quarkus-uuid-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml new file mode 100644 index 0000000..b95f87d --- /dev/null +++ b/quarkus-tracing-service/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + + ch.phoenix.oss + quarkus-commons + 1.0.1-SNAPSHOT + + + quarkus-tracing-service + jar + + + + io.quarkus + quarkus-rest-jackson + + + io.quarkus + quarkus-opentelemetry + + + io.quarkus + quarkus-security + + + io.quarkus + quarkus-elytron-security-properties-file + test + + + io.quarkus + quarkus-config-yaml + test + + + io.rest-assured + rest-assured + test + + + + diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/LowerCaseStringConverter.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/LowerCaseStringConverter.java new file mode 100644 index 0000000..ede1518 --- /dev/null +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/LowerCaseStringConverter.java @@ -0,0 +1,10 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import org.eclipse.microprofile.config.spi.Converter; + +public class LowerCaseStringConverter implements Converter { + @Override + public String convert(String value) throws IllegalArgumentException, NullPointerException { + return value.toLowerCase(); + } +} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java new file mode 100644 index 0000000..46e2854 --- /dev/null +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java @@ -0,0 +1,40 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithConverter; +import io.smallrye.config.WithDefault; +import java.util.Optional; +import java.util.Set; + +@ConfigMapping(prefix = "phoenix.commons.tracing") +public interface TracingConfiguration { + + RequestFilterConfiguration requestFilter(); + + interface RequestFilterConfiguration { + + Headers headers(); + + interface Headers { + + Optional> redact(); + } + + Path path(); + + interface Path { + + @WithDefault("false") + boolean includeRaw(); + } + + Query query(); + + interface Query { + @WithDefault("false") + boolean includeRaw(); + + Optional> redact(); + } + } +} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConstants.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConstants.java new file mode 100644 index 0000000..7022a22 --- /dev/null +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConstants.java @@ -0,0 +1,18 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +public class TracingConstants { + + public static final String ACTOR = "actor"; + public static final String ANONYMOUS = "anonymous"; + public static final String REQUEST_ROUTE = "request.route"; + public static final String REQUEST_METHOD = "request.method"; + public static final String REQUEST_PATH_RAW = "request.path.raw"; + public static final String REQUEST_PATH_PARAMS = "request.path.params"; + public static final String REQUEST_QUERY_RAW = "request.query.raw"; + public static final String REQUEST_QUERY_PARAMS = "request.query.params"; + public static final String REQUEST_HEADERS = "request.headers"; + public static final String REQUEST_CLIENT_IP = "request.client.ip"; + public static final String SCHEDULER_JOB_NAME = "scheduler.job.name"; + + private TracingConstants() {} +} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java new file mode 100644 index 0000000..4a1cbd4 --- /dev/null +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java @@ -0,0 +1,139 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import io.quarkus.arc.Unremovable; +import io.quarkus.logging.Log; +import io.quarkus.security.identity.SecurityIdentity; +import io.vertx.ext.web.RoutingContext; +import jakarta.inject.Inject; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ResourceInfo; +import java.util.List; +import java.util.Set; +import org.jboss.resteasy.reactive.server.ServerRequestFilter; + +@Unremovable +public class TracingRequestFilter { + + private final RoutingContext routingContext; + private final TracingService tracingService; + private final SecurityIdentity securityIdentity; + private final TracingConfiguration configuration; + + @Inject + public TracingRequestFilter( + RoutingContext routingContext, + TracingService tracingService, + SecurityIdentity securityIdentity, + TracingConfiguration configuration) { + this.routingContext = routingContext; + this.tracingService = tracingService; + this.securityIdentity = securityIdentity; + this.configuration = configuration; + } + + @ServerRequestFilter + public void filter(ContainerRequestContext requestContext, ResourceInfo resourceInfo) { + if (securityIdentity.isAnonymous()) { + tracingService.trace(TracingConstants.ACTOR, TracingConstants.ANONYMOUS); + } else { + tracingService.trace( + TracingConstants.ACTOR, securityIdentity.getPrincipal().getName()); + } + + var method = requestContext.getMethod(); + tracingService.trace(TracingConstants.REQUEST_METHOD, method); + + var routePattern = getRoutePattern(resourceInfo); + tracingService.trace(TracingConstants.REQUEST_ROUTE, routePattern); + + var uriInfo = requestContext.getUriInfo(); + uriInfo.getPathParameters() + .forEach((key, value) -> + tracingService.trace(TracingConstants.REQUEST_PATH_PARAMS + '.' + key, joinStrings(value))); + + if (configuration.requestFilter().path().includeRaw()) { + tracingService.trace( + TracingConstants.REQUEST_PATH_RAW, uriInfo.getAbsolutePath().getRawPath()); + } + + requestContext.getHeaders().forEach((key, value) -> { + var lowerCaseKey = key.toLowerCase(); + var property = TracingConstants.REQUEST_HEADERS + '.' + lowerCaseKey; + if (configuration + .requestFilter() + .headers() + .redact() + .orElse(Set.of()) + .contains(lowerCaseKey)) { + tracingService.trace(property, "********"); + } else { + tracingService.trace(property, joinStrings(value)); + } + }); + + uriInfo.getQueryParameters() + .forEach((key, value) -> + tracingService.trace(TracingConstants.REQUEST_QUERY_PARAMS + '.' + key, joinStrings(value))); + + if (configuration.requestFilter().query().includeRaw()) { + var rawQuery = uriInfo.getRequestUri().getRawQuery(); + if (rawQuery != null && !rawQuery.isBlank()) { + tracingService.trace(TracingConstants.REQUEST_QUERY_RAW, rawQuery); + } + } + + tracingService.trace( + TracingConstants.REQUEST_CLIENT_IP, + routingContext.request().connection().remoteAddress(true).hostAddress()); + + if (Log.isTraceEnabled()) { + Log.tracef( + "Incoming request: %s %s", method, uriInfo.getAbsolutePath().getRawPath()); + } + } + + private static String joinStrings(List value) { + return String.join(", ", value); + } + + private String getRoutePattern(ResourceInfo resourceInfo) { + String classPath = getPathValue(resourceInfo.getResourceClass().getAnnotation(Path.class)); + String methodPath = getPathValue(resourceInfo.getResourceMethod().getAnnotation(Path.class)); + + if (!classPath.isEmpty()) { + if (methodPath.isEmpty()) { + return "/" + classPath; + } else { + return "/" + classPath + "/" + methodPath; + } + } else { + if (methodPath.isEmpty()) { + return "/"; + } else { + return "/" + methodPath; + } + } + } + + private static String getPathValue(Path path) { + if (path == null) { + return ""; + } + return trimSlashes(path.value()); + } + + private static String trimSlashes(String segment) { + if (segment.isEmpty() || "/".equals(segment)) { + return ""; + } + + // Assuming that it's not possible for a segment to contain //, + // thus it's possible to avoid extra ifs and whiles, as well + // as the use of regexes + int start = (segment.charAt(0) == '/') ? 1 : 0; + int end = (segment.charAt(segment.length() - 1) == '/') ? segment.length() - 1 : segment.length(); + + return segment.substring(start, end); + } +} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java new file mode 100644 index 0000000..2b1ac38 --- /dev/null +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java @@ -0,0 +1,24 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +public interface TracingService { + + void clearAll(); + + void trace(String key, Object value); + + String getActor(); + + String getRequestPath(); + + String getRequestMethod(); + + String getRequestId(); + + String getTraceId(); + + String getSpanId(); + + String getClientIp(); + + String getSchedulerJob(); +} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java new file mode 100644 index 0000000..0970b35 --- /dev/null +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java @@ -0,0 +1,69 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import io.opentelemetry.api.trace.Span; +import io.quarkus.arc.DefaultBean; +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.MDC; + +@DefaultBean +@ApplicationScoped +class TracingServiceImpl implements TracingService { + + private final Span span; + + TracingServiceImpl(Span span) { + this.span = span; + } + + @Override + public void clearAll() { + MDC.clear(); + } + + @Override + public void trace(final String key, final Object value) { + Log.infof("tracing key=%s value=%s", key, value); + MDC.put(key, value); + } + + @Override + public String getActor() { + return (String) MDC.get(TracingConstants.ACTOR); + } + + @Override + public String getRequestPath() { + return (String) MDC.get(TracingConstants.REQUEST_PATH_RAW); + } + + @Override + public String getRequestMethod() { + return (String) MDC.get(TracingConstants.REQUEST_METHOD); + } + + @Override + public String getRequestId() { + return (String) MDC.get(TracingConstants.REQUEST_HEADERS + ".x-request-id"); + } + + @Override + public String getTraceId() { + return span.getSpanContext().getTraceId(); + } + + @Override + public String getSpanId() { + return span.getSpanContext().getSpanId(); + } + + @Override + public String getClientIp() { + return (String) MDC.get(TracingConstants.REQUEST_CLIENT_IP); + } + + @Override + public String getSchedulerJob() { + return (String) MDC.get(TracingConstants.SCHEDULER_JOB_NAME); + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java new file mode 100644 index 0000000..2190561 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java @@ -0,0 +1,44 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.startsWith; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.mockito.InjectSpy; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Test; + +@QuarkusTest +public class ActorTest { + + @InjectSpy + TracingService tracingService; + + @Test + void getAuthenticated() { + var route = "/authenticated"; + RestAssured.given() + .auth() + .basic("jon", "doe") + .accept(ContentType.TEXT) + .when() + .get(route) + .then() + .statusCode(200); + + verify(tracingService).trace("actor", "jon"); + verify(tracingService).trace("request.method", "GET"); + verify(tracingService).trace("request.route", route); + verify(tracingService).trace("request.headers.accept", "text/plain"); + verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); + verify(tracingService).trace("request.headers.authorization", "Basic am9uOmRvZQ=="); + verify(tracingService).trace("request.headers.connection", "Keep-Alive"); + verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); + verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); + verify(tracingService).trace("request.client.ip", "127.0.0.1"); + verifyNoMoreInteractions(tracingService); + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java new file mode 100644 index 0000000..96d8956 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java @@ -0,0 +1,46 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.startsWith; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; +import io.quarkus.test.junit.mockito.InjectSpy; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Test; + +@QuarkusTest +@TestProfile(Test2Profile.class) +public class RawPathTest { + + @InjectSpy + TracingService tracingService; + + @Test + void getWithRawPath() { + var route = "/no-leading-and-trailing/{param}/{param2}"; + RestAssured.given() + .accept(ContentType.TEXT) + .when() + .get(route, 1, 2) + .then() + .statusCode(200); + + verify(tracingService).trace("actor", "anonymous"); + verify(tracingService).trace("request.method", "GET"); + verify(tracingService).trace("request.route", route); + verify(tracingService).trace("request.path.params.param", "1"); + verify(tracingService).trace("request.path.params.param2", "2"); + verify(tracingService).trace("request.path.raw", "/no-leading-and-trailing/1/2"); + verify(tracingService).trace("request.headers.accept", "text/plain"); + verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); + verify(tracingService).trace("request.headers.connection", "Keep-Alive"); + verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); + verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); + verify(tracingService).trace("request.client.ip", "127.0.0.1"); + verifyNoMoreInteractions(tracingService); + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java new file mode 100644 index 0000000..11f1689 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java @@ -0,0 +1,204 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.startsWith; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.mockito.InjectSpy; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import java.util.Map; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class RoutePatternTest { + + @InjectSpy + TracingService tracingService; + + @Test + void getBlankResource() { + var route = "/"; + RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); + + verifyGetTracing(route, Map.of()); + } + + @Test + void postBlankResource() { + var route = "/"; + RestAssured.given().accept(ContentType.TEXT).when().post(route).then().statusCode(200); + + verify(tracingService).trace("actor", "anonymous"); + verify(tracingService).trace("request.method", "POST"); + verify(tracingService).trace("request.route", route); + verify(tracingService).trace("request.headers.accept", "text/plain"); + verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); + verify(tracingService).trace("request.headers.connection", "Keep-Alive"); + verify(tracingService).trace("request.headers.content-length", "0"); + verify(tracingService) + .trace("request.headers.content-type", "application/x-www-form-urlencoded; charset=ISO-8859-1"); + verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); + verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); + verify(tracingService).trace("request.client.ip", "127.0.0.1"); + verifyNoMoreInteractions(tracingService); + } + + @Test + void getLeadingResource() { + var route = "/leading/{id}/{anotherId}"; + RestAssured.given() + .accept(ContentType.TEXT) + .when() + .get(route, 1, 2) + .then() + .statusCode(200); + + verifyGetTracing(route, Map.of("id", "1", "anotherId", "2")); + } + + @Test + void getTrailingResource() { + var route = "/{id}/{anotherId}/trailing"; + RestAssured.given() + .accept(ContentType.TEXT) + .when() + .get(route, 1, 2) + .then() + .statusCode(200); + + verifyGetTracing(route, Map.of("id", "1", "anotherId", "2")); + } + + @Test + void getLeadingAndNoTrailingResource() { + var route = "/leading-and-no-trailing"; + RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); + + verifyGetTracing(route, Map.of()); + } + + @Test + void getLeadingAndNoTrailingWithSingleParamResource() { + var route = "/leading-and-no-trailing/{param}"; + RestAssured.given().accept(ContentType.TEXT).when().get(route, 1).then().statusCode(200); + + verifyGetTracing(route, Map.of("param", "1")); + } + + @Test + void getLeadingAndNoTrailingWithMultiParamResource() { + var route = "/leading-and-no-trailing/{param}/{param2}"; + RestAssured.given() + .accept(ContentType.TEXT) + .when() + .get(route, 1, 2) + .then() + .statusCode(200); + + verifyGetTracing(route, Map.of("param", "1", "param2", "2")); + } + + @Test + void getLeadingAndTrailingResource() { + var route = "/leading-and-trailing"; + RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); + + verifyGetTracing(route, Map.of()); + } + + @Test + void getLeadingAndTrailingWithSingleParamResource() { + var route = "/leading-and-trailing/{param}"; + RestAssured.given().accept(ContentType.TEXT).when().get(route, 1).then().statusCode(200); + + verifyGetTracing(route, Map.of("param", "1")); + } + + @Test + void getLeadingAndTrailingWithMultiParamResource() { + var route = "/leading-and-trailing/{param}/{param2}"; + RestAssured.given() + .accept(ContentType.TEXT) + .when() + .get(route, 1, 2) + .then() + .statusCode(200); + + verifyGetTracing(route, Map.of("param", "1", "param2", "2")); + } + + @Test + void getNoLeadingAndNoTrailingResource() { + var route = "/no-leading-and-no-trailing"; + RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); + + verifyGetTracing(route, Map.of()); + } + + @Test + void geNoLeadingAndNoTrailingWithSingleParamResource() { + var route = "/no-leading-and-no-trailing/{param}"; + RestAssured.given().accept(ContentType.TEXT).when().get(route, 1).then().statusCode(200); + + verifyGetTracing(route, Map.of("param", "1")); + } + + @Test + void getNoLeadingAndNoTrailingWithMultiParamResource() { + var route = "/no-leading-and-no-trailing/{param}/{param2}"; + RestAssured.given() + .accept(ContentType.TEXT) + .when() + .get(route, 1, 2) + .then() + .statusCode(200); + + verifyGetTracing(route, Map.of("param", "1", "param2", "2")); + } + + @Test + void getNoLeadingAndTrailingResource() { + var route = "/no-leading-and-trailing"; + RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); + + verifyGetTracing(route, Map.of()); + } + + @Test + void getNoLeadingAndTrailingWithSingleParamResource() { + var route = "/no-leading-and-trailing/{param}"; + RestAssured.given().accept(ContentType.TEXT).when().get(route, 1).then().statusCode(200); + + verifyGetTracing(route, Map.of("param", "1")); + } + + @Test + void getNoLeadingAndTrailingWithMultiParamResource() { + var route = "/no-leading-and-trailing/{param}/{param2}"; + RestAssured.given() + .accept(ContentType.TEXT) + .when() + .get(route, 1, 2) + .then() + .statusCode(200); + + verifyGetTracing(route, Map.of("param", "1", "param2", "2")); + } + + private void verifyGetTracing(String route, Map pathParams) { + verify(tracingService).trace("actor", "anonymous"); + verify(tracingService).trace("request.method", "GET"); + verify(tracingService).trace("request.route", route); + pathParams.forEach((key, value) -> verify(tracingService).trace("request.path.params." + key, value)); + verify(tracingService).trace("request.headers.accept", "text/plain"); + verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); + verify(tracingService).trace("request.headers.connection", "Keep-Alive"); + verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); + verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); + verify(tracingService).trace("request.client.ip", "127.0.0.1"); + verifyNoMoreInteractions(tracingService); + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/Test2Profile.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/Test2Profile.java new file mode 100644 index 0000000..f98dcff --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/Test2Profile.java @@ -0,0 +1,11 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import io.quarkus.test.junit.QuarkusTestProfile; + +public class Test2Profile implements QuarkusTestProfile { + + @Override + public String getConfigProfile() { + return "test2"; + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/AuthenticatedResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/AuthenticatedResource.java new file mode 100644 index 0000000..d18b967 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/AuthenticatedResource.java @@ -0,0 +1,15 @@ +package ch.phoenix.oss.quarkus.commons.tracing.resource; + +import io.quarkus.security.Authenticated; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +@Authenticated +@Path("authenticated") +public class AuthenticatedResource { + + @GET + public String get() { + return "Hello user"; + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/BlankResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/BlankResource.java new file mode 100644 index 0000000..04c5df9 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/BlankResource.java @@ -0,0 +1,25 @@ +package ch.phoenix.oss.quarkus.commons.tracing.resource; + +import jakarta.annotation.security.PermitAll; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("") +@Produces(MediaType.TEXT_PLAIN) +public class BlankResource { + + @GET + @PermitAll + public String get() { + return "get"; + } + + @POST + @Path("") + public String post() { + return "post"; + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndNoTrailingResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndNoTrailingResource.java new file mode 100644 index 0000000..b03a7ae --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndNoTrailingResource.java @@ -0,0 +1,29 @@ +package ch.phoenix.oss.quarkus.commons.tracing.resource; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/leading-and-no-trailing") +@Produces(MediaType.TEXT_PLAIN) +public class LeadingAndNoTrailingResource { + + @GET + @Path("") + public String root() { + return "root"; + } + + @GET + @Path("/{param}") + public String singleParam(String param) { + return param; + } + + @GET + @Path("/{param}/{param2}") + public String multiParam(String param, String param2) { + return param + "/" + param2; + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndTrailingResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndTrailingResource.java new file mode 100644 index 0000000..1dbc175 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndTrailingResource.java @@ -0,0 +1,29 @@ +package ch.phoenix.oss.quarkus.commons.tracing.resource; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/leading-and-trailing/") +@Produces(MediaType.TEXT_PLAIN) +public class LeadingAndTrailingResource { + + @GET + @Path("/") + public String root() { + return "root"; + } + + @GET + @Path("/{param}/") + public String singleParam(String param) { + return param; + } + + @GET + @Path("/{param}/{param2}/") + public String multiParam(String param, String param2) { + return param + "/" + param2; + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndNoTrailingResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndNoTrailingResource.java new file mode 100644 index 0000000..d75dade --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndNoTrailingResource.java @@ -0,0 +1,29 @@ +package ch.phoenix.oss.quarkus.commons.tracing.resource; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("no-leading-and-no-trailing") +@Produces(MediaType.TEXT_PLAIN) +public class NoLeadingAndNoTrailingResource { + + @GET + @Path("") + public String root() { + return "root"; + } + + @GET + @Path("{param}") + public String singleParam(String param) { + return param; + } + + @GET + @Path("{param}/{param2}") + public String multiParam(String param, String param2) { + return param + "/" + param2; + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndTrailingResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndTrailingResource.java new file mode 100644 index 0000000..9c9805a --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndTrailingResource.java @@ -0,0 +1,29 @@ +package ch.phoenix.oss.quarkus.commons.tracing.resource; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("no-leading-and-trailing/") +@Produces(MediaType.TEXT_PLAIN) +public class NoLeadingAndTrailingResource { + + @GET + @Path("/") + public String root() { + return "root"; + } + + @GET + @Path("{param}/") + public String singleParam(String param) { + return param; + } + + @GET + @Path("{param}/{param2}/") + public String multiParam(String param, String param2) { + return param + "/" + param2; + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java new file mode 100644 index 0000000..690c84a --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java @@ -0,0 +1,23 @@ +package ch.phoenix.oss.quarkus.commons.tracing.resource; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/") +@Produces(MediaType.TEXT_PLAIN) +public class SlashResource { + + @GET + @Path("/leading/{id}/{anotherId}") + public String doubleLeading(int id, int anotherId) { + return "leading/" + id + "/" + anotherId; + } + + @GET + @Path("{id}/{anotherId}/trailing/") + public String doubleTrailing(int id, int anotherId) { + return id + "/" + anotherId + "/trailing"; + } +} diff --git a/quarkus-tracing-service/src/test/resources/application.yaml b/quarkus-tracing-service/src/test/resources/application.yaml new file mode 100644 index 0000000..9d0943f --- /dev/null +++ b/quarkus-tracing-service/src/test/resources/application.yaml @@ -0,0 +1,38 @@ +quarkus: + http: + test-port: 0 + log: + category: + "org.apache.http.wire": + level: DEBUG # set to DEBUG when RestAssured logs are necessary to understand test failures + otel: + traces: + exporter: none + security: + users: + embedded: + enabled: true + plain-text: true + users: + jon: doe + +"%test2": + quarkus: + log: + min-level: TRACE + category: + "ch.phoenix.oss.quarkus.commons.tracing": + level: TRACE + phoenix: + commons: + tracing: + request-filter: + path: + include-raw: true + headers: + redact: + - AUTHORIZATION + query: + include-raw: true + redact: + - ACCESS_TOKEN \ No newline at end of file From f268c4a27a8c2c55b2668059f62b4a67a606525c Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 18 Jun 2025 01:41:16 +0200 Subject: [PATCH 04/54] feat(audit): add quarkus-audit-tools module --- pom.xml | 1 + quarkus-audit-tools/pom.xml | 88 ++++++++++++ .../commons/audit/AuditRevisionListener.java | 20 +++ .../commons/audit/AuditedPanacheEntity.java | 30 ++++ .../audit/AuditedPanacheEntityBase.java | 30 ++++ .../audit/DefaultRevisionContextProvider.java | 67 +++++++++ .../oss/quarkus/commons/audit/Revision.java | 58 ++++++++ .../audit/RevisionContextProvider.java | 16 +++ .../audit/AuditedPanacheEntityBaseTest.java | 136 ++++++++++++++++++ .../audit/AuditedPanacheEntityTest.java | 136 ++++++++++++++++++ .../DefaultRevisionContextProviderTest.java | 32 +++++ .../quarkus/commons/audit/RevisionTest.java | 28 ++++ .../oss/quarkus/commons/audit/TestEntity.java | 23 +++ .../quarkus/commons/audit/TestEntity2.java | 29 ++++ .../src/test/resources/application.yaml | 22 +++ .../db/migration/V1__create_schema.sql | 46 ++++++ .../db/migration/V2__create_audit_trigger.sql | 35 +++++ .../src/test/resources/import.sql | 37 +++++ 18 files changed, 834 insertions(+) create mode 100644 quarkus-audit-tools/pom.xml create mode 100644 quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditRevisionListener.java create mode 100644 quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntity.java create mode 100644 quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBase.java create mode 100644 quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProvider.java create mode 100644 quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/Revision.java create mode 100644 quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/RevisionContextProvider.java create mode 100644 quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBaseTest.java create mode 100644 quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityTest.java create mode 100644 quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java create mode 100644 quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java create mode 100644 quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity.java create mode 100644 quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity2.java create mode 100644 quarkus-audit-tools/src/test/resources/application.yaml create mode 100644 quarkus-audit-tools/src/test/resources/db/migration/V1__create_schema.sql create mode 100644 quarkus-audit-tools/src/test/resources/db/migration/V2__create_audit_trigger.sql create mode 100644 quarkus-audit-tools/src/test/resources/import.sql diff --git a/pom.xml b/pom.xml index 70703dc..2a94134 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,7 @@ pom + quarkus-audit-tools quarkus-clock-service quarkus-json-service quarkus-message-digest-service diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml new file mode 100644 index 0000000..be3a1e2 --- /dev/null +++ b/quarkus-audit-tools/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + + + ch.phoenix.oss + quarkus-commons + 1.0.1-SNAPSHOT + + + quarkus-audit-tools + jar + + + + ch.phoenix.oss + quarkus-tracing-service + ${project.version} + + + io.quarkus + quarkus-hibernate-envers + + + io.quarkus + quarkus-hibernate-orm-panache + + + io.quarkus + quarkus-jdbc-postgresql + + + io.quarkus + quarkus-flyway + test + + + io.quarkus + quarkus-flyway-postgresql + test + + + io.quarkus + quarkus-elytron-security-properties-file + test + + + io.quarkus + quarkus-config-yaml + test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditRevisionListener.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditRevisionListener.java new file mode 100644 index 0000000..29884f8 --- /dev/null +++ b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditRevisionListener.java @@ -0,0 +1,20 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import jakarta.enterprise.inject.spi.CDI; +import org.hibernate.envers.RevisionListener; + +public class AuditRevisionListener implements RevisionListener { + + @Override + public void newRevision(Object revisionEntity) { + var provider = CDI.current().select(RevisionContextProvider.class).get(); + + var rev = (Revision) revisionEntity; + rev.actor = provider.getActor(); + rev.traceId = provider.getTraceId(); + rev.spanId = provider.getSpanId(); + rev.requestId = provider.getRequestId(); + rev.clientIp = provider.getClientIp(); + rev.hostName = provider.getHostName(); + } +} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntity.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntity.java new file mode 100644 index 0000000..4540cbf --- /dev/null +++ b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntity.java @@ -0,0 +1,30 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import io.quarkus.hibernate.orm.panache.PanacheEntity; +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import java.time.Instant; +import org.hibernate.envers.NotAudited; + +/** + * The goal of this class is to have on the entity itself the exact same + * timestamps as the ones from revisions generated by envers. Because of that, + * we can't use @CreationTimestamp and @UpdateTimestamp, as those timestamp values + * are managed by different Hibernate classes, so the generated values will drift. + *

+ * Manually setting these values to match envers revisions would be error-prone, + * verbose and tedious. So, the recommendation is to implement triggers on the + * audit tables which will update the main entity whenever a revision is created. + * An example of how to do that can be found in this module's integration tests. + */ +@MappedSuperclass +public abstract class AuditedPanacheEntity extends PanacheEntity { + + @NotAudited + @Column(updatable = false) + public Instant createdAt; + + @NotAudited + @Column(updatable = false) + public Instant lastUpdatedAt; +} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBase.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBase.java new file mode 100644 index 0000000..a6114b3 --- /dev/null +++ b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBase.java @@ -0,0 +1,30 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import java.time.Instant; +import org.hibernate.envers.NotAudited; + +/** + * The goal of this class is to have on the entity itself the exact same + * timestamps as the ones from revisions generated by envers. Because of that, + * we can't use @CreationTimestamp and @UpdateTimestamp, as those timestamp values + * are managed by different Hibernate classes, so the generated values will drift. + *

+ * Manually setting these values to match envers revisions would be error-prone, + * verbose and tedious. So, the recommendation is to implement triggers on the + * audit tables which will update the main entity whenever a revision is created. + * An example of how to do that can be found in this module's integration tests. + */ +@MappedSuperclass +public abstract class AuditedPanacheEntityBase extends PanacheEntityBase { + + @NotAudited + @Column(updatable = false) + public Instant createdAt; + + @NotAudited + @Column(updatable = false) + public Instant lastUpdatedAt; +} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProvider.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProvider.java new file mode 100644 index 0000000..18ebba6 --- /dev/null +++ b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProvider.java @@ -0,0 +1,67 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import ch.phoenix.oss.quarkus.commons.tracing.TracingService; +import io.opentelemetry.instrumentation.annotations.WithSpan; +import io.quarkus.arc.DefaultBean; +import io.quarkus.arc.Unremovable; +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.net.InetAddress; +import java.net.UnknownHostException; + +@Unremovable +@DefaultBean +@ApplicationScoped +class DefaultRevisionContextProvider implements RevisionContextProvider { + + private static final String UNKNOWN = "unknown"; + + private final TracingService tracingService; + + @Inject + DefaultRevisionContextProvider(TracingService tracingService) { + this.tracingService = tracingService; + } + + @Override + @WithSpan + public String getActor() { + return tracingService.getActor(); + } + + @Override + @WithSpan + public String getTraceId() { + return tracingService.getTraceId(); + } + + @Override + @WithSpan + public String getSpanId() { + return tracingService.getSpanId(); + } + + @Override + @WithSpan + public String getRequestId() { + return tracingService.getRequestId(); + } + + @Override + @WithSpan + public String getClientIp() { + return tracingService.getClientIp(); + } + + @Override + @WithSpan + public String getHostName() { + try { + return InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + Log.error("Unable to determine host name", e); + return UNKNOWN; + } + } +} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/Revision.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/Revision.java new file mode 100644 index 0000000..fa3085a --- /dev/null +++ b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/Revision.java @@ -0,0 +1,58 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import jakarta.persistence.*; +import java.time.Instant; +import java.util.Objects; +import org.hibernate.envers.RevisionEntity; +import org.hibernate.envers.RevisionNumber; +import org.hibernate.envers.RevisionTimestamp; + +@Entity +@Table(name = "revinfo") +@RevisionEntity(AuditRevisionListener.class) +public class Revision extends PanacheEntityBase { + + @Id + @GeneratedValue + @RevisionNumber + public long rev; + + @RevisionTimestamp + @Column(nullable = false, updatable = false) + public Instant timestamp; + + @Column(updatable = false) + public String actor; + + @Column(updatable = false) + public String traceId; + + @Column(updatable = false) + public String spanId; + + @Column(updatable = false) + public String requestId; + + @Column(updatable = false) + public String clientIp; + + @Column(updatable = false) + public String hostName; + + @Override + public boolean equals(Object o) { + if (!(o instanceof Revision that)) return false; + return rev == that.rev; + } + + @Override + public int hashCode() { + return Objects.hashCode(rev); + } + + @Override + public String toString() { + return "Revision{rev=" + rev + '}'; + } +} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/RevisionContextProvider.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/RevisionContextProvider.java new file mode 100644 index 0000000..477c44b --- /dev/null +++ b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/RevisionContextProvider.java @@ -0,0 +1,16 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +public interface RevisionContextProvider { + + String getActor(); + + String getTraceId(); + + String getSpanId(); + + String getRequestId(); + + String getClientIp(); + + String getHostName(); +} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBaseTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBaseTest.java new file mode 100644 index 0000000..f4ba0de --- /dev/null +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBaseTest.java @@ -0,0 +1,136 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.Mockito.when; + +import ch.phoenix.oss.quarkus.commons.tracing.TracingService; +import io.quarkus.narayana.jta.QuarkusTransaction; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.mockito.InjectSpy; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import java.time.Instant; +import org.hibernate.envers.AuditReaderFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class AuditedPanacheEntityBaseTest { + + @Inject + EntityManager entityManager; + + @InjectSpy + TracingService tracingService; + + @SuppressWarnings("Convert2MethodRef") + @BeforeEach + void setup() { + QuarkusTransaction.requiringNew().run(() -> TestEntity2.deleteAll()); + } + + @Test + void persistAndUpdate() { + when(tracingService.getRequestId()).thenReturn("00000000-0000-0000-0000-000000000000"); + when(tracingService.getSpanId()).thenReturn("0000000000000000"); + when(tracingService.getTraceId()).thenReturn("00000000000000000000000000000000"); + when(tracingService.getActor()).thenReturn("unknown"); + when(tracingService.getClientIp()).thenReturn("unknown"); + + var now = Instant.now(); + + QuarkusTransaction.requiringNew().run(() -> { + var entity = new TestEntity2("something"); + entity.persist(); + }); + + QuarkusTransaction.requiringNew().run(() -> { + var entity = TestEntity2.findBySomething("something"); + assertAll( + () -> assertThat(entity.createdAt) + .as("createdAt should be after or equal to expected value") + .isAfterOrEqualTo(now), + () -> assertThat(entity.lastUpdatedAt) + .as("lastUpdatedAt should be equal to createdAt") + .isEqualTo(entity.createdAt)); + + var auditReader = AuditReaderFactory.get(entityManager); + + var revisions = auditReader.getRevisions(TestEntity2.class, entity.id); + assertThat(revisions).hasSize(1); + + var revInfo = entityManager.find(Revision.class, revisions.getFirst()); + assertThat(revInfo).isNotNull(); + + assertAll( + () -> assertThat(revInfo.timestamp) + .as("revision timestamp should be equal to entity's createdAt timestamp") + .isEqualTo(entity.createdAt), + () -> assertThat(revInfo.actor) + .as("actor should match expected value") + .isEqualTo("unknown"), + () -> assertThat(revInfo.traceId) + .as("traceId should match expected value") + .isEqualTo("00000000000000000000000000000000"), + () -> assertThat(revInfo.spanId) + .as("spanId should match expected value") + .isEqualTo("0000000000000000"), + () -> assertThat(revInfo.requestId) + .as("requestId should match expected value") + .isEqualTo("00000000-0000-0000-0000-000000000000"), + () -> assertThat(revInfo.clientIp) + .as("clientIp should match expected value") + .isEqualTo("unknown"), + () -> assertThat(revInfo.hostName) + .as("hostName should not be blank") + .isNotBlank()); + }); + + QuarkusTransaction.requiringNew().run(() -> { + var entity = TestEntity2.findBySomething("something"); + entity.something = "else"; + }); + + QuarkusTransaction.requiringNew().run(() -> { + var entity = TestEntity2.findBySomething("else"); + assertAll(() -> assertThat(entity.createdAt) + .as("createdAt should be before lastUpdatedAt") + .isBefore(entity.lastUpdatedAt)); + + var auditReader = AuditReaderFactory.get(entityManager); + + var revisions = auditReader.getRevisions(TestEntity2.class, entity.id); + assertThat(revisions).hasSize(2); + + Revision revInfo = Revision.findById(revisions.getLast()); + assertThat(revInfo).isNotNull(); + + assertAll( + () -> assertThat(revInfo.timestamp) + .as("revision timestamp should not be equal to entity's createdAt") + .isNotEqualTo(entity.createdAt), + () -> assertThat(revInfo.timestamp) + .as("revision timestamp should be equal to entity's lastUpdatedAt") + .isEqualTo(entity.lastUpdatedAt), + () -> assertThat(revInfo.actor) + .as("actor should match expected value") + .isEqualTo("unknown"), + () -> assertThat(revInfo.traceId) + .as("traceId should match expected value") + .isEqualTo("00000000000000000000000000000000"), + () -> assertThat(revInfo.spanId) + .as("spanId should match expected value") + .isEqualTo("0000000000000000"), + () -> assertThat(revInfo.requestId) + .as("requestId should match expected value") + .isEqualTo("00000000-0000-0000-0000-000000000000"), + () -> assertThat(revInfo.clientIp) + .as("clientIp should match expected value") + .isEqualTo("unknown"), + () -> assertThat(revInfo.hostName) + .as("hostName should not be blank") + .isNotBlank()); + }); + } +} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityTest.java new file mode 100644 index 0000000..0f182ee --- /dev/null +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityTest.java @@ -0,0 +1,136 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.Mockito.when; + +import ch.phoenix.oss.quarkus.commons.tracing.TracingService; +import io.quarkus.narayana.jta.QuarkusTransaction; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.mockito.InjectSpy; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import java.time.Instant; +import org.hibernate.envers.AuditReaderFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class AuditedPanacheEntityTest { + + @Inject + EntityManager entityManager; + + @InjectSpy + TracingService tracingService; + + @SuppressWarnings("Convert2MethodRef") + @BeforeEach + void setup() { + QuarkusTransaction.requiringNew().run(() -> TestEntity.deleteAll()); + } + + @Test + void persistAndUpdate() { + when(tracingService.getRequestId()).thenReturn("00000000-0000-0000-0000-000000000000"); + when(tracingService.getSpanId()).thenReturn("0000000000000000"); + when(tracingService.getTraceId()).thenReturn("00000000000000000000000000000000"); + when(tracingService.getActor()).thenReturn("unknown"); + when(tracingService.getClientIp()).thenReturn("unknown"); + + var now = Instant.now(); + + QuarkusTransaction.requiringNew().run(() -> { + var entity = new TestEntity("something"); + entity.persist(); + }); + + QuarkusTransaction.requiringNew().run(() -> { + var entity = TestEntity.findBySomething("something"); + assertAll( + () -> assertThat(entity.createdAt) + .as("createdAt should be after or equal to expected value") + .isAfterOrEqualTo(now), + () -> assertThat(entity.lastUpdatedAt) + .as("lastUpdatedAt should be equal to createdAt") + .isEqualTo(entity.createdAt)); + + var auditReader = AuditReaderFactory.get(entityManager); + + var revisions = auditReader.getRevisions(TestEntity.class, entity.id); + assertThat(revisions).hasSize(1); + + var revInfo = entityManager.find(Revision.class, revisions.getFirst()); + assertThat(revInfo).isNotNull(); + + assertAll( + () -> assertThat(revInfo.timestamp) + .as("revision timestamp should be equal to entity's createdAt timestamp") + .isEqualTo(entity.createdAt), + () -> assertThat(revInfo.actor) + .as("actor should match expected value") + .isEqualTo("unknown"), + () -> assertThat(revInfo.traceId) + .as("traceId should match expected value") + .isEqualTo("00000000000000000000000000000000"), + () -> assertThat(revInfo.spanId) + .as("spanId should match expected value") + .isEqualTo("0000000000000000"), + () -> assertThat(revInfo.requestId) + .as("requestId should match expected value") + .isEqualTo("00000000-0000-0000-0000-000000000000"), + () -> assertThat(revInfo.clientIp) + .as("clientIp should match expected value") + .isEqualTo("unknown"), + () -> assertThat(revInfo.hostName) + .as("hostName should not be blank") + .isNotBlank()); + }); + + QuarkusTransaction.requiringNew().run(() -> { + var entity = TestEntity.findBySomething("something"); + entity.something = "else"; + }); + + QuarkusTransaction.requiringNew().run(() -> { + var entity = TestEntity.findBySomething("else"); + assertAll(() -> assertThat(entity.createdAt) + .as("createdAt should be before lastUpdatedAt") + .isBefore(entity.lastUpdatedAt)); + + var auditReader = AuditReaderFactory.get(entityManager); + + var revisions = auditReader.getRevisions(TestEntity.class, entity.id); + assertThat(revisions).hasSize(2); + + Revision revInfo = Revision.findById(revisions.getLast()); + assertThat(revInfo).isNotNull(); + + assertAll( + () -> assertThat(revInfo.timestamp) + .as("revision timestamp should not be equal to entity's createdAt") + .isNotEqualTo(entity.createdAt), + () -> assertThat(revInfo.timestamp) + .as("revision timestamp should be equal to entity's lastUpdatedAt") + .isEqualTo(entity.lastUpdatedAt), + () -> assertThat(revInfo.actor) + .as("actor should match expected value") + .isEqualTo("unknown"), + () -> assertThat(revInfo.traceId) + .as("traceId should match expected value") + .isEqualTo("00000000000000000000000000000000"), + () -> assertThat(revInfo.spanId) + .as("spanId should match expected value") + .isEqualTo("0000000000000000"), + () -> assertThat(revInfo.requestId) + .as("requestId should match expected value") + .isEqualTo("00000000-0000-0000-0000-000000000000"), + () -> assertThat(revInfo.clientIp) + .as("clientIp should match expected value") + .isEqualTo("unknown"), + () -> assertThat(revInfo.hostName) + .as("hostName should not be blank") + .isNotBlank()); + }); + } +} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java new file mode 100644 index 0000000..5ad9ff7 --- /dev/null +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java @@ -0,0 +1,32 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.mockStatic; + +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import java.net.InetAddress; +import java.net.UnknownHostException; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class DefaultRevisionContextProviderTest { + + @Inject + DefaultRevisionContextProvider underTest; + + @Test + void getHostName() { + assertThat(underTest.getHostName()).isNotBlank(); + } + + @Test + void getHostNameWhenUnknown() { + try (var inetMock = mockStatic(InetAddress.class)) { + inetMock.when(InetAddress::getLocalHost).thenThrow(new UnknownHostException("simulated failure")); + + assertThat(underTest.getHostName()).isEqualTo("unknown"); + } + } +} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java new file mode 100644 index 0000000..1b08c56 --- /dev/null +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java @@ -0,0 +1,28 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class RevisionTest { + + @Test + void testEquals() { + var r1 = new Revision(); + r1.rev = 1; + + var r2 = new Revision(); + r2.rev = 1; + + assertThat(r1).as("Revisions should be equal").isEqualTo(r2); + } + + @Test + void testHashCode() {} + + @Test + void testToString() {} +} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity.java new file mode 100644 index 0000000..2dea9ea --- /dev/null +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity.java @@ -0,0 +1,23 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import org.hibernate.envers.Audited; + +@Entity +@Audited +@Table(name = "test_entity") +public class TestEntity extends AuditedPanacheEntity { + + public String something; + + public TestEntity() {} + + public TestEntity(String something) { + this.something = something; + } + + public static TestEntity findBySomething(String something) { + return find("something", something).singleResult(); + } +} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity2.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity2.java new file mode 100644 index 0000000..922b96a --- /dev/null +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity2.java @@ -0,0 +1,29 @@ +package ch.phoenix.oss.quarkus.commons.audit; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import org.hibernate.envers.Audited; + +@Entity +@Audited +@Table(name = "test_entity") +public class TestEntity2 extends AuditedPanacheEntityBase { + + @Id + @GeneratedValue + public Long id; + + public String something; + + public TestEntity2() {} + + public TestEntity2(String something) { + this.something = something; + } + + public static TestEntity2 findBySomething(String something) { + return find("something", something).singleResult(); + } +} diff --git a/quarkus-audit-tools/src/test/resources/application.yaml b/quarkus-audit-tools/src/test/resources/application.yaml new file mode 100644 index 0000000..d44d31a --- /dev/null +++ b/quarkus-audit-tools/src/test/resources/application.yaml @@ -0,0 +1,22 @@ +quarkus: + flyway: + migrate-at-start: true + datasource: + db-kind: postgresql + hibernate-orm: + sql-load-script: no-file + schema-management: + strategy: none + log: + sql: true + bind-parameters: true + hibernate-envers: + audit-strategy: org.hibernate.envers.strategy.internal.ValidityAuditStrategy + revision-listener: ch.phoenix.oss.quarkus.commons.audit.AuditRevisionListener + security: + users: + embedded: + enabled: true + plain-text: true + users: + jon: doe diff --git a/quarkus-audit-tools/src/test/resources/db/migration/V1__create_schema.sql b/quarkus-audit-tools/src/test/resources/db/migration/V1__create_schema.sql new file mode 100644 index 0000000..daabe85 --- /dev/null +++ b/quarkus-audit-tools/src/test/resources/db/migration/V1__create_schema.sql @@ -0,0 +1,46 @@ +create sequence revinfo_seq start with 1 increment by 50; +create sequence test_entity_seq start with 1 increment by 50; + +create table revinfo +( + rev bigint not null, + timestamp timestamp(6) with time zone not null, + actor varchar(255), + spanId varchar(255), + traceId varchar(255), + requestId varchar(255), + clientIp varchar(255), + hostName varchar(255), + primary key (rev) +); + +create table test_entity +( + + id bigint primary key not null, + something varchar(255), + createdAt timestamp(6) with time zone, + lastUpdatedAt timestamp(6) with time zone +); + +create table test_entity_aud +( + revtype smallint, + rev bigint not null, + revend bigint, + id bigint not null, + something varchar(255), + primary key (rev, id) +); + +alter table if exists test_entity_aud + add constraint fk_rev__revinfo_rev + foreign key (rev) + references revinfo; + + +alter table if exists test_entity_aud + add constraint fk_revend__revinfo_rev + foreign key (revend) + references revinfo; + diff --git a/quarkus-audit-tools/src/test/resources/db/migration/V2__create_audit_trigger.sql b/quarkus-audit-tools/src/test/resources/db/migration/V2__create_audit_trigger.sql new file mode 100644 index 0000000..f76a2cb --- /dev/null +++ b/quarkus-audit-tools/src/test/resources/db/migration/V2__create_audit_trigger.sql @@ -0,0 +1,35 @@ +CREATE OR REPLACE FUNCTION trg_test_entity_aud_apply_rev() + RETURNS TRIGGER + LANGUAGE plpgsql +AS $func$ +DECLARE + ts TIMESTAMP; +BEGIN + -- fetch the exact revision timestamp from revinfo + SELECT r.timestamp + INTO ts + FROM revinfo r + WHERE r.rev = NEW.rev; + + -- only set created_at once, when still NULL + UPDATE test_entity + SET createdAt = ts + WHERE id = NEW.id + AND createdAt IS NULL; + + -- always bump last_updated_at + UPDATE test_entity + SET lastUpdatedAt = ts + WHERE id = NEW.id; + + RETURN NULL; +END; +$func$; + +DROP TRIGGER IF EXISTS trg_test_entity_aud_after_insert + ON test_entity_aud; + +CREATE TRIGGER trg_test_entity_aud_after_insert + AFTER INSERT ON test_entity_aud + FOR EACH ROW +EXECUTE FUNCTION trg_test_entity_aud_apply_rev(); diff --git a/quarkus-audit-tools/src/test/resources/import.sql b/quarkus-audit-tools/src/test/resources/import.sql new file mode 100644 index 0000000..c4a0b85 --- /dev/null +++ b/quarkus-audit-tools/src/test/resources/import.sql @@ -0,0 +1,37 @@ +-- 1) Create or replace the trigger function +CREATE OR REPLACE FUNCTION trg_test_entity_aud_apply_rev() + RETURNS TRIGGER + LANGUAGE plpgsql +AS $func$ +DECLARE + ts TIMESTAMP; +BEGIN + -- fetch the exact revision timestamp from revinfo + SELECT r.timestamp + INTO ts + FROM revinfo r + WHERE r.rev = NEW.rev; + + -- only set created_at once, when still NULL + UPDATE test_entity + SET created_at = ts + WHERE id = NEW.id + AND created_at IS NULL; + + -- always bump last_updated_at + UPDATE test_entity + SET last_updated_at = ts + WHERE id = NEW.id; + + RETURN NULL; -- AFTER trigger ignores return value +END; +$func$; + +-- 2) Drop any existing trigger, then attach the new one +DROP TRIGGER IF EXISTS trg_test_entity_aud_after_insert + ON test_entity_aud; + +CREATE TRIGGER trg_test_entity_aud_after_insert + AFTER INSERT ON test_entity_aud + FOR EACH ROW +EXECUTE FUNCTION trg_test_entity_aud_apply_rev(); From 291e3b0712ec8702eeffb5b3a617e4cc64de8535 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 18 Jun 2025 01:45:56 +0200 Subject: [PATCH 05/54] docs(README): update modules list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3f9134e..6f32452 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,11 @@ that can be used by Quarkus applications. The modules are: +* `quarkus-audit-tools` * `quarkus-clock-service` * `quarkus-json-service` * `quarkus-message-digest-service` * `quarkus-random-number-generator` +* `quarkus-tracing-service` * `quarkus-uuid-generator` From a0006d4455db7f0d6bb60b836f561b6ae0425464 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 18 Jun 2025 01:54:21 +0200 Subject: [PATCH 06/54] fix(tracing): use trace level instead of info on TracingServiceImpl --- .../phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java index 0970b35..b5f295b 100644 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java @@ -23,7 +23,7 @@ class TracingServiceImpl implements TracingService { @Override public void trace(final String key, final Object value) { - Log.infof("tracing key=%s value=%s", key, value); + Log.tracef("tracing key=%s value=%s", key, value); MDC.put(key, value); } From 2844cff58a58ce9175993e73e3e07b7ee1ba2596 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 18 Jun 2025 01:57:56 +0200 Subject: [PATCH 07/54] ci(github-actions): use project-metadata-action@main instead of master --- .github/workflows/release.yaml | 2 +- .github/workflows/validate-versions.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 37ff2fd..3043398 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v4 - name: Retrieve project metadata - uses: https://github.com/radcortez/project-metadata-action@master + uses: https://github.com/radcortez/project-metadata-action@main id: metadata with: metadata-file-path: '.github/project.yaml' diff --git a/.github/workflows/validate-versions.yaml b/.github/workflows/validate-versions.yaml index a44b4c3..7828cbe 100644 --- a/.github/workflows/validate-versions.yaml +++ b/.github/workflows/validate-versions.yaml @@ -14,7 +14,7 @@ jobs: uses: https://github.com/actions/checkout@v4 - name: Retrieve project metadata - uses: https://github.com/radcortez/project-metadata-action@master + uses: https://github.com/radcortez/project-metadata-action@main id: metadata with: metadata-file-path: '.github/project.yaml' From 7c45b3e4aec8e0797d4f90434cb10e99a83fee5d Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 18 Jun 2025 02:14:58 +0200 Subject: [PATCH 08/54] chore: bump to 1.0.1 --- .github/project.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/project.yaml b/.github/project.yaml index 40e3006..d4f740e 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -1,4 +1,4 @@ name: Quarkus Commons release: - current-version: "1.0.0" - next-version: "1.0.1-SNAPSHOT" + current-version: "1.0.1" + next-version: "1.0.2-SNAPSHOT" From acbe6c5ae2ee930346362d08852c69860bd70a40 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 18 Jun 2025 02:16:31 +0200 Subject: [PATCH 09/54] chore: bump version to 1.0.1 --- .github/project.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/project.yaml b/.github/project.yaml index d4f740e..23a613b 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -2,3 +2,4 @@ name: Quarkus Commons release: current-version: "1.0.1" next-version: "1.0.2-SNAPSHOT" + From 1bd06f18570fa9f1a8321ef449621f679907a6c5 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Wed, 18 Jun 2025 00:18:20 +0000 Subject: [PATCH 10/54] chore: release 1.0.1 --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 2a94134..9495f64 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.1-SNAPSHOT + 1.0.1 pom @@ -72,7 +72,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD + 1.0.1 diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index be3a1e2..5501c6d 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1-SNAPSHOT + 1.0.1 quarkus-audit-tools diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 282883e..280d227 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1-SNAPSHOT + 1.0.1 quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 7584321..0b1d6cb 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1-SNAPSHOT + 1.0.1 quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index e619b25..c0c0a91 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1-SNAPSHOT + 1.0.1 quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 51104bb..6d14cc0 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1-SNAPSHOT + 1.0.1 quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index b95f87d..52ef69f 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1-SNAPSHOT + 1.0.1 quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 42454a7..98fa97b 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1-SNAPSHOT + 1.0.1 quarkus-uuid-generator From bbd1d80d6c77ac3c5440b52ed00787895b0792fc Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Wed, 18 Jun 2025 00:18:21 +0000 Subject: [PATCH 11/54] chore: prepare for next development iteration [skip ci] --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 9495f64..0cd5804 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.1 + 1.0.2-SNAPSHOT pom @@ -72,7 +72,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.1 + HEAD diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 5501c6d..dd9dd24 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1 + 1.0.2-SNAPSHOT quarkus-audit-tools diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 280d227..db69d67 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1 + 1.0.2-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 0b1d6cb..143b30c 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1 + 1.0.2-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index c0c0a91..8429483 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1 + 1.0.2-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 6d14cc0..5ca5956 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1 + 1.0.2-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 52ef69f..4e061b5 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1 + 1.0.2-SNAPSHOT quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 98fa97b..30624eb 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.1 + 1.0.2-SNAPSHOT quarkus-uuid-generator From 6ac4bd783e5d43bd04a43af684ebda710566e90c Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Thu, 19 Jun 2025 16:10:53 +0200 Subject: [PATCH 12/54] feat(clock): add local and zoned date methods to service --- .../quarkus/commons/clock/ClockService.java | 9 +++++ .../commons/clock/ClockServiceImpl.java | 18 ++++++++-- .../commons/clock/ClockServiceImplTest.java | 33 +++++++++++++++++-- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockService.java b/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockService.java index e9a214e..f6c3c26 100644 --- a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockService.java +++ b/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockService.java @@ -1,10 +1,19 @@ package ch.phoenix.oss.quarkus.commons.clock; import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZonedDateTime; public interface ClockService { Instant instant(); long currentTimeMillis(); + + LocalDate localDate(); + + LocalDateTime localDateTime(); + + ZonedDateTime zonedDateTime(); } diff --git a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImpl.java b/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImpl.java index 4c90334..e47c757 100644 --- a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImpl.java +++ b/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImpl.java @@ -2,8 +2,7 @@ package ch.phoenix.oss.quarkus.commons.clock; import io.quarkus.arc.DefaultBean; import jakarta.enterprise.context.ApplicationScoped; -import java.time.Clock; -import java.time.Instant; +import java.time.*; @DefaultBean @ApplicationScoped @@ -24,4 +23,19 @@ class ClockServiceImpl implements ClockService { public long currentTimeMillis() { return clock.millis(); } + + @Override + public LocalDate localDate() { + return LocalDate.now(clock); + } + + @Override + public LocalDateTime localDateTime() { + return LocalDateTime.now(clock); + } + + @Override + public ZonedDateTime zonedDateTime() { + return ZonedDateTime.now(clock); + } } diff --git a/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImplTest.java b/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImplTest.java index 626bb0a..dfffea8 100644 --- a/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImplTest.java +++ b/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImplTest.java @@ -6,8 +6,7 @@ import static org.mockito.Mockito.when; import io.quarkus.test.InjectMock; import io.quarkus.test.junit.QuarkusTest; import jakarta.inject.Inject; -import java.time.Clock; -import java.time.Instant; +import java.time.*; import org.junit.jupiter.api.Test; @QuarkusTest @@ -38,4 +37,34 @@ class ClockServiceImplTest { .as("Instant should match expected value") .isEqualTo(expected); } + + @Test + void localDate() { + var instant = Instant.ofEpochMilli(1729280640915L); + when(clock.instant()).thenReturn(instant); + when(clock.getZone()).thenReturn(ZoneId.of("UTC")); + assertThat(clockService.localDate()) + .as("LocalDate should match expected value") + .isEqualTo(LocalDate.parse("2024-10-18")); + } + + @Test + void localDateTime() { + var instant = Instant.ofEpochMilli(1729280640915L); + when(clock.instant()).thenReturn(instant); + when(clock.getZone()).thenReturn(ZoneId.of("UTC")); + assertThat(clockService.localDateTime()) + .as("LocalDateTime should match expected value") + .isEqualTo(LocalDateTime.parse("2024-10-18T19:44:00.915")); + } + + @Test + void zonedDateTime() { + var instant = Instant.ofEpochMilli(1729280640915L); + when(clock.instant()).thenReturn(instant); + when(clock.getZone()).thenReturn(ZoneId.of("UTC")); + assertThat(clockService.zonedDateTime()) + .as("ZonedDateTime should match expected value") + .isEqualTo(ZonedDateTime.parse("2024-10-18T19:44:00.915Z[UTC]")); + } } From 66c190208be0a42c4757fc5682c32b1e9d877367 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Thu, 19 Jun 2025 17:10:52 +0200 Subject: [PATCH 13/54] chore: bump to 1.0.2 --- .github/project.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/project.yaml b/.github/project.yaml index 23a613b..7daa27c 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -1,5 +1,5 @@ name: Quarkus Commons release: - current-version: "1.0.1" - next-version: "1.0.2-SNAPSHOT" - + current-version: "1.0.2" + next-version: "1.0.3-SNAPSHOT" + From c55e317c922342279584506e3a78c6f7828d847d Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Thu, 19 Jun 2025 15:12:06 +0000 Subject: [PATCH 14/54] chore: release 1.0.2 --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 0cd5804..ba69779 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.2-SNAPSHOT + 1.0.2 pom @@ -72,7 +72,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD + 1.0.2 diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index dd9dd24..9a4fc6d 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2-SNAPSHOT + 1.0.2 quarkus-audit-tools diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index db69d67..6a39da6 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2-SNAPSHOT + 1.0.2 quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 143b30c..a4d7197 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2-SNAPSHOT + 1.0.2 quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 8429483..3a71d83 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2-SNAPSHOT + 1.0.2 quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 5ca5956..96d5c87 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2-SNAPSHOT + 1.0.2 quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 4e061b5..e052fd3 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2-SNAPSHOT + 1.0.2 quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 30624eb..60dfe9f 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2-SNAPSHOT + 1.0.2 quarkus-uuid-generator From 3081156f9fd2a14f290e39634ea478542e4ce361 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Thu, 19 Jun 2025 15:12:07 +0000 Subject: [PATCH 15/54] chore: prepare for next development iteration [skip ci] --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index ba69779..d9cbc9d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.2 + 1.0.3-SNAPSHOT pom @@ -72,7 +72,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.2 + HEAD diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 9a4fc6d..319a288 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2 + 1.0.3-SNAPSHOT quarkus-audit-tools diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 6a39da6..42e0084 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2 + 1.0.3-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index a4d7197..7da3814 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2 + 1.0.3-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 3a71d83..3fa730e 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2 + 1.0.3-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 96d5c87..a9f3c7b 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2 + 1.0.3-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index e052fd3..ccec696 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2 + 1.0.3-SNAPSHOT quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 60dfe9f..b90a167 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.2 + 1.0.3-SNAPSHOT quarkus-uuid-generator From 6f7b048266059141d9540052461a47796ac442f7 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Fri, 27 Jun 2025 21:53:30 +0200 Subject: [PATCH 16/54] feat(deps): update quarkus.platform.version to 3.24.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d9cbc9d..6d09e71 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ quarkus-bom io.quarkus.platform - 3.23.3 + 3.24.1 3.14.0 From 5ac5d90f9709a631d9093058472c8680447ca6f3 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Sat, 28 Jun 2025 04:20:52 +0200 Subject: [PATCH 17/54] fix(tracing): implement redact for query, add default values --- .../commons/tracing/TracingConfiguration.java | 18 ++++++ .../commons/tracing/TracingRequestFilter.java | 42 ++++++++----- .../quarkus/commons/tracing/ActorTest.java | 2 +- .../commons/tracing/QueryParamTest.java | 54 ++++++++++++++++ .../quarkus/commons/tracing/RedactedTest.java | 61 +++++++++++++++++++ .../src/test/resources/application.yaml | 1 + 6 files changed, 162 insertions(+), 16 deletions(-) create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java index 46e2854..1093348 100644 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java @@ -3,6 +3,7 @@ package ch.phoenix.oss.quarkus.commons.tracing; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithConverter; import io.smallrye.config.WithDefault; +import jakarta.ws.rs.core.HttpHeaders; import java.util.Optional; import java.util.Set; @@ -17,6 +18,14 @@ public interface TracingConfiguration { interface Headers { + Set DEFAULT_REDACTED = Set.of(HttpHeaders.AUTHORIZATION.toLowerCase()); + + /** + * Optional set of headers to redact when tracing. By default, redacts + * the 'Authorization' header. + * + * @return the set of headers to be redacted + */ Optional> redact(); } @@ -31,9 +40,18 @@ public interface TracingConfiguration { Query query(); interface Query { + + Set DEFAULT_REDACTED = Set.of("access_token", "refresh_token", "apikey"); + @WithDefault("false") boolean includeRaw(); + /** + * Optional set of query params to redact when tracing. By default, redacts + * the following params: 'access_token', 'refresh_token' and 'apikey'. + * + * @return the set of query params to be redacted + */ Optional> redact(); } } diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java index 4a1cbd4..7bb2427 100644 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java @@ -9,12 +9,13 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.container.ResourceInfo; import java.util.List; -import java.util.Set; import org.jboss.resteasy.reactive.server.ServerRequestFilter; @Unremovable public class TracingRequestFilter { + private static final String REDACTED_VALUE = "********"; + private final RoutingContext routingContext; private final TracingService tracingService; private final SecurityIdentity securityIdentity; @@ -57,24 +58,38 @@ public class TracingRequestFilter { TracingConstants.REQUEST_PATH_RAW, uriInfo.getAbsolutePath().getRawPath()); } + var redactedHeaders = configuration + .requestFilter() + .headers() + .redact() + .orElse(TracingConfiguration.RequestFilterConfiguration.Headers.DEFAULT_REDACTED); + requestContext.getHeaders().forEach((key, value) -> { var lowerCaseKey = key.toLowerCase(); var property = TracingConstants.REQUEST_HEADERS + '.' + lowerCaseKey; - if (configuration - .requestFilter() - .headers() - .redact() - .orElse(Set.of()) - .contains(lowerCaseKey)) { - tracingService.trace(property, "********"); + if (redactedHeaders.contains(lowerCaseKey)) { + tracingService.trace(property, REDACTED_VALUE); } else { tracingService.trace(property, joinStrings(value)); } }); - uriInfo.getQueryParameters() - .forEach((key, value) -> - tracingService.trace(TracingConstants.REQUEST_QUERY_PARAMS + '.' + key, joinStrings(value))); + var redactedQueryParams = configuration + .requestFilter() + .query() + .redact() + .orElse(TracingConfiguration.RequestFilterConfiguration.Query.DEFAULT_REDACTED); + + uriInfo.getQueryParameters().forEach((key, value) -> { + var lowerCaseKey = key.toLowerCase(); + var property = TracingConstants.REQUEST_QUERY_PARAMS + '.' + lowerCaseKey; + + if (redactedQueryParams.contains(lowerCaseKey)) { + tracingService.trace(property, REDACTED_VALUE); + } else { + tracingService.trace(property, joinStrings(value)); + } + }); if (configuration.requestFilter().query().includeRaw()) { var rawQuery = uriInfo.getRequestUri().getRawQuery(); @@ -87,10 +102,7 @@ public class TracingRequestFilter { TracingConstants.REQUEST_CLIENT_IP, routingContext.request().connection().remoteAddress(true).hostAddress()); - if (Log.isTraceEnabled()) { - Log.tracef( - "Incoming request: %s %s", method, uriInfo.getAbsolutePath().getRawPath()); - } + Log.debugf("Incoming request: %s %s", method, uriInfo.getAbsolutePath().getRawPath()); } private static String joinStrings(List value) { diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java index 2190561..a173b72 100644 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java @@ -34,7 +34,7 @@ public class ActorTest { verify(tracingService).trace("request.route", route); verify(tracingService).trace("request.headers.accept", "text/plain"); verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); - verify(tracingService).trace("request.headers.authorization", "Basic am9uOmRvZQ=="); + verify(tracingService).trace("request.headers.authorization", "********"); verify(tracingService).trace("request.headers.connection", "Keep-Alive"); verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java new file mode 100644 index 0000000..7378040 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java @@ -0,0 +1,54 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.startsWith; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.mockito.InjectSpy; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Test; + +@QuarkusTest +public class QueryParamTest { + + @InjectSpy + TracingService tracingService; + + @Test + void traceQueryParams() { + var route = "/authenticated"; + RestAssured.given() + .auth() + .basic("jon", "doe") + .accept(ContentType.TEXT) + .header("X-SOMETHING-ELSE", "whatever") + .queryParam("access_token", "api123") + .queryParam("refresh_token", "refresh123") + .queryParam("apikey", "apikey123") + .queryParam("grant_type", "authorization_code") + .when() + .get(route) + .then() + .statusCode(200); + + verify(tracingService).trace("actor", "jon"); + verify(tracingService).trace("request.method", "GET"); + verify(tracingService).trace("request.route", route); + verify(tracingService).trace("request.headers.accept", "text/plain"); + verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); + verify(tracingService).trace("request.headers.authorization", "********"); + verify(tracingService).trace("request.headers.connection", "Keep-Alive"); + verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); + verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); + verify(tracingService).trace("request.headers.x-something-else", "whatever"); + verify(tracingService).trace("request.query.params.access_token", "********"); + verify(tracingService).trace("request.query.params.refresh_token", "********"); + verify(tracingService).trace("request.query.params.apikey", "********"); + verify(tracingService).trace("request.query.params.grant_type", "authorization_code"); + verify(tracingService).trace("request.client.ip", "127.0.0.1"); + verifyNoMoreInteractions(tracingService); + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java new file mode 100644 index 0000000..34658e2 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java @@ -0,0 +1,61 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.startsWith; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; +import io.quarkus.test.junit.mockito.InjectSpy; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Test; + +@QuarkusTest +@TestProfile(Test2Profile.class) +public class RedactedTest { + + @InjectSpy + TracingService tracingService; + + @Test + void traceRedactedValues() { + var route = "/authenticated"; + RestAssured.given() + .auth() + .basic("jon", "doe") + .accept(ContentType.TEXT) + .header("X-SOMETHING-ELSE", "whatever") + .queryParam("access_token", "api123") + .queryParam("refresh_token", "refresh123") + .queryParam("apikey", "apikey123") + .queryParam("grant_type", "authorization_code") + .when() + .get(route) + .then() + .statusCode(200); + + verify(tracingService).trace("actor", "jon"); + verify(tracingService).trace("request.method", "GET"); + verify(tracingService).trace("request.route", route); + verify(tracingService).trace("request.path.raw", route); + verify(tracingService).trace("request.headers.accept", "text/plain"); + verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); + verify(tracingService).trace("request.headers.authorization", "********"); + verify(tracingService).trace("request.headers.connection", "Keep-Alive"); + verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); + verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); + verify(tracingService).trace("request.headers.x-something-else", "********"); + verify(tracingService).trace("request.query.params.access_token", "********"); + verify(tracingService).trace("request.query.params.refresh_token", "refresh123"); + verify(tracingService).trace("request.query.params.apikey", "apikey123"); + verify(tracingService).trace("request.query.params.grant_type", "authorization_code"); + verify(tracingService) + .trace( + "request.query.raw", + "access_token=api123&refresh_token=refresh123&apikey=apikey123&grant_type=authorization_code"); + verify(tracingService).trace("request.client.ip", "127.0.0.1"); + verifyNoMoreInteractions(tracingService); + } +} diff --git a/quarkus-tracing-service/src/test/resources/application.yaml b/quarkus-tracing-service/src/test/resources/application.yaml index 9d0943f..3c6bb6f 100644 --- a/quarkus-tracing-service/src/test/resources/application.yaml +++ b/quarkus-tracing-service/src/test/resources/application.yaml @@ -32,6 +32,7 @@ quarkus: headers: redact: - AUTHORIZATION + - X-SOMETHING-ELSE query: include-raw: true redact: From d5053a3862f07850ac5971507ab4fa0b59d72a76 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Sat, 28 Jun 2025 05:04:22 +0200 Subject: [PATCH 18/54] chore: bump version to 1.0.3 --- .github/project.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/project.yaml b/.github/project.yaml index 7daa27c..3005d38 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -1,5 +1,6 @@ name: Quarkus Commons release: - current-version: "1.0.2" - next-version: "1.0.3-SNAPSHOT" + current-version: "1.0.3" + next-version: "1.0.4-SNAPSHOT" + From a22c0704018b6cfd717f04e69d4aef633337169b Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Sat, 28 Jun 2025 03:06:33 +0000 Subject: [PATCH 19/54] chore: release 1.0.3 --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 6d09e71..a975eaa 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.3-SNAPSHOT + 1.0.3 pom @@ -72,7 +72,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD + 1.0.3 diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 319a288..6a66725 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3-SNAPSHOT + 1.0.3 quarkus-audit-tools diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 42e0084..51131fd 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3-SNAPSHOT + 1.0.3 quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 7da3814..efe3c1b 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3-SNAPSHOT + 1.0.3 quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 3fa730e..1a5db9a 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3-SNAPSHOT + 1.0.3 quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index a9f3c7b..3553726 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3-SNAPSHOT + 1.0.3 quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index ccec696..5f8440f 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3-SNAPSHOT + 1.0.3 quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index b90a167..1780637 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3-SNAPSHOT + 1.0.3 quarkus-uuid-generator From 1f38615a156d249bd430366859f1a959ec9b0a0c Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Sat, 28 Jun 2025 03:06:34 +0000 Subject: [PATCH 20/54] chore: prepare for next development iteration [skip ci] --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index a975eaa..aa04984 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.3 + 1.0.4-SNAPSHOT pom @@ -72,7 +72,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.3 + HEAD diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 6a66725..76ee4ad 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3 + 1.0.4-SNAPSHOT quarkus-audit-tools diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 51131fd..40b429b 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3 + 1.0.4-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index efe3c1b..2d1f869 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3 + 1.0.4-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 1a5db9a..668ccf7 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3 + 1.0.4-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 3553726..d86279f 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3 + 1.0.4-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 5f8440f..75a714b 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3 + 1.0.4-SNAPSHOT quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 1780637..8dab532 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.3 + 1.0.4-SNAPSHOT quarkus-uuid-generator From e6ec3f57f8640101ca1e48a8d2f8cefd9fed3d5e Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Fri, 4 Jul 2025 18:34:48 +0200 Subject: [PATCH 21/54] feat: add quarkus-client-logger module with RedactingClientLogger --- pom.xml | 1 + .../client/logger/RedactingClientLogger.java | 106 ++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java diff --git a/pom.xml b/pom.xml index aa04984..a0d09c6 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,7 @@ quarkus-audit-tools + quarkus-client-logger quarkus-clock-service quarkus-json-service quarkus-message-digest-service diff --git a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java new file mode 100644 index 0000000..3061c09 --- /dev/null +++ b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java @@ -0,0 +1,106 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import io.vertx.core.Handler; +import io.vertx.core.MultiMap; +import io.vertx.core.buffer.Buffer; +import io.vertx.core.http.HttpClientRequest; +import io.vertx.core.http.HttpClientResponse; +import jakarta.enterprise.context.Dependent; +import jakarta.ws.rs.core.HttpHeaders; +import java.util.Map; +import org.jboss.logging.Logger; +import org.jboss.resteasy.reactive.client.api.ClientLogger; + +/** + * This is based on org.jboss.resteasy.reactive.client.logging.DefaultClientLogger, + * with the only change being that the value of "Authorization" header, when present, + * is redacted. + */ +@Dependent +public class RedactingClientLogger implements ClientLogger { + + private static final Logger log = Logger.getLogger(RedactingClientLogger.class); + + private int bodySize; + + @Override + public void setBodySize(int bodySize) { + this.bodySize = bodySize; + } + + @Override + public void logResponse(HttpClientResponse response, boolean redirect) { + if (!log.isDebugEnabled()) { + return; + } + + //noinspection Convert2Lambda + response.bodyHandler(new Handler<>() { + @Override + public void handle(Buffer body) { + log.debugf( + "%s: %s %s, Status[%d %s], Headers[%s], Body:\n%s", + redirect ? "Redirect" : "Response", + response.request().getMethod(), + response.request().absoluteURI(), + response.statusCode(), + response.statusMessage(), + asString(response.headers()), + bodyToString(body)); + } + }); + } + + @Override + public void logRequest(HttpClientRequest request, Buffer body, boolean omitBody) { + if (!log.isDebugEnabled()) { + return; + } + if (omitBody) { + log.debugf( + "Request: %s %s Headers[%s], Body omitted", + request.getMethod(), request.absoluteURI(), asString(request.headers())); + } else if (body == null || body.length() == 0) { + log.debugf( + "Request: %s %s Headers[%s], Empty body", + request.getMethod(), request.absoluteURI(), asString(request.headers())); + } else { + log.debugf( + "Request: %s %s Headers[%s], Body:\n%s", + request.getMethod(), request.absoluteURI(), asString(request.headers()), bodyToString(body)); + } + } + + private String bodyToString(Buffer body) { + if (body == null) { + return ""; + } else if (bodySize <= 0) { + return body.toString(); + } else { + String bodyAsString = body.toString(); + return bodyAsString.substring(0, Math.min(bodySize, bodyAsString.length())); + } + } + + private String asString(MultiMap headers) { + if (headers.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder((headers.size() * (6 + 1 + 6)) + + (headers.size() - 1)); // this is a very rough estimate of a result like 'key1=value1 key2=value2' + boolean isFirst = true; + for (Map.Entry entry : headers) { + if (isFirst) { + isFirst = false; + } else { + sb.append(' '); + } + + var key = entry.getKey(); + var value = HttpHeaders.AUTHORIZATION.equalsIgnoreCase(key) ? "*****" : entry.getValue(); + + sb.append(key).append('=').append(value); + } + return sb.toString(); + } +} From cccd9dde98c4aa5fbf64931c33800dd2b1234161 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Fri, 4 Jul 2025 18:36:27 +0200 Subject: [PATCH 22/54] fix(deps): update quarkus.platform.version to 3.24.2 --- pom.xml | 2 +- quarkus-client-logger/pom.xml | 55 +++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 quarkus-client-logger/pom.xml diff --git a/pom.xml b/pom.xml index a0d09c6..72b43a0 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ quarkus-bom io.quarkus.platform - 3.24.1 + 3.24.2 3.14.0 diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml new file mode 100644 index 0000000..2e055f1 --- /dev/null +++ b/quarkus-client-logger/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + + ch.phoenix.oss + quarkus-commons + 1.0.4-SNAPSHOT + + + quarkus-client-logger + jar + + + + io.quarkus + quarkus-rest-client + + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-plugin.version} + + + jacoco-check + + check + + test + + ${project.build.directory}/jacoco-quarkus.exec + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + 1 + + + + + + + + + + + + From d7b6286546b33ec581ebd6ac0d92b611e5cd5055 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Fri, 4 Jul 2025 18:46:01 +0200 Subject: [PATCH 23/54] chore: bump version to 1.0.4 --- .github/project.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/project.yaml b/.github/project.yaml index 3005d38..8d17764 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -1,6 +1,6 @@ name: Quarkus Commons release: - current-version: "1.0.3" - next-version: "1.0.4-SNAPSHOT" + current-version: "1.0.4" + next-version: "1.0.5-SNAPSHOT" From 3bbdf7015abb7ff433399e57a92688cc7bd6fce3 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Fri, 4 Jul 2025 16:47:32 +0000 Subject: [PATCH 24/54] chore: release 1.0.4 --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 72b43a0..2814070 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD + 1.0.4 diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 76ee4ad..e4c9f0d 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index 2e055f1..d9a3e4d 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 40b429b..16bd522 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 2d1f869..a1706a3 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 668ccf7..99857d0 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index d86279f..ec5ccf8 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 75a714b..2d4e33e 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 8dab532..bb65687 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4-SNAPSHOT + 1.0.4 quarkus-uuid-generator From 4b20f998567d0da8e8982211272e50df96b73043 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Fri, 4 Jul 2025 16:47:33 +0000 Subject: [PATCH 25/54] chore: prepare for next development iteration [skip ci] --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 2814070..80aacd9 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.4 + HEAD diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index e4c9f0d..420d24e 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index d9a3e4d..b6af2c3 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 16bd522..92392f0 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index a1706a3..afc346d 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 99857d0..9f66400 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index ec5ccf8..7fe3fbf 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 2d4e33e..d3b48ed 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index bb65687..4f7bef1 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.4 + 1.0.5-SNAPSHOT quarkus-uuid-generator From 4d20a75f42e022b3e0ea734883ebaee3abdd6d9f Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Sat, 12 Jul 2025 18:18:59 +0200 Subject: [PATCH 26/54] fix(deps): update quarkus.platform.version to 3.24.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 80aacd9..7706ed1 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ quarkus-bom io.quarkus.platform - 3.24.2 + 3.24.3 3.14.0 From 33e10b7a40a02f9c796318619244ecf5a338a086 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Sat, 12 Jul 2025 18:19:18 +0200 Subject: [PATCH 27/54] fix(deps): update palantir-java-format.version to 2.70.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7706ed1..60f9b8f 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ 3.14.0 3.5.3 2.44.4 - 2.66.0 + 2.70.0 0.8.13 3.3.1 3.1.1 From 0fd62decaf7a2707dd757ae439220fb771ec9c9a Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Sat, 12 Jul 2025 18:20:23 +0200 Subject: [PATCH 28/54] feat(deps): update com.diffplug.spotless:spotless-maven-plugin to 2.45.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 60f9b8f..91f6837 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 3.14.0 3.5.3 - 2.44.4 + 2.45.0 2.70.0 0.8.13 3.3.1 From 6d95a3b1230a06f44404da320f5fba74cabf8b6d Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Sat, 12 Jul 2025 18:26:17 +0200 Subject: [PATCH 29/54] chore: bump version to 1.0.5 --- .github/project.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/project.yaml b/.github/project.yaml index 8d17764..513c623 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -1,6 +1,5 @@ name: Quarkus Commons release: - current-version: "1.0.4" - next-version: "1.0.5-SNAPSHOT" + current-version: "1.0.5" + next-version: "1.0.6-SNAPSHOT" - From 2d1f9a14176c7d2f7f2081c716f6bac24ac47337 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Sat, 12 Jul 2025 16:29:58 +0000 Subject: [PATCH 30/54] chore: release 1.0.5 --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 91f6837..4b8f236 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD + 1.0.5 diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 420d24e..2c78b9b 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index b6af2c3..53754d9 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 92392f0..3b0953d 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index afc346d..d516d62 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 9f66400..584d87b 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 7fe3fbf..0dab4fc 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index d3b48ed..7f046aa 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 4f7bef1..ca0280d 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5-SNAPSHOT + 1.0.5 quarkus-uuid-generator From 880df82728cacfd72239d4ee05ae2bbb1531af1a Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Sat, 12 Jul 2025 16:29:59 +0000 Subject: [PATCH 31/54] chore: prepare for next development iteration [skip ci] --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 4b8f236..5e7a8ee 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.5 + HEAD diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 2c78b9b..6722361 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index 53754d9..f213f78 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 3b0953d..a772de5 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index d516d62..71a54cd 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 584d87b..bca71c6 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 0dab4fc..10b74cb 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 7f046aa..d3c4157 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index ca0280d..16a3f3a 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.5 + 1.0.6-SNAPSHOT quarkus-uuid-generator From 8aad75a493d09465aacfe36d5d75da6d6e34e060 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Fri, 18 Jul 2025 09:43:50 +0200 Subject: [PATCH 32/54] fix(deps): update quarkus.platform.version to 3.24.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5e7a8ee..1808f9d 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ quarkus-bom io.quarkus.platform - 3.24.3 + 3.24.4 3.14.0 From a5e0c2672b06980fd0aac7b39f3e2bf418bf6b49 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Fri, 18 Jul 2025 10:26:00 +0200 Subject: [PATCH 33/54] ci(github-actions): revamp build.yaml to trigger on tags and do proper validation of version --- .github/workflows/build.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b32c3db..f99f691 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -4,6 +4,8 @@ on: push: branches: - "main" + tags: + - '[0-9]+.[0-9]+.[0-9]+' paths-ignore: - '.gitattributes' - '.gitignore' @@ -12,6 +14,7 @@ on: - 'docs/**' - 'README.md' pull_request: + workflow_dispatch: env: COMMON_MAVEN_OPTS: "-e -B --fae" @@ -73,6 +76,17 @@ jobs: - name: Make maven wrapper executable run: chmod +x mvnw + - name: Validate tag + if: startsWith(github.ref, 'refs/tags/') + run: | + TAG_NAME="${GITHUB_REF#refs/tags/}" + PROJECT_VERSION=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout) + + if [[ "$PROJECT_VERSION" != "$TAG_NAME" ]]; then + echo "::error::pom.xml version '$PROJECT_VERSION' does not match tag '$TAG_NAME'" + exit 1 + fi + - name: Download dependencies run: ./mvnw $COMMON_MAVEN_OPTS quarkus:go-offline From 5e8f8fefa8f11359886fe9a44307e4b121c68692 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Fri, 18 Jul 2025 14:01:02 +0200 Subject: [PATCH 34/54] ci(github-actions): fix jars not being published on tags --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f99f691..bf8a636 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -101,5 +101,5 @@ jobs: run: ./mvnw $COMMON_MAVEN_OPTS org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=quarkus-commons -Dsonar.projectName='quarkus-commons' -Dsonar.coverage.jacoco.xmlReportPaths=../**/target/jacoco-report/jacoco.xml - name: Publish jars - if: github.ref == 'refs/heads/main' + if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') run: ./mvnw $COMMON_MAVEN_OPTS deploy -Dmaven.test.skip=true -Dmaven.javadoc.skip=true \ No newline at end of file From 2d2383581077a50e481957abad83fa450fe226e8 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Fri, 18 Jul 2025 14:01:19 +0200 Subject: [PATCH 35/54] chore: bump version to 1.0.6 --- .github/project.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/project.yaml b/.github/project.yaml index 513c623..b1c8594 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -1,5 +1,5 @@ name: Quarkus Commons release: - current-version: "1.0.5" - next-version: "1.0.6-SNAPSHOT" + current-version: "1.0.6" + next-version: "1.0.7-SNAPSHOT" From a0939d7729f15e72a47feffd1ed34020f9045996 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Fri, 18 Jul 2025 12:03:02 +0000 Subject: [PATCH 36/54] chore: release 1.0.6 --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 1808f9d..402ec46 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD + 1.0.6 diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 6722361..b63e3f7 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index f213f78..58e2aa9 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index a772de5..c84c0c6 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 71a54cd..8739a83 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index bca71c6..c5bf009 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 10b74cb..8b1d028 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index d3c4157..5cd4ae6 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 16a3f3a..c510a6f 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6-SNAPSHOT + 1.0.6 quarkus-uuid-generator From fc140833d5d536b0236fa242ee2ccb63cea63496 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Fri, 18 Jul 2025 12:03:03 +0000 Subject: [PATCH 37/54] chore: prepare for next development iteration [skip ci] --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 402ec46..80a246e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.6 + HEAD diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index b63e3f7..f491142 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index 58e2aa9..81aa2e0 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index c84c0c6..59c15ae 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 8739a83..22775c3 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index c5bf009..b7e365d 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 8b1d028..5e9f0e0 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 5cd4ae6..abcaf25 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index c510a6f..a67e844 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.6 + 1.0.7-SNAPSHOT quarkus-uuid-generator From ed362d84b8395fdc429ac91c71c04d78e89b99a3 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Tue, 22 Jul 2025 22:30:15 +0200 Subject: [PATCH 38/54] chore(maven): remove skip ci from release message --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 80a246e..a4ee2d5 100644 --- a/pom.xml +++ b/pom.xml @@ -196,7 +196,7 @@ @{project.version} mvnw chore: release @{releaseLabel} - chore: prepare for next development iteration [skip ci] + chore: prepare for next development iteration true From 35d4e29a57bc0d4cb52b46a506e483f3605f68e2 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Tue, 22 Jul 2025 22:30:44 +0200 Subject: [PATCH 39/54] feat(deps): update palantir-java-format.version to 2.72.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a4ee2d5..b14da0c 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ 3.14.0 3.5.3 2.45.0 - 2.70.0 + 2.72.0 0.8.13 3.3.1 3.1.1 From cf81524d86ec674bf679b748ebaf3939d18816eb Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Tue, 22 Jul 2025 22:30:56 +0200 Subject: [PATCH 40/54] feat(deps): update com.diffplug.spotless:spotless-maven-plugin to 2.46.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b14da0c..36a20d6 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 3.14.0 3.5.3 - 2.45.0 + 2.46.1 2.72.0 0.8.13 3.3.1 From ca915c4bf5667e97a138c725851e2010e777d9f2 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Tue, 22 Jul 2025 22:31:39 +0200 Subject: [PATCH 41/54] feat(deps): update io.smallrye:jandex-maven-plugin to 3.4.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 36a20d6..8e88778 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 2.46.1 2.72.0 0.8.13 - 3.3.1 + 3.4.0 3.1.1 3.3.1 From 7d2cda5b2032d2fd77dc163cdd54ab262b7964b6 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Tue, 22 Jul 2025 22:36:43 +0200 Subject: [PATCH 42/54] docs(README): update sonarqube badges --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6f32452..1cfb1f7 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@ Quarkus Commons =============== [![Java version](https://img.shields.io/badge/Java%20version-21-brightgreen)](https://openjdk.org/projects/jdk/21/) -[![Coverage](https://sonarqube.pub.production.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=coverage&token=sqb_b39e0a05145228a10eb07d8771fd073297800645)](https://sonarqube.pub.production.kvant.cloud/dashboard?id=quarkus-commons) -[![Duplicated Lines (%)](https://sonarqube.pub.production.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=duplicated_lines_density&token=sqb_b39e0a05145228a10eb07d8771fd073297800645)](https://sonarqube.pub.production.kvant.cloud/dashboard?id=quarkus-commons) -[![Quality Gate Status](https://sonarqube.pub.production.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=alert_status&token=sqb_b39e0a05145228a10eb07d8771fd073297800645)](https://sonarqube.pub.production.kvant.cloud/dashboard?id=quarkus-commons) -[![Security Rating](https://sonarqube.pub.production.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=security_rating&token=sqb_b39e0a05145228a10eb07d8771fd073297800645)](https://sonarqube.pub.production.kvant.cloud/dashboard?id=quarkus-commons) -[![Reliability Rating](https://sonarqube.pub.production.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=reliability_rating&token=sqb_b39e0a05145228a10eb07d8771fd073297800645)](https://sonarqube.pub.production.kvant.cloud/dashboard?id=quarkus-commons) -[![Maintainability Rating](https://sonarqube.pub.production.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=sqale_rating&token=sqb_b39e0a05145228a10eb07d8771fd073297800645)](https://sonarqube.pub.production.kvant.cloud/dashboard?id=quarkus-commons) +[![Coverage](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=coverage&token=sqb_b56d9ea175c7f51f522ce63acd7fe7807643ac9e)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) +[![Duplicated Lines (%)](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=duplicated_lines_density&token=sqb_b56d9ea175c7f51f522ce63acd7fe7807643ac9e)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) +[![Quality Gate Status](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=alert_status&token=sqb_b56d9ea175c7f51f522ce63acd7fe7807643ac9e)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) +[![Security Rating](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=security_rating&token=sqb_b56d9ea175c7f51f522ce63acd7fe7807643ac9e)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) +[![Reliability Rating](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=reliability_rating&token=sqb_b56d9ea175c7f51f522ce63acd7fe7807643ac9e)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) +[![Maintainability Rating](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=sqale_rating&token=sqb_b56d9ea175c7f51f522ce63acd7fe7807643ac9e)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) # Introduction From 331a830c2bf92fd4e109bec88ea88cbb25910744 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 23 Jul 2025 14:27:42 +0200 Subject: [PATCH 43/54] refactor: apply some suggestions from SonarQube --- .../quarkus/commons/audit/RevisionTest.java | 32 +++++++++++++++++-- .../quarkus/commons/tracing/ActorTest.java | 2 +- .../commons/tracing/QueryParamTest.java | 2 +- .../quarkus/commons/tracing/RawPathTest.java | 2 +- .../quarkus/commons/tracing/RedactedTest.java | 2 +- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java index 1b08c56..61c3743 100644 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java @@ -17,12 +17,38 @@ class RevisionTest { var r2 = new Revision(); r2.rev = 1; - assertThat(r1).as("Revisions should be equal").isEqualTo(r2); + var r3 = new Revision(); + r3.rev = 2; + + assertThat(r1) + .as("Revisions equality should should match expected value") + .isEqualTo(r1) + .isEqualTo(r2) + .isNotEqualTo(r3) + .isNotEqualTo(new Object()); } @Test - void testHashCode() {} + void testHashCode() { + var r1 = new Revision(); + r1.rev = 123; + + var r2 = new Revision(); + r2.rev = 123; + + var r3 = new Revision(); + r3.rev = 2; + + assertThat(r1.hashCode()).isEqualTo(123).isEqualTo(r2.hashCode()).isNotEqualTo(r3.hashCode()); + } @Test - void testToString() {} + void testToString() { + var rev = new Revision(); + rev.rev = 1; + + assertThat(rev.toString()) + .as("Revision's toString should match expected value") + .isEqualTo("Revision{rev=1}"); + } } diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java index a173b72..8ab52eb 100644 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java @@ -12,7 +12,7 @@ import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; @QuarkusTest -public class ActorTest { +class ActorTest { @InjectSpy TracingService tracingService; diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java index 7378040..10b3894 100644 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java @@ -12,7 +12,7 @@ import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; @QuarkusTest -public class QueryParamTest { +class QueryParamTest { @InjectSpy TracingService tracingService; diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java index 96d8956..e3579ba 100644 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test; @QuarkusTest @TestProfile(Test2Profile.class) -public class RawPathTest { +class RawPathTest { @InjectSpy TracingService tracingService; diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java index 34658e2..c928917 100644 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test; @QuarkusTest @TestProfile(Test2Profile.class) -public class RedactedTest { +class RedactedTest { @InjectSpy TracingService tracingService; From bc0110cc29277d342e979cebe24e1e24bb7c6a05 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Thu, 24 Jul 2025 11:11:53 +0200 Subject: [PATCH 44/54] chore: more sonarqube improvements, rename tracing service method --- .../DefaultRevisionContextProviderTest.java | 1 - .../quarkus/commons/audit/RevisionTest.java | 5 +- .../commons/tracing/TracingService.java | 2 +- .../commons/tracing/TracingServiceImpl.java | 2 +- .../commons/tracing/RoutePatternTest.java | 205 ++++-------------- .../tracing/TracingServiceImplTest.java | 98 +++++++++ .../tracing/resource/SlashResource.java | 12 +- 7 files changed, 151 insertions(+), 174 deletions(-) create mode 100644 quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImplTest.java diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java index 5ad9ff7..8ef3a73 100644 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java @@ -1,7 +1,6 @@ package ch.phoenix.oss.quarkus.commons.audit; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mockStatic; import io.quarkus.test.junit.QuarkusTest; diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java index 61c3743..d0f5d1f 100644 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java +++ b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java @@ -1,7 +1,6 @@ package ch.phoenix.oss.quarkus.commons.audit; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.Test; @@ -47,8 +46,6 @@ class RevisionTest { var rev = new Revision(); rev.rev = 1; - assertThat(rev.toString()) - .as("Revision's toString should match expected value") - .isEqualTo("Revision{rev=1}"); + assertThat(rev).as("Revision's toString should match expected value").hasToString("Revision{rev=1}"); } } diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java index 2b1ac38..812867d 100644 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java @@ -8,7 +8,7 @@ public interface TracingService { String getActor(); - String getRequestPath(); + String getRequestPathRaw(); String getRequestMethod(); diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java index b5f295b..d46f684 100644 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java +++ b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java @@ -33,7 +33,7 @@ class TracingServiceImpl implements TracingService { } @Override - public String getRequestPath() { + public String getRequestPathRaw() { return (String) MDC.get(TracingConstants.REQUEST_PATH_RAW); } diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java index 11f1689..156c0a4 100644 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java @@ -1,5 +1,6 @@ package ch.phoenix.oss.quarkus.commons.tracing; +import static org.junit.jupiter.params.provider.Arguments.arguments; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.startsWith; import static org.mockito.Mockito.verify; @@ -10,7 +11,11 @@ import io.quarkus.test.junit.mockito.InjectSpy; import io.restassured.RestAssured; import io.restassured.http.ContentType; import java.util.Map; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; @QuarkusTest class RoutePatternTest { @@ -18,12 +23,46 @@ class RoutePatternTest { @InjectSpy TracingService tracingService; - @Test - void getBlankResource() { - var route = "/"; - RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); + static Stream get() { + return Stream.of( + arguments("/", Map.of()), + arguments("/leading-and-no-trailing", Map.of()), + arguments("/leading/{param}/{param2}", Map.of("param", "1", "param2", "2")), + arguments("/{param}/{param2}/trailing", Map.of("param", "1", "param2", "2")), + arguments("/leading-and-no-trailing/{param}", Map.of("param", "1")), + arguments("/leading-and-no-trailing/{param}/{param2}", Map.of("param", "1", "param2", "2")), + arguments("/leading-and-trailing", Map.of()), + arguments("/leading-and-trailing/{param}", Map.of("param", "1")), + arguments("/leading-and-trailing/{param}/{param2}", Map.of("param", "1", "param2", "2")), + arguments("/no-leading-and-no-trailing", Map.of()), + arguments("/no-leading-and-no-trailing/{param}", Map.of("param", "1")), + arguments("/no-leading-and-no-trailing/{param}/{param2}", Map.of("param", "1", "param2", "2")), + arguments("/no-leading-and-trailing", Map.of()), + arguments("/no-leading-and-trailing/{param}", Map.of("param", "1")), + arguments("/no-leading-and-trailing/{param}/{param2}", Map.of("param", "1", "param2", "2"))); + } - verifyGetTracing(route, Map.of()); + @MethodSource + @ParameterizedTest + void get(String route, Map pathParams) { + RestAssured.given() + .accept(ContentType.TEXT) + .when() + .get(route, pathParams) + .then() + .statusCode(200); + + verify(tracingService).trace("actor", "anonymous"); + verify(tracingService).trace("request.method", "GET"); + verify(tracingService).trace("request.route", route); + pathParams.forEach((key, value) -> verify(tracingService).trace("request.path.params." + key, value)); + verify(tracingService).trace("request.headers.accept", "text/plain"); + verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); + verify(tracingService).trace("request.headers.connection", "Keep-Alive"); + verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); + verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); + verify(tracingService).trace("request.client.ip", "127.0.0.1"); + verifyNoMoreInteractions(tracingService); } @Test @@ -45,160 +84,4 @@ class RoutePatternTest { verify(tracingService).trace("request.client.ip", "127.0.0.1"); verifyNoMoreInteractions(tracingService); } - - @Test - void getLeadingResource() { - var route = "/leading/{id}/{anotherId}"; - RestAssured.given() - .accept(ContentType.TEXT) - .when() - .get(route, 1, 2) - .then() - .statusCode(200); - - verifyGetTracing(route, Map.of("id", "1", "anotherId", "2")); - } - - @Test - void getTrailingResource() { - var route = "/{id}/{anotherId}/trailing"; - RestAssured.given() - .accept(ContentType.TEXT) - .when() - .get(route, 1, 2) - .then() - .statusCode(200); - - verifyGetTracing(route, Map.of("id", "1", "anotherId", "2")); - } - - @Test - void getLeadingAndNoTrailingResource() { - var route = "/leading-and-no-trailing"; - RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); - - verifyGetTracing(route, Map.of()); - } - - @Test - void getLeadingAndNoTrailingWithSingleParamResource() { - var route = "/leading-and-no-trailing/{param}"; - RestAssured.given().accept(ContentType.TEXT).when().get(route, 1).then().statusCode(200); - - verifyGetTracing(route, Map.of("param", "1")); - } - - @Test - void getLeadingAndNoTrailingWithMultiParamResource() { - var route = "/leading-and-no-trailing/{param}/{param2}"; - RestAssured.given() - .accept(ContentType.TEXT) - .when() - .get(route, 1, 2) - .then() - .statusCode(200); - - verifyGetTracing(route, Map.of("param", "1", "param2", "2")); - } - - @Test - void getLeadingAndTrailingResource() { - var route = "/leading-and-trailing"; - RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); - - verifyGetTracing(route, Map.of()); - } - - @Test - void getLeadingAndTrailingWithSingleParamResource() { - var route = "/leading-and-trailing/{param}"; - RestAssured.given().accept(ContentType.TEXT).when().get(route, 1).then().statusCode(200); - - verifyGetTracing(route, Map.of("param", "1")); - } - - @Test - void getLeadingAndTrailingWithMultiParamResource() { - var route = "/leading-and-trailing/{param}/{param2}"; - RestAssured.given() - .accept(ContentType.TEXT) - .when() - .get(route, 1, 2) - .then() - .statusCode(200); - - verifyGetTracing(route, Map.of("param", "1", "param2", "2")); - } - - @Test - void getNoLeadingAndNoTrailingResource() { - var route = "/no-leading-and-no-trailing"; - RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); - - verifyGetTracing(route, Map.of()); - } - - @Test - void geNoLeadingAndNoTrailingWithSingleParamResource() { - var route = "/no-leading-and-no-trailing/{param}"; - RestAssured.given().accept(ContentType.TEXT).when().get(route, 1).then().statusCode(200); - - verifyGetTracing(route, Map.of("param", "1")); - } - - @Test - void getNoLeadingAndNoTrailingWithMultiParamResource() { - var route = "/no-leading-and-no-trailing/{param}/{param2}"; - RestAssured.given() - .accept(ContentType.TEXT) - .when() - .get(route, 1, 2) - .then() - .statusCode(200); - - verifyGetTracing(route, Map.of("param", "1", "param2", "2")); - } - - @Test - void getNoLeadingAndTrailingResource() { - var route = "/no-leading-and-trailing"; - RestAssured.given().accept(ContentType.TEXT).when().get(route).then().statusCode(200); - - verifyGetTracing(route, Map.of()); - } - - @Test - void getNoLeadingAndTrailingWithSingleParamResource() { - var route = "/no-leading-and-trailing/{param}"; - RestAssured.given().accept(ContentType.TEXT).when().get(route, 1).then().statusCode(200); - - verifyGetTracing(route, Map.of("param", "1")); - } - - @Test - void getNoLeadingAndTrailingWithMultiParamResource() { - var route = "/no-leading-and-trailing/{param}/{param2}"; - RestAssured.given() - .accept(ContentType.TEXT) - .when() - .get(route, 1, 2) - .then() - .statusCode(200); - - verifyGetTracing(route, Map.of("param", "1", "param2", "2")); - } - - private void verifyGetTracing(String route, Map pathParams) { - verify(tracingService).trace("actor", "anonymous"); - verify(tracingService).trace("request.method", "GET"); - verify(tracingService).trace("request.route", route); - pathParams.forEach((key, value) -> verify(tracingService).trace("request.path.params." + key, value)); - verify(tracingService).trace("request.headers.accept", "text/plain"); - verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); - verify(tracingService).trace("request.headers.connection", "Keep-Alive"); - verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); - verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); - verify(tracingService).trace("request.client.ip", "127.0.0.1"); - verifyNoMoreInteractions(tracingService); - } } diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImplTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImplTest.java new file mode 100644 index 0000000..f728e14 --- /dev/null +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImplTest.java @@ -0,0 +1,98 @@ +package ch.phoenix.oss.quarkus.commons.tracing; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.instrumentation.annotations.WithSpan; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.jboss.logging.MDC; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class TracingServiceImplTest { + + @Inject + TracingService tracingService; + + @Inject + Span span; + + @BeforeEach + void setUp() { + MDC.clear(); + } + + @Test + void getActor() { + tracingService.trace("actor", "abc"); + assertThat(tracingService.getActor()) + .as("Actor should match expected value") + .isEqualTo("abc"); + } + + @Test + void getRequestPathRaw() { + tracingService.trace("request.path.raw", "/foo/bar"); + assertThat(tracingService.getRequestPathRaw()) + .as("Request Path Raw should match expected value") + .isEqualTo("/foo/bar"); + } + + @Test + void getRequestMethod() { + tracingService.trace("request.method", "GET"); + assertThat(tracingService.getRequestMethod()) + .as("Request Method should match expected value") + .isEqualTo("GET"); + } + + @Test + void getRequestId() { + tracingService.trace("request.headers.x-request-id", "ba458367-bfeb-46ba-87da-50b9343be8f9"); + assertThat(tracingService.getRequestId()) + .as("Request Id should match expected value") + .isEqualTo("ba458367-bfeb-46ba-87da-50b9343be8f9"); + } + + @Test + @WithSpan + void getTraceId() { + assertThat(tracingService.getTraceId()) + .as("Request Trace Id should match expected value") + .isEqualTo(span.getSpanContext().getTraceId()); + } + + @Test + @WithSpan + void getSpanId() { + assertThat(tracingService.getSpanId()) + .as("Request Span Id should match expected value") + .isEqualTo(span.getSpanContext().getSpanId()); + } + + @Test + void getClientIp() { + tracingService.trace("request.client.ip", "127.0.0.1"); + assertThat(tracingService.getClientIp()) + .as("Request Client Iü should match expected value") + .isEqualTo("127.0.0.1"); + } + + @Test + void getSchedulerJob() { + tracingService.trace("scheduler.job.name", "scheduler/abc"); + assertThat(tracingService.getSchedulerJob()) + .as("Scheduler Job Name should match expected value") + .isEqualTo("scheduler/abc"); + } + + @Test + void clearAll() { + tracingService.trace("aaa", "bbb"); + assertThat(MDC.get("aaa")).isEqualTo("bbb"); + tracingService.clearAll(); + assertThat(MDC.get("aaa")).isNull(); + } +} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java index 690c84a..8c8bdc7 100644 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java +++ b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java @@ -10,14 +10,14 @@ import jakarta.ws.rs.core.MediaType; public class SlashResource { @GET - @Path("/leading/{id}/{anotherId}") - public String doubleLeading(int id, int anotherId) { - return "leading/" + id + "/" + anotherId; + @Path("/leading/{param}/{param2}") + public String doubleLeading(int param, int param2) { + return "leading/" + param + "/" + param2; } @GET - @Path("{id}/{anotherId}/trailing/") - public String doubleTrailing(int id, int anotherId) { - return id + "/" + anotherId + "/trailing"; + @Path("{param}/{param2}/trailing/") + public String doubleTrailing(int param, int param2) { + return param + "/" + param2 + "/trailing"; } } From d1acb1a0ee0851510170835e9c374c0cc1386f50 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Thu, 24 Jul 2025 11:53:27 +0200 Subject: [PATCH 45/54] chore(maven): enable jacoco rules for audit and tracing modules --- quarkus-audit-tools/pom.xml | 66 ++++++++++++++++----------------- quarkus-tracing-service/pom.xml | 34 +++++++++++++++++ 2 files changed, 67 insertions(+), 33 deletions(-) diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index f491142..59c7367 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -51,38 +51,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-plugin.version} + + + jacoco-check + + check + + test + + ${project.build.directory}/jacoco-quarkus.exec + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + 1 + + + + + + + + + + diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index abcaf25..44dc2f9 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -41,4 +41,38 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-plugin.version} + + + jacoco-check + + check + + test + + ${project.build.directory}/jacoco-quarkus.exec + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + 0.95 + + + + + + + + + + + From 21913626ad4831264e4c1d95a5c27ea6152eda8c Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 30 Jul 2025 14:44:49 +0200 Subject: [PATCH 46/54] feat(client-logger): redact headers based on configuration --- quarkus-client-logger/pom.xml | 12 ++++- .../logger/LowerCaseStringConverter.java | 10 ++++ .../client/logger/RedactingClientLogger.java | 21 +++++++-- .../RedactingClientLoggerConfiguration.java | 20 ++++++++ .../client/logger/InfoLevelProfile.java | 12 +++++ .../commons/client/logger/InfoLevelTest.java | 44 +++++++++++++++++ .../logger/RedactingClientLoggerTest.java | 47 +++++++++++++++++++ .../client/logger/ScopeNoneProfile.java | 12 +++++ .../commons/client/logger/ScopeNoneTest.java | 44 +++++++++++++++++ .../commons/client/logger/TestClient.java | 28 +++++++++++ .../commons/client/logger/TestResource.java | 21 +++++++++ .../src/test/resources/application.yaml | 20 ++++++++ 12 files changed, 286 insertions(+), 5 deletions(-) create mode 100644 quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/LowerCaseStringConverter.java create mode 100644 quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerConfiguration.java create mode 100644 quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelProfile.java create mode 100644 quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelTest.java create mode 100644 quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerTest.java create mode 100644 quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneProfile.java create mode 100644 quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneTest.java create mode 100644 quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestClient.java create mode 100644 quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestResource.java create mode 100644 quarkus-client-logger/src/test/resources/application.yaml diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index 81aa2e0..9306ab4 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -16,6 +16,16 @@ io.quarkus quarkus-rest-client + + io.quarkus + quarkus-config-yaml + test + + + io.quarkus + quarkus-rest-jackson + test + @@ -40,7 +50,7 @@ INSTRUCTION COVEREDRATIO - 1 + 0.92 diff --git a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/LowerCaseStringConverter.java b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/LowerCaseStringConverter.java new file mode 100644 index 0000000..498e318 --- /dev/null +++ b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/LowerCaseStringConverter.java @@ -0,0 +1,10 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import org.eclipse.microprofile.config.spi.Converter; + +public class LowerCaseStringConverter implements Converter { + @Override + public String convert(String value) throws IllegalArgumentException, NullPointerException { + return value.toLowerCase(); + } +} diff --git a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java index 3061c09..cb2b63b 100644 --- a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java +++ b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java @@ -6,23 +6,36 @@ import io.vertx.core.buffer.Buffer; import io.vertx.core.http.HttpClientRequest; import io.vertx.core.http.HttpClientResponse; import jakarta.enterprise.context.Dependent; -import jakarta.ws.rs.core.HttpHeaders; +import jakarta.inject.Inject; import java.util.Map; +import java.util.Set; import org.jboss.logging.Logger; import org.jboss.resteasy.reactive.client.api.ClientLogger; /** * This is based on org.jboss.resteasy.reactive.client.logging.DefaultClientLogger, - * with the only change being that the value of "Authorization" header, when present, - * is redacted. + * with the only change being that headers are redacted based on the Set provided + * by the configuration. */ @Dependent public class RedactingClientLogger implements ClientLogger { private static final Logger log = Logger.getLogger(RedactingClientLogger.class); + private static final String REDACTED_VALUE = "*****"; + + private final Set redactedHeaders; + private int bodySize; + @Inject + public RedactingClientLogger(RedactingClientLoggerConfiguration configuration) { + this.redactedHeaders = configuration + .headers() + .redact() + .orElse(RedactingClientLoggerConfiguration.Headers.DEFAULT_REDACTED_HEADERS); + } + @Override public void setBodySize(int bodySize) { this.bodySize = bodySize; @@ -97,7 +110,7 @@ public class RedactingClientLogger implements ClientLogger { } var key = entry.getKey(); - var value = HttpHeaders.AUTHORIZATION.equalsIgnoreCase(key) ? "*****" : entry.getValue(); + var value = redactedHeaders.contains(key.toLowerCase()) ? REDACTED_VALUE : entry.getValue(); sb.append(key).append('=').append(value); } diff --git a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerConfiguration.java b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerConfiguration.java new file mode 100644 index 0000000..24fa05f --- /dev/null +++ b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerConfiguration.java @@ -0,0 +1,20 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithConverter; +import jakarta.ws.rs.core.HttpHeaders; +import java.util.Optional; +import java.util.Set; + +@ConfigMapping(prefix = "phoenix.client-logger") +public interface RedactingClientLoggerConfiguration { + + Headers headers(); + + interface Headers { + + Set DEFAULT_REDACTED_HEADERS = Set.of(HttpHeaders.AUTHORIZATION.toLowerCase()); + + Optional> redact(); + } +} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelProfile.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelProfile.java new file mode 100644 index 0000000..35acb14 --- /dev/null +++ b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelProfile.java @@ -0,0 +1,12 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import io.quarkus.test.junit.QuarkusTestProfile; +import java.util.Map; + +public class InfoLevelProfile implements QuarkusTestProfile { + + @Override + public Map getConfigOverrides() { + return Map.of("quarkus.log.category.\"ch.phoenix.oss.quarkus.commons.client.logger\".level", "INFO"); + } +} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelTest.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelTest.java new file mode 100644 index 0000000..c6b27ef --- /dev/null +++ b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelTest.java @@ -0,0 +1,44 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import io.quarkus.rest.client.reactive.QuarkusRestClientBuilder; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; +import jakarta.inject.Inject; +import java.net.URI; +import java.util.Optional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.junit.jupiter.api.Test; + +@QuarkusTest +@TestProfile(InfoLevelProfile.class) +class InfoLevelTest { + + @Inject + @RestClient + TestClient injectedClient; + + TestClient builtClient = QuarkusRestClientBuilder.newBuilder() + .clientLogger(new RedactingClientLogger(() -> Optional::empty)) + .baseUri(URI.create("http://localhost:8087")) + .build(TestClient.class); + + @Test + void getWithInjectedClient() { + injectedClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted"); + } + + @Test + void getWithBuiltClientAndEmptyConfig() { + builtClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted"); + } + + @Test + void postWithInjectedClient() { + injectedClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted", "body"); + } + + @Test + void postWithBuiltClientAndEmptyConfig() { + builtClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted", ""); + } +} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerTest.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerTest.java new file mode 100644 index 0000000..01e9389 --- /dev/null +++ b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerTest.java @@ -0,0 +1,47 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import io.quarkus.rest.client.reactive.QuarkusRestClientBuilder; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import java.net.URI; +import java.util.Optional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class RedactingClientLoggerTest { + + @Inject + @RestClient + TestClient injectedClient; + + TestClient builtClient = QuarkusRestClientBuilder.newBuilder() + .clientLogger(new RedactingClientLogger(() -> Optional::empty)) + .baseUri(URI.create("http://localhost:8087")) + .build(TestClient.class); + + @Test + void getWithInjectedClient() { + injectedClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted"); + } + + @Test + void getWithBuiltClientAndEmptyConfig() { + builtClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted"); + } + + @Test + void postWithInjectedClient() { + injectedClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted", "body"); + } + + @Test + void postWithInjectedClientAndNullBody() { + injectedClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted", null); + } + + @Test + void postWithBuiltClientAndEmptyConfig() { + builtClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted", ""); + } +} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneProfile.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneProfile.java new file mode 100644 index 0000000..42daa28 --- /dev/null +++ b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneProfile.java @@ -0,0 +1,12 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import io.quarkus.test.junit.QuarkusTestProfile; +import java.util.Map; + +public class ScopeNoneProfile implements QuarkusTestProfile { + + @Override + public Map getConfigOverrides() { + return Map.of("quarkus.rest-client.logging.scope", "none"); + } +} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneTest.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneTest.java new file mode 100644 index 0000000..14538b2 --- /dev/null +++ b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneTest.java @@ -0,0 +1,44 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import io.quarkus.rest.client.reactive.QuarkusRestClientBuilder; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; +import jakarta.inject.Inject; +import java.net.URI; +import java.util.Optional; +import org.eclipse.microprofile.rest.client.inject.RestClient; +import org.junit.jupiter.api.Test; + +@QuarkusTest +@TestProfile(ScopeNoneProfile.class) +class ScopeNoneTest { + + @Inject + @RestClient + TestClient injectedClient; + + TestClient builtClient = QuarkusRestClientBuilder.newBuilder() + .clientLogger(new RedactingClientLogger(() -> Optional::empty)) + .baseUri(URI.create("http://localhost:8087")) + .build(TestClient.class); + + @Test + void getWithInjectedClient() { + injectedClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted"); + } + + @Test + void getWithBuiltClientAndEmptyConfig() { + builtClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted"); + } + + @Test + void postWithInjectedClient() { + injectedClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted", "body"); + } + + @Test + void postWithBuiltClientAndEmptyConfig() { + builtClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted", ""); + } +} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestClient.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestClient.java new file mode 100644 index 0000000..79769ac --- /dev/null +++ b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestClient.java @@ -0,0 +1,28 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +@SuppressWarnings("UastIncorrectHttpHeaderInspection") +@RegisterRestClient(configKey = "test") +public interface TestClient { + + @GET + @Path("/") + @Produces(MediaType.TEXT_PLAIN) + String get( + @HeaderParam("Authorization") String authorization, + @HeaderParam("X-Request-ID") String requestId, + @HeaderParam("X-Something-Else") String somethingElse); + + @POST + @Path("/") + @Consumes(MediaType.TEXT_PLAIN) + @Produces(MediaType.TEXT_PLAIN) + String post( + @HeaderParam("Authorization") String authorization, + @HeaderParam("X-Request-ID") String requestId, + @HeaderParam("X-Something-Else") String somethingElse, + String body); +} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestResource.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestResource.java new file mode 100644 index 0000000..c83bdd0 --- /dev/null +++ b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestResource.java @@ -0,0 +1,21 @@ +package ch.phoenix.oss.quarkus.commons.client.logger; + +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; + +@Path("/") +public class TestResource { + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String get() { + return "get"; + } + + @POST + @Consumes(MediaType.TEXT_PLAIN) + @Produces(MediaType.TEXT_PLAIN) + public String post(String body) { + return body; + } +} diff --git a/quarkus-client-logger/src/test/resources/application.yaml b/quarkus-client-logger/src/test/resources/application.yaml new file mode 100644 index 0000000..a02f41d --- /dev/null +++ b/quarkus-client-logger/src/test/resources/application.yaml @@ -0,0 +1,20 @@ +quarkus: + http: + test-port: 8087 + rest-client: + logging: + scope: request-response + body-limit: 10000 + test: + url: http://localhost:${quarkus.http.test-port} + log: + category: + "ch.phoenix.oss.quarkus.commons.client.logger": + level: DEBUG + +phoenix: + client-logger: + headers: + redact: + - AUTHORIZATION + - X-SOMETHING-ELSE From 3ae16bfa253b8dd3e8a62fb40a4aaf110f8ac5c6 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 30 Jul 2025 14:49:00 +0200 Subject: [PATCH 47/54] chore: bump version to 1.0.7 --- .github/project.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/project.yaml b/.github/project.yaml index b1c8594..4a177d6 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -1,5 +1,5 @@ name: Quarkus Commons release: - current-version: "1.0.6" - next-version: "1.0.7-SNAPSHOT" + current-version: "1.0.7" + next-version: "1.0.8-SNAPSHOT" From 6a3026de70563fff4606f0812a331114d80620d8 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Wed, 30 Jul 2025 12:52:52 +0000 Subject: [PATCH 48/54] chore: release 1.0.7 --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 8e88778..a6660de 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD + 1.0.7 diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 59c7367..1f274e3 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index 9306ab4..9d593b2 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 59c15ae..d10a9f4 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 22775c3..0355ccc 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index b7e365d..8c72f61 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 5e9f0e0..37ec4cb 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 44dc2f9..d682448 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index a67e844..405a9f0 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7-SNAPSHOT + 1.0.7 quarkus-uuid-generator From 7a33e9cdbbdfc4e3401deebb0576cfe8ac883d94 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Wed, 30 Jul 2025 12:52:53 +0000 Subject: [PATCH 49/54] chore: prepare for next development iteration --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index a6660de..d46a115 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.7 + HEAD diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 1f274e3..f4cabbd 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index 9d593b2..144c0a7 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index d10a9f4..76982ef 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 0355ccc..9f61cd5 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 8c72f61..293f484 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 37ec4cb..f3ff525 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index d682448..9c8471a 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 405a9f0..986b323 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.7 + 1.0.8-SNAPSHOT quarkus-uuid-generator From 25ea6c556d6f9c52fa9d133e3c4a2d2686e1a2d3 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 30 Jul 2025 15:27:53 +0200 Subject: [PATCH 50/54] feat(deps): update quarkus.platform.version to 3.25.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d46a115..90dcbc6 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ quarkus-bom io.quarkus.platform - 3.24.4 + 3.25.0 3.14.0 From 9621f913e38fc42fa32f99470ad7fb6b573b24d7 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 30 Jul 2025 15:33:00 +0200 Subject: [PATCH 51/54] chore: bump version to 1.0.8 --- .github/project.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/project.yaml b/.github/project.yaml index 4a177d6..0b40189 100644 --- a/.github/project.yaml +++ b/.github/project.yaml @@ -1,5 +1,5 @@ name: Quarkus Commons release: - current-version: "1.0.7" - next-version: "1.0.8-SNAPSHOT" + current-version: "1.0.8" + next-version: "1.0.9-SNAPSHOT" From 584ffc85f2b4320d7c45c725c4501c2818066440 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Wed, 30 Jul 2025 13:34:45 +0000 Subject: [PATCH 52/54] chore: release 1.0.8 --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 90dcbc6..6976b67 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD + 1.0.8 diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index f4cabbd..5c905f4 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index 144c0a7..cdfe438 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index 76982ef..f8d077c 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 9f61cd5..d404f1d 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 293f484..9533270 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index f3ff525..5638017 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 9c8471a..775d445 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 986b323..8f3de48 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8-SNAPSHOT + 1.0.8 quarkus-uuid-generator From 58a53fe280d1ff39cfa3a8b0c58577639f2e4ea0 Mon Sep 17 00:00:00 2001 From: maven_release_technical_account Date: Wed, 30 Jul 2025 13:34:47 +0000 Subject: [PATCH 53/54] chore: prepare for next development iteration --- pom.xml | 4 ++-- quarkus-audit-tools/pom.xml | 2 +- quarkus-client-logger/pom.xml | 2 +- quarkus-clock-service/pom.xml | 2 +- quarkus-json-service/pom.xml | 2 +- quarkus-message-digest-service/pom.xml | 2 +- quarkus-random-number-generator/pom.xml | 2 +- quarkus-tracing-service/pom.xml | 2 +- quarkus-uuid-generator/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 6976b67..3b61944 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT pom @@ -73,7 +73,7 @@ scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - 1.0.8 + HEAD diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml index 5c905f4..1a01d07 100644 --- a/quarkus-audit-tools/pom.xml +++ b/quarkus-audit-tools/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT quarkus-audit-tools diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml index cdfe438..3095369 100644 --- a/quarkus-client-logger/pom.xml +++ b/quarkus-client-logger/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT quarkus-client-logger diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index f8d077c..aaab0c1 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT quarkus-clock-service diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index d404f1d..717c39f 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT quarkus-json-service diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index 9533270..c5d2c2d 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index 5638017..940f965 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml index 775d445..214e936 100644 --- a/quarkus-tracing-service/pom.xml +++ b/quarkus-tracing-service/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT quarkus-tracing-service diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 8f3de48..a6c395c 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -5,7 +5,7 @@ ch.phoenix.oss quarkus-commons - 1.0.8 + 1.0.9-SNAPSHOT quarkus-uuid-generator From 1e9ab13c9787375c4ce0d0d9c77123b6a8df7c17 Mon Sep 17 00:00:00 2001 From: Jorge Bornhausen Date: Wed, 30 Jul 2025 15:34:35 +0200 Subject: [PATCH 54/54] ci(github-actions): simplify maven settings --- .github/workflows/build.yaml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index bf8a636..1272b20 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -63,14 +63,8 @@ jobs: servers: | [{ "id": "phoenix-oss", - "configuration": { - "httpHeaders": { - "property": { - "name": "Authorization", - "value": "token ${{ secrets.ORG_PACKAGE_WRITER_TOKEN }}" - } - } - } + "username": "${{ vars.ORG_PACKAGE_WRITER_USERNAME }}", + "password": "${{ secrets.ORG_PACKAGE_WRITER_TOKEN }}" }] - name: Make maven wrapper executable