You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2009/07/15 14:09:01 UTC

svn commit: r794245 - in /camel/trunk/components/camel-bindy/src: main/java/org/apache/camel/dataformat/bindy/ main/java/org/apache/camel/dataformat/bindy/annotation/ main/java/org/apache/camel/dataformat/bindy/csv/ test/data/ test/data3/ test/java/org...

Author: cmoulliard
Date: Wed Jul 15 12:09:00 2009
New Revision: 794245

URL: http://svn.apache.org/viewvc?rev=794245&view=rev
Log:
Add a new property in annotation DataField.java to define mandatory fields, generate exceptions in BindyCsvDataFormat when record is empty in case of missing mandatory fields.

Added:
    camel/trunk/components/camel-bindy/src/test/data3/
    camel/trunk/components/camel-bindy/src/test/data3/csv.txt   (with props)
    camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvMandatoryFieldsUnmarshallTest.java   (with props)
Modified:
    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/annotation/DataField.java
    camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
    camel/trunk/components/camel-bindy/src/test/data/csv.txt
    camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyComplexCsvUnmarshallTest.java
    camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvSkipFirstLineUnmarshallTest.java
    camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallDslTest.java
    camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java

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=794245&r1=794244&r2=794245&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 Wed Jul 15 12:09:00 2009
@@ -17,14 +17,34 @@
 package org.apache.camel.dataformat.bindy;
 
 import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.text.NumberFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.camel.dataformat.bindy.format.BigDecimalFormat;
+import org.apache.camel.dataformat.bindy.format.BigIntegerFormat;
+import org.apache.camel.dataformat.bindy.format.ByteFormat;
+import org.apache.camel.dataformat.bindy.format.BytePatternFormat;
+import org.apache.camel.dataformat.bindy.format.CharacterFormat;
+import org.apache.camel.dataformat.bindy.format.DatePatternFormat;
+import org.apache.camel.dataformat.bindy.format.DoubleFormat;
+import org.apache.camel.dataformat.bindy.format.DoublePatternFormat;
+import org.apache.camel.dataformat.bindy.format.FloatFormat;
+import org.apache.camel.dataformat.bindy.format.FloatPatternFormat;
+import org.apache.camel.dataformat.bindy.format.IntegerFormat;
+import org.apache.camel.dataformat.bindy.format.IntegerPatternFormat;
+import org.apache.camel.dataformat.bindy.format.LongFormat;
+import org.apache.camel.dataformat.bindy.format.LongPatternFormat;
+import org.apache.camel.dataformat.bindy.format.ShortFormat;
+import org.apache.camel.dataformat.bindy.format.ShortPatternFormat;
+import org.apache.camel.dataformat.bindy.format.StringFormat;
 import org.apache.camel.dataformat.bindy.util.AnnotationModelLoader;
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.util.ObjectHelper;
@@ -162,6 +182,36 @@
         
         return nf;
     }
