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

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

commit 7cb869c21297d6cf6ffa2f53ee1782f39c6af88d
Author: Peter Palaga <ppal...@redhat.com>
AuthorDate: Fri Jan 29 17:15:36 2021 +0100

    Freemarker native support #223
---
 .../pages/reference/extensions/freemarker.adoc     | 101 ++++++++++++++++++++-
 .../partials/reference/components/freemarker.adoc  |   6 +-
 extensions-jvm/pom.xml                             |   1 -
 .../freemarker/deployment/pom.xml                  |   4 +
 .../freemarker/deployment/FreemarkerProcessor.java |  23 +++--
 {extensions-jvm => extensions}/freemarker/pom.xml  |   1 -
 .../freemarker/runtime/pom.xml                     |  11 +++
 .../runtime/src/main/doc/configuration.adoc        |  84 +++++++++++++++++
 .../freemarker/CamelFreemarkerRecorder.java        |  38 +++-----
 .../main/resources/META-INF/quarkus-extension.yaml |   3 +-
 extensions/pom.xml                                 |   1 +
 .../freemarker}/pom.xml                            |  38 +++++++-
 .../freemarker/it/FreemarkerResource.java          |  52 ++++-------
 .../quarkus/component/freemarker/it/MyPerson.java  |   0
 .../src/main/resources/AppleTemplate.ftl           |   0
 .../src/main/resources/application.properties      |   3 +-
 .../subfolder/templates/BodyAsDomainObject.ftl     |   0
 .../apache/camel/component/freemarker/example.ftl  |   0
 .../component/freemarker/it/FreemarkerIT.java      |  30 +-----
 .../component/freemarker/it/FreemarkerTest.java    |  19 ++--
 integration-tests/pom.xml                          |   1 +
 pom.xml                                            |   3 +-
 poms/bom/pom.xml                                   |  10 ++
 tooling/scripts/test-categories.yaml               |   1 +
 24 files changed, 307 insertions(+), 123 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/freemarker.adoc 
b/docs/modules/ROOT/pages/reference/extensions/freemarker.adoc
index d1c1e20..264080e 100644
--- a/docs/modules/ROOT/pages/reference/extensions/freemarker.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/freemarker.adoc
@@ -2,15 +2,15 @@
 // This file was generated by 
camel-quarkus-maven-plugin:update-extension-doc-page
 = Freemarker
 :cq-artifact-id: camel-quarkus-freemarker
-:cq-native-supported: false
-:cq-status: Preview
+:cq-native-supported: true
+:cq-status: Stable
 :cq-description: Transform messages using FreeMarker templates.
 :cq-deprecated: false
 :cq-jvm-since: 1.1.0
-:cq-native-since: n/a
+:cq-native-since: 1.8.0
 
 [.badges]
-[.badge-key]##JVM since##[.badge-supported]##1.1.0## 
[.badge-key]##Native##[.badge-unsupported]##unsupported##
+[.badge-key]##JVM since##[.badge-supported]##1.1.0## [.badge-key]##Native 
since##[.badge-supported]##1.8.0##
 
 Transform messages using FreeMarker templates.
 
@@ -31,3 +31,96 @@ Please refer to the above link for usage and configuration 
details.
 ----
 
 Check the xref:user-guide/index.adoc[User guide] for more information about 
