() {
+ @Override
+ public OidcDbTokenStateManagerInitializerProperties get() {
+ return new OidcDbTokenStateManagerInitializerProperties(createTableDdl, supportsIfTableNotExists);
+ }
+ };
+ }
+}
diff --git a/extensions/oidc-db-token-state-manager/runtime/src/main/java/io/quarkus/oidc/db/token/state/manager/runtime/OidcDbTokenStateManagerRunTimeConfig.java b/extensions/oidc-db-token-state-manager/runtime/src/main/java/io/quarkus/oidc/db/token/state/manager/runtime/OidcDbTokenStateManagerRunTimeConfig.java
new file mode 100644
index 00000000000000..1e6136a0f64a9b
--- /dev/null
+++ b/extensions/oidc-db-token-state-manager/runtime/src/main/java/io/quarkus/oidc/db/token/state/manager/runtime/OidcDbTokenStateManagerRunTimeConfig.java
@@ -0,0 +1,26 @@
+package io.quarkus.oidc.db.token.state.manager.runtime;
+
+import static io.quarkus.runtime.annotations.ConfigPhase.RUN_TIME;
+
+import java.time.Duration;
+
+import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
+import io.smallrye.config.WithDefault;
+
+@ConfigMapping(prefix = "quarkus.oidc.db-token-state-manager")
+@ConfigRoot(phase = RUN_TIME)
+public interface OidcDbTokenStateManagerRunTimeConfig {
+
+ /**
+ * How often should Quarkus check for expired tokens.
+ */
+ @WithDefault("8h")
+ Duration deleteExpiredDelay();
+
+ /**
+ * Whether Quarkus should attempt to create database table where the token state is going to be stored.
+ */
+ @WithDefault("true")
+ boolean createDatabaseTableIfNotExists();
+}
diff --git a/extensions/oidc-db-token-state-manager/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/oidc-db-token-state-manager/runtime/src/main/resources/META-INF/quarkus-extension.yaml
new file mode 100644
index 00000000000000..1497ca376c53e9
--- /dev/null
+++ b/extensions/oidc-db-token-state-manager/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -0,0 +1,16 @@
+---
+artifact: ${project.groupId}:${project.artifactId}:${project.version}
+name: "OpenID Connect Database Token State Manager"
+metadata:
+ keywords:
+ - "oauth2"
+ - "openid-connect"
+ - "oidc"
+ - "oidc-token"
+ - "oidc-db-token-state-manager"
+ guide: "https://quarkus.io/guides/security-openid-connect-client"
+ categories:
+ - "security"
+ status: "preview"
+ config:
+ - "quarkus.oidc.db-token-state-manager."
diff --git a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java
index c98d7b23cf2d68..d40a81d4e67a4c 100644
--- a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java
+++ b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java
@@ -437,14 +437,14 @@ public enum Strategy {
public boolean splitTokens;
/**
- * Mandates that the session cookie that stores the tokens is encrypted.
+ * Mandates that the Default TokenStateManager will encrypt the session cookie that stores the tokens.
*/
@ConfigItem(defaultValue = "true")
public boolean encryptionRequired = true;
/**
- * Secret which will be used to encrypt the session cookie storing the tokens when {@link #encryptionRequired} property
- * is enabled.
+ * Secret which will be used by the Default TokenStateManager to encrypt the session cookie
+ * storing the tokens when {@link #encryptionRequired} property is enabled.
*
* If this secret is not set, the client secret configured with
* either `quarkus.oidc.credentials.secret` or `quarkus.oidc.credentials.client-secret.value` will be checked.
diff --git a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/CodeAuthenticationMechanism.java b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/CodeAuthenticationMechanism.java
index be150ea8a97a0c..1dbf394b2da866 100644
--- a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/CodeAuthenticationMechanism.java
+++ b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/CodeAuthenticationMechanism.java
@@ -60,13 +60,13 @@
public class CodeAuthenticationMechanism extends AbstractOidcAuthenticationMechanism {
+ public static final String SESSION_MAX_AGE_PARAM = "session-max-age";
static final String AMP = "&";
static final String EQ = "=";
static final String COMMA = ",";
static final String UNDERSCORE = "_";
static final String COOKIE_DELIM = "|";
static final Pattern COOKIE_PATTERN = Pattern.compile("\\" + COOKIE_DELIM);
- static final String SESSION_MAX_AGE_PARAM = "session-max-age";
static final String STATE_COOKIE_RESTORE_PATH = "restore-path";
static final Uni VOID_UNI = Uni.createFrom().voidItem();
static final Integer MAX_COOKIE_VALUE_LENGTH = 4096;
diff --git a/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/OpenTelemetryProcessor.java b/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/OpenTelemetryProcessor.java
index 983da2a9121538..f263832b8d8105 100644
--- a/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/OpenTelemetryProcessor.java
+++ b/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/OpenTelemetryProcessor.java
@@ -8,6 +8,7 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;
+import java.util.function.Predicate;
import jakarta.enterprise.inject.Instance;
import jakarta.inject.Singleton;
@@ -19,12 +20,14 @@
import org.jboss.jandex.AnnotationValue;
import org.jboss.jandex.ClassType;
import org.jboss.jandex.DotName;
+import org.jboss.jandex.MethodInfo;
import org.jboss.jandex.ParameterizedType;
import org.jboss.jandex.Type;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.exporter.otlp.internal.OtlpSpanExporterProvider;
+import io.opentelemetry.instrumentation.annotations.AddingSpanAttributes;
import io.opentelemetry.instrumentation.annotations.SpanAttribute;
import io.opentelemetry.instrumentation.annotations.WithSpan;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
@@ -42,6 +45,7 @@
import io.quarkus.arc.deployment.ValidationPhaseBuildItem.ValidationErrorBuildItem;
import io.quarkus.arc.processor.AnnotationsTransformer;
import io.quarkus.arc.processor.InterceptorBindingRegistrar;
+import io.quarkus.arc.processor.Transformation;
import io.quarkus.datasource.common.runtime.DataSourceUtil;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
@@ -64,6 +68,7 @@
import io.quarkus.opentelemetry.runtime.config.build.ExporterType;
import io.quarkus.opentelemetry.runtime.config.build.OTelBuildConfig;
import io.quarkus.opentelemetry.runtime.config.runtime.OTelRuntimeConfig;
+import io.quarkus.opentelemetry.runtime.tracing.cdi.AddingSpanAttributesInterceptor;
import io.quarkus.opentelemetry.runtime.tracing.cdi.WithSpanInterceptor;
import io.quarkus.opentelemetry.runtime.tracing.intrumentation.InstrumentationRecorder;
import io.quarkus.runtime.LaunchMode;
@@ -76,8 +81,17 @@ public class OpenTelemetryProcessor {
private static final DotName LEGACY_WITH_SPAN = DotName.createSimple(
io.opentelemetry.extension.annotations.WithSpan.class.getName());
private static final DotName WITH_SPAN = DotName.createSimple(WithSpan.class.getName());
+ private static final DotName ADD_SPAN_ATTRIBUTES = DotName.createSimple(AddingSpanAttributes.class.getName());
+ private static final Predicate isAddSpanAttribute = new Predicate<>() {
+ @Override
+ public boolean test(AnnotationInstance annotationInstance) {
+ return annotationInstance.name().equals(ADD_SPAN_ATTRIBUTES);
+ }
+ };
private static final DotName SPAN_KIND = DotName.createSimple(SpanKind.class.getName());
private static final DotName WITH_SPAN_INTERCEPTOR = DotName.createSimple(WithSpanInterceptor.class.getName());
+ private static final DotName ADD_SPAN_ATTRIBUTES_INTERCEPTOR = DotName
+ .createSimple(AddingSpanAttributesInterceptor.class.getName());
private static final DotName SPAN_ATTRIBUTE = DotName.createSimple(SpanAttribute.class.getName());
@BuildStep
@@ -168,11 +182,15 @@ void registerWithSpan(
new InterceptorBindingRegistrar() {
@Override
public List getAdditionalBindings() {
- return List.of(InterceptorBinding.of(WithSpan.class, Set.of("value", "kind")));
+ return List.of(
+ InterceptorBinding.of(WithSpan.class, Set.of("value", "kind")),
+ InterceptorBinding.of(AddingSpanAttributes.class, Set.of("value")));
}
}));
- additionalBeans.produce(new AdditionalBeanBuildItem(WithSpanInterceptor.class));
+ additionalBeans.produce(new AdditionalBeanBuildItem(
+ WithSpanInterceptor.class,
+ AddingSpanAttributesInterceptor.class));
}
@BuildStep
@@ -209,11 +227,21 @@ public void transform(TransformationContext context) {
annotationsTransformer.produce(new AnnotationsTransformerBuildItem(transformationContext -> {
AnnotationTarget target = transformationContext.getTarget();
+ Transformation transform = transformationContext.transform();
if (target.kind().equals(AnnotationTarget.Kind.CLASS)) {
if (target.asClass().name().equals(WITH_SPAN_INTERCEPTOR)) {
- transformationContext.transform().add(WITH_SPAN).done();
+ transform.add(WITH_SPAN);
+ } else if (target.asClass().name().equals(ADD_SPAN_ATTRIBUTES_INTERCEPTOR)) {
+ transform.add(ADD_SPAN_ATTRIBUTES);
+ }
+ } else if (target.kind() == AnnotationTarget.Kind.METHOD) {
+ MethodInfo methodInfo = target.asMethod();
+ // WITH_SPAN_INTERCEPTOR and ADD_SPAN_ATTRIBUTES must not be applied at the same time and the first has priority.
+ if (methodInfo.hasAnnotation(WITH_SPAN) && methodInfo.hasAnnotation(ADD_SPAN_ATTRIBUTES)) {
+ transform.remove(isAddSpanAttribute);
}
}
+ transform.done();
}));
}
diff --git a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/AddingSpanAttributesInterceptorTest.java b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/AddingSpanAttributesInterceptorTest.java
new file mode 100644
index 00000000000000..9853edf6aa817f
--- /dev/null
+++ b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/AddingSpanAttributesInterceptorTest.java
@@ -0,0 +1,167 @@
+package io.quarkus.opentelemetry.deployment.interceptor;
+
+import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.List;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import io.opentelemetry.api.common.AttributeKey;
+import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.context.Scope;
+import io.opentelemetry.instrumentation.annotations.AddingSpanAttributes;
+import io.opentelemetry.instrumentation.annotations.SpanAttribute;
+import io.opentelemetry.instrumentation.annotations.WithSpan;
+import io.opentelemetry.sdk.trace.data.SpanData;
+import io.quarkus.opentelemetry.deployment.common.TestSpanExporter;
+import io.quarkus.opentelemetry.deployment.common.TestSpanExporterProvider;
+import io.quarkus.test.QuarkusUnitTest;
+
+public class AddingSpanAttributesInterceptorTest {
+ @RegisterExtension
+ static final QuarkusUnitTest TEST = new QuarkusUnitTest()
+ .setArchiveProducer(
+ () -> ShrinkWrap.create(JavaArchive.class)
+ .addClass(HelloRouter.class)
+ .addClasses(TestSpanExporter.class, TestSpanExporterProvider.class)
+ .addAsManifestResource(
+ "META-INF/services-config/io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider",
+ "services/io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider")
+ .addAsResource("resource-config/application.properties", "application.properties"));
+
+ @Inject
+ HelloRouter helloRouter;
+ @Inject
+ Tracer tracer;
+ @Inject
+ TestSpanExporter spanExporter;
+
+ @AfterEach
+ void tearDown() {
+ spanExporter.reset();
+ }
+
+ @Test
+ void withSpanAttributesTest_existingSpan() {
+ Span span = tracer.spanBuilder("withSpanAttributesTest").startSpan();
+ String result;
+ try (Scope scope = span.makeCurrent()) {
+ result = helloRouter.withSpanAttributes(
+ "implicit", "explicit", null, "ignore");
+ } finally {
+ span.end();
+ }
+ assertEquals("hello!", result);
+ List spanItems = spanExporter.getFinishedSpanItems(1);
+ SpanData spanDataOut = spanItems.get(0);
+ assertEquals("withSpanAttributesTest", spanDataOut.getName());
+ assertEquals(INTERNAL, spanDataOut.getKind());
+ assertFalse(spanDataOut.getAttributes().isEmpty(), "No attributes found");
+ assertEquals("implicit", getAttribute(spanDataOut, "implicitName"));
+ assertEquals("explicit", getAttribute(spanDataOut, "explicitName"));
+ }
+
+ @Test
+ void withSpanAttributesTest_noActiveSpan() {
+ String resultWithoutSpan = helloRouter.withSpanAttributes(
+ "implicit", "explicit", null, "ignore");
+ assertEquals("hello!", resultWithoutSpan);
+
+ spanExporter.getFinishedSpanItems(0);
+ // No span created
+
+ String resultWithSpan = helloRouter.withSpanTakesPrecedence(
+ "implicit", "explicit", null, "ignore");
+ assertEquals("hello!", resultWithSpan);
+
+ // we need 1 span to make sure we don't get a false positive.
+ // The previous call to getFinishedSpanItems might return too early.
+
+ List spanItems = spanExporter.getFinishedSpanItems(1);
+ assertEquals(1, spanItems.size());
+ SpanData spanDataOut = spanItems.get(0);
+ assertEquals("HelloRouter.withSpanTakesPrecedence", spanDataOut.getName());
+ }
+
+ @Test
+ void withSpanAttributesTest_newSpan() {
+ String result = helloRouter.withSpanTakesPrecedence(
+ "implicit", "explicit", null, "ignore");
+
+ assertEquals("hello!", result);
+ List spanItems = spanExporter.getFinishedSpanItems(1);
+ SpanData spanDataOut = spanItems.get(0);
+ assertEquals("HelloRouter.withSpanTakesPrecedence", spanDataOut.getName());
+ assertEquals(INTERNAL, spanDataOut.getKind());
+ assertEquals(2, spanDataOut.getAttributes().size());
+ assertEquals("implicit", getAttribute(spanDataOut, "implicitName"));
+ assertEquals("explicit", getAttribute(spanDataOut, "explicitName"));
+ }
+
+ @Test
+ void noAttributesAdded() {
+ Span span = tracer.spanBuilder("noAttributesAdded").startSpan();
+ String result;
+ try (Scope scope = span.makeCurrent()) {
+ result = helloRouter.noAttributesAdded(
+ "implicit", "explicit", null, "ignore");
+ } finally {
+ span.end();
+ }
+ assertEquals("hello!", result);
+ List spanItems = spanExporter.getFinishedSpanItems(1);
+ SpanData spanDataOut = spanItems.get(0);
+ assertEquals("noAttributesAdded", spanDataOut.getName());
+ assertEquals(INTERNAL, spanDataOut.getKind());
+ assertTrue(spanDataOut.getAttributes().isEmpty(), "No attributes must be present");
+ }
+
+ private static Object getAttribute(SpanData spanDataOut, String attributeName) {
+ return spanDataOut.getAttributes().asMap().get(AttributeKey.stringKey(attributeName));
+ }
+
+ @ApplicationScoped
+ public static class HelloRouter {
+ // mast have already an active span
+ @AddingSpanAttributes
+ public String withSpanAttributes(
+ @SpanAttribute String implicitName,
+ @SpanAttribute("explicitName") String parameter,
+ @SpanAttribute("nullAttribute") String nullAttribute,
+ String notTraced) {
+
+ return "hello!";
+ }
+
+ @WithSpan
+ @AddingSpanAttributes
+ public String withSpanTakesPrecedence(
+ @SpanAttribute String implicitName,
+ @SpanAttribute("explicitName") String parameter,
+ @SpanAttribute("nullAttribute") String nullAttribute,
+ String notTraced) {
+
+ return "hello!";
+ }
+
+ public String noAttributesAdded(
+ @SpanAttribute String implicitName,
+ @SpanAttribute("explicitName") String parameter,
+ @SpanAttribute("nullAttribute") String nullAttribute,
+ String notTraced) {
+
+ return "hello!";
+ }
+ }
+}
diff --git a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/WithSpanInterceptorTest.java b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/WithSpanInterceptorTest.java
similarity index 99%
rename from extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/WithSpanInterceptorTest.java
rename to extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/WithSpanInterceptorTest.java
index 52de43f905ee15..b12624fd36912c 100644
--- a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/WithSpanInterceptorTest.java
+++ b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/WithSpanInterceptorTest.java
@@ -1,4 +1,4 @@
-package io.quarkus.opentelemetry.deployment;
+package io.quarkus.opentelemetry.deployment.interceptor;
import static io.opentelemetry.api.trace.SpanKind.CLIENT;
import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
diff --git a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/WithSpanLegacyInterceptorTest.java b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/WithSpanLegacyInterceptorTest.java
similarity index 99%
rename from extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/WithSpanLegacyInterceptorTest.java
rename to extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/WithSpanLegacyInterceptorTest.java
index b6b2eb1f4f30e4..a38c18c57f6263 100644
--- a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/WithSpanLegacyInterceptorTest.java
+++ b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/interceptor/WithSpanLegacyInterceptorTest.java
@@ -1,4 +1,4 @@
-package io.quarkus.opentelemetry.deployment;
+package io.quarkus.opentelemetry.deployment.interceptor;
import static io.opentelemetry.api.trace.SpanKind.CLIENT;
import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
diff --git a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/cdi/AddingSpanAttributesInterceptor.java b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/cdi/AddingSpanAttributesInterceptor.java
new file mode 100644
index 00000000000000..3eecc0f3cade58
--- /dev/null
+++ b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/cdi/AddingSpanAttributesInterceptor.java
@@ -0,0 +1,87 @@
+package io.quarkus.opentelemetry.runtime.tracing.cdi;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+
+import jakarta.annotation.Priority;
+import jakarta.interceptor.AroundInvoke;
+import jakarta.interceptor.Interceptor;
+
+import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.context.Scope;
+import io.opentelemetry.instrumentation.annotations.AddingSpanAttributes;
+import io.opentelemetry.instrumentation.annotations.SpanAttribute;
+import io.opentelemetry.instrumentation.api.annotation.support.ParameterAttributeNamesExtractor;
+import io.quarkus.arc.ArcInvocationContext;
+
+/**
+ * Will capture the arguments annotated with {@link SpanAttribute} on methods annotated with {@link AddingSpanAttributes}.
+ * Will not start a Span if one is not already started.
+ */
+@SuppressWarnings("CdiInterceptorInspection")
+@Interceptor
+@Priority(Interceptor.Priority.PLATFORM_BEFORE)
+public class AddingSpanAttributesInterceptor {
+
+ private final WithSpanParameterAttributeNamesExtractor extractor;
+
+ public AddingSpanAttributesInterceptor() {
+ extractor = new WithSpanParameterAttributeNamesExtractor();
+ }
+
+ @AroundInvoke
+ public Object span(final ArcInvocationContext invocationContext) throws Exception {
+ String[] extractedParameterNames = extractor.extract(invocationContext.getMethod(),
+ invocationContext.getMethod().getParameters());
+ Object[] parameterValues = invocationContext.getParameters();
+
+ Span span = Span.current();
+ if (span.isRecording()) {
+ try (Scope scope = span.makeCurrent()) {
+ for (int i = 0; i < extractedParameterNames.length; i++) {
+ if (extractedParameterNames[i] == null || parameterValues[i] == null) {
+ continue;
+ }
+ span.setAttribute(extractedParameterNames[i], parameterValues[i].toString());
+ }
+ }
+ }
+ return invocationContext.proceed();
+ }
+
+ private static final class WithSpanParameterAttributeNamesExtractor implements ParameterAttributeNamesExtractor {
+ @Override
+ public String[] extract(final Method method, final Parameter[] parameters) {
+ String[] attributeNames = new String[parameters.length];
+ for (int i = 0; i < parameters.length; i++) {
+ attributeNames[i] = attributeName(parameters[i]);
+ }
+ return attributeNames;
+ }
+
+ private static String attributeName(Parameter parameter) {
+ String value;
+ SpanAttribute spanAttribute = parameter.getDeclaredAnnotation(SpanAttribute.class);
+ if (spanAttribute == null) {
+ // Needed because SpanAttribute cannot be transformed
+ io.opentelemetry.extension.annotations.SpanAttribute legacySpanAttribute = parameter.getDeclaredAnnotation(
+ io.opentelemetry.extension.annotations.SpanAttribute.class);
+ if (legacySpanAttribute == null) {
+ return null;
+ } else {
+ value = legacySpanAttribute.value();
+ }
+ } else {
+ value = spanAttribute.value();
+ }
+
+ if (!value.isEmpty()) {
+ return value;
+ } else if (parameter.isNamePresent()) {
+ return parameter.getName();
+ } else {
+ return null;
+ }
+ }
+ }
+}
diff --git a/extensions/pom.xml b/extensions/pom.xml
index 8222854e51be20..746699977266af 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -141,6 +141,7 @@
oidc-client-reactive-filter
oidc-token-propagation
oidc-token-propagation-reactive
+ oidc-db-token-state-manager
keycloak-authorization
keycloak-admin-client-common
keycloak-admin-client
diff --git a/extensions/reactive-db2-client/runtime/pom.xml b/extensions/reactive-db2-client/runtime/pom.xml
index 8ea8d89f8db39c..254cda26cb106e 100644
--- a/extensions/reactive-db2-client/runtime/pom.xml
+++ b/extensions/reactive-db2-client/runtime/pom.xml
@@ -49,6 +49,11 @@
io.quarkus
quarkus-extension-maven-plugin
+
+
+ io.quarkus.reactive-db2-client
+
+
maven-compiler-plugin
diff --git a/extensions/reactive-mssql-client/runtime/pom.xml b/extensions/reactive-mssql-client/runtime/pom.xml
index 8fa6801bdb7fa0..aa9ba57b9f1449 100644
--- a/extensions/reactive-mssql-client/runtime/pom.xml
+++ b/extensions/reactive-mssql-client/runtime/pom.xml
@@ -53,6 +53,11 @@
io.quarkus
quarkus-extension-maven-plugin
+
+
+ io.quarkus.reactive-mssql-client
+
+
maven-compiler-plugin
diff --git a/extensions/reactive-mysql-client/runtime/pom.xml b/extensions/reactive-mysql-client/runtime/pom.xml
index f8229fb01f6491..f98ea175f5550a 100644
--- a/extensions/reactive-mysql-client/runtime/pom.xml
+++ b/extensions/reactive-mysql-client/runtime/pom.xml
@@ -69,6 +69,11 @@
io.quarkus
quarkus-extension-maven-plugin
+
+
+ io.quarkus.reactive-mysql-client
+
+
maven-compiler-plugin
diff --git a/extensions/reactive-oracle-client/runtime/pom.xml b/extensions/reactive-oracle-client/runtime/pom.xml
index 2a07cfd2169f3d..842a846f3c9b11 100644
--- a/extensions/reactive-oracle-client/runtime/pom.xml
+++ b/extensions/reactive-oracle-client/runtime/pom.xml
@@ -57,6 +57,11 @@
io.quarkus
quarkus-extension-maven-plugin
+
+
+ io.quarkus.reactive-oracle-client
+
+
maven-compiler-plugin
diff --git a/extensions/reactive-pg-client/runtime/pom.xml b/extensions/reactive-pg-client/runtime/pom.xml
index 72d18586745532..21ea768d8973b8 100644
--- a/extensions/reactive-pg-client/runtime/pom.xml
+++ b/extensions/reactive-pg-client/runtime/pom.xml
@@ -57,6 +57,11 @@
io.quarkus
quarkus-extension-maven-plugin
+
+
+ io.quarkus.reactive-pg-client
+
+
maven-compiler-plugin
diff --git a/independent-projects/arc/pom.xml b/independent-projects/arc/pom.xml
index 1fc71b3db0415f..079419c1a867da 100644
--- a/independent-projects/arc/pom.xml
+++ b/independent-projects/arc/pom.xml
@@ -48,7 +48,7 @@
2.0.1
1.7.0
- 3.1.3
+ 3.1.5
3.5.3.Final
2.2.0
1.6.Final
diff --git a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/InjectionPointInfo.java b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/InjectionPointInfo.java
index f98d4bda71cd49..3174b2976989fd 100644
--- a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/InjectionPointInfo.java
+++ b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/InjectionPointInfo.java
@@ -388,7 +388,8 @@ public TypeAndQualifiers(Type type, Set qualifiers) {
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + ((qualifiers == null) ? 0 : qualifiers.hashCode());
+ // We cannot use AnnotationInstance#hashCode() as it includes the AnnotationTarget
+ result = prime * result + annotationSetHashCode(qualifiers);
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
@@ -409,8 +410,8 @@ public boolean equals(Object obj) {
if (other.qualifiers != null) {
return false;
}
- } else if (!qualifiersAreEqual(qualifiers, other.qualifiers)) {
- // We cannot use AnnotationInstance#equals() as it requires the exact same annotationTarget instance
+ } else if (!annotationSetEquals(qualifiers, other.qualifiers)) {
+ // We cannot use AnnotationInstance#equals() as it requires the exact same AnnotationTarget instance
return false;
}
if (type == null) {
@@ -423,16 +424,16 @@ public boolean equals(Object obj) {
return true;
}
- private boolean qualifiersAreEqual(Set q1, Set q2) {
- if (q1 == q2) {
+ private static boolean annotationSetEquals(Set s1, Set s2) {
+ if (s1 == s2) {
return true;
}
- if (q1.size() != q2.size()) {
+ if (s1.size() != s2.size()) {
return false;
}
- for (AnnotationInstance a1 : q1) {
- for (AnnotationInstance a2 : q2) {
- if (!annotationsAreEqual(a1, a2)) {
+ for (AnnotationInstance a1 : s1) {
+ for (AnnotationInstance a2 : s2) {
+ if (!annotationEquals(a1, a2)) {
return false;
}
}
@@ -440,13 +441,27 @@ private boolean qualifiersAreEqual(Set q1, Set s) {
+ int result = 1;
+ for (AnnotationInstance a : s) {
+ result = 31 * result + annotationHashCode(a);
+ }
+ return result;
+ }
+
+ private static int annotationHashCode(AnnotationInstance a) {
+ int result = a.name().hashCode();
+ result = 31 * result + a.values().hashCode();
+ return result;
+ }
+
}
}
diff --git a/independent-projects/bootstrap/pom.xml b/independent-projects/bootstrap/pom.xml
index 1236a615edb48b..daf37730e53a9e 100644
--- a/independent-projects/bootstrap/pom.xml
+++ b/independent-projects/bootstrap/pom.xml
@@ -40,7 +40,7 @@
3.11.0
3.2.1
3.1.2
- 3.1.3
+ 3.1.5
3.24.2
@@ -63,7 +63,7 @@
1.16.0
2.13.0
3.12.0
- 32.1.1-jre
+ 32.1.2-jre
1.0.1
2.8
1.2.6
diff --git a/independent-projects/enforcer-rules/pom.xml b/independent-projects/enforcer-rules/pom.xml
index e7a5826dae2e6a..0bded1328c8b00 100644
--- a/independent-projects/enforcer-rules/pom.xml
+++ b/independent-projects/enforcer-rules/pom.xml
@@ -109,7 +109,7 @@
org.apache.groovy
groovy
- 4.0.13
+ 4.0.15
diff --git a/independent-projects/junit5-virtual-threads/pom.xml b/independent-projects/junit5-virtual-threads/pom.xml
index f3cac0d65d5bcb..0f5a5618ac3f18 100644
--- a/independent-projects/junit5-virtual-threads/pom.xml
+++ b/independent-projects/junit5-virtual-threads/pom.xml
@@ -44,7 +44,7 @@
3.11.0
3.2.1
3.1.2
- 3.1.3
+ 3.1.5
2.23.0
1.9.0
@@ -295,4 +295,4 @@
-
\ No newline at end of file
+
diff --git a/independent-projects/qute/pom.xml b/independent-projects/qute/pom.xml
index 551ebe66ac214c..af929866376141 100644
--- a/independent-projects/qute/pom.xml
+++ b/independent-projects/qute/pom.xml
@@ -43,7 +43,7 @@
11
5.10.0
3.24.2
- 3.1.3
+ 3.1.5
1.7.0
3.5.3.Final
3.11.0
diff --git a/independent-projects/resteasy-reactive/pom.xml b/independent-projects/resteasy-reactive/pom.xml
index 00ce1bdcaf0367..3a05b82f63ae95 100644
--- a/independent-projects/resteasy-reactive/pom.xml
+++ b/independent-projects/resteasy-reactive/pom.xml
@@ -41,14 +41,14 @@
2.1.2
3.1.0
4.0.1
- 1.1.2
+ 1.1.4
UTF-8
11
11
11
4.0.1
- 3.1.3
+ 3.1.5
1.12.12
5.10.0
3.9.3
diff --git a/independent-projects/tools/pom.xml b/independent-projects/tools/pom.xml
index 00bd02a7bc9181..10ed0138fb11c4 100644
--- a/independent-projects/tools/pom.xml
+++ b/independent-projects/tools/pom.xml
@@ -62,7 +62,7 @@
3.1.2
${project.version}
25
- 3.1.3
+ 3.1.5
2.0.2
4.2.0
diff --git a/integration-tests/smallrye-jwt-oidc-webapp/pom.xml b/integration-tests/smallrye-jwt-oidc-webapp/pom.xml
index d8e3343d5ab5bc..e2494bd6d5f974 100644
--- a/integration-tests/smallrye-jwt-oidc-webapp/pom.xml
+++ b/integration-tests/smallrye-jwt-oidc-webapp/pom.xml
@@ -23,6 +23,14 @@
org.keycloak
keycloak-adapter-core