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