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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot-examples.git


The following commit(s) were added to refs/heads/main by this push:
     new 9360109  [CAMEL-17614]Be able to run infinispan spring-boot example 
out of the box (#49)
9360109 is described below

commit 9360109606756ac098dd1609ef0f1ef8e07355a1
Author: Freeman(Yue) Fang <[email protected]>
AuthorDate: Wed Feb 9 03:51:32 2022 -0500

    [CAMEL-17614]Be able to run infinispan spring-boot example out of the box 
(#49)
---
 infinispan/README.adoc                             |   2 +-
 infinispan/pom.xml                                 |   5 +
 .../example/springboot/infinispan/Application.java | 106 ++++++++++++++++++++-
 .../infinispan/CamelInfinispanRoute.java           |   4 +-
 infinispan/src/main/resources/infinispan.xml       |  72 ++++++++++++++
 5 files changed, 185 insertions(+), 4 deletions(-)

diff --git a/infinispan/README.adoc b/infinispan/README.adoc
index cbc1aec..776b52f 100644
--- a/infinispan/README.adoc
+++ b/infinispan/README.adoc
@@ -3,7 +3,7 @@
 === Introduction
 
 This example demonstrates how you can use Camel-Infinispan Starter component. 
The example is really simple: put a key/value pair in a remote cache and get 
the same key.
-You'll need a running Infinispan server to run this example.
+This example starts an Infinispan server with Infinispan Docker Image, so it 
can run OOTB.
 
 === Build
 
diff --git a/infinispan/pom.xml b/infinispan/pom.xml
index 2ec42ea..fe55e02 100644
--- a/infinispan/pom.xml
+++ b/infinispan/pom.xml
@@ -67,6 +67,11 @@
             <artifactId>camel-infinispan-starter</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>testcontainers</artifactId>
+        </dependency>
+
         <!-- Test -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
diff --git 
a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java
 
b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java
index b6c8e90..cfb9387 100644
--- 
a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java
+++ 
b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java
@@ -16,19 +16,123 @@
  */
 package org.apache.camel.example.springboot.infinispan;
 
+import java.util.Properties;
+import java.util.function.Consumer;
+
+import com.github.dockerjava.api.command.CreateContainerCmd;
+import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.PortBinding;
+import com.github.dockerjava.api.model.Ports;
+
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent;
+import 
org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration;
+import org.infinispan.client.hotrod.RemoteCacheManager;
+import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
+import org.infinispan.configuration.cache.CacheMode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.testcontainers.containers.BindMode;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.output.OutputFrame;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.shaded.org.apache.commons.lang.SystemUtils;
+
 
 // CHECKSTYLE:OFF
 @SpringBootApplication
 public class Application {
-
+    
+    
+    private static final Logger LOG = 
LoggerFactory.getLogger(Application.class);
+    
+    private static final String CONTAINER_IMAGE = 
"quay.io/infinispan/server:13.0.5.Final-1";
+    private static final String CONTAINER_NAME = "infinispan";
+    private static final String DEFAULT_USERNAME = "admin";
+    private static final String DEFAULT_PASSWORD = "password";
+    private static final int CONTAINER_PORT = 11222;
+    
+    private GenericContainer container;
     /**
      * Main method to start the application.
      */
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
     }
+    
+    
+    
+    @Configuration
+    public class InfinispanConfiguration {
+
+        private void initContainer() {
+            LOG.info("start infinispan docker container");
+            Consumer<CreateContainerCmd> cmd = e -> {
+                e.getHostConfig().withPortBindings(new 
PortBinding(Ports.Binding.bindPort(CONTAINER_PORT),
+                                                   new 
ExposedPort(CONTAINER_PORT)));
+
+            };
+            final Logger containerLog = LoggerFactory.getLogger("container." + 
CONTAINER_NAME);
+            final Consumer<OutputFrame> logConsumer = new 
Slf4jLogConsumer(containerLog);
+
+            container = new 
GenericContainer<>(CONTAINER_IMAGE).withNetworkAliases(CONTAINER_NAME)
+                .withEnv("USER", DEFAULT_USERNAME).withEnv("PASS", 
DEFAULT_PASSWORD)
+                .withLogConsumer(logConsumer)
+                .withClasspathResourceMapping("infinispan.xml", 
"/user-config/infinispan.xml",
+                                              BindMode.READ_ONLY)
+                .withCommand("-c", 
"/user-config/infinispan.xml").withExposedPorts(CONTAINER_PORT)
+                
.withCreateContainerCmdModifier(cmd).waitingFor(Wait.forListeningPort())
+                
.waitingFor(Wait.forLogMessage(".*Infinispan.*Server.*started.*", 1));
+            container.start();
+
+        }
+
+        protected ConfigurationBuilder getConfiguration() {
+            ConfigurationBuilder clientBuilder = new ConfigurationBuilder();
+
+            clientBuilder.forceReturnValues(true);
+
+
+            clientBuilder.addServer().host("localhost").port(CONTAINER_PORT);
+
+            // add security info
+            
clientBuilder.security().authentication().username(DEFAULT_USERNAME).password(DEFAULT_PASSWORD)
+                
.serverName("infinispan").saslMechanism("DIGEST-MD5").realm("default");
+            if (SystemUtils.IS_OS_MAC) {
+                Properties properties = new Properties();
+                properties.put("infinispan.client.hotrod.client_intelligence", 
"BASIC");
+                clientBuilder.withProperties(properties);
+            }
+
+            return clientBuilder;
+        }
+
+        @Bean(name = "infinispanRemoteComponent")
+        public InfinispanRemoteComponent infinispanRemoteComponent() {
+            initContainer();
+            InfinispanRemoteConfiguration infinispanRemoteConfiguration = new 
InfinispanRemoteConfiguration();
+
+            infinispanRemoteConfiguration.setHosts("localhost" + ":" + 
CONTAINER_PORT);
+
+            infinispanRemoteConfiguration.setUsername(DEFAULT_USERNAME);
+            infinispanRemoteConfiguration.setPassword(DEFAULT_PASSWORD);
+
+            RemoteCacheManager cacheContainer = new 
RemoteCacheManager(getConfiguration().build());
+            cacheContainer.administration()
+                .getOrCreateCache("default", new 
org.infinispan.configuration.cache.ConfigurationBuilder()
+                    .clustering().cacheMode(CacheMode.DIST_SYNC).build());
+
+            infinispanRemoteConfiguration.setCacheContainer(cacheContainer);
+            InfinispanRemoteComponent component = new 
InfinispanRemoteComponent();
+            component.setConfiguration(infinispanRemoteConfiguration);
+
+            return component;
+        }
+    }
 
 }
 // CHECKSTYLE:ON
diff --git 
a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java
 
b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java
index f93cb98..b4c82c5 100644
--- 
a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java
+++ 
b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java
@@ -33,10 +33,10 @@ public class CamelInfinispanRoute extends RouteBuilder {
         
.setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT)
         .setHeader(InfinispanConstants.KEY).constant("1")
         .setHeader(InfinispanConstants.VALUE).constant("test")
-        .to("infinispan://default")
+        .to("infinispanRemoteComponent://default")
         
.setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GET)
         .setHeader(InfinispanConstants.KEY).constant("1")
