You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2012/04/30 14:28:07 UTC

svn commit: r1332173 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/builder/ camel-core/src/main/java/org/apache/camel/model/dataformat/ components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/ components/camel-bindy/src/ma...

Author: davsclaus
Date: Mon Apr 30 12:28:07 2012
New Revision: 1332173

URL: http://svn.apache.org/viewvc?rev=1332173&view=rev
Log:
CAMEL-3496: Made camel-bindy easier to use by specifying class type. As well unmarshal a single row returns the pojo directly.

Added:
    camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/classtype/
    camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/classtype/BindyCsvClassTypeTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
    camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
    camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java
    camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java
    camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java
    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/csv/BindyCsvDataFormat.java
    camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
    camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java?rev=1332173&r1=1332172&r2=1332173&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java Mon Apr 30 12:28:07 2012
@@ -106,6 +106,19 @@ public class DataFormatClause<T extends 
     }
 
     /**
+     * Uses the Bindy data format
+     *
+     * @param type      the type of bindy data format to use
+     * @param classType the POJO class type
+     */
+    public T bindy(BindyType type, Class<?> classType) {
+        BindyDataFormat bindy = new BindyDataFormat();
+        bindy.setType(type);
+        bindy.setClassType(classType);
+        return dataFormat(bindy);
+    }
+
+    /**
      * Uses the CSV data format
      */
     public T csv() {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java?rev=1332173&r1=1332172&r2=1332173&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java Mon Apr 30 12:28:07 2012
@@ -20,10 +20,12 @@ import javax.xml.bind.annotation.XmlAcce
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.RouteContext;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * Represents the Bindy {@link org.apache.camel.spi.DataFormat}
@@ -35,10 +37,14 @@ import org.apache.camel.spi.RouteContext
 public class BindyDataFormat extends DataFormatDefinition {
     @XmlAttribute(required = true)
     private BindyType type;
-    @XmlAttribute(required = true)
+    @XmlAttribute
     private String[] packages;
     @XmlAttribute
+    private String classType;
+    @XmlAttribute
     private String locale;
+    @XmlTransient
+    private Class<?> clazz;
 
     public BindyDataFormat() {
     }
@@ -59,6 +65,18 @@ public class BindyDataFormat extends Dat
         this.packages = packages;
     }
 
+    public String getClassType() {
+        return classType;
+    }
+
+    public void setClassType(String classType) {
+        this.classType = classType;
+    }
+
+    public void setClassType(Class<?> classType) {
+        this.clazz = classType;
+    }
+
     public String getLocale() {
         return locale;
     }
@@ -68,6 +86,13 @@ public class BindyDataFormat extends Dat
     }
 
     protected DataFormat createDataFormat(RouteContext routeContext) {
+        if (packages == null && (classType == null && clazz == null)) {
+            throw new IllegalArgumentException("Either packages or classType must be specified");
+        }
+        if (packages != null && (classType != null || clazz != null)) {
+            throw new IllegalArgumentException("Only one of packages and classType must be specified");
+        }
+
         if (type == BindyType.Csv) {
             setDataFormatName("bindy-csv");
         } else if (type == BindyType.Fixed) {
@@ -75,6 +100,14 @@ public class BindyDataFormat extends Dat
         } else {
             setDataFormatName("bindy-kvp");
         }
+
+        if (clazz == null && classType != null) {
+            try {
+                clazz = routeContext.getCamelContext().getClassResolver().resolveMandatoryClass(classType);
+            } catch (ClassNotFoundException e) {
+                throw ObjectHelper.wrapRuntimeCamelException(e);
+            }
+        }
         return super.createDataFormat(routeContext);
     }
 
@@ -82,6 +115,7 @@ public class BindyDataFormat extends Dat
     protected void configureDataFormat(DataFormat dataFormat) {
         setProperty(dataFormat, "packages", packages);
         setProperty(dataFormat, "locale", locale);
+        setProperty(dataFormat, "classType", clazz);
     }
 
 }