+    
+    public static Object getDefaultValueforPrimitive(Class<?> clazz) throws Exception {
+        if (clazz == byte.class || clazz == Byte.class) {
+            return Byte.MIN_VALUE;
+        } else if (clazz == short.class || clazz == Short.class) {
+            return Short.MIN_VALUE;
+        } else if (clazz == int.class || clazz == Integer.class) {
+            return Integer.MIN_VALUE;
+        } else if (clazz == long.class || clazz == Long.class) {
+            return Long.MIN_VALUE;
+        } else if (clazz == float.class || clazz == Float.class) {
+            return Float.MIN_VALUE;
+        } else if (clazz == double.class || clazz == Double.class) {
+            return Double.MIN_VALUE;
+        } else if (clazz == BigDecimal.class) {
+            return BigDecimal.ZERO;
+        } else if (clazz == BigInteger.class) {
+            return BigInteger.ZERO;
+        } else if (clazz == String.class) {
+            return null;
+        } else if (clazz == Date.class) {
+            return null;
+        } else if (clazz == char.class || clazz == Character.class) {
+            return null;
+        } else if (clazz == boolean.class || clazz == Boolean.class) {
+        	return false;
+        } else {
+            throw new IllegalArgumentException("Can not find type corresponding : " + clazz.getCanonicalName());
+        }
+    }
 
     /**
      * Find the carriage return set

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=794245&r1=794244&r2=794245&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 Wed Jul 15 12:09:00 2009
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.jar.JarException;
 
 import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
 import org.apache.camel.dataformat.bindy.annotation.DataField;
@@ -48,6 +49,9 @@
     private Map<Integer, DataField> dataFields = new LinkedHashMap<Integer, DataField>();
     private Map<Integer, Field> annotedFields = new LinkedHashMap<Integer, Field>();
     private Map<String, Integer> sections = new HashMap<String, Integer>();
+    private int numberOptionalFields = 0;
+    private int numberMandatoryFields = 0;
+    private int totalFields = 0;
 
     private String separator;
     private boolean skipFirstLine;
@@ -95,6 +99,13 @@
                         LOG.debug("Position defined in the class : " + cl.getName() + ", position : "
                                   + dataField.pos() + ", Field : " + dataField.toString());
                     }
+                    
+                    if ( dataField.required() ) {
+                    	++numberMandatoryFields;
+                    } else {
+                    	++numberOptionalFields;
+                    }
+                    
                     dataFields.put(dataField.pos(), dataField);
                     annotedFields.put(dataField.pos(), field);
                 }
@@ -113,13 +124,75 @@
             if (!linkFields.isEmpty()) {
                 annotedLinkFields.put(cl.getName(), linkFields);
             }
+            
+            totalFields = numberMandatoryFields + numberOptionalFields;
+            
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Number of optional fields : " + numberOptionalFields);
+                LOG.debug("Number of mandatory fields : " + numberMandatoryFields);
+                LOG.debug("Total : " + totalFields);
+            }  
+            
         }
     }
 
-    public void bind(List<String> data, Map<String, Object> model) throws Exception {
+    public void bind(List<String> tokens, Map<String, Object> model) throws Exception {
 
         int pos = 0;
-        while (pos < data.size()) {
+        int counterMandatoryFields = 0;
+ 
+        for (String data : tokens) {
+        	
+        	// Get DataField from model
+            DataField dataField = dataFields.get(pos);
+            ObjectHelper.notNull(dataField, "No position " + pos + " defined for the field : " + data);
+            
+            if ( dataField.required()) {
+            	// Increment counter of mandatory fields
+            	++counterMandatoryFields;
+            	
+            	// Check if content of the field is empty
+            	// This is not possible for mandatory fields
+            	if ( data.equals("")) {
+            		throw new IllegalArgumentException("The mandatory field defined at the position " + pos + " is empty !");
+            	}
+            }
+            
+            // Get Field to be setted
+            Field field = annotedFields.get(pos);
+            field.setAccessible(true);
+            
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Pos : " + pos + ", Data : " + data + ", Field type : " + field.getType());
+            }
+            
+            Format<?> format;
+            
+            // Get pattern defined for the field
+            String pattern = dataField.pattern();
+            
+            // Create format object to format the field 
+            format = FormatFactory.getFormat(field.getType(), pattern, dataField.precision());
+            
+            // field object to be set
+            Object modelField = model.get(field.getDeclaringClass().getName());
+            
+            // format the data received
+            Object value = null;
+            
+            if ( ! data.equals("") ) {
+            	value = format.parse( data );
+            } else   {
+            	value = getDefaultValueforPrimitive(field.getType());
+            }
+            
+            field.set(modelField, value);
+            
+            ++pos;            
+            
+        }
+        
+/*        while (pos < data.size()) {
 
             // Set the field with the data received
             // Only when no empty line is provided
@@ -130,9 +203,14 @@
 
                 DataField dataField = dataFields.get(pos);
                 ObjectHelper.notNull(dataField, "No position defined for the field");
+                
+                if ( dataField.required()) {
+                	++counterMandatoryFields;
+                }
+                
                 Field field = annotedFields.get(pos);
                 field.setAccessible(true);
-
+                
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("Pos : " + pos + ", Data : " + data.get(pos) + ", Field type : " + field.getType());
                 }
@@ -153,8 +231,23 @@
                 
                 field.set(modelField, value);
             }
-            pos++;
+
+            ++pos;
+        }*/
+        
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Counter mandatory fields : " + counterMandatoryFields);
         }
