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

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

commit 44ced31a740f275bd7508e87347f341012e05311
Author: James Netherton <jamesnether...@gmail.com>
AuthorDate: Thu Apr 27 11:03:48 2023 +0100

    Add workaround for RemoteCacheManager bean discovery #4841
---
 .../pages/reference/extensions/infinispan.adoc     | 23 +++++++++++++
 .../camel/quarkus/core/RuntimeBeanRepository.java  |  8 +++++
 .../runtime/src/main/doc/configuration.adoc        | 23 +++++++++++++
 .../infinispan/CamelInfinispanRecorder.java        | 39 ++++++++++++++++++++++
 .../infinispan/InfinispanQuarkusClientRoutes.java  |  7 ++++
 5 files changed, 100 insertions(+)

diff --git a/docs/modules/ROOT/pages/reference/extensions/infinispan.adoc 
b/docs/modules/ROOT/pages/reference/extensions/infinispan.adoc
index 20cfea3021..15eeabc4a4 100644
--- a/docs/modules/ROOT/pages/reference/extensions/infinispan.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/infinispan.adoc
@@ -54,6 +54,29 @@ endif::[]
 You can either configure the Infinispan client via the relevant Camel 
Infinispan component & endpoint options, or you
 may use the 
https://quarkus.io/guides/infinispan-client#configuration-reference[Quarkus 
Infinispan extension configuration properties].
 
+Note that if you choose to use Quarkus Infinispan configuration properties, 
you *must* add an injection point for the `RemoteCacheManager` in order for it 
to be discoverable by the Camel Infinispan component. For example:
+
+[source,java]
+----
+public class Routes extends RouteBuilder {
+    // Injects the default unnamed RemoteCacheManager
+    @Inject
+    RemoteCacheManager cacheManager;
+
+    // If configured, injects an optional named RemoteCacheManager
+    @Inject
+    @InfinispanClientName("myNamedClient")
+    RemoteCacheManager namedCacheManager;
+
+    @Override
+    public void configure() {
+        // Route configuration here...
+    }
+}
+
+----
+
+
 
[id="extensions-infinispan-configuration-camel-infinispan-infinispanremoteaggregationrepository-in-native-mode"]
 === Camel Infinispan `InfinispanRemoteAggregationRepository` in native mode
 
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 cd01044e1b..cfb34569f3 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
@@ -28,6 +28,7 @@ import io.quarkus.arc.Arc;
 import io.quarkus.arc.ArcContainer;
 import io.smallrye.common.annotation.Identifier;
 import jakarta.enterprise.inject.AmbiguousResolutionException;
+import jakarta.enterprise.inject.literal.NamedLiteral;
 import jakarta.enterprise.inject.spi.Bean;
 import jakarta.enterprise.inject.spi.BeanManager;
 import org.apache.camel.spi.BeanRepository;
@@ -73,10 +74,17 @@ public final class RuntimeBeanRepository implements 
BeanRepository {
 
     private static <T> Optional<T> getReferenceByName(BeanManager manager, 
String name, Class<T> type) {
         Set<Bean<?>> beans = manager.getBeans(name);
+
+        if (beans.isEmpty()) {
+            // Fallback to searching explicitly with NamedLiteral
+            beans = manager.getBeans(type, NamedLiteral.of(name));
+        }
+
         if (beans.isEmpty()) {
             // Fallback to SmallRye @Identifier
             beans = manager.getBeans(type, Identifier.Literal.of(name));
         }
+
         return Optional.ofNullable(manager.resolve(beans)).map(bean -> 
getReference(manager, type, bean));
     }
 
diff --git a/extensions/infinispan/runtime/src/main/doc/configuration.adoc 
b/extensions/infinispan/runtime/src/main/doc/configuration.adoc
index f4bd4fac58..cdc779e832 100644
--- a/extensions/infinispan/runtime/src/main/doc/configuration.adoc
+++ b/extensions/infinispan/runtime/src/main/doc/configuration.adoc
@@ -3,6 +3,29 @@
 You can either configure the Infinispan client via the relevant Camel 
Infinispan component & endpoint options, or you
 may use the 
https://quarkus.io/guides/infinispan-client#configuration-reference[Quarkus 
Infinispan extension configuration properties].
 
