This is an automated email from the ASF dual-hosted git repository.
zhfeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new 91cb3a2b1f Fix #6301 to resort the beans if priority is same the
default one wins (#6304)
91cb3a2b1f is described below
commit 91cb3a2b1fed870d313411935ada312d5b653069
Author: Zheng Feng <[email protected]>
AuthorDate: Wed Jul 31 20:23:47 2024 +0800
Fix #6301 to resort the beans if priority is same the default one wins
(#6304)
---
.../camel/quarkus/core/RuntimeBeanRepository.java | 33 ++++++++++++++++++++--
integration-test-groups/foundation/bean/pom.xml | 8 ++++++
.../camel/quarkus/component/bean/BeanResource.java | 11 ++++++++
.../bean/src/main/resources/application.properties | 6 ++++
.../camel/quarkus/component/bean/BeanTest.java | 9 ++++++
integration-tests/foundation-grouped/pom.xml | 8 ++++++
6 files changed, 73 insertions(+), 2 deletions(-)
diff --git
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java
index deb85823c5..4522183835 100644
---
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java
+++
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java
@@ -17,6 +17,7 @@
package org.apache.camel.quarkus.core;
import java.lang.annotation.Annotation;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -27,9 +28,11 @@ import java.util.Set;
import io.quarkus.arc.Arc;
import io.quarkus.arc.ArcContainer;
+import io.quarkus.arc.InjectableBean;
import io.quarkus.arc.InstanceHandle;
import io.smallrye.common.annotation.Identifier;
import jakarta.enterprise.inject.AmbiguousResolutionException;
+import jakarta.enterprise.inject.Default;
import jakarta.enterprise.inject.literal.NamedLiteral;
import jakarta.enterprise.inject.spi.Bean;
import jakarta.enterprise.inject.spi.BeanManager;
@@ -163,8 +166,30 @@ public final class RuntimeBeanRepository implements
BeanRepository {
} else {
handles = container.listAll(type);
}
- if (handles.size() > 0) {
- return handles.get(0).get();
+
+ List<InstanceHandle<T>> sortedHandles = new
ArrayList<>(handles.size());
+ sortedHandles.addAll(handles);
+
+ if (sortedHandles.size() > 1) {
+ sortedHandles.sort((bean1, bean2) -> {
+ Integer priority2 = bean2.getBean().getPriority();
+ Integer priority1 = bean1.getBean().getPriority();
+
+ int result = priority2.compareTo(priority1);
+ // If the priority is same, the default bean wins
+ if (result == 0) {
+ if (isDefaultBean(bean1.getBean())) {
+ result = -1;
+ } else if (isDefaultBean(bean2.getBean())) {
+ result = 1;
+ }
+ }
+ return result;
+ });
+ }
+
+ if (sortedHandles.size() > 0) {
+ return sortedHandles.get(0).get();
}
}
return null;
@@ -177,4 +202,8 @@ public final class RuntimeBeanRepository implements
BeanRepository {
}
return Optional.empty();
}
+
+ private boolean isDefaultBean(InjectableBean<?> bean) {
+ return bean.isDefaultBean() ||
bean.getQualifiers().stream().anyMatch(q ->
q.annotationType().equals(Default.class));
+ }
}
diff --git a/integration-test-groups/foundation/bean/pom.xml
b/integration-test-groups/foundation/bean/pom.xml
index e5767b9f34..ea5911a84a 100644
--- a/integration-test-groups/foundation/bean/pom.xml
+++ b/integration-test-groups/foundation/bean/pom.xml
@@ -48,6 +48,14 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-agroal</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-jdbc-h2</artifactId>
+ </dependency>
<!-- test dependencies -->
<dependency>
diff --git
a/integration-test-groups/foundation/bean/src/main/java/org/apache/camel/quarkus/component/bean/BeanResource.java
b/integration-test-groups/foundation/bean/src/main/java/org/apache/camel/quarkus/component/bean/BeanResource.java
index ffb3958864..85daa27c1a 100644
---
a/integration-test-groups/foundation/bean/src/main/java/org/apache/camel/quarkus/component/bean/BeanResource.java
+++
b/integration-test-groups/foundation/bean/src/main/java/org/apache/camel/quarkus/component/bean/BeanResource.java
@@ -21,6 +21,8 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
+import javax.sql.DataSource;
+
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
@@ -38,6 +40,7 @@ import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.quarkus.component.bean.cdi.Producers;
import org.apache.camel.quarkus.component.bean.model.Employee;
+import org.apache.camel.support.CamelContextHelper;
@Path("/bean")
@ApplicationScoped
@@ -212,4 +215,12 @@ public class BeanResource {
Map<String, Object> headers = Map.of("beanName", beanName,
"beanMethod", beanMethod);
return template.requestBodyAndHeaders("direct:propertyInject", null,
headers, String.class);
}
+
+ @Path("/dataSource")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public String dataSourceBean() throws Exception {
+ DataSource ds = CamelContextHelper.findSingleByType(camelContext,
DataSource.class);
+ return ds.getConnection().getMetaData().getURL();
+ }
}
diff --git
a/integration-test-groups/foundation/bean/src/main/resources/application.properties
b/integration-test-groups/foundation/bean/src/main/resources/application.properties
index 8d522c8da9..9a092334b3 100644
---
a/integration-test-groups/foundation/bean/src/main/resources/application.properties
+++
b/integration-test-groups/foundation/bean/src/main/resources/application.properties
@@ -21,3 +21,9 @@ my.foo.property = foo
my.injected.property.a = Test @PropertyInject
my.injected.property.d = Test @PropertyInject Setter Method
my.injected.property.e = Test @PropertyInject Method Argument
+
+# DataSource Test
+quarkus.datasource.db-kind = h2
+
+quarkus.datasource."test".db-kind = h2
+quarkus.datasource."test".jdbc.url = jdbc:h2:mem:test
diff --git
a/integration-test-groups/foundation/bean/src/test/java/org/apache/camel/quarkus/component/bean/BeanTest.java
b/integration-test-groups/foundation/bean/src/test/java/org/apache/camel/quarkus/component/bean/BeanTest.java
index 5e61dc0d55..50b4ad8b84 100644
---
a/integration-test-groups/foundation/bean/src/test/java/org/apache/camel/quarkus/component/bean/BeanTest.java
+++
b/integration-test-groups/foundation/bean/src/test/java/org/apache/camel/quarkus/component/bean/BeanTest.java
@@ -265,4 +265,13 @@ public class BeanTest {
containsString("alternatingBean")));
}
+ @Test
+ public void testDataSourceBean() {
+ for (int i = 0; i < 10; i++) {
+ RestAssured.given()
+ .get("/bean/dataSource")
+ .then()
+ .body(containsString("mem:quarkus"));
+ }
+ }
}
diff --git a/integration-tests/foundation-grouped/pom.xml
b/integration-tests/foundation-grouped/pom.xml
index 9289bd2cf3..f7860376f9 100644
--- a/integration-tests/foundation-grouped/pom.xml
+++ b/integration-tests/foundation-grouped/pom.xml
@@ -32,10 +32,18 @@
<!-- Regenerate the dependencies via `mvn process-resources -Pformat -N`
from the source tree root directory -->
<dependencies>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-agroal</artifactId>
+ </dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jackson</artifactId>
</dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-jdbc-h2</artifactId>
+ </dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jsonb</artifactId>