+        
+     
+        if ( pos < totalFields ) {
+        	throw new IllegalArgumentException("Some fields are missing (optional or mandatory) !!");
+        }
+        
+        if ( counterMandatoryFields < numberMandatoryFields) {
+        	throw new IllegalArgumentException("Some mandatory fields are missing !!");
+        }
+        
     }
 
     public String unbind(Map<String, Object> model) throws Exception {

Modified: camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java?rev=794245&r1=794244&r2=794245&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java (original)
+++ camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java Wed Jul 15 12:09:00 2009
@@ -29,6 +29,7 @@
  * The length (optional) allows to define for fixed length message the size of the data's block
  * The precision(optional) reflects the precision to be used with BigDecimal number
  * The position (optional) identify the position of the field in the CSV generated
+ * The required (optional) property identifies a field which is mandatory.
  */
 @Documented
 @Retention(RetentionPolicy.RUNTIME)
@@ -77,5 +78,13 @@
      * @return int 
      */
     int position() default 0;
+    
+    /**
+     * 
+     * Indicates if the field is mandatory
+     * 
+     * @return boolean
+     */
+    boolean required() default false;
 
 }

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=794245&r1=794244&r2=794245&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 Wed Jul 15 12:09:00 2009
@@ -119,24 +119,44 @@
 
                 // Split the CSV record according to the separator defined in
                 // annotated class @CSVRecord
-                List<String> result = Arrays.asList(line.split(separator));
+                String[] tokens = line.split(separator, -1);
+                List<String> result = Arrays.asList(tokens);
                 
-                // Bind data from CSV record with model classes
-                factory.bind(result, model);
-
-                // Link objects together
-                factory.link(model);
-
-                // Add objects graph to the list
-                models.add(model);
+                if ( result.size() == 0 || result.isEmpty() ) {
+                	throw new java.lang.IllegalArgumentException("No records have been defined in the CSV !");
+                }
 
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("Graph of objects created : " + model);
+                if ( result.size() > 0 ) {
+                	
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("Size of the record splitted : " + result.size());
+                    }
+                	
+                    // Bind data from CSV record with model classes
+                    factory.bind(result, model);
+
+                    // Link objects together
+                    factory.link(model);
+
+                    // Add objects graph to the list
+                    models.add(model);
+
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("Graph of objects created : " + model);
+                    }
+                	
                 }
+ 
 
             }
