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

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


The following commit(s) were added to refs/heads/quarkus-main by this push:
     new 8243475a6a Restore named DataSource autowiring for SQL extension
8243475a6a is described below

commit 8243475a6ad377fc5e283bf56e48ccb08d44d54b
Author: James Netherton <jamesnether...@gmail.com>
AuthorDate: Fri Sep 2 15:39:09 2022 +0100

    Restore named DataSource autowiring for SQL extension
---
 .../core/deployment/CamelRegistryProcessor.java    | 17 +++++++-
 .../spi/CamelBeanQualifierResolverBuildItem.java   | 46 ++++++++++++++++++++++
 ...gistry.java => CamelBeanQualifierResolver.java} | 19 +++------
 .../apache/camel/quarkus/core/CamelRecorder.java   | 17 +++++++-
 .../camel/quarkus/core/RuntimeBeanRepository.java  | 18 ++++++++-
 .../apache/camel/quarkus/core/RuntimeRegistry.java |  6 ++-
 .../component/sql/deployment/SqlProcessor.java     | 32 +++++++++++++++
 .../quarkus/component/sql/CamelSqlRecorder.java    | 27 +++++++------
 8 files changed, 150 insertions(+), 32 deletions(-)

diff --git 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRegistryProcessor.java
 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRegistryProcessor.java
index d27028eeb8..a9be5e7e26 100644
--- 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRegistryProcessor.java
+++ 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRegistryProcessor.java
@@ -16,15 +16,19 @@
  */
 package org.apache.camel.quarkus.core.deployment;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.annotations.ExecutionTime;
 import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
+import org.apache.camel.quarkus.core.CamelBeanQualifierResolver;
 import org.apache.camel.quarkus.core.CamelConfig;
 import org.apache.camel.quarkus.core.CamelRecorder;
 import org.apache.camel.quarkus.core.deployment.spi.CamelBeanBuildItem;
+import 
org.apache.camel.quarkus.core.deployment.spi.CamelBeanQualifierResolverBuildItem;
 import org.apache.camel.quarkus.core.deployment.spi.CamelContextBuildItem;
 import org.apache.camel.quarkus.core.deployment.spi.CamelRegistryBuildItem;
 import org.apache.camel.quarkus.core.deployment.spi.CamelRuntimeBeanBuildItem;