\ No newline at end of file

Modified: camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java?rev=1332173&r1=1332172&r2=1332173&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java (original)
+++ camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java Mon Apr 30 12:28:07 2012
@@ -16,6 +16,10 @@
  */
 package org.apache.camel.dataformat.bindy;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.PackageScanClassResolver;
 
@@ -23,6 +27,7 @@ public abstract class BindyAbstractDataF
     private String[] packages;
     private String locale;
     private BindyAbstractFactory modelFactory;
+    private Class<?> classType;
 
     public BindyAbstractDataFormat() {
     }
@@ -31,6 +36,10 @@ public abstract class BindyAbstractDataF
         this.packages = packages;
     }
 
+    protected BindyAbstractDataFormat(Class<?> classType) {
+        this.classType = classType;
+    }
+
     public String[] getPackages() {
         return packages;
     }
@@ -39,6 +48,14 @@ public abstract class BindyAbstractDataF
         this.packages = packages;
     }
 
+    public Class<?> getClassType() {
+        return classType;
+    }
+
+    public void setClassType(Class<?> classType) {
+        this.classType = classType;
+    }
+
     public String getLocale() {
         return locale;
     }
@@ -60,4 +77,25 @@ public abstract class BindyAbstractDataF
     }
     
     protected abstract BindyAbstractFactory createModelFactory(PackageScanClassResolver resolver) throws Exception;
+
+    protected Object extractUnmarshalResult(List<Map<String, Object>> models) {
+        if (getClassType() != null) {
+            // we expect to find this type in the models, and grab only that type
+            List<Object> answer = new ArrayList<Object>();
+            for (Map<String, Object> entry : models) {
+                Object data = entry.get(getClassType().getName());
+                if (data != null) {
+                    answer.add(data);
+                }
+            }
+            // if there is only 1 then dont return a list
+            if (answer.size() == 1) {
+                return answer.get(0);
+            } else {
+                return answer;
+            }
+        } else {
+            return models;
+        }
+    }
 }

Modified: camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java?rev=1332173&r1=1332172&r2=1332173&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java (original)
+++ camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java Mon Apr 30 12:28:07 2012
@@ -19,6 +19,7 @@ package org.apache.camel.dataformat.bind
 import java.lang.reflect.Field;
 import java.text.NumberFormat;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -43,6 +44,7 @@ public abstract class BindyAbstractFacto
     private AnnotationModelLoader modelsLoader;
     private String[] packageNames;
     private String locale;
+    private Class<?> type;
 
     public BindyAbstractFactory(PackageScanClassResolver resolver, String... packageNames) throws Exception {
         this.modelsLoader = new AnnotationModelLoader(resolver);
@@ -57,6 +59,13 @@ public abstract class BindyAbstractFacto
         initModel();
     }
 