writing Camel Quarkus applications.
+
+== allowContextMapAll option in native mode
+
+The `allowContextMapAll` option is not supported in native mode as it requires 
reflective access to security sensitive camel core classes such as
+`CamelContext` & `Exchange`. This is considered a security risk and thus 
access to the feature is not provided by default.
+
+== Additional Camel Quarkus configuration
+
+== Class path resources
+
+For the FreeMarker templates loaded from class path to work flawlessly in 
native mode, you need to list all your
+template files using `quarkus.native.resources.includes` and 
`quarkus.native.resources.excludes`
+options in `application.properties`.
+
+Here is an example: If your application's resources look like this
+
+[source,shell]
+----
+$ tree src/main/resources
+src/main/resources
+└── templates
+    ├── email.ftl
+    ├── page.html
+    └── unwanted-file.txt
+----
+
+and if your configuration is like this
+
+[source,properties]
+----
+quarkus.native.resources.includes = templates/*.ftl,templates/*.html
+quarkus.native.resources.excludes = templates/unwanted*
+----
+
+then, resources `templates/email.ftl` and `templates/page.ftl` will be 
available in the native image,
+while file `unwanted-file.txt` will not be available.
+
+You can thus use the available templates in a Camel route, e.g.:
+
+[source,java]
+----
+public class MyRoutes extends RouteBuilder {
+    @Override
+    public void configure() {
+        from("direct:example")
+            .to("freemarker:templates/email.ftl")
+    }
+}
+----
+
+== Quarkiverse Freemarker and its configuration
+
+Camel Quarkus Freemarker uses dev/index.html[Quarkiverse Freemarker] under the 
hood.
+This means in particular, that the `freemarker.template.Configuration` bean 
produced by Quarkiverse Freemarker
+is used by Camel Quarkus.
+The bean can be configured via `quarkus.freemarker.*` properties
+- check 
https://quarkiverse.github.io/quarkiverse-docs/quarkiverse-freemarker/dev/index.html[Freemarker
 Configuration Reference]
+for more details.
+
+If you wish to use your custom `Configuration` bean instead of the default 
provided by Quarkiverse Freemarker,
+you can let CDI to do the required wiring:
+
+[source,java]
+----
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Named;
+import freemarker.template.Configuration;
+import io.quarkus.arc.Unremovable;
+import org.apache.camel.builder.RouteBuilder;
+
+@ApplicationScoped
+public class MyRoutes extends RouteBuilder {
+
+    @Produces
+    @ApplicationScoped
+    @Unremovable
+    @Named("myFreemarkerConfig")
+    Configuration produceFreemarkerConfig() {
+        Configuration result = new Configuration();
+        ...
+        return result;
+    }
+
+    @Override
+    public void configure() {
+        from("direct:example")
+            
.to("freemarker:templates/email.ftl?configuration=myFreemarkerConfig")
+
+    }
+}
+----
+
diff --git a/docs/modules/ROOT/partials/reference/components/freemarker.adoc 
b/docs/modules/ROOT/partials/reference/components/freemarker.adoc
index 5c7f4c9..d2038c6 100644
--- a/docs/modules/ROOT/partials/reference/components/freemarker.adoc
+++ b/docs/modules/ROOT/partials/reference/components/freemarker.adoc
@@ -2,11 +2,11 @@
 // This file was generated by 
camel-quarkus-maven-plugin:update-extension-doc-page
 :cq-artifact-id: camel-quarkus-freemarker
 :cq-artifact-id-base: freemarker
-:cq-native-supported: false
-:cq-status: Preview
+:cq-native-supported: true
+:cq-status: Stable
 :cq-deprecated: false
 :cq-jvm-since: 1.1.0
-:cq-native-since: n/a
+:cq-native-since: 1.8.0
 :cq-camel-part-name: freemarker
 :cq-camel-part-title: Freemarker
 :cq-camel-part-description: Transform messages using FreeMarker templates.
diff --git a/extensions-jvm/pom.xml b/extensions-jvm/pom.xml
index 423f22c..994f12c 100644
--- a/extensions-jvm/pom.xml
+++ b/extensions-jvm/pom.xml
@@ -62,7 +62,6 @@
         <module>facebook</module>
         <module>fastjson</module>
         <module>flink</module>
-        <module>freemarker</module>
         <module>ganglia</module>
         <module>groovy</module>
         <module>guava-eventbus</module>
diff --git a/extensions-jvm/freemarker/deployment/pom.xml 
b/extensions/freemarker/deployment/pom.xml
similarity index 93%
rename from extensions-jvm/freemarker/deployment/pom.xml
rename to extensions/freemarker/deployment/pom.xml
index e471d94..ae701fd 100644
--- a/extensions-jvm/freemarker/deployment/pom.xml
+++ b/extensions/freemarker/deployment/pom.xml
@@ -35,6 +35,10 @@
             <artifactId>camel-quarkus-core-deployment</artifactId>
         </dependency>
         <dependency>
+            <groupId>io.quarkiverse.freemarker</groupId>
+            <artifactId>quarkus-freemarker-deployment</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-freemarker</artifactId>
         </dependency>
diff --git 
a/extensions-jvm/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
 
b/extensions/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
similarity index 66%
rename from 
extensions-jvm/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
rename to 
extensions/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
index 1884a52..3faa3fa 100644
--- 
a/extensions-jvm/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
+++ 
b/extensions/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
@@ -16,17 +16,17 @@
  */
 package org.apache.camel.quarkus.component.freemarker.deployment;
 
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
 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.pkg.steps.NativeBuild;