@@ -43,8 +47,17 @@ public class CamelRegistryProcessor {
 
     @Record(ExecutionTime.STATIC_INIT)
     @BuildStep
-    CamelRegistryBuildItem registry(CamelRecorder recorder) {
-        return new CamelRegistryBuildItem(recorder.createRegistry());
+    CamelRegistryBuildItem registry(
+            List<CamelBeanQualifierResolverBuildItem> 
camelBeanQualifierResolvers,
+            CamelRecorder recorder) {
+
+        Map<String, CamelBeanQualifierResolver> beanQualifierResolvers = new 
HashMap<>();
+        for (CamelBeanQualifierResolverBuildItem resolver : 
camelBeanQualifierResolvers) {
+            
recorder.registerCamelBeanQualifierResolver(resolver.getBeanTypeName(), 
resolver.getRuntimeValue(),
+                    beanQualifierResolvers);
+        }
+
+        return new 
CamelRegistryBuildItem(recorder.createRegistry(beanQualifierResolvers));
     }
 
     @Record(ExecutionTime.STATIC_INIT)
diff --git 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/CamelBeanQualifierResolverBuildItem.java
 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/CamelBeanQualifierResolverBuildItem.java
new file mode 100644
index 0000000000..7d9e96b0b9
--- /dev/null
+++ 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/CamelBeanQualifierResolverBuildItem.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.core.deployment.spi;
+
+import io.quarkus.builder.item.MultiBuildItem;
+import io.quarkus.runtime.RuntimeValue;
+import org.apache.camel.quarkus.core.CamelBeanQualifierResolver;
+
+/**
+ * Holds a {@link CamelBeanQualifierResolver} for a specified bean type.
+ */
+public final class CamelBeanQualifierResolverBuildItem extends MultiBuildItem {
+    private final RuntimeValue<CamelBeanQualifierResolver> runtimeValue;
+    private final Class<?> beanType;
+
+    public CamelBeanQualifierResolverBuildItem(Class<?> beanType, 
RuntimeValue<CamelBeanQualifierResolver> runtimeValue) {
+        this.beanType = beanType;
+        this.runtimeValue = runtimeValue;
+    }
+
+    public Class<?> getBeanType() {
+        return beanType;
+    }
+
+    public String getBeanTypeName() {
+        return beanType.getName();
+    }
+
+    public RuntimeValue<CamelBeanQualifierResolver> getRuntimeValue() {
+        return runtimeValue;
+    }
+}
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelBeanQualifierResolver.java
similarity index 67%
copy from 
extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
copy to 
extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelBeanQualifierResolver.java
index 6a89ba2b3c..c8d7cc5330 100644
--- 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelBeanQualifierResolver.java
@@ -16,18 +16,11 @@
  */
 package org.apache.camel.quarkus.core;
 
-import io.quarkus.runtime.RuntimeValue;
-import org.apache.camel.support.DefaultRegistry;
+import java.lang.annotation.Annotation;
 
-public class RuntimeRegistry extends DefaultRegistry {
-    public RuntimeRegistry() {
-        super(new RuntimeBeanRepository());
-    }
-
-    @Override
-    public Object unwrap(Object value) {
-        return (value instanceof RuntimeValue)
-                ? ((RuntimeValue<?>) value).getValue()
-                : value;
-    }
+/**
+ * Abstraction for resolving bean annotation qualifiers
+ */
+public interface CamelBeanQualifierResolver {
+    Annotation[] resolveQualifiers();
 }
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
index 67b16da1e9..d1217cb673 100644
--- 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.quarkus.core;
 
+import java.util.Map;
 import java.util.Set;
 import java.util.function.Supplier;
 
@@ -47,8 +48,20 @@ import 
org.apache.camel.support.startup.DefaultStartupStepRecorder;
 
 @Recorder
 public class CamelRecorder {
-    public RuntimeValue<Registry> createRegistry() {
-        return new RuntimeValue<>(new RuntimeRegistry());
+    public void registerCamelBeanQualifierResolver(
+            String className,
+            RuntimeValue<CamelBeanQualifierResolver> runtimeValue,
+            Map<String, CamelBeanQualifierResolver> beanQualifiers) {
+
+        if (beanQualifiers.containsKey(className)) {
+            throw new RuntimeException("Duplicate CamelBeanQualifierResolver 
detected for class: " + className);
+        }
+
+        beanQualifiers.put(className, runtimeValue.getValue());
+    }
+
+    public RuntimeValue<Registry> createRegistry(Map<String, 
CamelBeanQualifierResolver> beanQualifierResolvers) {
+        return new RuntimeValue<>(new RuntimeRegistry(beanQualifierResolvers));
     }
 
     public RuntimeValue<TypeConverterRegistry> createTypeConverterRegistry() {
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 934cb22ae0..e191e55df7 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
@@ -34,6 +34,12 @@ import org.apache.camel.spi.BeanRepository;
 
 public final class RuntimeBeanRepository implements BeanRepository {
 
+    private final Map<String, CamelBeanQualifierResolver> 
beanQualifierResolvers;
+
+    public RuntimeBeanRepository(Map<String, CamelBeanQualifierResolver> 
beanQualifierResolvers) {
+        this.beanQualifierResolvers = beanQualifierResolvers;
+    }
+
     private static <T> Set<Bean<? extends T>> resolveAmbiguity(BeanManager 
manager, Set<Bean<? extends T>> beans) {
         if (beans.size() > 1) {
             try {
@@ -111,13 +117,21 @@ public final class RuntimeBeanRepository implements 
BeanRepository {
 
     @Override
     public <T> Map<String, T> findByTypeWithName(Class<T> type) {
-        return getReferencesByTypeWithName(type);
+        return getReferencesByTypeWithName(type, 
resolveQualifiersForType(type));
     }
 
     @Override
     public <T> Set<T> findByType(Class<T> type) {
         return getBeanManager()
-                .map(manager -> getReferencesByType(manager, type))
+                .map(manager -> getReferencesByType(manager, type, 
resolveQualifiersForType(type)))
                 .orElseGet(Collections::emptySet);
     }
+
+    private Annotation[] resolveQualifiersForType(Class<?> type) {
+        CamelBeanQualifierResolver resolver = 
beanQualifierResolvers.get(type.getName());
+        if (resolver != null) {
+            return resolver.resolveQualifiers();
+        }
+        return null;
+    }
 }
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
index 6a89ba2b3c..3f547bd290 100644
--- 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
@@ -16,12 +16,14 @@
  */
 package org.apache.camel.quarkus.core;
 
+import java.util.Map;
+
 import io.quarkus.runtime.RuntimeValue;
 import org.apache.camel.support.DefaultRegistry;
 
 public class RuntimeRegistry extends DefaultRegistry {
-    public RuntimeRegistry() {
-        super(new RuntimeBeanRepository());
+    public RuntimeRegistry(Map<String, CamelBeanQualifierResolver> 
beanQualifierResolvers) {
+        super(new RuntimeBeanRepository(beanQualifierResolvers));
     }
 
     @Override
diff --git 
a/extensions/sql/deployment/src/main/java/org/apache/camel/quarkus/component/sql/deployment/SqlProcessor.java
 
b/extensions/sql/deployment/src/main/java/org/apache/camel/quarkus/component/sql/deployment/SqlProcessor.java
index 571b2d9e8a..ff45dd658f 100644
--- 
a/extensions/sql/deployment/src/main/java/org/apache/camel/quarkus/component/sql/deployment/SqlProcessor.java
+++ 
b/extensions/sql/deployment/src/main/java/org/apache/camel/quarkus/component/sql/deployment/SqlProcessor.java
@@ -18,11 +18,21 @@ package org.apache.camel.quarkus.component.sql.deployment;
 
 import java.sql.Types;
 import java.util.LinkedHashMap;
+import java.util.List;
 
+import javax.sql.DataSource;
+
+import io.quarkus.agroal.spi.JdbcDataSourceBuildItem;
 import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.quarkus.runtime.RuntimeValue;
+import org.apache.camel.quarkus.component.sql.CamelSqlRecorder;
+import org.apache.camel.quarkus.core.CamelBeanQualifierResolver;
+import 
org.apache.camel.quarkus.core.deployment.spi.CamelBeanQualifierResolverBuildItem;
 import 
org.apache.camel.quarkus.core.deployment.spi.CamelSerializationBuildItem;
 import org.apache.camel.support.DefaultExchangeHolder;
 
@@ -45,4 +55,26 @@ class SqlProcessor {
         reflectiveClass.produce(new ReflectiveClassBuildItem(false, true, 
Types.class, DefaultExchangeHolder.class));
         
reflectiveClass.produce(ReflectiveClassBuildItem.serializationClass(LinkedHashMap.class.getName()));
     }
+
+    @Record(ExecutionTime.STATIC_INIT)
+    @BuildStep
+    void registerNamedDataSourceCamelBeanQualifierResolver(
+            List<JdbcDataSourceBuildItem> dataSources,
+            BuildProducer<CamelBeanQualifierResolverBuildItem> 
camelBeanQualifierResolver,
+            CamelSqlRecorder recorder) {
+
+        // If there are multiple DataSource configs, then users need to 
explicitly state which one to use
+        // via their component / endpoint configuration. Otherwise if there is 
just 1 and it is not the default DataSource,
+        // we can create a resolver for DataSourceLiteral and make named 
DataSource autowiring work as expected
+        if (dataSources.size() == 1) {
+            JdbcDataSourceBuildItem dataSource = dataSources.get(0);
+            if (!dataSource.isDefault()) {
+                RuntimeValue<CamelBeanQualifierResolver> runtimeValue = 
recorder
+                        
.createDataSourceQualifierResolver(dataSource.getName());
+                CamelBeanQualifierResolverBuildItem beanQualifierResolver = 
new CamelBeanQualifierResolverBuildItem(
+                        DataSource.class, runtimeValue);
+                camelBeanQualifierResolver.produce(beanQualifierResolver);
+            }
+        }
+    }
 }
diff --git 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
 
b/extensions/sql/runtime/src/main/java/org/apache/camel/quarkus/component/sql/CamelSqlRecorder.java
similarity index 53%
copy from 
extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
copy to 
extensions/sql/runtime/src/main/java/org/apache/camel/quarkus/component/sql/CamelSqlRecorder.java
index 6a89ba2b3c..a011724be0 100644
--- 
a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeRegistry.java
+++ 
b/extensions/sql/runtime/src/main/java/org/apache/camel/quarkus/component/sql/CamelSqlRecorder.java
@@ -14,20 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core;
+package org.apache.camel.quarkus.component.sql;
 
+import java.lang.annotation.Annotation;
+
+import io.quarkus.agroal.DataSource;
 import io.quarkus.runtime.RuntimeValue;
-import org.apache.camel.support.DefaultRegistry;
+import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.quarkus.core.CamelBeanQualifierResolver;
 
-public class RuntimeRegistry extends DefaultRegistry {
-    public RuntimeRegistry() {
-        super(new RuntimeBeanRepository());
-    }
+@Recorder
+public class CamelSqlRecorder {
+    public RuntimeValue<CamelBeanQualifierResolver> 
createDataSourceQualifierResolver(String dataSourceName) {
+        return new RuntimeValue<>(new CamelBeanQualifierResolver() {
+            final DataSource.DataSourceLiteral datasourceLiteral = new 
DataSource.DataSourceLiteral(dataSourceName);
 
-    @Override
-    public Object unwrap(Object value) {
-        return (value instanceof RuntimeValue)
-                ? ((RuntimeValue<?>) value).getValue()
-                : value;
+            @Override
+            public Annotation[] resolveQualifiers() {
+                return new Annotation[] { datasourceLiteral };
+            }
+        });
     }
 }

Reply via email to