Repository: camel Updated Branches: refs/heads/camel-2.15.x 89961adaa -> 08d97d879 refs/heads/camel-2.16.x c65de1026 -> 00d075c17
CAMEL-9432 - Bindy CSV separator not treated as regex but fixed character in all cases Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/08d97d87 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/08d97d87 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/08d97d87 Branch: refs/heads/camel-2.15.x Commit: 08d97d879adba8b9cec98cf9774b8704e5fd85b7 Parents: 89961ad Author: lburgazzoli <lburgazz...@gmail.com> Authored: Wed Feb 24 14:31:46 2016 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Thu Feb 25 08:11:59 2016 +0100 ---------------------------------------------------------------------- .../bindy/csv/BindyCsvDataFormat.java | 38 +---------- .../BindySimpleCsvRegexAutospanLineTest.java | 72 ++++++++++++++++++++ .../spanLastRecord/RegexSpanLastRecord.java | 61 +++++++++++++++++ 3 files changed, 134 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/08d97d87/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java ---------------------------------------------------------------------- diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java index d8ef0c6..49840e3 100755 --- a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java +++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java @@ -165,7 +165,7 @@ public class BindyCsvDataFormat extends BindyAbstractDataFormat { // Split the CSV record according to the separator defined in // annotated class @CSVRecord - String[] tokens = line.split(separator, -1); + String[] tokens = line.split(separator, factory.getAutospanLine() ? factory.getMaxpos() : -1); List<String> result = Arrays.asList(tokens); // must unquote tokens before use result = unquoteTokens(result, separator, quote); @@ -177,10 +177,6 @@ public class BindyCsvDataFormat extends BindyAbstractDataFormat { LOG.debug("Size of the record splitted : {}", result.size()); } - if (factory.getAutospanLine()) { - result = autospanLine(result, factory.getMaxpos(), separator); - } - // Bind data from CSV record with model classes factory.bind(result, model, count); @@ -210,38 +206,6 @@ public class BindyCsvDataFormat extends BindyAbstractDataFormat { } /** - * Concatenate "the rest of the line" as the last record. Works similar as if quoted - * - * @param result input result set - * @param maxpos position of maximum record - * @param separator csv separator char - * @return List<String> with concatenated last record - */ - private static List<String> autospanLine(final List<String> result, final int maxpos, final String separator) { - if (result.size() <= maxpos) { - return result; - } - - final List<String> answer = new ArrayList<String>(); - final StringBuilder lastRecord = new StringBuilder(); - - final Iterator<String> it = result.iterator(); - for (int counter = 0; counter < maxpos - 1; counter++) { - answer.add(it.next()); - } - - while (it.hasNext()) { - lastRecord.append(it.next()); - if (it.hasNext()) { - lastRecord.append(separator); - } - } - answer.add(lastRecord.toString()); - - return answer; - } - - /** * Unquote the tokens, by removing leading and trailing quote chars, * as will handling fixing broken tokens which may have been split * by a separator inside a quote. http://git-wip-us.apache.org/repos/asf/camel/blob/08d97d87/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvRegexAutospanLineTest.java ---------------------------------------------------------------------- diff --git a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvRegexAutospanLineTest.java b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvRegexAutospanLineTest.java new file mode 100644 index 0000000..066a2b5 --- /dev/null +++ b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvRegexAutospanLineTest.java @@ -0,0 +1,72 @@ +/** + * 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.dataformat.bindy.csv; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.dataformat.bindy.model.simple.spanLastRecord.RegexSpanLastRecord; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.Test; + +public class BindySimpleCsvRegexAutospanLineTest extends CamelTestSupport { + + @Test + public void testUnmarshalNoNeedToSpanLine() throws Exception { + final MockEndpoint mock = getMockEndpoint("mock:unmarshal"); + mock.expectedMessageCount(1); + + template.sendBody("direct:unmarshal", "1 hei kommentar"); + + assertMockEndpointsSatisfied(); + + final RegexSpanLastRecord order = mock.getReceivedExchanges().get(0).getIn().getBody(RegexSpanLastRecord.class); + + assertEquals(1, order.getRecordId()); + assertEquals("hei", order.getName()); + assertEquals("kommentar", order.getComment()); + } + + @Test + public void testUnmarshalSpanningLine() throws Exception { + final MockEndpoint mock = getMockEndpoint("mock:unmarshal"); + mock.expectedMessageCount(1); + + template.sendBody("direct:unmarshal", "1 hei kommentar test noe hei"); + + assertMockEndpointsSatisfied(); + + final RegexSpanLastRecord order = mock.getReceivedExchanges().get(0).getIn().getBody(RegexSpanLastRecord.class); + + assertEquals(1, order.getRecordId()); + assertEquals("hei", order.getName()); + assertEquals("kommentar test noe hei", order.getComment()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + final BindyCsvDataFormat bindy = new BindyCsvDataFormat(RegexSpanLastRecord.class); + + from("direct:unmarshal") + .unmarshal(bindy) + .to("mock:unmarshal"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/08d97d87/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/spanLastRecord/RegexSpanLastRecord.java ---------------------------------------------------------------------- diff --git a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/spanLastRecord/RegexSpanLastRecord.java b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/spanLastRecord/RegexSpanLastRecord.java new file mode 100644 index 0000000..878ade8 --- /dev/null +++ b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/spanLastRecord/RegexSpanLastRecord.java @@ -0,0 +1,61 @@ +/** + * 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.dataformat.bindy.model.simple.spanLastRecord; + +import org.apache.camel.dataformat.bindy.annotation.CsvRecord; +import org.apache.camel.dataformat.bindy.annotation.DataField; + +@CsvRecord(separator = "\\s+", autospanLine = true) +public class RegexSpanLastRecord { + + @DataField(pos = 1) + private int recordId; + @DataField(pos = 2) + private String name; + @DataField(pos = 3) + private String comment; + + public int getRecordId() { + return recordId; + } + + public void setRecordId(final int recordId) { + this.recordId = recordId; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getComment() { + return comment; + } + + public void setComment(final String comment) { + this.comment = comment; + } + + @Override + public String toString() { + return "SpanLastRecord [recordId=" + recordId + ", name=" + name + ", comment=" + comment + "]"; + } + +}