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>

Reply via email to