You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2023/07/12 13:54:31 UTC
[camel-quarkus] branch main updated: Velocity $foreach.index, $foreach.count and $foreach.hasNext do not work in native mode fix #5080
This is an automated email from the ASF dual-hosted git repository.
ppalaga pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new d54c3abec1 Velocity $foreach.index, $foreach.count and $foreach.hasNext do not work in native mode fix #5080
d54c3abec1 is described below
commit d54c3abec1d488ddd4b3e5991f084cd2d982281e
Author: Peter Palaga <pp...@redhat.com>
AuthorDate: Wed Jul 12 11:45:43 2023 +0200
Velocity $foreach.index, $foreach.count and $foreach.hasNext do not work in native mode fix #5080
---
.../velocity/deployment/VelocityProcessor.java | 19 ++++++++++++-------
.../camel/quarkus/component/velocity/it/Person.java | 5 +++++
.../component/velocity/it/VelocityResource.java | 21 +++++++++++++++++++++
.../velocity/src/main/resources/template/foreach.vm | 19 +++++++++++++++++++
.../quarkus/component/velocity/it/VelocityTest.java | 17 +++++++++++++++++
5 files changed, 74 insertions(+), 7 deletions(-)
diff --git a/extensions/velocity/deployment/src/main/java/org/apache/camel/quarkus/component/velocity/deployment/VelocityProcessor.java b/extensions/velocity/deployment/src/main/java/org/apache/camel/quarkus/component/velocity/deployment/VelocityProcessor.java
index 816b866c3e..308b834f19 100644
--- a/extensions/velocity/deployment/src/main/java/org/apache/camel/quarkus/component/velocity/deployment/VelocityProcessor.java
+++ b/extensions/velocity/deployment/src/main/java/org/apache/camel/quarkus/component/velocity/deployment/VelocityProcessor.java
@@ -19,6 +19,7 @@ package org.apache.camel.quarkus.component.velocity.deployment;
import java.util.ArrayList;
import java.util.TreeMap;
+import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
@@ -26,6 +27,7 @@ import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import org.apache.camel.component.velocity.CamelVelocityClasspathResourceLoader;
+import org.apache.velocity.runtime.directive.ForeachScope;
import org.jboss.jandex.IndexView;
import static java.util.stream.Collectors.toCollection;
@@ -47,7 +49,9 @@ class VelocityProcessor {
}
@BuildStep
- ReflectiveClassBuildItem registerForReflection(CombinedIndexBuildItem combinedIndex) {
+ void reflectiveClass(
+ BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+ CombinedIndexBuildItem combinedIndex) {
IndexView index = combinedIndex.getIndex();
ArrayList<String> dtos = index.getKnownClasses().stream().map(ci -> ci.name().toString())
@@ -56,13 +60,14 @@ class VelocityProcessor {
.collect(toCollection(ArrayList::new));
dtos.add(CamelVelocityClasspathResourceLoader.class.getName());
+ reflectiveClass.produce(ReflectiveClassBuildItem.builder(dtos.toArray(new String[dtos.size()])).build());
- return ReflectiveClassBuildItem.builder(dtos.toArray(new String[dtos.size()])).build();
- }
-
- @BuildStep
- ReflectiveClassBuildItem registerForReflectionWithMethods() {
- return ReflectiveClassBuildItem.builder(TreeMap.class.getName()).methods().build();
+ reflectiveClass.produce(
+ ReflectiveClassBuildItem.builder(
+ TreeMap.class.getName(),
+ ForeachScope.class.getName())
+ .methods()
+ .build());
}
@BuildStep
diff --git a/integration-tests/velocity/src/main/java/org/apache/camel/quarkus/component/velocity/it/Person.java b/integration-tests/velocity/src/main/java/org/apache/camel/quarkus/component/velocity/it/Person.java
index 9ba60b665f..a01c7e7261 100644
--- a/integration-tests/velocity/src/main/java/org/apache/camel/quarkus/component/velocity/it/Person.java
+++ b/integration-tests/velocity/src/main/java/org/apache/camel/quarkus/component/velocity/it/Person.java
@@ -24,6 +24,11 @@ public class Person {
private String name;
private String country;
+ public static Person fromString(String str) {
+ String[] fields = str.split(",");
+ return new Person(fields[0], fields[1]);
+ }
+
public Person() {
}
diff --git a/integration-tests/velocity/src/main/java/org/apache/camel/quarkus/component/velocity/it/VelocityResource.java b/integration-tests/velocity/src/main/java/org/apache/camel/quarkus/component/velocity/it/VelocityResource.java
index 79f0da783d..faac091151 100644
--- a/integration-tests/velocity/src/main/java/org/apache/camel/quarkus/component/velocity/it/VelocityResource.java
+++ b/integration-tests/velocity/src/main/java/org/apache/camel/quarkus/component/velocity/it/VelocityResource.java
@@ -18,8 +18,10 @@ package org.apache.camel.quarkus.component.velocity.it;
import java.net.URI;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
@@ -166,6 +168,25 @@ public class VelocityResource {
.build();
}
+ @Path("/list")
+ @POST
+ @Consumes(MediaType.TEXT_PLAIN)
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response list(String payload, @QueryParam("template") String template) throws Exception {
+ final List<Person> persons = Stream.of(payload.split(";"))
+ .map(Person::fromString)
+ .collect(Collectors.toList());
+
+ final String response = producerTemplate.requestBody("velocity:" + template,
+ persons,
+ String.class);
+ LOG.infof("Got response from velocity: %s", response);
+ return Response
+ .created(new URI("https://camel.apache.org/"))
+ .entity(response)
+ .build();
+ }
+
@Path("/dynamicTemplate")
@POST
@Consumes(MediaType.TEXT_PLAIN)
diff --git a/integration-tests/velocity/src/main/resources/template/foreach.vm b/integration-tests/velocity/src/main/resources/template/foreach.vm
new file mode 100644
index 0000000000..c348f03012
--- /dev/null
+++ b/integration-tests/velocity/src/main/resources/template/foreach.vm
@@ -0,0 +1,19 @@
+#*
+ * 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.
+ *#
+#foreach( $person in $body )
+- $person, $foreach.index, $foreach.count, $foreach.hasNext
+#end
\ No newline at end of file
diff --git a/integration-tests/velocity/src/test/java/org/apache/camel/quarkus/component/velocity/it/VelocityTest.java b/integration-tests/velocity/src/test/java/org/apache/camel/quarkus/component/velocity/it/VelocityTest.java
index 3eed5bdc8b..1045de04c9 100644
--- a/integration-tests/velocity/src/test/java/org/apache/camel/quarkus/component/velocity/it/VelocityTest.java
+++ b/integration-tests/velocity/src/test/java/org/apache/camel/quarkus/component/velocity/it/VelocityTest.java
@@ -75,6 +75,23 @@ class VelocityTest {
.body(equalTo(MSG));
}
+ @Test
+ public void forEach() {
+ RestAssured.given()
+ .queryParam("template", "//template/foreach.vm")
+ .contentType(ContentType.TEXT)
+ .body("Joe,US;Paul,UK")
+ .post("/velocity/list")
+ .then()
+ .statusCode(201)
+ .body(equalTo(
+ """
+
+ - Person{name='Joe', country='US'}, 0, 1, true
+ - Person{name='Paul', country='UK'}, 1, 2, false
+ """));
+ }
+
@Test
public void testTemplateViaClasspathWithProperties() {
//class loader is forbidden by properties, response should fail