+Note that if you choose to use Quarkus Infinispan configuration properties, 
you *must* add an injection point for the `RemoteCacheManager` in order for it 
to be discoverable by the Camel Infinispan component. For example:
+
+[source,java]
+----
+public class Routes extends RouteBuilder {
+    // Injects the default unnamed RemoteCacheManager
+    @Inject
+    RemoteCacheManager cacheManager;
+
+    // If configured, injects an optional named RemoteCacheManager
+    @Inject
+    @InfinispanClientName("myNamedClient")
+    RemoteCacheManager namedCacheManager;
+
+    @Override
+    public void configure() {
+        // Route configuration here...
+    }
+}
+
+----
+
+
 === Camel Infinispan `InfinispanRemoteAggregationRepository` in native mode
 
 If you chose to use the `InfinispanRemoteAggregationRepository` in native 
mode, then you must 
xref:extensions/core.adoc#quarkus.camel.native.reflection.serialization-enabled[enable
 native serialization support].
diff --git 
a/extensions/infinispan/runtime/src/main/java/org/apache/camel/quarkus/component/infinispan/CamelInfinispanRecorder.java
 
b/extensions/infinispan/runtime/src/main/java/org/apache/camel/quarkus/component/infinispan/CamelInfinispanRecorder.java
new file mode 100644
index 0000000000..9a53283e1b
--- /dev/null
+++ 
b/extensions/infinispan/runtime/src/main/java/org/apache/camel/quarkus/component/infinispan/CamelInfinispanRecorder.java
@@ -0,0 +1,39 @@
+package org.apache.camel.quarkus.component.infinispan;
+
+import java.lang.annotation.Annotation;
+
+import io.quarkus.infinispan.client.InfinispanClientName;
+import io.quarkus.infinispan.client.runtime.InfinispanClientUtil;
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
+import jakarta.enterprise.inject.Default;
+import jakarta.enterprise.inject.literal.NamedLiteral;
+import org.apache.camel.quarkus.core.CamelBeanQualifierResolver;
+
+@Recorder
+public class CamelInfinispanRecorder {
+
+    public RuntimeValue<CamelBeanQualifierResolver> 
createInfinispanClientNameQualifierResolver(String clientName) {
+        CamelBeanQualifierResolver resolver = new CamelBeanQualifierResolver() 
{
+            Annotation[] annotations;
+
+            @Override
+            public Annotation[] resolveQualifiers() {
+                if 
(clientName.startsWith(InfinispanClientUtil.DEFAULT_INFINISPAN_CLIENT_NAME)) {
+                    annotations = new Annotation[] { Default.Literal.INSTANCE 
};
+                } else {
+                    annotations = new Annotation[] { 
NamedLiteral.of(clientName), InfinispanClientName.Literal.of(clientName) };
+                }
+
+                System.out.println(annotations);
+
+                return annotations;
+            }
+        };
+        return new RuntimeValue<>(resolver);
+    }
+
+    public RuntimeValue<?> createBean() {
+        return new RuntimeValue<>(new Object());
+    }
+}
diff --git 
a/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java
 
b/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java
index 7f4c291606..4baa067bf7 100644
--- 
a/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java
+++ 
b/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java
@@ -18,6 +18,8 @@ package org.apache.camel.quarkus.component.infinispan;
 
 import java.util.Set;
 
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 import org.apache.camel.CamelContext;
 import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent;
 import 
org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration;
@@ -29,8 +31,13 @@ import 
org.infinispan.client.hotrod.configuration.Configuration;
 import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
 import org.infinispan.commons.marshall.ProtoStreamMarshaller;
 
+@ApplicationScoped
 public class InfinispanQuarkusClientRoutes extends InfinispanCommonRoutes {
 
+    // TODO: This should not be required: 
https://github.com/apache/camel-quarkus/issues/4841
+    @Inject
+    RemoteCacheManager cacheManager;
+
     @Override
     protected Configuration getConfigurationBuilder() {
         Config config = ConfigProvider.getConfig();

Reply via email to