This is an automated email from the ASF dual-hosted git repository. jamesnetherton 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 f3745bb451 fixes #6771 DataFormat endpoints ignore camel.dataformat.* configuration properties f3745bb451 is described below commit f3745bb4511f964211e8340ed0e72115d464acf0 Author: Jiri Ondrusek <ondrusek.j...@gmail.com> AuthorDate: Tue Apr 8 14:20:21 2025 +0200 fixes #6771 DataFormat endpoints ignore camel.dataformat.* configuration properties --- .../pages/reference/extensions/dataformat.adoc | 24 +++++++ .../dataformat/deployment/DataformatProcessor.java | 17 +++++ .../dataformat/CamelDataformatConfig.java} | 28 +++++--- .../component/dataformat/DataformatRecorder.java | 77 ++++++++++++++++++++++ integration-tests/beanio/pom.xml | 17 +++++ .../component/beanio/it/BeanioResource.java | 47 +++++++------ .../quarkus/component/beanio/it/BeanioRoutes.java | 4 ++ .../quarkus/component/beanio/it/model/Person.java | 30 ++++++--- .../src/main/resources/application.properties | 6 +- .../beanio/src/main/resources/employee-mapping.xml | 12 ++++ .../quarkus/component/beanio/it/BeanioTest.java | 52 +++++++++++---- .../beanio/src/test/resources/employees-csv.txt | 2 +- .../src/test/resources/employees-delimited.txt | 2 +- .../src/test/resources/employees-fixedlength.txt | 2 +- .../src/test/resources/employees-with-error.txt | 2 +- .../beanio/src/test/resources/employees-xml.txt | 2 +- 16 files changed, 271 insertions(+), 53 deletions(-) diff --git a/docs/modules/ROOT/pages/reference/extensions/dataformat.adoc b/docs/modules/ROOT/pages/reference/extensions/dataformat.adoc index 613682cfe6..8adcb34c9d 100644 --- a/docs/modules/ROOT/pages/reference/extensions/dataformat.adoc +++ b/docs/modules/ROOT/pages/reference/extensions/dataformat.adoc @@ -45,3 +45,27 @@ Or add the coordinates to your existing project: ifeval::[{doc-show-user-guide-link} == true] Check the xref:user-guide/index.adoc[User guide] for more information about writing Camel Quarkus applications. endif::[] + +[id="extensions-dataformat-additional-camel-quarkus-configuration"] +== Additional Camel Quarkus configuration + +[width="100%",cols="80,5,15",options="header"] +|=== +| Configuration property | Type | Default + + +a| [[camel-dataformat-dataformats]]`link:#camel-dataformat-dataformats[camel.dataformat."dataformats"]` + +Configuration of properties for any dataformat. +(In the format camel.dataformat."dataformat_name"."property"=value + +i.e. +camel.dataformat.beanio.stream-name = test-stream +camel.dataformat.beanio.mapping = test-mapping.xml +| `Map<String,Map<String,String>>` +| +|=== + +[.configuration-legend] +{doc-link-icon-lock}[title=Fixed at build time] Configuration property fixed at build time. All other configuration properties are overridable at runtime. + diff --git a/extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java b/extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java index f6a1b2d18b..2813f7df5b 100644 --- a/extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java +++ b/extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java @@ -17,7 +17,14 @@ package org.apache.camel.quarkus.component.dataformat.deployment; 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.runtime.RuntimeValue; +import org.apache.camel.CamelContext; +import org.apache.camel.quarkus.component.dataformat.CamelDataformatConfig; +import org.apache.camel.quarkus.component.dataformat.DataformatRecorder; +import org.apache.camel.quarkus.core.deployment.spi.CamelContextBuildItem; class DataformatProcessor { @@ -28,4 +35,14 @@ class DataformatProcessor { return new FeatureBuildItem(FEATURE); } + @Record(ExecutionTime.RUNTIME_INIT) + @BuildStep + void dataformatCustomizer( + CamelContextBuildItem context, + CamelDataformatConfig config, + DataformatRecorder recorder) { + + RuntimeValue<CamelContext> camelContext = context.getCamelContext(); + recorder.createDataformatCustomizer(camelContext, config); + } } diff --git a/extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java b/extensions/dataformat/runtime/src/main/java/org/apache/camel/quarkus/component/dataformat/CamelDataformatConfig.java similarity index 52% copy from extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java copy to extensions/dataformat/runtime/src/main/java/org/apache/camel/quarkus/component/dataformat/CamelDataformatConfig.java index f6a1b2d18b..16d243dbf3 100644 --- a/extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java +++ b/extensions/dataformat/runtime/src/main/java/org/apache/camel/quarkus/component/dataformat/CamelDataformatConfig.java @@ -14,18 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.quarkus.component.dataformat.deployment; +package org.apache.camel.quarkus.component.dataformat; -import io.quarkus.deployment.annotations.BuildStep; -import io.quarkus.deployment.builditem.FeatureBuildItem; +import java.util.Map; -class DataformatProcessor { +import io.quarkus.runtime.annotations.ConfigPhase; +import io.quarkus.runtime.annotations.ConfigRoot; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithParentName; - private static final String FEATURE = "camel-dataformat"; +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +@ConfigMapping(prefix = "camel.dataformat") +public interface CamelDataformatConfig { - @BuildStep - FeatureBuildItem feature() { - return new FeatureBuildItem(FEATURE); - } + /** + * Configuration of properties for any dataformat. + * (In the format camel.dataformat."dataformat_name"."property"=value + * + * i.e. + * camel.dataformat.beanio.stream-name = test-stream + * camel.dataformat.beanio.mapping = test-mapping.xml + */ + @WithParentName + Map<String, Map<String, String>> dataformats(); } diff --git a/extensions/dataformat/runtime/src/main/java/org/apache/camel/quarkus/component/dataformat/DataformatRecorder.java b/extensions/dataformat/runtime/src/main/java/org/apache/camel/quarkus/component/dataformat/DataformatRecorder.java new file mode 100644 index 0000000000..ef8d0204fd --- /dev/null +++ b/extensions/dataformat/runtime/src/main/java/org/apache/camel/quarkus/component/dataformat/DataformatRecorder.java @@ -0,0 +1,77 @@ +/* + * 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. + */ +package org.apache.camel.quarkus.component.dataformat; + +import java.util.Map; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import io.quarkus.runtime.RuntimeValue; +import io.quarkus.runtime.annotations.Recorder; +import org.apache.camel.CamelContext; +import org.apache.camel.Ordered; +import org.apache.camel.spi.DataFormat; +import org.apache.camel.support.LifecycleStrategySupport; +import org.apache.camel.support.PropertyBindingSupport; +import org.eclipse.microprofile.config.ConfigProvider; + +@Recorder +public class DataformatRecorder { + public void createDataformatCustomizer(final RuntimeValue<CamelContext> camelContext, final CamelDataformatConfig config) { + camelContext.getValue().addLifecycleStrategy(new BeanioLifecycleStrategy(config, camelContext)); + } + + private static class BeanioLifecycleStrategy extends LifecycleStrategySupport implements Ordered { + + //kebab-case pattern + private final static Pattern KEBAB_CASE_PATTERN = Pattern.compile("-([a-z])"); + + private final CamelDataformatConfig config; + private final RuntimeValue<CamelContext> camelContext; + + public BeanioLifecycleStrategy(CamelDataformatConfig config, RuntimeValue<CamelContext> camelContext) { + this.config = config; + this.camelContext = camelContext; + } + + @Override + public int getOrder() { + return Ordered.HIGHEST; + } + + @Override + public void onDataFormatCreated(String name, DataFormat dataFormat) { + + if (ConfigProvider.getConfig().getOptionalValue("camel.component.dataformat.customizer.enabled", Boolean.class) + .orElse(true) + && ConfigProvider.getConfig().getOptionalValue("camel.component.customizer.enabled", Boolean.class) + .orElse(true)) { + + //set properties from application.properties + Map<String, String> properties = config.dataformats().get(name); + + if (properties != null) { + //convert properties to camel Case + Map<String, Object> camelCaseMap = properties.entrySet().stream().collect(Collectors.toMap( + entry -> KEBAB_CASE_PATTERN.matcher(entry.getKey()).replaceAll(mr -> mr.group(1).toUpperCase()), + Map.Entry::getValue)); + PropertyBindingSupport.build().withIgnoreCase(true).bind(camelContext.getValue(), dataFormat, camelCaseMap); + } + } + } + } +} diff --git a/integration-tests/beanio/pom.xml b/integration-tests/beanio/pom.xml index 7f0de32484..7f036d2a7a 100644 --- a/integration-tests/beanio/pom.xml +++ b/integration-tests/beanio/pom.xml @@ -35,6 +35,10 @@ <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-beanio</artifactId> </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-dataformat</artifactId> + </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-direct</artifactId> @@ -89,6 +93,19 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-dataformat-deployment</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>*</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-direct-deployment</artifactId> diff --git a/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/BeanioResource.java b/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/BeanioResource.java index 1d1d25f48a..015bc1a2e2 100644 --- a/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/BeanioResource.java +++ b/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/BeanioResource.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import jakarta.inject.Inject; import jakarta.json.Json; @@ -50,13 +51,16 @@ import org.apache.camel.quarkus.component.beanio.it.model.Trailer; @Path("/beanio") public class BeanioResource { - public static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd"); + public static String DATA_FORMAT = "yyyy-MM-dd"; + private final SimpleDateFormat formatter = new SimpleDateFormat(DATA_FORMAT); @Inject CamelContext context; @Inject ProducerTemplate producerTemplate; + @Inject + org.jboss.logging.Logger logger; @Path("/marshal") @POST @@ -81,17 +85,7 @@ public class BeanioResource { @SuppressWarnings("unchecked") public Response unmarshal(String data, @QueryParam("type") String type) { List<Employee> employees = producerTemplate.requestBodyAndHeader("direct:unmarshal", data, "type", type, List.class); - JsonArrayBuilder array = Json.createArrayBuilder(); - for (Employee employee : employees) { - JsonObjectBuilder builder = Json.createObjectBuilder(); - builder.add("firstName", employee.getFirstName()); - builder.add("lastName", employee.getLastName()); - builder.add("title", employee.getTitle()); - builder.add("hireDate", FORMATTER.format(employee.getHireDate())); - builder.add("salary", employee.getSalary()); - array.add(builder.build()); - } - return Response.ok(array.build()).build(); + return getResponse(employees); } @Path("/unmarshal/annotated") @@ -108,7 +102,7 @@ public class BeanioResource { builder.add("firstName", employee.getFirstName()); builder.add("lastName", employee.getLastName()); builder.add("title", employee.getTitle()); - builder.add("hireDate", FORMATTER.format(employee.getHireDate())); + builder.add("hireDate", formatter.format(employee.getHireDate())); builder.add("salary", employee.getSalary()); array.add(builder.build()); } @@ -146,7 +140,7 @@ public class BeanioResource { builder.add("firstName", employee.getFirstName()); builder.add("lastName", employee.getLastName()); builder.add("title", employee.getTitle()); - builder.add("hireDate", FORMATTER.format(employee.getHireDate())); + builder.add("hireDate", formatter.format(employee.getHireDate())); builder.add("salary", employee.getSalary()); } else if (object instanceof Error) { Error error = (Error) object; @@ -182,7 +176,7 @@ public class BeanioResource { Header header = (Header) object; builder.add("identifier", header.getIdentifier()); builder.add("recordType", header.getRecordType()); - builder.add("date", FORMATTER.format(header.getHeaderDate())); + builder.add("date", formatter.format(header.getHeaderDate())); } else if (object instanceof Separator) { Separator separator = (Separator) object; builder.add("value", separator.getValue()); @@ -213,7 +207,7 @@ public class BeanioResource { private List<Object> createComplexObject() throws Exception { String source = "camel-beanio"; List<Object> complexObject = new ArrayList<>(); - Date date = FORMATTER.parse("2008-08-03"); + Date date = formatter.parse("2008-08-03"); Header hFirst = new Header("A1", date, "PRICE"); Header hSecond = new Header("B1", date, "SECURITY"); Separator headerEnd = new Separator("HEADER END"); @@ -258,14 +252,29 @@ public class BeanioResource { mockEndpoint.assertIsSatisfied(5000); List<Exchange> exchanges = mockEndpoint.getExchanges(); + List<Employee> employees = exchanges.stream().map(e -> e.getMessage().getBody(Employee.class)) + .collect(Collectors.toList()); + return getResponse(employees); + } + + @Path("/unmarshal/global") + @POST + @Consumes(MediaType.TEXT_PLAIN) + @Produces(MediaType.APPLICATION_JSON) + @SuppressWarnings("unchecked") + public Response marshalEmployees(String csv) { + List<Employee> employees = producerTemplate.requestBody("direct:unmarshalGlobal", csv, List.class); + return getResponse(employees); + } + + private Response getResponse(List<Employee> employees) { JsonArrayBuilder array = Json.createArrayBuilder(); - for (Exchange exchange : exchanges) { - Employee employee = exchange.getMessage().getBody(Employee.class); + for (Employee employee : employees) { JsonObjectBuilder builder = Json.createObjectBuilder(); builder.add("firstName", employee.getFirstName()); builder.add("lastName", employee.getLastName()); builder.add("title", employee.getTitle()); - builder.add("hireDate", FORMATTER.format(employee.getHireDate())); + builder.add("hireDate", formatter.format(employee.getHireDate())); builder.add("salary", employee.getSalary()); array.add(builder.build()); } diff --git a/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/BeanioRoutes.java b/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/BeanioRoutes.java index 766d8a024e..e5c69cda12 100644 --- a/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/BeanioRoutes.java +++ b/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/BeanioRoutes.java @@ -91,5 +91,9 @@ public class BeanioRoutes extends RouteBuilder { from("direct:unmarshalWithSplitter") .split(splitter).streaming() .to("mock:splitEmployees"); + + from("direct:unmarshalGlobal") + .to("dataformat:beanio:unmarshal"); + } } diff --git a/extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java b/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/model/Person.java similarity index 62% copy from extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java copy to integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/model/Person.java index f6a1b2d18b..8bedf83ac9 100644 --- a/extensions/dataformat/deployment/src/main/java/org/apache/camel/quarkus/component/dataformat/deployment/DataformatProcessor.java +++ b/integration-tests/beanio/src/main/java/org/apache/camel/quarkus/component/beanio/it/model/Person.java @@ -14,18 +14,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.quarkus.component.dataformat.deployment; +package org.apache.camel.quarkus.component.beanio.it.model; -import io.quarkus.deployment.annotations.BuildStep; -import io.quarkus.deployment.builditem.FeatureBuildItem; +public class Person { -class DataformatProcessor { + private String name; - private static final String FEATURE = "camel-dataformat"; + private int age; - @BuildStep - FeatureBuildItem feature() { - return new FeatureBuildItem(FEATURE); + public String getName() { + return name; } + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public String toString() { + return "Person{name='" + name + "', age=" + age + "}"; + } } diff --git a/integration-tests/beanio/src/main/resources/application.properties b/integration-tests/beanio/src/main/resources/application.properties index 5610e20f5a..148e0d7a40 100644 --- a/integration-tests/beanio/src/main/resources/application.properties +++ b/integration-tests/beanio/src/main/resources/application.properties @@ -14,4 +14,8 @@ ## See the License for the specific language governing permissions and ## limitations under the License. ## --------------------------------------------------------------------------- -quarkus.native.resources.includes=*mapping.xml \ No newline at end of file +quarkus.native.resources.includes=*mapping.xml + +camel.dataformat.beanio.stream-name = employee-stream +camel.dataformat.beanio.mapping = employee-mapping.xml +camel.dataformat.beanio.ignore-unexpected-records = false \ No newline at end of file diff --git a/integration-tests/beanio/src/main/resources/employee-mapping.xml b/integration-tests/beanio/src/main/resources/employee-mapping.xml index b605d57476..081e3ac824 100644 --- a/integration-tests/beanio/src/main/resources/employee-mapping.xml +++ b/integration-tests/beanio/src/main/resources/employee-mapping.xml @@ -70,4 +70,16 @@ </parser> <record name="employeeAnnotated" class="org.apache.camel.quarkus.component.beanio.it.model.EmployeeAnnotated"/> </stream> + <stream name="employee-stream" format="csv"> + <parser> + <property name="recordTerminator" value="\n"/> + </parser> + <record name="employee" class="org.apache.camel.quarkus.component.beanio.it.model.Employee"> + <field name="firstName"/> + <field name="lastName"/> + <field name="title"/> + <field name="salary"/> + <field name="hireDate" format="MMddyyyy"/> + </record> + </stream> </beanio> \ No newline at end of file diff --git a/integration-tests/beanio/src/test/java/org/apache/camel/quarkus/component/beanio/it/BeanioTest.java b/integration-tests/beanio/src/test/java/org/apache/camel/quarkus/component/beanio/it/BeanioTest.java index e70c53bb2d..b82c10c461 100644 --- a/integration-tests/beanio/src/test/java/org/apache/camel/quarkus/component/beanio/it/BeanioTest.java +++ b/integration-tests/beanio/src/test/java/org/apache/camel/quarkus/component/beanio/it/BeanioTest.java @@ -17,6 +17,8 @@ package org.apache.camel.quarkus.component.beanio.it; import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -32,12 +34,13 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import static org.apache.camel.quarkus.component.beanio.it.BeanioResource.FORMATTER; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; @QuarkusTest class BeanioTest { + private final SimpleDateFormat formatter = new SimpleDateFormat(BeanioResource.DATA_FORMAT); + @ParameterizedTest @ValueSource(strings = { "CSV", "DELIMITED", "FIXEDLENGTH", "XML", }) void marshal(String type) throws Exception { @@ -47,7 +50,7 @@ class BeanioTest { one.setLastName("Smith"); one.setTitle("Developer"); one.setSalary(75000); - one.setHireDate(FORMATTER.parse("2009-10-01")); + one.setHireDate(formatter.parse("2009-11-01")); employees.add(one); Employee two = new Employee(); @@ -55,7 +58,7 @@ class BeanioTest { two.setLastName("Doe"); two.setTitle("Architect"); two.setSalary(80000); - two.setHireDate(FORMATTER.parse("2008-01-15")); + two.setHireDate(formatter.parse("2008-01-15")); employees.add(two); Employee three = new Employee(); @@ -63,7 +66,7 @@ class BeanioTest { three.setLastName("Anderson"); three.setTitle("Manager"); three.setSalary(85000); - three.setHireDate(FORMATTER.parse("2007-03-18")); + three.setHireDate(formatter.parse("2007-03-18")); employees.add(three); String expected = IOUtils.toString( @@ -103,7 +106,7 @@ class BeanioTest { "[0].lastName", is("Smith"), "[0].title", is("Developer"), "[0].salary", is(75000), - "[0].hireDate", is("2009-10-01"), + "[0].hireDate", is("2009-11-01"), "[1].firstName", is("Jane"), "[1].lastName", is("Doe"), "[1].title", is("Architect"), @@ -124,7 +127,7 @@ class BeanioTest { one.setLastName("Smith"); one.setTitle("Developer"); one.setSalary(75000); - one.setHireDate(FORMATTER.parse("2009-10-01")); + one.setHireDate(formatter.parse("2009-11-01")); employees.add(one); EmployeeAnnotated two = new EmployeeAnnotated(); @@ -132,7 +135,7 @@ class BeanioTest { two.setLastName("Doe"); two.setTitle("Architect"); two.setSalary(80000); - two.setHireDate(FORMATTER.parse("2008-01-15")); + two.setHireDate(formatter.parse("2008-01-15")); employees.add(two); EmployeeAnnotated three = new EmployeeAnnotated(); @@ -140,7 +143,7 @@ class BeanioTest { three.setLastName("Anderson"); three.setTitle("Manager"); three.setSalary(85000); - three.setHireDate(FORMATTER.parse("2007-03-18")); + three.setHireDate(formatter.parse("2007-03-18")); employees.add(three); String expected = IOUtils.toString(BeanioTest.class.getResourceAsStream("/employees-csv.txt"), @@ -172,7 +175,7 @@ class BeanioTest { "[0].lastName", is("Smith"), "[0].title", is("Developer"), "[0].salary", is(75000), - "[0].hireDate", is("2009-10-01"), + "[0].hireDate", is("2009-11-01"), "[1].firstName", is("Jane"), "[1].lastName", is("Doe"), "[1].title", is("Architect"), @@ -235,7 +238,7 @@ class BeanioTest { "[0].lastName", is("Smith"), "[0].title", is("Developer"), "[0].salary", is(75000), - "[0].hireDate", is("2009-10-01"), + "[0].hireDate", is("2009-11-01"), "[1].firstName", is("Jane"), "[1].lastName", is("Doe"), "[1].title", is("Architect"), @@ -312,7 +315,34 @@ class BeanioTest { "[0].lastName", is("Smith"), "[0].title", is("Developer"), "[0].salary", is(75000), - "[0].hireDate", is("2009-10-01"), + "[0].hireDate", is("2009-11-01"), + "[1].firstName", is("Jane"), + "[1].lastName", is("Doe"), + "[1].title", is("Architect"), + "[1].salary", is(80000), + "[1].hireDate", is("2008-01-15"), + "[2].firstName", is("Jon"), + "[2].lastName", is("Anderson"), + "[2].title", is("Manager"), + "[2].salary", is(85000), + "[2].hireDate", is("2007-03-18")); + } + + @Test + void marshalEmployees() { + ZonedDateTime expectedTime = ZonedDateTime.parse("2009-09-30T22:00:00Z[UTC]"); + RestAssured.given() + .contentType(ContentType.TEXT) + .body(BeanioTest.class.getResourceAsStream("/employees-csv.txt")) + .post("/beanio/unmarshal/global") + .then() + .statusCode(200) + .body( + "[0].firstName", is("Joe"), + "[0].lastName", is("Smith"), + "[0].title", is("Developer"), + "[0].salary", is(75000), + "[0].hireDate", is("2009-11-01"), "[1].firstName", is("Jane"), "[1].lastName", is("Doe"), "[1].title", is("Architect"), diff --git a/integration-tests/beanio/src/test/resources/employees-csv.txt b/integration-tests/beanio/src/test/resources/employees-csv.txt index 6c05f5ec17..c0d21cfcbf 100644 --- a/integration-tests/beanio/src/test/resources/employees-csv.txt +++ b/integration-tests/beanio/src/test/resources/employees-csv.txt @@ -1,3 +1,3 @@ -Joe,Smith,Developer,75000,10012009 +Joe,Smith,Developer,75000,11012009 Jane,Doe,Architect,80000,01152008 Jon,Anderson,Manager,85000,03182007 \ No newline at end of file diff --git a/integration-tests/beanio/src/test/resources/employees-delimited.txt b/integration-tests/beanio/src/test/resources/employees-delimited.txt index 6ef9eed965..8a4cf9eafa 100644 --- a/integration-tests/beanio/src/test/resources/employees-delimited.txt +++ b/integration-tests/beanio/src/test/resources/employees-delimited.txt @@ -1,3 +1,3 @@ -Joe|Smith|Developer|75000|10012009 +Joe|Smith|Developer|75000|11012009 Jane|Doe|Architect|80000|01152008 Jon|Anderson|Manager|85000|03182007 diff --git a/integration-tests/beanio/src/test/resources/employees-fixedlength.txt b/integration-tests/beanio/src/test/resources/employees-fixedlength.txt index 8ea0749e80..b71be235e6 100644 --- a/integration-tests/beanio/src/test/resources/employees-fixedlength.txt +++ b/integration-tests/beanio/src/test/resources/employees-fixedlength.txt @@ -1,3 +1,3 @@ -Joe Smith Developer 75000 10012009 +Joe Smith Developer 75000 11012009 Jane Doe Architect 80000 01152008 Jon Anderson Manager 85000 03182007 \ No newline at end of file diff --git a/integration-tests/beanio/src/test/resources/employees-with-error.txt b/integration-tests/beanio/src/test/resources/employees-with-error.txt index d345b993ca..81c92cc718 100644 --- a/integration-tests/beanio/src/test/resources/employees-with-error.txt +++ b/integration-tests/beanio/src/test/resources/employees-with-error.txt @@ -1,3 +1,3 @@ -Joe,Smith,Developer,75000,10012009 +Joe,Smith,Developer,75000,11012009 Jane,Doe,Architect,80000,01152008 Jon,Anderson,Manager,XXXX,03182007 \ No newline at end of file diff --git a/integration-tests/beanio/src/test/resources/employees-xml.txt b/integration-tests/beanio/src/test/resources/employees-xml.txt index a04e44478e..7c01864172 100644 --- a/integration-tests/beanio/src/test/resources/employees-xml.txt +++ b/integration-tests/beanio/src/test/resources/employees-xml.txt @@ -23,7 +23,7 @@ <lastName>Smith</lastName> <title>Developer</title> <salary>75000</salary> - <hireDate>10012009</hireDate> + <hireDate>11012009</hireDate> </employee> <employee> <firstName>Jane</firstName>