+    public BindyAbstractFactory(PackageScanClassResolver resolver, Class<?> type) throws Exception {
+        this.modelsLoader = new AnnotationModelLoader(resolver);
+        this.type = type;
+
+        initModel();
+    }
+
     /**
      * method uses to initialize the model representing the classes who will
      * bind the data. This process will scan for classes according to the
@@ -66,7 +75,15 @@ public abstract class BindyAbstractFacto
      */
     public void initModel() throws Exception {
         // Find classes defined as Model
-        initModelClasses(this.packageNames);
+        if (packageNames != null)  {
+            initModelClasses(this.packageNames);
+        } else if (type != null) {
+            // use the package name from the type as it may refer to types in the same package
+            String pckName = type.getPackage().getName();
+            initModelClasses(pckName);
+        } else {
+            throw new IllegalArgumentException("Either packagenames or type should be configured");
+        }
     }
 
     /**

Modified: camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java?rev=1332173&r1=1332172&r2=1332173&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java (original)
+++ camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java Mon Apr 30 12:28:07 2012
@@ -72,6 +72,13 @@ public class BindyCsvFactory extends Bin
         initCsvModel();
     }
 
+    public BindyCsvFactory(PackageScanClassResolver resolver, Class<?> type) throws Exception {
+        super(resolver, type);
+
+        // initialize specific parameters of the csv model
+        initCsvModel();
+    }
+
     /**
      * method uses to initialize the model representing the classes who will
      * bind the data. This process will scan for classes according to the

Modified: camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java?rev=1332173&r1=1332172&r2=1332173&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java (original)
+++ camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java Mon Apr 30 12:28:07 2012
@@ -68,6 +68,13 @@ public class BindyFixedLengthFactory ext
         initFixedLengthModel();
     }
 
+    public BindyFixedLengthFactory(PackageScanClassResolver resolver, Class<?> type) throws Exception {
+        super(resolver, type);
+
+        // initialize specific parameters of the fixed length model
+        initFixedLengthModel();
+    }
+
     /**
      * method uses to initialize the model representing the classes who will
      * bind the data. This process will scan for classes according to the

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=1332173&r1=1332172&r2=1332173&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 Mon Apr 30 12:28:07 2012
@@ -56,13 +56,19 @@ public class BindyKeyValuePairFactory ex
     private boolean messageOrdered;
 
     public BindyKeyValuePairFactory(PackageScanClassResolver resolver, String... packageNames) throws Exception {
-
         super(resolver, packageNames);
 
         // Initialize what is specific to Key Value Pair model
         initKeyValuePairModel();
     }
 
+    public BindyKeyValuePairFactory(PackageScanClassResolver resolver, Class<?> type) throws Exception {
+        super(resolver, type);
+
+        // Initialize what is specific to Key Value Pair model
+        initKeyValuePairModel();
+    }
+
     /**
      * method uses to initialize the model representing the classes who will
      * bind the data This process will scan for classes according to the package

Modified: camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java?rev=1332173&r1=1332172&r2=1332173&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java (original)
+++ camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java Mon Apr 30 12:28:07 2012
@@ -36,7 +36,6 @@ import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,6 +53,10 @@ public class BindyCsvDataFormat extends 
         super(packages);
     }
 
+    public BindyCsvDataFormat(Class<?> type) {
+        super(type);
+    }
+
     @SuppressWarnings("unchecked")
     public void marshal(Exchange exchange, Object body, OutputStream outputStream) throws Exception {
 
@@ -183,7 +186,7 @@ public class BindyCsvDataFormat extends 
             if (models.size() == 0) {
                 throw new java.lang.IllegalArgumentException("No records have been defined in the CSV");
             } else {
-                return models;
+                return extractUnmarshalResult(models);
             }
 
         } finally {
@@ -256,6 +259,10 @@ public class BindyCsvDataFormat extends 
     }
 
     protected BindyAbstractFactory createModelFactory(PackageScanClassResolver resolver) throws Exception {
-        return new BindyCsvFactory(resolver, getPackages());
+        if (getClassType() != null) {
+            return new BindyCsvFactory(resolver, getClassType());
+        } else {
+            return new BindyCsvFactory(resolver, getPackages());
+        }
     }
 }

Modified: camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java?rev=1332173&r1=1332172&r2=1332173&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java (original)
+++ camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java Mon Apr 30 12:28:07 2012
@@ -27,6 +27,8 @@ import java.util.Map;
 import java.util.Scanner;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.dataformat.bindy.BindyAbstractDataFormat;
+import org.apache.camel.dataformat.bindy.BindyAbstractFactory;
 import org.apache.camel.dataformat.bindy.BindyFixedLengthFactory;
 import org.apache.camel.dataformat.bindy.util.ConverterUtils;
 import org.apache.camel.spi.DataFormat;
@@ -40,23 +42,24 @@ import org.slf4j.LoggerFactory;
  * A <a href="http://camel.apache.org/data-format.html">data format</a> (
  * {@link DataFormat}) using Bindy to marshal to and from Fixed Length
  */