-
-            return models;
+            
+            // 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.Exception("No records have been defined in the CSV !");
+        	} else {
+        		return models;
+        	}
 
         } finally {
             scanner.close();

Modified: camel/trunk/components/camel-bindy/src/test/data/csv.txt
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/data/csv.txt?rev=794245&r1=794244&r2=794245&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/test/data/csv.txt (original)
+++ camel/trunk/components/camel-bindy/src/test/data/csv.txt Wed Jul 15 12:09:00 2009
@@ -1,4 +1,3 @@
-
 01,,Albert,Cartier,ISIN,BE12345678,SELL,,1500,EUR,08-01-2009
 02,A1,,Preud'Homme,ISIN,XD12345678,BUY,,2500,USD,08-01-2009
 03,A2,Jacques,,,BE12345678,SELL,,1500,EUR,08-01-2009

Added: camel/trunk/components/camel-bindy/src/test/data3/csv.txt
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/data3/csv.txt?rev=794245&view=auto
==============================================================================
--- camel/trunk/components/camel-bindy/src/test/data3/csv.txt (added)
+++ camel/trunk/components/camel-bindy/src/test/data3/csv.txt Wed Jul 15 12:09:00 2009
@@ -0,0 +1,7 @@
+order nr,client ref,first name, last name,instrument code,instrument name,order type, instrument type, quantity,currency,date
+01,A0,Albert,Cartier,ISIN,,,,,EUR,08-01-2009
+02,A1,Jacques,Preud'Homme,,,BUY,,2500,USD,08-01-2009
+03,A2,Jacques,Delporte,,BE12345678,SELL,,1500,EUR,08-01-2009
+,blable,,,,,,,,,
+,,,,,,,,
+,,,,,
\ No newline at end of file

Propchange: camel/trunk/components/camel-bindy/src/test/data3/csv.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyComplexCsvUnmarshallTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyComplexCsvUnmarshallTest.java?rev=794245&r1=794244&r2=794245&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyComplexCsvUnmarshallTest.java (original)
+++ camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyComplexCsvUnmarshallTest.java Wed Jul 15 12:09:00 2009
@@ -17,6 +17,8 @@
 package org.apache.camel.dataformat.bindy.csv;
 
 import org.apache.camel.EndpointInject;
+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.spring.javaconfig.SingleRouteCamelConfiguration;
@@ -30,11 +32,29 @@
 @ContextConfiguration(locations = "org.apache.camel.dataformat.bindy.csv.BindyComplexCsvUnmarshallTest$ContextConfig", loader = JavaConfigContextLoader.class)
 public class BindyComplexCsvUnmarshallTest extends AbstractJUnit4SpringContextTests {
 
-    @EndpointInject(uri = "mock:result")
-    private MockEndpoint resultEndpoint;
+	private String record = "01,,Albert,Cartier,ISIN,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" +
+    "02,A1,,Preud'Homme,ISIN,XD12345678,BUY,,2500,USD,08-01-2009\r\n" +
+    "03,A2,Jacques,,,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" +
+    "04,A3,Michel,Dupond,,,BUY,,2500,USD,08-01-2009\r\n" +
+    "05,A4,Annie,Dutronc,ISIN,BE12345678,,,1500,EUR,08-01-2009\r\n" +
+    "06,A5,André,Rieux,ISIN,XD12345678,SELL,Share,,USD,08-01-2009\r\n" +
+    "07,A6,Mylène,Farmer,ISIN,BE12345678,BUY,1500,,,08-01-2009\r\n" +
+    "08,A7,Eva,Longoria,ISIN,XD12345678,SELL,Share,2500,USD,\r\n" +
+    ",,,D,,BE12345678,SELL,,,,08-01-2009\r\n" +
+    ",,,D,ISIN,BE12345678,,,,,08-01-2009\r\n" +
+    ",,,D,ISIN,LU123456789,,,,,\r\n" +
+    "10,A8,Pauline,M,ISIN,XD12345678,SELL,Share,2500,USD,08-01-2009\r\n" +
+    "10,A9,Pauline,M,ISIN,XD12345678,BUY,Share,2500.45,USD,08-01-2009";
+	
+	@EndpointInject(uri = "mock:result")
+	private MockEndpoint resultEndpoint;
+
+	@Produce(uri = "direct:start")
+	protected ProducerTemplate template;
 
     @Test
     public void testUnMarshallMessage() throws Exception {
+    	template.sendBody(record);
         resultEndpoint.expectedMessageCount(1);
         resultEndpoint.assertIsSatisfied();
     }
@@ -49,7 +69,10 @@
             return new RouteBuilder() {
                 @Override
                 public void configure() {
-                    from("file://src/test/data?noop=true").unmarshal(camelDataFormat).to("mock:result");
+                    //from("file://src/test/data?noop=true")
+                	from("direct:start")
+                    .unmarshal(camelDataFormat)
+                    .to("mock:result");
                 }
             };
         }

Added: camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvMandatoryFieldsUnmarshallTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvMandatoryFieldsUnmarshallTest.java?rev=794245&view=auto
==============================================================================
--- camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvMandatoryFieldsUnmarshallTest.java (added)
+++ camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvMandatoryFieldsUnmarshallTest.java Wed Jul 15 12:09:00 2009
@@ -0,0 +1,152 @@
+/**
+ * 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.csv;
+
+import static org.junit.Assert.fail;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.EndpointInject;
+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.spring.javaconfig.SingleRouteCamelConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Test;
+import org.springframework.config.java.annotation.Bean;
+import org.springframework.config.java.annotation.Configuration;
+import org.springframework.config.java.test.JavaConfigContextLoader;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
+import org.springframework.util.Assert;
+
+@ContextConfiguration(locations = "org.apache.camel.dataformat.bindy.csv.BindySimpleCsvMandatoryFieldsUnmarshallTest$ContextConfig", loader = JavaConfigContextLoader.class)
+public class BindySimpleCsvMandatoryFieldsUnmarshallTest extends AbstractJUnit4SpringContextTests {
+	
+	private static final transient Log LOG = LogFactory.getLog(BindySimpleCsvMandatoryFieldsUnmarshallTest.class);
+	
+	String header = "order nr,client ref,first name, last name,instrument code,instrument name,order type, instrument type, quantity,currency,date\r\n";
+	String record1 = "";
+	String record2 = ",,blabla,,,,,,,,";
+	String record3 = "1,A1,Charles,Moulliard,ISIN,LU123456789,,,,,";
+	String record4 = "1,A1,Charles,,ISIN,LU123456789,,,,,";
+	String record5 = ",,,,,,,,,,";
+
+    @EndpointInject(uri = "mock:result1")
+    protected MockEndpoint resultEndpoint1;
+    
+    @EndpointInject(uri = "mock:result2")
+    protected MockEndpoint resultEndpoint2;
+    
+    @Produce(uri = "direct:start1")
+    protected ProducerTemplate template1;
+    
+    @Produce(uri = "direct:start2")
+    protected ProducerTemplate template2;
+
+    @DirtiesContext
+    @Test
+    public void testEmptyRecord() throws Exception {
+    	resultEndpoint1.expectedMessageCount(0);
+    	
+    	try {
+    		template1.sendBody(record1);
+            fail("Should have thrown an exception");
+    	} catch (CamelExecutionException e) {
+    	   // Assert.isInstanceOf(java.lang.IllegalArgumentException.class, e.getCause());
+    		 Assert.isInstanceOf(Exception.class, e.getCause());
+    	  // LOG.info(">> Error : " + e);
+    	}
+    	
+        resultEndpoint1.assertIsSatisfied();
+    }
+    
+    @DirtiesContext
+    @Test
+    public void testEmptyFields() throws Exception {
+    	resultEndpoint1.expectedMessageCount(1);
+   		template1.sendBody(record2);
+    	
+        resultEndpoint1.assertIsSatisfied();
+    }
+    
+    @DirtiesContext
+    @Test
+    public void testOneOptionalField() throws Exception {
+    	resultEndpoint1.expectedMessageCount(1);
+    	
+    	template1.sendBody(record2);
+        resultEndpoint1.assertIsSatisfied();
+    }
+    
+    @DirtiesContext
+    @Test
+    public void testSeveralOptionalField() throws Exception {
+    	resultEndpoint1.expectedMessageCount(1);
+    	
+    	template1.sendBody(record3);
+        resultEndpoint1.assertIsSatisfied();
+    }
+    
+    @DirtiesContext
+    @Test
+    public void testMandatoryFields() throws Exception {
+    	resultEndpoint2.expectedMessageCount(1);
+    	
+    	template2.sendBody(header + record3);
+        resultEndpoint2.assertIsSatisfied();
+    }
+    
+    @DirtiesContext
+    @Test
+    public void testMissingMandatoryFields() throws Exception {
+    	resultEndpoint2.expectedMessageCount(1);
+    	
+    	try {
+    		template2.sendBody(header + record4);
+    		resultEndpoint2.assertIsSatisfied();
+    	} catch (CamelExecutionException e) {
+      	  //LOG.info(">> Error : " + e);
+      	}
+    }
+    
+    @Configuration
+    public static class ContextConfig extends SingleRouteCamelConfiguration {
+        BindyCsvDataFormat formatOptional = new BindyCsvDataFormat("org.apache.camel.dataformat.bindy.model.simple.oneclass");
+        BindyCsvDataFormat formatMandatory = new BindyCsvDataFormat("org.apache.camel.dataformat.bindy.model.simple.oneclassmandatory");
+
+        @Override
+        @Bean
+        public RouteBuilder route() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                	try {
+                		from("direct:start1").unmarshal(formatOptional).to("mock:result1");
+                		from("direct:start2").unmarshal(formatMandatory).to("mock:result2");
+                	} catch (Exception e) {
+                		//
+                	}
+                }
+            };
+        }
+    }
+}
+
+    
\ No newline at end of file

Propchange: camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvMandatoryFieldsUnmarshallTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvSkipFirstLineUnmarshallTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvSkipFirstLineUnmarshallTest.java?rev=794245&r1=794244&r2=794245&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvSkipFirstLineUnmarshallTest.java (original)
+++ camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvSkipFirstLineUnmarshallTest.java Wed Jul 15 12:09:00 2009
@@ -17,6 +17,8 @@
 package org.apache.camel.dataformat.bindy.csv;
 
 import org.apache.camel.EndpointInject;
+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.spring.javaconfig.SingleRouteCamelConfiguration;
@@ -29,11 +31,31 @@
 
 @ContextConfiguration(locations = "org.apache.camel.dataformat.bindy.csv.BindySimpleCsvSkipFirstLineUnmarshallTest$ContextConfig", loader = JavaConfigContextLoader.class)
 public class BindySimpleCsvSkipFirstLineUnmarshallTest extends AbstractJUnit4SpringContextTests {
-    @EndpointInject(uri = "mock:result")
-    private MockEndpoint resultEndpoint;
+	
+	private String record = "order nr,client ref,first name, last name,instrument code,instrument name,order type, instrument type, quantity,currency,date\r\n" +
+	"01,,Albert,Cartier,ISIN,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" +
+    "02,A1,,Preud'Homme,ISIN,XD12345678,BUY,,2500,USD,08-01-2009\r\n" +
+    "03,A2,Jacques,,,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" +
+    "04,A3,Michel,Dupond,,,BUY,,2500,USD,08-01-2009\r\n" +
+    "05,A4,Annie,Dutronc,ISIN,BE12345678,,,1500,EUR,08-01-2009\r\n" +
+    "06,A5,André,Rieux,ISIN,XD12345678,SELL,Share,,USD,08-01-2009\r\n" +
+    "07,A6,Mylène,Farmer,ISIN,BE12345678,BUY,1500,,,08-01-2009\r\n" +
+    "08,A7,Eva,Longoria,ISIN,XD12345678,SELL,Share,2500,USD,\r\n" +
+    ",,,D,,BE12345678,SELL,,,,08-01-2009\r\n" +
+    ",,,D,ISIN,BE12345678,,,,,08-01-2009\r\n" +
+    ",,,D,ISIN,LU123456789,,,,,\r\n" +
+    "10,A8,Pauline,M,ISIN,XD12345678,SELL,Share,2500,USD,08-01-2009\r\n" +
+    "10,A9,Pauline,M,ISIN,XD12345678,BUY,Share,2500.45,USD,08-01-2009";
+
+	@EndpointInject(uri = "mock:result")
+	private MockEndpoint resultEndpoint;
+
+	@Produce(uri = "direct:start")
+	protected ProducerTemplate template;
 
     @Test
     public void testUnMarshallMessage() throws Exception {
+    	template.sendBody(record);
         resultEndpoint.expectedMessageCount(1);
         resultEndpoint.assertIsSatisfied();
     }
@@ -48,7 +70,10 @@
             return new RouteBuilder() {
                 @Override
                 public void configure() {
-                    from("file://src/test/data2?noop=true").unmarshal(camelDataFormat).to("mock:result");
+                    //from("file://src/test/data2")
+                	from("direct:start")
+                    .unmarshal(camelDataFormat)
+                    .to("mock:result");
                 }
             };
         }

Modified: camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallDslTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallDslTest.java?rev=794245&r1=794244&r2=794245&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallDslTest.java (original)
+++ camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallDslTest.java Wed Jul 15 12:09:00 2009
@@ -17,6 +17,8 @@
 package org.apache.camel.dataformat.bindy.csv;
 
 import org.apache.camel.EndpointInject;
+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.model.dataformat.BindyType;
@@ -31,11 +33,29 @@
 @ContextConfiguration(locations = "org.apache.camel.dataformat.bindy.csv.BindySimpleCsvUnmarshallTest$ContextConfig", loader = JavaConfigContextLoader.class)
 public class BindySimpleCsvUnmarshallDslTest extends AbstractJUnit4SpringContextTests {
 
-    @EndpointInject(uri = "mock:result")
-    private MockEndpoint resultEndpoint;
+	private String record ="01,,Albert,Cartier,ISIN,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" +
+    "02,A1,,Preud'Homme,ISIN,XD12345678,BUY,,2500,USD,08-01-2009\r\n" +
+    "03,A2,Jacques,,,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" +
+    "04,A3,Michel,Dupond,,,BUY,,2500,USD,08-01-2009\r\n" +
+    "05,A4,Annie,Dutronc,ISIN,BE12345678,,,1500,EUR,08-01-2009\r\n" +
+    "06,A5,André,Rieux,ISIN,XD12345678,SELL,Share,,USD,08-01-2009\r\n" +
+    "07,A6,Mylène,Farmer,ISIN,BE12345678,BUY,1500,,,08-01-2009\r\n" +
+    "08,A7,Eva,Longoria,ISIN,XD12345678,SELL,Share,2500,USD,\r\n" +
+    ",,,D,,BE12345678,SELL,,,,08-01-2009\r\n" +
+    ",,,D,ISIN,BE12345678,,,,,08-01-2009\r\n" +
+    ",,,D,ISIN,LU123456789,,,,,\r\n" +
+    "10,A8,Pauline,M,ISIN,XD12345678,SELL,Share,2500,USD,08-01-2009\r\n" +
+    "10,A9,Pauline,M,ISIN,XD12345678,BUY,Share,2500.45,USD,08-01-2009";
+
+	@EndpointInject(uri = "mock:result")
+	private MockEndpoint resultEndpoint;
+
+	@Produce(uri = "direct:start")
+	protected ProducerTemplate template;
 
     @Test
     public void testUnMarshallMessage() throws Exception {
+    	template.sendBody(record);
         resultEndpoint.expectedMessageCount(1);
         resultEndpoint.assertIsSatisfied();
     }
@@ -48,7 +68,8 @@
             return new RouteBuilder() {
                 @Override
                 public void configure() {
-                    from("file://src/test/data?noop=true")
+                    //from("file://src/test/data?noop=true")
+                	from("direct:start")
                         .unmarshal().bindy(BindyType.Csv, "org.apache.camel.dataformat.bindy.model.simple.oneclass")
                         .to("mock:result");
                 }

Modified: camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java?rev=794245&r1=794244&r2=794245&view=diff
==============================================================================
--- camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java (original)
+++ camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java Wed Jul 15 12:09:00 2009
@@ -16,10 +16,16 @@
  */
 package org.apache.camel.dataformat.bindy.csv;
 
+import java.util.List;
+
 import org.apache.camel.EndpointInject;
+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.spring.javaconfig.SingleRouteCamelConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.junit.Test;
 import org.springframework.config.java.annotation.Bean;
 import org.springframework.config.java.annotation.Configuration;
@@ -29,14 +35,44 @@
 
 @ContextConfiguration(locations = "org.apache.camel.dataformat.bindy.csv.BindySimpleCsvUnmarshallTest$ContextConfig", loader = JavaConfigContextLoader.class)
 public class BindySimpleCsvUnmarshallTest extends AbstractJUnit4SpringContextTests {
+	
+	private static final transient Log LOG = LogFactory.getLog(BindySimpleCsvUnmarshallTest.class);
+	
+	private String record ="01,,Albert,Cartier,ISIN,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" +
+                            "02,A1,,Preud'Homme,ISIN,XD12345678,BUY,,2500,USD,08-01-2009\r\n" +
+                            "03,A2,Jacques,,,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" +
+                            "04,A3,Michel,Dupond,,,BUY,,2500,USD,08-01-2009\r\n" +
+                            "05,A4,Annie,Dutronc,ISIN,BE12345678,,,1500,EUR,08-01-2009\r\n" +
+                            "06,A5,André,Rieux,ISIN,XD12345678,SELL,Share,,USD,08-01-2009\r\n" +
+                            "07,A6,Mylène,Farmer,ISIN,BE12345678,BUY,1500,,,08-01-2009\r\n" +
+                            "08,A7,Eva,Longoria,ISIN,XD12345678,SELL,Share,2500,USD,\r\n" +
+                            ",,,D,,BE12345678,SELL,,,,08-01-2009\r\n" +
+                            ",,,D,ISIN,BE12345678,,,,,08-01-2009\r\n" +
+                            ",,,D,ISIN,LU123456789,,,,,\r\n" +
+                            "10,A8,Pauline,M,ISIN,XD12345678,SELL,Share,2500,USD,08-01-2009\r\n" +
+                            "10,A9,Pauline,M,ISIN,XD12345678,BUY,Share,2500.45,USD,08-01-2009";
 
     @EndpointInject(uri = "mock:result")
     private MockEndpoint resultEndpoint;
+    
+    @Produce(uri = "direct:start")
+    protected ProducerTemplate template;
 
     @Test
     public void testUnMarshallMessage() throws Exception {
-        resultEndpoint.expectedMessageCount(1);
+    	
+    	template.sendBody(record);
+ 
+        resultEndpoint.expectedMessageCount(1);        
         resultEndpoint.assertIsSatisfied();
+    	
+/*    	List<Exchange> exchanges = resultEndpoint.getExchanges(); 
+    	
+    	for(Exchange exchange : exchanges) {
+    		Object body = exchange.getOut().getBody();
+    		LOG.debug("Body received : " + body.toString());
+    	}*/
+
     }
 
     @Configuration
@@ -49,9 +85,12 @@
             return new RouteBuilder() {
                 @Override
                 public void configure() {
-                    from("file://src/test/data?noop=true").unmarshal(camelDataFormat).to("mock:result");
+                    //from("file://src/test/data?move=./target/done").unmarshal(camelDataFormat).to("mock:result");
+                	from("direct:start").unmarshal(camelDataFormat).to("mock:result");
                 }
             };
         }
     }
 }
