This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 11c4244 CAMEL-17101: Split EIP should support splitting a
java.util.Map into a Set<Map.Entry> - so it works out of the box, and what you
would assume Camel can do. Fixed some other components that was using the
faulty behavioiur of createIterable.
11c4244 is described below
commit 11c42447f875f430f39761d3878626a781869d17
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Oct 20 20:48:30 2021 +0200
CAMEL-17101: Split EIP should support splitting a java.util.Map into a
Set<Map.Entry> - so it works out of the box, and what you would assume Camel
can do. Fixed some other components that was using the faulty behavioiur of
createIterable.
---
.../apache/camel/dataformat/beanio/BeanIODataFormat.java | 7 ++++++-
.../camel/dataformat/bindy/csv/BindyCsvDataFormat.java | 6 ++++++
.../bindy/fixed/BindyFixedLengthDataFormat.java | 6 ++++++
.../dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java | 8 +++++---
.../org/apache/camel/dataformat/csv/CsvMarshaller.java | 13 +++++++++----
.../CsvMarshalHeaderWithCustomMarshallFactoryTest.java | 11 ++++++++---
.../org/apache/camel/component/elsql/ElsqlProducer.java | 7 ++++++-
.../camel/jsonpath/JsonPathSplitWriteAsStringMapTest.java | 15 +++++++--------
8 files changed, 53 insertions(+), 20 deletions(-)
diff --git
a/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java
b/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java
index d501147..1ff1892 100644
---
a/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java
+++
b/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java
@@ -25,6 +25,7 @@ import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import org.apache.camel.CamelContext;
@@ -143,7 +144,11 @@ public class BeanIODataFormat extends ServiceSupport
implements DataFormat, Data
@SuppressWarnings("unchecked")
private List<Object> getModels(Exchange exchange, Object body) {
List<Object> models;
- if ((models =
exchange.getContext().getTypeConverter().convertTo(List.class, body)) == null) {
+
+ if (body instanceof Map && isUnmarshalSingleObject()) {
+ models = new ArrayList<>();
+ models.add(body);
+ } else if ((models =
exchange.getContext().getTypeConverter().convertTo(List.class, body)) == null) {
models = new ArrayList<>();
for (Object model : ObjectHelper.createIterable(body)) {
models.add(model);
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 055d147..93c1681 100644
---
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
@@ -23,6 +23,7 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -90,6 +91,11 @@ public class BindyCsvDataFormat extends
BindyAbstractDataFormat {
// the body is not a prepared list of map that bindy expects so help a
// bit here and create one for us
+ if (body instanceof Map) {
+ // the body is already a map, and we do not want to iterate each
element in the map,
+ // but keep the body as a map, so wrap as iterator
+ body = Collections.singleton(body).iterator();
+ }
for (Object model : ObjectHelper.createIterable(body)) {
if (model instanceof Map) {
models.add((Map<String, Object>) model);
diff --git
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
index 5152f34..192754f 100644
---
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
+++
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
@@ -20,6 +20,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -80,6 +81,11 @@ public class BindyFixedLengthDataFormat extends
BindyAbstractDataFormat {
// the body is not a prepared list so help a bit here and create one
for us
if (!isPreparedList(body)) {
models = new ArrayList<>();
+ if (body instanceof Map) {
+ // the body is already a map, and we do not want to iterate
each element in the map,
+ // but keep the body as a map, so wrap as iterator
+ body = Collections.singleton(body).iterator();
+ }
for (Object model : ObjectHelper.createIterable(body)) {
String name = model.getClass().getName();
Map<String, Object> row = new HashMap<>();
diff --git
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
index 2cb40d7..429f798 100644
---
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
+++
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
@@ -74,17 +74,19 @@ public class BindyKeyValuePairDataFormat extends
BindyAbstractDataFormat {
// the body may not be a prepared list of map that bindy expects so
help
// a bit here and create one if needed
+ if (body instanceof Map) {
+ // the body is already a map, and we do not want to iterate each
element in the map,
+ // but keep the body as a map, so wrap as iterator
+ body = Collections.singleton(body).iterator();
+ }
for (Object model : ObjectHelper.createIterable(body)) {
-
Map<String, Object> row;
if (model instanceof Map) {
row = (Map<String, Object>) model;
} else {
row = Collections.singletonMap(model.getClass().getName(),
model);
}
-
String result = factory.unbind(getCamelContext(), row);
-
outputStream.write(converter.convertTo(byte[].class, exchange,
result));
outputStream.write(crlf);
}
diff --git
a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvMarshaller.java
b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvMarshaller.java
index 4a974ad..77e1d9f 100644
---
a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvMarshaller.java
+++
b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvMarshaller.java
@@ -80,10 +80,15 @@ public abstract class CsvMarshaller {
throws NoTypeConversionAvailableException, IOException {
CSVPrinter printer = createPrinter(exchange, outputStream);
try {
- Iterator it = ObjectHelper.createIterator(object);
- while (it.hasNext()) {
- Object child = it.next();
- printer.printRecord(getRecordValues(exchange, child));
+ if (object instanceof Map) {
+ Map map = (Map) object;
+ printer.printRecord(getMapRecordValues(map));
+ } else {
+ Iterator it = ObjectHelper.createIterator(object);
+ while (it.hasNext()) {
+ Object child = it.next();
+ printer.printRecord(getRecordValues(exchange, child));
+ }
}
} finally {
IOHelper.close(printer);
diff --git
a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderWithCustomMarshallFactoryTest.java
b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderWithCustomMarshallFactoryTest.java
index baddf7c..00ef106 100644
---
a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderWithCustomMarshallFactoryTest.java
+++
b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderWithCustomMarshallFactoryTest.java
@@ -132,10 +132,15 @@ public class
CsvMarshalHeaderWithCustomMarshallFactoryTest extends CamelTestSupp
@Override
@SuppressWarnings("unchecked")
public void marshal(Exchange exchange, Object object, OutputStream
outputStream) throws IOException {
- Iterator<Map<String, String>> it = (Iterator<Map<String, String>>)
ObjectHelper.createIterator(object);
synchronized (printer) {
- while (it.hasNext()) {
- printer.printRecord(getMapRecordValues(it.next()));
+ if (object instanceof Map) {
+ Map map = (Map) object;
+ printer.printRecord(getMapRecordValues(map));
+ } else {
+ Iterator<Map<String, String>> it = (Iterator<Map<String,
String>>) ObjectHelper.createIterator(object);
+ while (it.hasNext()) {
+ printer.printRecord(getMapRecordValues(it.next()));
+ }
}
// Access the 'Appendable'
StringBuilder stringBuilder = (StringBuilder) printer.getOut();
diff --git
a/components/camel-elsql/src/main/java/org/apache/camel/component/elsql/ElsqlProducer.java
b/components/camel-elsql/src/main/java/org/apache/camel/component/elsql/ElsqlProducer.java
index ea2c7b7..9901a3b 100644
---
a/components/camel-elsql/src/main/java/org/apache/camel/component/elsql/ElsqlProducer.java
+++
b/components/camel-elsql/src/main/java/org/apache/camel/component/elsql/ElsqlProducer.java
@@ -20,8 +20,10 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import javax.sql.DataSource;
@@ -109,7 +111,10 @@ public class ElsqlProducer extends DefaultProducer {
final String sqlForDefaultPreparedStamentStrategy =
sql.replace(":", ":?");
final String preparedQuery =
sqlPrepareStatementStrategy.prepareQuery(
sqlForDefaultPreparedStamentStrategy,
getEndpoint().isAllowNamedParameters(), exchange);
- final Iterator<?> iterator =
exchange.getIn().getBody(Iterator.class);
+ // if the body is a map then it's the key/values for a
statement, so do not iterate each map entry.
+ Object body = exchange.getIn().getBody();
+ final Iterator<?> iterator = body instanceof Map
+ ? Collections.singleton(body).iterator() :
exchange.getIn().getBody(Iterator.class);
while (iterator != null && iterator.hasNext()) {
final Object value = iterator.next();
final Iterator<?> i =
sqlPrepareStatementStrategy.createPopulateIterator(
diff --git
a/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathSplitWriteAsStringMapTest.java
b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathSplitWriteAsStringMapTest.java
index c5be405..399ab14 100644
---
a/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathSplitWriteAsStringMapTest.java
+++
b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathSplitWriteAsStringMapTest.java
@@ -45,20 +45,19 @@ public class JsonPathSplitWriteAsStringMapTest extends
CamelTestSupport {
@Test
public void testSplitToJSon() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:line");
- // we only get 1 map (because we split via: $.content) but each entry
is converted to a json string
- mock.expectedMessageCount(1);
+ mock.expectedMessageCount(2);
template.sendBody("direct:start", new
File("src/test/resources/content-map.json"));
assertMockEndpointsSatisfied();
- Map map =
mock.getReceivedExchanges().get(0).getIn().getBody(Map.class);
+ Map.Entry<?, ?> row =
mock.getReceivedExchanges().get(0).getIn().getBody(Map.Entry.class);
+ assertEquals("foo", row.getKey());
+
assertEquals("{\"action\":\"CU\",\"id\":123,\"modifiedTime\":\"2015-07-28T11:40:09.520+02:00\"}",
row.getValue());
- String foo = (String) map.get("foo");
-
assertEquals("{\"action\":\"CU\",\"id\":123,\"modifiedTime\":\"2015-07-28T11:40:09.520+02:00\"}",
foo);
-
- String bar = (String) map.get("bar");
-
assertEquals("{\"action\":\"CU\",\"id\":456,\"modifiedTime\":\"2015-07-28T11:42:29.510+02:00\"}",
bar);
+ row =
mock.getReceivedExchanges().get(1).getIn().getBody(Map.Entry.class);
+ assertEquals("bar", row.getKey());
+
assertEquals("{\"action\":\"CU\",\"id\":456,\"modifiedTime\":\"2015-07-28T11:42:29.510+02:00\"}",
row.getValue());
}
}