-import org.apache.camel.quarkus.core.JvmOnlyRecorder;
-import org.jboss.logging.Logger;
+import org.apache.camel.component.freemarker.FreemarkerComponent;
+import org.apache.camel.quarkus.component.freemarker.CamelFreemarkerRecorder;
+import org.apache.camel.quarkus.core.deployment.spi.CamelRuntimeBeanBuildItem;
 
 class FreemarkerProcessor {
 
-    private static final Logger LOG = 
Logger.getLogger(FreemarkerProcessor.class);
     private static final String FEATURE = "camel-freemarker";
 
     @BuildStep
@@ -34,13 +34,12 @@ class FreemarkerProcessor {
         return new FeatureBuildItem(FEATURE);
     }
 
-    /**
-     * Remove this once this extension starts supporting the native mode.
-     */
-    @BuildStep(onlyIf = NativeBuild.class)
-    @Record(value = ExecutionTime.RUNTIME_INIT)
-    void warnJvmInNative(JvmOnlyRecorder recorder) {
-        JvmOnlyRecorder.warnJvmInNative(LOG, FEATURE); // warn at build time
-        recorder.warnJvmInNative(FEATURE); // warn at runtime
+    @Record(ExecutionTime.RUNTIME_INIT)
+    @BuildStep
+    CamelRuntimeBeanBuildItem componentBean(CamelFreemarkerRecorder recorder, 
BeanContainerBuildItem beanContainer) {
+        return new CamelRuntimeBeanBuildItem(
+                "freemarker",
+                FreemarkerComponent.class.getName(),
+                recorder.createComponent(beanContainer.getValue()));
     }
 }
diff --git a/extensions-jvm/freemarker/pom.xml b/extensions/freemarker/pom.xml
similarity index 97%
rename from extensions-jvm/freemarker/pom.xml
rename to extensions/freemarker/pom.xml
index 8614c45..3616976 100644
--- a/extensions-jvm/freemarker/pom.xml
+++ b/extensions/freemarker/pom.xml
@@ -33,6 +33,5 @@
     <modules>
         <module>deployment</module>
         <module>runtime</module>
-        <module>integration-test</module>
     </modules>
 </project>
diff --git a/extensions-jvm/freemarker/runtime/pom.xml 
b/extensions/freemarker/runtime/pom.xml
similarity index 89%
rename from extensions-jvm/freemarker/runtime/pom.xml
rename to extensions/freemarker/runtime/pom.xml
index cabf4fd..483bb6e 100644
--- a/extensions-jvm/freemarker/runtime/pom.xml
+++ b/extensions/freemarker/runtime/pom.xml
@@ -32,6 +32,7 @@
 
     <properties>
         <camel.quarkus.jvmSince>1.1.0</camel.quarkus.jvmSince>
+        <camel.quarkus.nativeSince>1.8.0</camel.quarkus.nativeSince>
     </properties>
 
     <dependencyManagement>
@@ -52,8 +53,18 @@
             <artifactId>camel-quarkus-core</artifactId>
         </dependency>
         <dependency>
+            <groupId>io.quarkiverse.freemarker</groupId>
+            <artifactId>quarkus-freemarker</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-freemarker</artifactId>
+            <exclusions>
+                <exclusion><!-- We prefer the version pulled via 
quarkus-freemarker -->
+                    <groupId>org.freemarker</groupId>
+                    <artifactId>freemarker</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>
 
diff --git a/extensions/freemarker/runtime/src/main/doc/configuration.adoc 
b/extensions/freemarker/runtime/src/main/doc/configuration.adoc
new file mode 100644
index 0000000..323fd41
--- /dev/null
+++ b/extensions/freemarker/runtime/src/main/doc/configuration.adoc
@@ -0,0 +1,84 @@
+== Class path resources
+
+For the FreeMarker templates loaded from class path to work flawlessly in 
native mode, you need to list all your
+template files using `quarkus.native.resources.includes` and 
`quarkus.native.resources.excludes`
+options in `application.properties`.
+
+Here is an example: If your application's resources look like this
+
+[source,shell]
+----
+$ tree src/main/resources
+src/main/resources
+└── templates
+    ├── email.ftl
+    ├── page.html
+    └── unwanted-file.txt
+----
+
+and if your configuration is like this
+
+[source,properties]
+----
+quarkus.native.resources.includes = templates/*.ftl,templates/*.html
+quarkus.native.resources.excludes = templates/unwanted*
+----
+
+then, resources `templates/email.ftl` and `templates/page.ftl` will be 
available in the native image,
+while file `unwanted-file.txt` will not be available.
+
+You can thus use the available templates in a Camel route, e.g.:
+
+[source,java]
+----
+public class MyRoutes extends RouteBuilder {
+    @Override
+    public void configure() {
+        from("direct:example")
+            .to("freemarker:templates/email.ftl")
+    }
+}
+----
+
+== Quarkiverse Freemarker and its configuration
+
+Camel Quarkus Freemarker uses dev/index.html[Quarkiverse Freemarker] under the 
hood.
+This means in particular, that the `freemarker.template.Configuration` bean 
produced by Quarkiverse Freemarker
+is used by Camel Quarkus.
+The bean can be configured via `quarkus.freemarker.*` properties
+- check 
https://quarkiverse.github.io/quarkiverse-docs/quarkiverse-freemarker/dev/index.html[Freemarker
 Configuration Reference]
+for more details.
+
+If you wish to use your custom `Configuration` bean instead of the default 
provided by Quarkiverse Freemarker,
+you can let CDI to do the required wiring:
+
+[source,java]
+----
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Named;
+import freemarker.template.Configuration;
+import io.quarkus.arc.Unremovable;
+import org.apache.camel.builder.RouteBuilder;
+
+@ApplicationScoped
+public class MyRoutes extends RouteBuilder {
+
+    @Produces
+    @ApplicationScoped
+    @Unremovable
+    @Named("myFreemarkerConfig")
+    Configuration produceFreemarkerConfig() {
+        Configuration result = new Configuration();
+        ...
+        return result;
+    }
+
+    @Override
+    public void configure() {
+        from("direct:example")
+            
.to("freemarker:templates/email.ftl?configuration=myFreemarkerConfig")
+
+    }
+}
+----
diff --git 
a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
 
b/extensions/freemarker/runtime/src/main/java/org/apache/camel/quarkus/component/freemarker/CamelFreemarkerRecorder.java
similarity index 52%
copy from 
extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
copy to 
extensions/freemarker/runtime/src/main/java/org/apache/camel/quarkus/component/freemarker/CamelFreemarkerRecorder.java
index 1cf3731..67b01b1 100644
--- 
a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
+++ 
b/extensions/freemarker/runtime/src/main/java/org/apache/camel/quarkus/component/freemarker/CamelFreemarkerRecorder.java
@@ -14,35 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.freemarker.it;
+package org.apache.camel.quarkus.component.freemarker;
 
-import io.quarkus.runtime.annotations.RegisterForReflection;
+import freemarker.template.Configuration;
+import io.quarkus.arc.runtime.BeanContainer;
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.component.freemarker.FreemarkerComponent;
 
-@RegisterForReflection
-public class MyPerson {
-    public MyPerson(String givenName, String familyName) {
-        this.givenName = givenName;
-        this.familyName = familyName;
-    }
-
-    private final String givenName;
-    private final String familyName;
+@Recorder
+public class CamelFreemarkerRecorder {
 
-    public String getGivenName() {
-        return givenName;
-    }
+    public RuntimeValue<FreemarkerComponent> createComponent(BeanContainer 
beanContainer) {
+        final Configuration configuration = 
beanContainer.instance(Configuration.class);
 
-    public String getFamilyName() {
-        return familyName;
-    }
+        final FreemarkerComponent component = new FreemarkerComponent();
+        component.setConfiguration(configuration);
 
-    @Override
-    public String toString() {
-        return "MyPerson{"
-                + "givenName='"
-                + givenName + '\''
-                + ", familyName='"
-                + familyName + '\''
-                + '}';
+        return new RuntimeValue<>(component);
     }
 }
diff --git 
a/extensions-jvm/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
 
b/extensions/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
similarity index 97%
rename from 
extensions-jvm/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
rename to 
extensions/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
index 8f8698f..51fd8fe 100644
--- 
a/extensions-jvm/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
+++ 
b/extensions/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -24,9 +24,8 @@
 name: "Camel Freemarker"
 description: "Transform messages using FreeMarker templates"
 metadata:
-  unlisted: true
   guide: 
"https://camel.apache.org/camel-quarkus/latest/reference/extensions/freemarker.html";
   categories:
   - "integration"
   status:
-  - "preview"
+  - "stable"
diff --git a/extensions/pom.xml b/extensions/pom.xml
index ed82c5b..467ea84 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -115,6 +115,7 @@
         <module>file-watch</module>
         <module>flatpack</module>
         <module>fop</module>
+        <module>freemarker</module>
         <module>ftp</module>
         <module>geocoder</module>
         <module>git</module>
diff --git a/extensions-jvm/freemarker/integration-test/pom.xml 
b/integration-tests/freemarker/pom.xml
similarity index 71%
rename from extensions-jvm/freemarker/integration-test/pom.xml
rename to integration-tests/freemarker/pom.xml
index 7fb0c80..ec0c3cf 100644
--- a/extensions-jvm/freemarker/integration-test/pom.xml
+++ b/integration-tests/freemarker/pom.xml
@@ -21,13 +21,13 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-build-parent-it</artifactId>
+        <artifactId>camel-quarkus-integration-tests</artifactId>
         <version>1.8.0-SNAPSHOT</version>
-        <relativePath>../../../poms/build-parent-it/pom.xml</relativePath>
+        <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-freemarker-integration-test</artifactId>
-    <name>Camel Quarkus :: Freemarker :: Integration Test</name>
+    <artifactId>camel-quarkus-integration-test-freemarker</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Freemarker</name>
     <description>Integration tests for Camel Quarkus Freemarker 
extension</description>
 
     <dependencyManagement>
@@ -80,4 +80,34 @@
         </dependency>
     </dependencies>
 
+    <profiles>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.package.type>native</quarkus.package.type>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
 </project>
diff --git 
a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
 
b/integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
similarity index 68%
rename from 
extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
rename to 
integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
index d24527b..1ca1c9e 100644
--- 
a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
+++ 
b/integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.quarkus.component.freemarker.it;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -64,20 +65,16 @@ public class FreemarkerResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String freemarkerDataModel() throws Exception {
         return producerTemplate.request(
-                
"freemarker:org/apache/camel/component/freemarker/example.ftl?allowTemplateFromHeader=true&allowContextMapAll=true",
+                
"freemarker:org/apache/camel/component/freemarker/example.ftl?allowTemplateFromHeader=true",
                 new Processor() {
                     @Override
                     public void process(Exchange exchange) throws Exception {
-                        exchange.getIn().setBody("");
-                        exchange.getIn().setHeader("name", "Christian");
-                        Map<String, Object> variableMap = new HashMap<>();
-                        Map<String, Object> headersMap = new HashMap<>();
-                        headersMap.put("name", "Willem");
-                        variableMap.put("headers", headersMap);
-                        variableMap.put("body", "Monday");
-                        variableMap.put("exchange", exchange);
-                        
exchange.getIn().setHeader(FreemarkerConstants.FREEMARKER_DATA_MODEL, 
variableMap);
-                        exchange.setProperty("item", "7");
+                        final Map<String, Object> model = new HashMap<>();
+                        model.put("headers", Collections.singletonMap("name", 
"Willem"));
+                        model.put("body", "Monday");
+                        model.put("exchange",
+                                Collections.singletonMap("properties", 
Collections.singletonMap("item", "7")));
+                        
exchange.getIn().setHeader(FreemarkerConstants.FREEMARKER_DATA_MODEL, model);
                     }
                 })
                 .getMessage().getBody(String.class);
@@ -102,13 +99,14 @@ public class FreemarkerResource {
 
     @Path("/templateInHeader")
     @POST
-    @Consumes(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.TEXT_PLAIN)
     @Produces(MediaType.TEXT_PLAIN)
-    public String templateInHeader() throws Exception {
-        final Map<String, Object> headers = new HashMap<>();
-        headers.put(FreemarkerConstants.FREEMARKER_TEMPLATE, 
"<hello>${headers.cheese}</hello>");
-        headers.put("cheese", "foo");
-        return 
producerTemplate.requestBodyAndHeaders("freemarker://dummy?allowContextMapAll=true",
 headers, null,
+    public String templateInHeader(String body) throws Exception {
+        return producerTemplate.requestBodyAndHeader(
+                "freemarker://dummy?allowTemplateFromHeader=true",
+                body,
+                FreemarkerConstants.FREEMARKER_TEMPLATE,
+                "Hello ${body}!",
                 String.class);
     }
 
@@ -118,26 +116,10 @@ public class FreemarkerResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String bodyAsDomainObject(@PathParam("firstName") String firstName, 
@PathParam("lastName") String lastName)
             throws Exception {
-        return 
producerTemplate.requestBody("freemarker:folder/subfolder/templates/BodyAsDomainObject.ftl",
+        return producerTemplate.requestBody(
+                "freemarker:folder/subfolder/templates/BodyAsDomainObject.ftl",
                 new MyPerson(firstName, lastName),
                 String.class);
     }
 
-    @Path("/apple")
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.TEXT_PLAIN)
-    public String apple() throws Exception {
-        return producerTemplate
-                
.request("freemarker:AppleTemplate.ftl?allowContextMapAll=true", new 
Processor() {
-                    @Override
-                    public void process(Exchange exchange) throws Exception {
-                        exchange.getIn().setBody("Orange");
-                        exchange.getIn().setHeader("color", "orange");
-                        exchange.setProperty("price", "7");
-                    }
-                })
-                .getMessage().getBody(String.class);
-    }
-
 }
diff --git 
a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
 
b/integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
similarity index 100%
copy from 
extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
copy to 
integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
diff --git 
a/extensions-jvm/freemarker/integration-test/src/main/resources/AppleTemplate.ftl
 b/integration-tests/freemarker/src/main/resources/AppleTemplate.ftl
similarity index 100%
rename from 
extensions-jvm/freemarker/integration-test/src/main/resources/AppleTemplate.ftl
rename to integration-tests/freemarker/src/main/resources/AppleTemplate.ftl
diff --git 
a/extensions-jvm/freemarker/integration-test/src/main/resources/application.properties
 b/integration-tests/freemarker/src/main/resources/application.properties
similarity index 95%
rename from 
extensions-jvm/freemarker/integration-test/src/main/resources/application.properties
rename to integration-tests/freemarker/src/main/resources/application.properties
index 5e200d3..db92578 100644
--- 
a/extensions-jvm/freemarker/integration-test/src/main/resources/application.properties
+++ b/integration-tests/freemarker/src/main/resources/application.properties
@@ -17,5 +17,6 @@
 #
 # Quarkus
 #
-quarkus.freemarker.resource-paths=classpath:
 quarkus.freemarker.default-encoding=UTF-8
+
+quarkus.freemarker.includes=**.ftl
diff --git 
a/extensions-jvm/freemarker/integration-test/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl
 
b/integration-tests/freemarker/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl
similarity index 100%
rename from 
extensions-jvm/freemarker/integration-test/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl
rename to 
integration-tests/freemarker/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl
diff --git 
a/extensions-jvm/freemarker/integration-test/src/main/resources/org/apache/camel/component/freemarker/example.ftl
 
b/integration-tests/freemarker/src/main/resources/org/apache/camel/component/freemarker/example.ftl
similarity index 100%
rename from 
extensions-jvm/freemarker/integration-test/src/main/resources/org/apache/camel/component/freemarker/example.ftl
rename to 
integration-tests/freemarker/src/main/resources/org/apache/camel/component/freemarker/example.ftl
diff --git 
a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
 
b/integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerIT.java
similarity index 55%
rename from 
extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
rename to 
integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerIT.java
index 1cf3731..69a2c75 100644
--- 
a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
+++ 
b/integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerIT.java
@@ -16,33 +16,9 @@
  */
 package org.apache.camel.quarkus.component.freemarker.it;
 
-import io.quarkus.runtime.annotations.RegisterForReflection;
+import io.quarkus.test.junit.NativeImageTest;
 
-@RegisterForReflection
-public class MyPerson {
-    public MyPerson(String givenName, String familyName) {
-        this.givenName = givenName;
-        this.familyName = familyName;
-    }
+@NativeImageTest
+class FreemarkerIT extends FreemarkerTest {
 
-    private final String givenName;
-    private final String familyName;
-
-    public String getGivenName() {
-        return givenName;
-    }
-
-    public String getFamilyName() {
-        return familyName;
-    }
-
-    @Override
-    public String toString() {
-        return "MyPerson{"
-                + "givenName='"
-                + givenName + '\''
-                + ", familyName='"
-                + familyName + '\''
-                + '}';
-    }
 }
diff --git 
a/extensions-jvm/freemarker/integration-test/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
 
b/integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
similarity index 85%
rename from 
extensions-jvm/freemarker/integration-test/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
rename to 
integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
index 4cb258f..5af38d4 100644
--- 
a/extensions-jvm/freemarker/integration-test/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
+++ 
b/integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.quarkus.component.freemarker.it;
 
+import io.quarkus.test.junit.DisabledOnNativeImage;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
@@ -27,6 +28,7 @@ import static org.hamcrest.Matchers.equalTo;
 class FreemarkerTest {
 
     @Test
+    @DisabledOnNativeImage // requires allowContextMapAll=true which is 
unsupported in native mode
     public void freemarkerLetter() {
         RestAssured.given()
                 .contentType(ContentType.JSON)
@@ -49,6 +51,7 @@ class FreemarkerTest {
     }
 
     @Test
+    @DisabledOnNativeImage // requires allowContextMapAll=true which is 
unsupported in native mode
     public void valuesInProperties() {
         RestAssured.given()
                 .contentType(ContentType.JSON)
@@ -60,23 +63,25 @@ class FreemarkerTest {
     }
 
     @Test
-    public void bodyAsDomainObject() {
+    public void templateInHeader() {
         RestAssured.given()
+                .contentType(ContentType.TEXT)
                 .accept(ContentType.TEXT)
-                .get("/freemarker/bodyAsDomainObject/{firstName}/{lastName}", 
"Claus", "Ibsen")
+                .body("Kermit")
+                .post("/freemarker/templateInHeader")
                 .then()
                 .statusCode(200)
-                .body(equalTo("Hi Claus how are you? Its a nice day.\nGive my 
regards to the family Ibsen."));
+                .body(equalTo("Hello Kermit!"));
     }
 
     @Test
-    public void apple() {
+    public void bodyAsDomainObject() {
         RestAssured.given()
-                .contentType(ContentType.JSON)
                 .accept(ContentType.TEXT)
-                .post("/freemarker/apple")
+                .get("/freemarker/bodyAsDomainObject/{firstName}/{lastName}", 
"Claus", "Ibsen")
                 .then()
                 .statusCode(200)
-                .body(equalTo("I am a Orange whose color is orange. I cost 
7."));
+                .body(equalTo("Hi Claus how are you? Its a nice day.\nGive my 
regards to the family Ibsen."));
     }
+
 }
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 8812ae7..5b4c436 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -102,6 +102,7 @@
         <module>flatpack</module>
         <module>fop</module>
         <module>foundation</module>
+        <module>freemarker</module>
         <module>ftp</module>
         <module>geocoder</module>
         <module>git</module>
diff --git a/pom.xml b/pom.xml
index 6e78ba3..cd1525c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,7 +69,7 @@
         <debezium.version>1.4.0.Final</debezium.version>
         <derby.version>10.15.2.0</derby.version><!-- Spark -->
         <eddsa.version>0.3.0</eddsa.version>
-        <freemarker.version>2.3.30</freemarker.version>
+        <freemarker.version>2.3.31</freemarker.version><!-- keep in sync with 
quarkiverse.freemarker.version -->
         <fommil.netlib.core.version>1.1.2</fommil.netlib.core.version><!-- 
Mess in Weka transitive deps -->
         <jodatime.version>2.10.6</jodatime.version><!-- Mess in transitive 
dependencies of Spark and Splunk -->
         <github-api.version>1.111</github-api.version>
@@ -103,6 +103,7 @@
         <okhttp.version>${squareup-okhttp-version}</okhttp.version><!-- keep 
in sync with okio -->
         <okio.version>${squareup-okio-version}</okio.version><!-- keep in sync 
with okhttp -->
         <optaplanner.version>7.46.0.Final</optaplanner.version>
+        <quarkiverse.freemarker.version>0.2.2</quarkiverse.freemarker.version>
         <quarkiverse-minio.version>0.2.0</quarkiverse-minio.version>
         <quarkus.version>1.12.0.Final</quarkus.version>
         <quarkus-google-cloud.version>0.3.0</quarkus-google-cloud.version>
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index b193197..baaf2b3 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -5809,6 +5809,16 @@
                 <version>${reactor-netty.version}</version>
             </dependency>
             <dependency>
+                <groupId>io.quarkiverse.freemarker</groupId>
+                <artifactId>quarkus-freemarker</artifactId>
+                <version>${quarkiverse.freemarker.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.quarkiverse.freemarker</groupId>
+                <artifactId>quarkus-freemarker-deployment</artifactId>
+                <version>${quarkiverse.freemarker.version}</version>
+            </dependency>
+            <dependency>
                 <groupId>io.quarkiverse.googlecloudservices</groupId>
                 <artifactId>quarkus-google-cloud-bigquery</artifactId>
                 <version>${quarkus-google-cloud.version}</version>
diff --git a/tooling/scripts/test-categories.yaml 
b/tooling/scripts/test-categories.yaml
index 9571ed7..7549a8a 100644
--- a/tooling/scripts/test-categories.yaml
+++ b/tooling/scripts/test-categories.yaml
@@ -53,6 +53,7 @@ core-main-validation:
   - bean-validator
   - json-validator
   - validator
+  - freemarker
 database:
   - arangodb
   - cassandraql

Reply via email to