You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2016/06/08 10:16:37 UTC
camel git commit: CAMEL-10030: BindyKeyValuePairDataFormat shold
detect if the body is a map, a list of map or a simple value when marshalling
Repository: camel
Updated Branches:
refs/heads/master 3938344aa -> 5fcb5ab20
CAMEL-10030: BindyKeyValuePairDataFormat shold detect if the body is a map, a list of map or a simple value when marshalling
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/5fcb5ab2
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/5fcb5ab2
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/5fcb5ab2
Branch: refs/heads/master
Commit: 5fcb5ab20e87ec263f1169984509ef6dd49f1bdd
Parents: 3938344
Author: lburgazzoli <lb...@gmail.com>
Authored: Wed Jun 8 12:13:27 2016 +0200
Committer: lburgazzoli <lb...@gmail.com>
Committed: Wed Jun 8 12:16:05 2016 +0200
----------------------------------------------------------------------
.../bindy/BindyAbstractDataFormat.java | 10 +-
.../bindy/kvp/BindyKeyValuePairDataFormat.java | 32 +++--
.../fix/BindySimpleKeyValuePairFixTest.java | 134 +++++++++++++++++++
.../BindySimpleKeyValuePairFixTest-context.xml | 32 +++++
4 files changed, 195 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/5fcb5ab2/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
index c55084e..8ae6dce 100644
--- a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
+++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
@@ -134,16 +134,22 @@ public abstract class BindyAbstractDataFormat extends ServiceSupport implements
protected Map<String, Object> createLinkedFieldsModel(Object model) throws IllegalAccessException {
Map<String, Object> row = new HashMap<>();
+ createLinkedFieldsModel(model, row);
+ return row;
+ }
+
+ protected void createLinkedFieldsModel(Object model, Map<String, Object> row) throws IllegalAccessException {
for (Field field : model.getClass().getDeclaredFields()) {
Link linkField = field.getAnnotation(Link.class);
if (linkField != null) {
boolean accessible = field.isAccessible();
field.setAccessible(true);
- row.put(field.getType().getName(), field.get(model));
+ if (!row.containsKey(field.getType().getName())) {
+ row.put(field.getType().getName(), field.get(model));
+ }
field.setAccessible(accessible);
}
}
- return row;
}
protected abstract BindyAbstractFactory createModelFactory(FormatFactory formatFactory) throws Exception;
http://git-wip-us.apache.org/repos/asf/camel/blob/5fcb5ab2/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
----------------------------------------------------------------------
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 6fb8a76..1d35957 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
@@ -21,12 +21,15 @@ 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;
import java.util.Map;
import java.util.Scanner;
import org.apache.camel.Exchange;
+import org.apache.camel.TypeConverter;
import org.apache.camel.dataformat.bindy.BindyAbstractDataFormat;
import org.apache.camel.dataformat.bindy.BindyAbstractFactory;
import org.apache.camel.dataformat.bindy.BindyKeyValuePairFactory;
@@ -60,19 +63,26 @@ public class BindyKeyValuePairDataFormat extends BindyAbstractDataFormat {
@SuppressWarnings("unchecked")
public void marshal(Exchange exchange, Object body, OutputStream outputStream) throws Exception {
- BindyAbstractFactory factory = getFactory();
- List<Map<String, Object>> models = (ArrayList<Map<String, Object>>)body;
- byte[] crlf;
-
- // Get CRLF
- crlf = ConverterUtils.getByteReturn(factory.getCarriageReturn());
+ final BindyAbstractFactory factory = getFactory();
+ final byte[] crlf = ConverterUtils.getByteReturn(factory.getCarriageReturn());
+ final TypeConverter converter = exchange.getContext().getTypeConverter();
+
+ // the body may not be a prepared list of map that bindy expects so help
+ // a bit here and create one if needed
+ final Iterator<Object> it = ObjectHelper.createIterator(body);
+ while (it.hasNext()) {
+ Object model = it.next();
+
+ Map<String, Object> row;
+ if (model instanceof Map) {
+ row = (Map<String, Object>) model;
+ } else {
+ row = Collections.singletonMap(model.getClass().getName(), model);
+ }
- for (Map<String, Object> model : models) {
- String result = factory.unbind(model);
- byte[] bytes = exchange.getContext().getTypeConverter().convertTo(byte[].class, exchange, result);
- outputStream.write(bytes);
+ String result = factory.unbind(row);
- // Add a carriage return
+ outputStream.write(converter.convertTo(byte[].class, exchange, result));
outputStream.write(crlf);
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/5fcb5ab2/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindySimpleKeyValuePairFixTest.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindySimpleKeyValuePairFixTest.java b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindySimpleKeyValuePairFixTest.java
new file mode 100644
index 0000000..6c5368c
--- /dev/null
+++ b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindySimpleKeyValuePairFixTest.java
@@ -0,0 +1,134 @@
+/**
+ * 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.fix;
+
+import java.util.Collections;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.dataformat.bindy.annotation.KeyValuePairField;
+import org.apache.camel.dataformat.bindy.annotation.Message;
+import org.apache.camel.dataformat.bindy.kvp.BindyKeyValuePairDataFormat;
+import org.apache.camel.spi.DataFormat;
+import org.junit.Test;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
+
+
+@ContextConfiguration
+public class BindySimpleKeyValuePairFixTest extends AbstractJUnit4SpringContextTests {
+ private static final String[] FIX_REQUESTS = new String[] {
+ "8=FIX.4.1 37=1 38=1 40=butter",
+ "8=FIX.4.1 37=2 38=2 40=milk",
+ "8=FIX.4.1 37=3 38=3 40=bread"
+ };
+ private static final String[] FIX_RESPONSES = new String[] {
+ "37=1 38=2 40=butter \r\n",
+ "37=2 38=4 40=milk \r\n",
+ "37=3 38=6 40=bread \r\n"
+ };
+
+ @Produce(uri = "direct:fix")
+ private ProducerTemplate template;
+
+ @EndpointInject(uri = "mock:result")
+ private MockEndpoint mock;
+
+ @Test
+ @DirtiesContext
+ public void testUnMarshallMessage() throws Exception {
+ mock.expectedMessageCount(FIX_RESPONSES.length);
+ mock.expectedBodiesReceived(FIX_RESPONSES);
+
+ for (String request : FIX_REQUESTS) {
+ template.sendBody("direct:fix", request);
+ }
+
+ mock.assertIsSatisfied();
+ }
+
+ public static class ContextConfig extends RouteBuilder {
+ @Override
+ public void configure() {
+ DataFormat bindy = new BindyKeyValuePairDataFormat(FixOrder.class);
+ from("direct:fix")
+ .unmarshal(bindy)
+ .process(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ FixOrder order = exchange.getIn().getBody(FixOrder.class);
+ Object body = exchange.getIn().getBody();
+
+ if (order.getProduct().equals("butter")) {
+ order.setQuantity("2");
+ body = order;
+ } else if (order.getProduct().equals("milk")) {
+ order.setQuantity("4");
+ body = Collections.singletonMap(order.getClass().getName(), order);
+ } else if (order.getProduct().equals("bread")) {
+ order.setQuantity("6");
+ body = Collections.singletonList(Collections.singletonMap(order.getClass().getName(), order));
+ }
+
+ exchange.getIn().setBody(body);
+ }
+ })
+ .marshal(bindy)
+ .to("mock:result");
+ }
+ }
+
+ @Message(keyValuePairSeparator = "=", pairSeparator = " ", type = "FIX", version = "4.1")
+ public static class FixOrder {
+ @KeyValuePairField(tag = 37)
+ private String id;
+ @KeyValuePairField(tag = 40)
+ private String product;
+ @KeyValuePairField(tag = 38)
+ private String quantity;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ id = id;
+ }
+
+ public String getProduct() {
+ return product;
+ }
+
+ public void setProduct(String product) {
+ this.product = product;
+ }
+
+ public String getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(String quantity) {
+ this.quantity = quantity;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/5fcb5ab2/components/camel-bindy/src/test/resources/org/apache/camel/dataformat/bindy/fix/BindySimpleKeyValuePairFixTest-context.xml
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/test/resources/org/apache/camel/dataformat/bindy/fix/BindySimpleKeyValuePairFixTest-context.xml b/components/camel-bindy/src/test/resources/org/apache/camel/dataformat/bindy/fix/BindySimpleKeyValuePairFixTest-context.xml
new file mode 100755
index 0000000..f5bd4cb
--- /dev/null
+++ b/components/camel-bindy/src/test/resources/org/apache/camel/dataformat/bindy/fix/BindySimpleKeyValuePairFixTest-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 xmlns="http://camel.apache.org/schema/spring">
+ <routeBuilder ref="myBuilder" />
+ </camelContext>
+
+ <bean id="myBuilder" class="org.apache.camel.dataformat.bindy.fix.BindySimpleKeyValuePairFixTest$ContextConfig"/>
+
+</beans>
\ No newline at end of file