-        .to("infinispan://default").log("Received body: ${body}");
+        .to("infinispanRemoteComponent://default").log("Received body: 
${body}");
     }
 
 }
diff --git a/infinispan/src/main/resources/infinispan.xml 
b/infinispan/src/main/resources/infinispan.xml
new file mode 100644
index 0000000..d82c7e9
--- /dev/null
+++ b/infinispan/src/main/resources/infinispan.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+               xsi:schemaLocation="urn:infinispan:config:13.0 
https://infinispan.org/schemas/infinispan-config-13.0.xsd
+                            urn:infinispan:server:13.0 
https://infinispan.org/schemas/infinispan-server-13.0.xsd";
+               xmlns="urn:infinispan:config:13.0"
+               xmlns:server="urn:infinispan:server:13.0">
+
+       <cache-container name="default" statistics="true">
+               <metrics accurate-size="true"/>
+               <transport cluster="${infinispan.cluster.name:cluster}" 
stack="${infinispan.cluster.stack:tcp}" node-name="${infinispan.node.name:}"/>
+               <security>
+                       <authorization/>
+               </security>
+       </cache-container>
+
+       <server xmlns="urn:infinispan:server:13.0">
+               <interfaces>
+                       <interface name="public">
+                               <inet-address 
value="${infinispan.bind.address:127.0.0.1}"/>
+                       </interface>
+               </interfaces>
+
+               <socket-bindings default-interface="public" 
port-offset="${infinispan.socket.binding.port-offset:0}">
+                       <socket-binding name="default" 
port="${infinispan.bind.port:11222}"/>
+                       <socket-binding name="memcached" port="11221"/>
+               </socket-bindings>
+
+               <security>
+                       <credential-stores>
+                               <credential-store name="credentials" 
path="credentials.pfx">
+                                       <clear-text-credential 
clear-text="secret"/>
+                               </credential-store>
+                       </credential-stores>
+                       <security-realms>
+                               <security-realm name="default">
+                                       <!-- Uncomment to enable TLS on the 
realm -->
+                                       <!-- server-identities>
+                                          <ssl>
+                                                 <keystore 
path="application.keystore"
+                                                                       
password="password" alias="server"
+                                                                       
generate-self-signed-certificate-host="localhost"/>
+                                          </ssl>
+                                       </server-identities-->
+                                       <properties-realm 
groups-attribute="Roles">
+                                               <user-properties 
path="users.properties"/>
+                                               <group-properties 
path="groups.properties"/>
+                                       </properties-realm>
+                               </security-realm>
+                       </security-realms>
+               </security>
+
+               <endpoints socket-binding="default" security-realm="default"/>
+       </server>
+</infinispan>

Reply via email to