This is an automated email from the ASF dual-hosted git repository.

zhfeng pushed a commit to branch 3.8.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/3.8.x by this push:
     new 896605ba67 Fix #6301 to resort the beans if priority is same the 
default one wins (#6304) (#6307)
896605ba67 is described below

commit 896605ba67f84cb11c8df1d296f0e11724f22166
Author: Zheng Feng <[email protected]>
AuthorDate: Thu Aug 1 15:39:12 2024 +0800

    Fix #6301 to resort the beans if priority is same the default one wins 
(#6304) (#6307)
---
 .../camel/quarkus/core/RuntimeBeanRepository.java  | 33 ++++++++++++++++++++--
 integration-test-groups/foundation/bean/pom.xml    |  8 ++++++
 .../camel/quarkus/component/bean/BeanResource.java | 10 +++++++
 .../bean/src/main/resources/application.properties |  6 ++++
 .../camel/quarkus/component/bean/BeanTest.java     |  9 ++++++
 integration-tests/foundation-grouped/pom.xml       |  8 ++++++
 6 files changed, 72 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 d48e821db8..72b48788af 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 fc8450a354..0418a2d27c 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;
@@ -37,6 +39,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
@@ -202,4 +205,11 @@ public class BeanResource {
                 .map(b -> b.getName()).collect(Collectors.toSet());
     }
 
+    @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 06aeb9fd2b..5bfec94657 100644
--- 
a/integration-test-groups/foundation/bean/src/main/resources/application.properties
+++ 
b/integration-test-groups/foundation/bean/src/main/resources/application.properties
@@ -17,3 +17,9 @@
 
 # A test value
 my.foo.property = foo
+
+# 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 740b26297c..4daf52e9ab 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>

Reply via email to