-public class BindyFixedLengthDataFormat implements DataFormat {
+public class BindyFixedLengthDataFormat extends BindyAbstractDataFormat {
     private static final transient Logger LOG = LoggerFactory.getLogger(BindyFixedLengthDataFormat.class);
 
-    private String[] packages;
-    private BindyFixedLengthFactory modelFactory;
-
     public BindyFixedLengthDataFormat() {
     }
 
     public BindyFixedLengthDataFormat(String... packages) {
-        this.packages = packages;
+        super(packages);
+    }
+
+    public BindyFixedLengthDataFormat(Class<?> type) {
+        super(type);
     }
 
     @SuppressWarnings("unchecked")
     public void marshal(Exchange exchange, Object body, OutputStream outputStream) throws Exception {
 
-        BindyFixedLengthFactory factory = getFactory(exchange.getContext().getPackageScanClassResolver());
+        BindyFixedLengthFactory factory = (BindyFixedLengthFactory) getFactory(exchange.getContext().getPackageScanClassResolver());
         ObjectHelper.notNull(factory, "not instantiated");
 
         // Get CRLF
@@ -93,7 +96,7 @@ public class BindyFixedLengthDataFormat 
     }
 
     public Object unmarshal(Exchange exchange, InputStream inputStream) throws Exception {
-        BindyFixedLengthFactory factory = getFactory(exchange.getContext().getPackageScanClassResolver());
+        BindyFixedLengthFactory factory = (BindyFixedLengthFactory) getFactory(exchange.getContext().getPackageScanClassResolver());
         ObjectHelper.notNull(factory, "not instantiated");
 
         // List of Pojos
@@ -152,9 +155,9 @@ public class BindyFixedLengthDataFormat 
             // Test if models list is empty or not
             // If this is the case (correspond to an empty stream, ...)
             if (models.size() == 0) {
-                throw new java.lang.IllegalArgumentException("No records have been defined in the message");
+                throw new java.lang.IllegalArgumentException("No records have been defined in the CSV");
             } else {
-                return models;
+                return extractUnmarshalResult(models);
             }
 
         } finally {
@@ -164,26 +167,13 @@ public class BindyFixedLengthDataFormat 
 
     }
 
-    /**
-     * Method used to create the singleton of the BindyCsvFactory
-     */
-    public BindyFixedLengthFactory getFactory(PackageScanClassResolver resolver) throws Exception {
-        if (modelFactory == null) {
-            modelFactory = new BindyFixedLengthFactory(resolver, packages);
+    @Override
+    protected BindyAbstractFactory createModelFactory(PackageScanClassResolver resolver) throws Exception {
+        if (getClassType() != null) {
+            return new BindyFixedLengthFactory(resolver, getClassType());
+        } else {
+            return new BindyFixedLengthFactory(resolver, getPackages());
         }
-        return modelFactory;
-    }
-
-    public void setModelFactory(BindyFixedLengthFactory modelFactory) {
-        this.modelFactory = modelFactory;
-    }
-
-    public String[] getPackages() {
-        return packages;
-    }
-
-    public void setPackages(String[] packages) {
-        this.packages = packages;
     }
 
 }

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=1332173&r1=1332172&r2=1332173&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 Mon Apr 30 12:28:07 2012
@@ -53,6 +53,10 @@ public class BindyKeyValuePairDataFormat
         super(packages);
     }
 
+    public BindyKeyValuePairDataFormat(Class<?> type) {
+        super(type);
+    }
+
     @SuppressWarnings("unchecked")
     public void marshal(Exchange exchange, Object body, OutputStream outputStream) throws Exception {
         BindyAbstractFactory factory = getFactory(exchange.getContext().getPackageScanClassResolver());
@@ -136,9 +140,9 @@ public class BindyKeyValuePairDataFormat
             // Test if models list is empty or not
             // If this is the case (correspond to an empty stream, ...)
             if (models.size() == 0) {
-                throw new java.lang.IllegalArgumentException("No records have been defined in the KVP");
+                throw new java.lang.IllegalArgumentException("No records have been defined in the CSV");
             } else {
-                return models;
+                return extractUnmarshalResult(models);
             }
 
         } finally {
@@ -148,6 +152,10 @@ public class BindyKeyValuePairDataFormat
     }
 
     protected BindyAbstractFactory createModelFactory(PackageScanClassResolver resolver) throws Exception {
-        return new BindyKeyValuePairFactory(resolver, getPackages());
+        if (getClassType() != null) {
+            return new BindyKeyValuePairFactory(resolver, getClassType());
+        } else {
+            return new BindyKeyValuePairFactory(resolver, getPackages());
+        }
     }
 }

Added: camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/classtype/BindyCsvClassTypeTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/classtype/BindyCsvClassTypeTest.java?rev=1332173&view=auto
==============================================================================
--- camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/classtype/BindyCsvClassTypeTest.java (added)
+++ camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/classtype/BindyCsvClassTypeTest.java Mon Apr 30 12:28:07 2012
@@ -0,0 +1,103 @@
+/**
+ * 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.classtype;
+
+import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.dataformat.bindy.model.simple.oneclass.Order;
+import org.apache.camel.model.dataformat.BindyType;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class BindyCsvClassTypeTest extends CamelTestSupport {
+
+    @Test
+    public void testMarshallMessage() throws Exception {
+        String expected = "1,B2,Keira,Knightley,ISIN,XX23456789,BUY,Share,400.25,EUR,14-01-2009\r\n";
+
+        getMockEndpoint("mock:in").expectedBodiesReceived(expected);
+
+        template.sendBody("direct:in", generateOrder());
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testUnmarshallMessage() throws Exception {
+        getMockEndpoint("mock:out").expectedMessageCount(1);
+        getMockEndpoint("mock:out").message(0).body().isInstanceOf(Order.class);
+
+        String data = "1,B2,Keira,Knightley,ISIN,XX23456789,BUY,Share,400.25,EUR,14-01-2009\r\n";
+        template.sendBody("direct:out", data);
+
+        assertMockEndpointsSatisfied();
+
+        Order order = getMockEndpoint("mock:out").getReceivedExchanges().get(0).getIn().getBody(Order.class);
+        assertEquals(1, order.getOrderNr());
+        assertEquals("BUY", order.getOrderType());
+        assertEquals("B2", order.getClientNr());
+        assertEquals("Keira", order.getFirstName());
+        assertEquals("Knightley", order.getLastName());
+        assertEquals(new BigDecimal("400.25"), order.getAmount());
+        assertEquals("ISIN", order.getInstrumentCode());
+        assertEquals("XX23456789", order.getInstrumentNumber());
+        assertEquals("Share", order.getInstrumentType());
+        assertEquals("EUR", order.getCurrency());
+    }
+
+    public Order generateOrder() {
+        Order order = new Order();
+        order.setOrderNr(1);
+        order.setOrderType("BUY");
+        order.setClientNr("B2");
+        order.setFirstName("Keira");
+        order.setLastName("Knightley");
+        order.setAmount(new BigDecimal("400.25"));
+        order.setInstrumentCode("ISIN");
+        order.setInstrumentNumber("XX23456789");
+        order.setInstrumentType("Share");
+        order.setCurrency("EUR");
+
+        Calendar calendar = new GregorianCalendar();
+        calendar.set(2009, 0, 14);
+        order.setOrderDate(calendar.getTime());
+
+        return order;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:in")
+                    .marshal().bindy(BindyType.Csv, Order.class)
+                    .to("mock:in");
+
+                from("direct:out")
+                    .unmarshal().bindy(BindyType.Csv, Order.class)
+                    .to("mock:out");
+            }
+        };
+    }
+}