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 }; + } + }); } }