Updated Branches: refs/heads/master f85d3e56a -> f4e8992f3
CAMEL-6969 Add an option on the CSV unmarshalling in order to generate Maps with headers as keys Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1ea2dbb2 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1ea2dbb2 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1ea2dbb2 Branch: refs/heads/master Commit: 1ea2dbb2642e7b896272de7f3dc47ec473fc3949 Parents: f85d3e5 Author: Antoine DESSAIGNE <[email protected]> Authored: Wed Jan 8 16:58:09 2014 +0100 Committer: Antoine DESSAIGNE <[email protected]> Committed: Wed Jan 8 16:58:09 2014 +0100 ---------------------------------------------------------------------- .../camel/model/dataformat/CsvDataFormat.java | 16 ++- .../camel/dataformat/csv/CsvDataFormat.java | 40 ++++++-- .../camel/dataformat/csv/CsvIterator.java | 12 +-- .../camel/dataformat/csv/CsvLineConverter.java | 32 ++++++ .../camel/dataformat/csv/CsvLineConverters.java | 101 +++++++++++++++++++ .../camel/dataformat/csv/CsvIteratorTest.java | 28 +++-- .../dataformat/csv/CsvLineConvertersTest.java | 68 +++++++++++++ .../dataformat/csv/CsvUnmarshalMapLineTest.java | 73 ++++++++++++++ .../CsvUnmarshalMapLineSpringTest-context.xml | 32 ++++++ 9 files changed, 369 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/camel-core/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java b/camel-core/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java index cfd4f6b..b6fdae0 100644 --- a/camel-core/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java +++ b/camel-core/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java @@ -31,7 +31,7 @@ import org.apache.camel.util.ObjectHelper; /** * Represents a CSV (Comma Separated Values) {@link org.apache.camel.spi.DataFormat} * - * @version + * @version */ @XmlRootElement(name = "csv") @XmlAccessorType(XmlAccessType.FIELD) @@ -48,6 +48,8 @@ public class CsvDataFormat extends DataFormatDefinition { private Boolean skipFirstLine; @XmlAttribute private Boolean lazyLoad; + @XmlAttribute + private Boolean useMaps; public CsvDataFormat() { super("csv"); @@ -111,6 +113,14 @@ public class CsvDataFormat extends DataFormatDefinition { this.lazyLoad = lazyLoad; } + public Boolean getUseMaps() { + return useMaps; + } + + public void setUseMaps(Boolean useMaps) { + this.useMaps = useMaps; + } + @Override protected DataFormat createDataFormat(RouteContext routeContext) { DataFormat csvFormat = super.createDataFormat(routeContext); @@ -150,5 +160,9 @@ public class CsvDataFormat extends DataFormatDefinition { if (lazyLoad != null) { setProperty(camelContext, dataFormat, "lazyLoad", lazyLoad); } + + if (useMaps != null) { + setProperty(camelContext, dataFormat, "useMaps", useMaps); + } } } http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java ---------------------------------------------------------------------- diff --git a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java index 649bc81..848ac49 100644 --- a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java +++ b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java @@ -46,7 +46,7 @@ import org.apache.commons.csv.writer.CSVWriter; * Autogeneration can be disabled. In this case, only the fields defined in * csvConfig are written on the output. * - * @version + * @version */ public class CsvDataFormat implements DataFormat { private CSVStrategy strategy = CSVStrategy.DEFAULT_STRATEGY; @@ -58,6 +58,7 @@ public class CsvDataFormat implements DataFormat { * Lazy row loading with iterator for big files. */ private boolean lazyLoad; + private boolean useMaps; public void marshal(Exchange exchange, Object object, OutputStream outputStream) throws Exception { if (delimiter != null) { @@ -105,12 +106,18 @@ public class CsvDataFormat implements DataFormat { reader = IOHelper.buffered(new InputStreamReader(inputStream, IOHelper.getCharsetName(exchange))); CSVParser parser = new CSVParser(reader, strategy); - if (skipFirstLine) { - // read one line ahead and skip it - parser.getLine(); + CsvLineConverter<?> lineConverter; + if (useMaps) { + lineConverter = CsvLineConverters.getMapLineConverter(parser.getLine()); + } else { + lineConverter = CsvLineConverters.getListConverter(); + if (skipFirstLine) { + // read one line ahead and skip it + parser.getLine(); + } } - CsvIterator csvIterator = new CsvIterator(parser, reader); + @SuppressWarnings("unchecked") CsvIterator<?> csvIterator = new CsvIterator(parser, reader, lineConverter); return lazyLoad ? csvIterator : loadAllAsList(csvIterator); } catch (Exception e) { error = true; @@ -122,9 +129,9 @@ public class CsvDataFormat implements DataFormat { } } - private List<List<String>> loadAllAsList(CsvIterator iter) { + private <T> List<T> loadAllAsList(CsvIterator<T> iter) { try { - List<List<String>> list = new ArrayList<List<String>>(); + List<T> list = new ArrayList<T>(); while (iter.hasNext()) { list.add(iter.next()); } @@ -145,7 +152,7 @@ public class CsvDataFormat implements DataFormat { } this.delimiter = delimiter; } - + public CSVConfig getConfig() { return config; } @@ -191,6 +198,20 @@ public class CsvDataFormat implements DataFormat { this.lazyLoad = lazyLoad; } + public boolean isUseMaps() { + return useMaps; + } + + /** + * Sets whether or not the result of the unmarshalling should be a {@code java.util.Map} instead of a {@code java.util.List}. It uses the first line as a + * header line and uses it as keys of the maps. + * + * @param useMaps {@code true} in order to use {@code java.util.Map} instead of {@code java.util.List}, {@code false} otherwise. + */ + public void setUseMaps(boolean useMaps) { + this.useMaps = useMaps; + } + private synchronized void updateFieldsInConfig(Set<?> set, Exchange exchange) { for (Object value : set) { if (value != null) { @@ -203,5 +224,4 @@ public class CsvDataFormat implements DataFormat { } } } - -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java ---------------------------------------------------------------------- diff --git a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java index fece082..9d26edb 100644 --- a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java +++ b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvIterator.java @@ -20,9 +20,7 @@ package org.apache.camel.dataformat.csv; import java.io.Closeable; import java.io.IOException; import java.io.Reader; -import java.util.Arrays; import java.util.Iterator; -import java.util.List; import java.util.NoSuchElementException; import org.apache.camel.util.IOHelper; @@ -30,15 +28,17 @@ import org.apache.commons.csv.CSVParser; /** */ -public class CsvIterator implements Iterator<List<String>>, Closeable { +public class CsvIterator<T> implements Iterator<T>, Closeable { private final CSVParser parser; private final Reader reader; + private final CsvLineConverter<T> lineConverter; private String[] line; - public CsvIterator(CSVParser parser, Reader reader) throws IOException { + public CsvIterator(CSVParser parser, Reader reader, CsvLineConverter<T> lineConverter) throws IOException { this.parser = parser; this.reader = reader; + this.lineConverter = lineConverter; line = parser.getLine(); } @@ -48,11 +48,11 @@ public class CsvIterator implements Iterator<List<String>>, Closeable { } @Override - public List<String> next() { + public T next() { if (!hasNext()) { throw new NoSuchElementException(); } - List<String> result = Arrays.asList(line); + T result = lineConverter.convertLine(line); try { line = parser.getLine(); } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvLineConverter.java ---------------------------------------------------------------------- diff --git a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvLineConverter.java b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvLineConverter.java new file mode 100644 index 0000000..7f91636 --- /dev/null +++ b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvLineConverter.java @@ -0,0 +1,32 @@ +/** + * 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.csv; + +/** + * This interface helps converting a single CSV line into another representation. + * + * @param <T> Class for representing a single line + */ +public interface CsvLineConverter<T> { + /** + * Converts a single CSV line. + * + * @param line CSV line + * @return Another representation of the CSV line + */ + public T convertLine(String[] line); +} http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvLineConverters.java ---------------------------------------------------------------------- diff --git a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvLineConverters.java b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvLineConverters.java new file mode 100644 index 0000000..1f3ad30 --- /dev/null +++ b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvLineConverters.java @@ -0,0 +1,101 @@ +/** + * 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.csv; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * This {@code CsvLineConverters} class provides common implementations of the {@code CsvLineConverter} interface. + */ +public final class CsvLineConverters { + /** + * Provides an implementation of {@code CsvLineConverter} that converts a line into a {@code List}. + * + * @return List-based {@code CsvLineConverter} implementation + */ + public static CsvLineConverter<List<String>> getListConverter() { + return ListLineConverter.SINGLETON; + } + + /** + * Provides an implementation of {@code CsvLineConverter} that converts a line into a {@code Map}. + * <p/> + * It requires to have unique {@code headers} values as well as the same number of item in each line. + * + * @param headers Headers of the CSV file + * @return Map-based {@code CsvLineConverter} implementation + */ + public static CsvLineConverter<Map<String, String>> getMapLineConverter(String[] headers) { + return new MapLineConverter(headers); + } + + private static class ListLineConverter implements CsvLineConverter<List<String>> { + public static final ListLineConverter SINGLETON = new ListLineConverter(); + + @Override + public List<String> convertLine(String[] line) { + return Arrays.asList(line); + } + } + + private static class MapLineConverter implements CsvLineConverter<Map<String, String>> { + private final String[] headers; + + private MapLineConverter(String[] headers) { + this.headers = checkHeaders(headers); + } + + @Override + public Map<String, String> convertLine(String[] line) { + if (line.length != headers.length) { + throw new IllegalStateException("This line does not have the same number of items than the header"); + } + + Map<String, String> result = new HashMap<String, String>(line.length); + for (int i = 0; i < line.length; i++) { + result.put(headers[i], line[i]); + } + return result; + } + + private static String[] checkHeaders(String[] headers) { + // Check that we have headers + if (headers == null || headers.length == 0) { + throw new IllegalArgumentException("Missing headers for the CSV parsing"); + } + + // Check that there is no duplicates + Set<String> headerSet = new HashSet<String>(headers.length); + Collections.addAll(headerSet, headers); + if (headerSet.size() != headers.length) { + throw new IllegalArgumentException("There are duplicate headers"); + } + + return headers; + } + } + + private CsvLineConverters() { + // Prevent instantiation + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvIteratorTest.java ---------------------------------------------------------------------- diff --git a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvIteratorTest.java b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvIteratorTest.java index 091faf6..cd5425a 100644 --- a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvIteratorTest.java +++ b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvIteratorTest.java @@ -19,29 +19,27 @@ package org.apache.camel.dataformat.csv; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; +import java.util.List; import java.util.NoSuchElementException; - -import mockit.Expectations; -import mockit.Injectable; import org.apache.commons.csv.CSVParser; import org.junit.Assert; import org.junit.Test; +import mockit.Expectations; +import mockit.Injectable; public class CsvIteratorTest { public static final String HDD_CRASH = "HDD crash"; @Test - public void closeIfError( - @Injectable final InputStreamReader reader, - @Injectable final CSVParser parser) throws IOException { + public void closeIfError(@Injectable final InputStreamReader reader, @Injectable final CSVParser parser) throws IOException { new Expectations() { { parser.getLine(); - result = new String[] {"1"}; + result = new String[]{"1"}; parser.getLine(); - result = new String[] {"2"}; + result = new String[]{"2"}; parser.getLine(); result = new IOException(HDD_CRASH); @@ -52,7 +50,7 @@ public class CsvIteratorTest { }; @SuppressWarnings("resource") - CsvIterator iterator = new CsvIterator(parser, reader); + CsvIterator<List<String>> iterator = new CsvIterator<List<String>>(parser, reader, CsvLineConverters.getListConverter()); Assert.assertTrue(iterator.hasNext()); Assert.assertEquals(Arrays.asList("1"), iterator.next()); Assert.assertTrue(iterator.hasNext()); @@ -75,15 +73,14 @@ public class CsvIteratorTest { } @Test - public void normalCycle(@Injectable final InputStreamReader reader, - @Injectable final CSVParser parser) throws IOException { + public void normalCycle(@Injectable final InputStreamReader reader, @Injectable final CSVParser parser) throws IOException { new Expectations() { { parser.getLine(); - result = new String[] {"1"}; + result = new String[]{"1"}; parser.getLine(); - result = new String[] {"2"}; + result = new String[]{"2"}; parser.getLine(); result = null; @@ -92,9 +89,9 @@ public class CsvIteratorTest { reader.close(); } }; - + @SuppressWarnings("resource") - CsvIterator iterator = new CsvIterator(parser, reader); + CsvIterator<List<String>> iterator = new CsvIterator<List<String>>(parser, reader, CsvLineConverters.getListConverter()); Assert.assertTrue(iterator.hasNext()); Assert.assertEquals(Arrays.asList("1"), iterator.next()); @@ -109,6 +106,5 @@ public class CsvIteratorTest { } catch (NoSuchElementException e) { // okay } - } } http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvLineConvertersTest.java ---------------------------------------------------------------------- diff --git a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvLineConvertersTest.java b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvLineConvertersTest.java new file mode 100644 index 0000000..fcb2c4f --- /dev/null +++ b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvLineConvertersTest.java @@ -0,0 +1,68 @@ +/** + * 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.csv; + +import java.util.List; +import java.util.Map; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class CsvLineConvertersTest { + @Test + public void shouldConvertAsList() { + CsvLineConverter<?> converter = CsvLineConverters.getListConverter(); + + Object result = converter.convertLine(new String[]{"foo", "bar"}); + + assertTrue(result instanceof List); + List list = (List) result; + assertEquals(2, list.size()); + assertEquals("foo", list.get(0)); + assertEquals("bar", list.get(1)); + } + + @Test + public void shouldConvertAsMap() { + CsvLineConverter<?> converter = CsvLineConverters.getMapLineConverter(new String[]{"HEADER_1", "HEADER_2"}); + + Object result = converter.convertLine(new String[]{"foo", "bar"}); + + assertTrue(result instanceof Map); + Map map = (Map) result; + assertEquals(2, map.size()); + assertEquals("foo", map.get("HEADER_1")); + assertEquals("bar", map.get("HEADER_2")); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldNotConvertAsMapWithNullHeaders() { + CsvLineConverters.getMapLineConverter(null); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldNotConvertAsMapWithNoHeaders() { + CsvLineConverters.getMapLineConverter(new String[]{}); + } + + @Test(expected = IllegalStateException.class) + public void shouldNotConvertAsMapWithInvalidLine() { + CsvLineConverter<?> converter = CsvLineConverters.getMapLineConverter(new String[]{"HEADER_1", "HEADER_2"}); + + converter.convertLine(new String[]{"foo"}); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalMapLineTest.java ---------------------------------------------------------------------- diff --git a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalMapLineTest.java b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalMapLineTest.java new file mode 100644 index 0000000..5f02dc3 --- /dev/null +++ b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvUnmarshalMapLineTest.java @@ -0,0 +1,73 @@ +/** + * 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.csv; + +import java.util.List; +import java.util.Map; +import org.apache.camel.EndpointInject; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.CamelSpringTestSupport; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * Spring based test for the <code>CsvDataFormat</code> demonstrating the usage of + * the <tt>useMaps</tt> option. + */ +public class CsvUnmarshalMapLineTest extends CamelSpringTestSupport { + + @EndpointInject(uri = "mock:result") + private MockEndpoint result; + + @SuppressWarnings("unchecked") + @Test + public void testCsvUnMarshal() throws Exception { + result.expectedMessageCount(1); + + // the first line contains the column names which we intend to skip + template.sendBody("direct:start", "OrderId|Item|Amount\n123|Camel in Action|1\n124|ActiveMQ in Action|2"); + + assertMockEndpointsSatisfied(); + + List<Map<String, String>> body = result.getReceivedExchanges().get(0).getIn().getBody(List.class); + assertEquals(2, body.size()); + assertEquals("123", body.get(0).get("OrderId")); + assertEquals("Camel in Action", body.get(0).get("Item")); + assertEquals("1", body.get(0).get("Amount")); + assertEquals("124", body.get(1).get("OrderId")); + assertEquals("ActiveMQ in Action", body.get(1).get("Item")); + assertEquals("2", body.get(1).get("Amount")); + } + + @Test + public void testCsvUnMarshalNoLine() throws Exception { + result.expectedMessageCount(1); + + // the first and last line we intend to skip + template.sendBody("direct:start", "OrderId|Item|Amount\n"); + + assertMockEndpointsSatisfied(); + + List<?> body = result.getReceivedExchanges().get(0).getIn().getBody(List.class); + assertEquals(0, body.size()); + } + + @Override + protected ClassPathXmlApplicationContext createApplicationContext() { + return new ClassPathXmlApplicationContext("org/apache/camel/dataformat/csv/CsvUnmarshalMapLineSpringTest-context.xml"); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/1ea2dbb2/components/camel-csv/src/test/resources/org/apache/camel/dataformat/csv/CsvUnmarshalMapLineSpringTest-context.xml ---------------------------------------------------------------------- diff --git a/components/camel-csv/src/test/resources/org/apache/camel/dataformat/csv/CsvUnmarshalMapLineSpringTest-context.xml b/components/camel-csv/src/test/resources/org/apache/camel/dataformat/csv/CsvUnmarshalMapLineSpringTest-context.xml new file mode 100644 index 0000000..17e7325 --- /dev/null +++ b/components/camel-csv/src/test/resources/org/apache/camel/dataformat/csv/CsvUnmarshalMapLineSpringTest-context.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> + <!-- + 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. + --> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> + + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + <route> + <from uri="direct:start" /> + <unmarshal> + <csv delimiter="|" useMaps="true" /> + </unmarshal> + <to uri="mock:result" /> + </route> + </camelContext> +</beans>
