Author: davsclaus
Date: Sun Aug 7 10:31:56 2011
New Revision: 1154684
URL: http://svn.apache.org/viewvc?rev=1154684&view=rev
Log:
CAMEL-4311: Fixed issue with bindy in key value mode when using @OneToMany in
multi threded unmarshalling. Thanks to Surya for the patch.
Modified:
camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexOneToManyKeyValuePairUnMarshallTest.java
Modified:
camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java?rev=1154684&r1=1154683&r2=1154684&view=diff
==============================================================================
---
camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
(original)
+++
camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
Sun Aug 7 10:31:56 2011
@@ -51,9 +51,6 @@ public class BindyKeyValuePairFactory ex
private Map<Integer, KeyValuePairField> keyValuePairFields = new
LinkedHashMap<Integer, KeyValuePairField>();
private Map<Integer, Field> annotatedFields = new LinkedHashMap<Integer,
Field>();
private Map<String, Integer> sections = new HashMap<String, Integer>();
-
- private Map<String, List<Object>> lists = new HashMap<String,
List<Object>>();
-
private String keyValuePairSeparator;
private String pairSeparator;
private boolean messageOrdered;
@@ -117,11 +114,17 @@ public class BindyKeyValuePairFactory ex
}
}
- /**
- *
- */
+ @Override
public void bind(List<String> data, Map<String, Object> model, int line)
throws Exception {
+ // Map to hold the model @OneToMany classes while binding
+ Map<String, List<Object>> lists = new HashMap<String, List<Object>>();
+
+ bind(data, model, line, lists);
+ }
+
+ public void bind(List<String> data, Map<String, Object> model, int line,
Map<String, List<Object>> lists) throws Exception {
+
Map<Integer, List<String>> results = new HashMap<Integer,
List<String>>();
LOG.debug("Key value pairs data : {}", data);
@@ -169,14 +172,14 @@ public class BindyKeyValuePairFactory ex
if (obj != null) {
// Generate model from key value map
- generateModelFromKeyValueMap(clazz, obj, results, line);
+ generateModelFromKeyValueMap(clazz, obj, results, line, lists);
}
}
}
- private void generateModelFromKeyValueMap(Class clazz, Object obj,
Map<Integer, List<String>> results, int line) throws Exception {
+ private void generateModelFromKeyValueMap(Class clazz, Object obj,
Map<Integer, List<String>> results, int line, Map<String, List<Object>> lists)
throws Exception {
for (Field field : clazz.getDeclaredFields()) {
@@ -388,7 +391,7 @@ public class BindyKeyValuePairFactory ex
lists.put(cl.getName(), new ArrayList<Object>());
}
- generateModelFromKeyValueMap(cl, null, results, line);
+ generateModelFromKeyValueMap(cl, null, results, line,
lists);
// Add list of objects
field.set(obj, lists.get(cl.getName()));
@@ -632,4 +635,5 @@ public class BindyKeyValuePairFactory ex
}
}
+
}
Modified:
camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java?rev=1154684&r1=1154683&r2=1154684&view=diff
==============================================================================
---
camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
(original)
+++
camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
Sun Aug 7 10:31:56 2011
@@ -21,6 +21,7 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
@@ -79,6 +80,9 @@ public class BindyKeyValuePairDataFormat
// Pojos of the model
Map<String, Object> model;
+
+ // Map to hold the model @OneToMany classes while binding
+ Map<String, List<Object>> lists = new HashMap<String, List<Object>>();
InputStreamReader in = new InputStreamReader(inputStream);
@@ -117,7 +121,7 @@ public class BindyKeyValuePairDataFormat
if (result.size() > 0) {
// Bind data from message with model classes
// Counter is used to detect line where error occurs
- factory.bind(result, model, count);
+ factory.bind(result, model, count, lists);
// Link objects together
factory.link(model);
Modified:
camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexOneToManyKeyValuePairUnMarshallTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexOneToManyKeyValuePairUnMarshallTest.java?rev=1154684&r1=1154683&r2=1154684&view=diff
==============================================================================
---
camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexOneToManyKeyValuePairUnMarshallTest.java
(original)
+++
camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexOneToManyKeyValuePairUnMarshallTest.java
Sun Aug 7 10:31:56 2011
@@ -33,9 +33,11 @@ public class BindyComplexOneToManyKeyVal
String message = "8=FIX 4.19=2034=135=049=INVMGR56=BRKR" +
"1=BE.CHM.00111=CHM0001-0158=this is a camel - bindy test" +
"22=448=BE000124567854=1"
+ "22=548=BE000987654354=2" +
"22=648=BE000999999954=3" + "10=220";
+ String message2 = "8=FIX 4.19=2034=135=049=INVMGR56=BRKR" +
"1=BE.CHM.00111=CHM0001-0158=this is a camel - bindy test10=220";
- result.expectedMessageCount(1);
+ result.expectedMessageCount(2);
template.sendBody(message);
+ template.sendBody(message2);
result.assertIsSatisfied();