+
+    
\ No newline at end of file



Re: svn commit: r794245 - in /camel/trunk/components/camel-bindy/src: main/java/org/apache/camel/dataformat/bindy/ main/java/org/apache/camel/dataformat/bindy/annotation/ main/java/org/apache/camel/dataformat/bindy/csv/ test/data/ test/data3/ test/java/org...

Posted by Willem Jiang <wi...@gmail.com>.
Hi Charles

I think you didn't comment the package of 
"org.apache.camel.dataformat.bindy.model.simple.oneclassmandatory"
So the test of BindySimpleCsvMandatoryFieldsUnmarshallTest is failed.

Please using "svn st" to double check the code with ? states before you 
commit the code :)

Willem

cmoulliard@apache.org wrote:
> Author: cmoulliard
> Date: Wed Jul 15 12:09:00 2009
> New Revision: 794245
> 
> URL: http://svn.apache.org/viewvc?rev=794245&view=rev
> Log:
> Add a new property in annotation DataField.java to define mandatory fields, generate exceptions in BindyCsvDataFormat when record is empty in case of missing mandatory fields.
> 
> Added:
>     camel/trunk/components/camel-bindy/src/test/data3/
>     camel/trunk/components/camel-bindy/src/test/data3/csv.txt   (with props)
>     camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvMandatoryFieldsUnmarshallTest.java   (with props)
> Modified:
>     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/annotation/DataField.java
>     camel/trunk/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
>     camel/trunk/components/camel-bindy/src/test/data/csv.txt
>     camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyComplexCsvUnmarshallTest.java
>     camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvSkipFirstLineUnmarshallTest.java
>     camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallDslTest.java
>     camel/trunk/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java
>