From 1d25d874397020c67ff4eb17ca609e9e28a78b45 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Thu, 26 Jan 2012 07:48:50 +0000
Subject: [PATCH] BSSE#1017477 fixed: Empty cells are now empty strings.
 Exception message improved in case of column header uniqueness check.

SVN: 24287
---
 .../cisd/common/parser/ExcelFileLoader.java   |   5 +++--
 .../cisd/common/parser/ExcelRowTokenizer.java |   4 ++++
 .../common/parser/ExcelRowTokenizerTest.java  |  10 +++++++++-
 .../parser/excel-row-tokenizer-test.xls       | Bin 6656 -> 13824 bytes
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/common/source/java/ch/systemsx/cisd/common/parser/ExcelFileLoader.java b/common/source/java/ch/systemsx/cisd/common/parser/ExcelFileLoader.java
index e0f22f625a5..967a4caf8da 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/ExcelFileLoader.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/ExcelFileLoader.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.common.parser;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -302,8 +303,8 @@ public class ExcelFileLoader<T>
         {
             if (unique.add(token.toLowerCase()) == false)
             {
-                throw new IllegalArgumentException(String.format("Duplicated column name '%s'.",
-                        token));
+                throw new IllegalArgumentException(String.format("Duplicated column name '%s': %s" ,
+                        token, Arrays.asList(tokens)));
             }
         }
     }
diff --git a/common/source/java/ch/systemsx/cisd/common/parser/ExcelRowTokenizer.java b/common/source/java/ch/systemsx/cisd/common/parser/ExcelRowTokenizer.java
index 4ba1ff38fb2..4f135349e20 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/ExcelRowTokenizer.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/ExcelRowTokenizer.java
@@ -40,6 +40,10 @@ public class ExcelRowTokenizer implements ILineTokenizer<Row>
     public static String[] tokenizeRow(Row row)
     {
         String[] line = new String[row.getLastCellNum()];
+        for (int i = 0; i < line.length; i++)
+        {
+            line[i] = "";
+        }
         for (Cell cell : row)
         {
             String value = extractCellValue(cell).trim();
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/ExcelRowTokenizerTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/parser/ExcelRowTokenizerTest.java
index 77f7e04ef9a..94ef6469c2f 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/parser/ExcelRowTokenizerTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/parser/ExcelRowTokenizerTest.java
@@ -52,6 +52,14 @@ public class ExcelRowTokenizerTest extends AssertJUnit
         assertEquals("Meh blah & so on", line2[1]);
         assertEquals("no", line2[2]);
 
+        String[] line3 = ExcelRowTokenizer.tokenizeRow(row.get(2));
+        assertEquals("42", line3[0]);
+        assertEquals("The question", line3[1]);
+        assertEquals("", line3[2]);
+        assertEquals("", line3[3]);
+        assertEquals("", line3[4]);
+        assertEquals("hello", line3[5]);
+        assertEquals(6, line3.length);
     }
 
     private List<Row> getRows() throws Exception
@@ -65,7 +73,7 @@ public class ExcelRowTokenizerTest extends AssertJUnit
             POIFSFileSystem poifsFileSystem = new POIFSFileSystem(stream);
             HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
             final HSSFSheet sheet = workbook.getSheetAt(0);
-            return Arrays.<Row> asList(sheet.getRow(0), sheet.getRow(1));
+            return Arrays.<Row> asList(sheet.getRow(0), sheet.getRow(1), sheet.getRow(2));
         } finally
         {
             IOUtils.closeQuietly(stream);
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/parser/excel-row-tokenizer-test.xls b/common/sourceTest/java/ch/systemsx/cisd/common/parser/excel-row-tokenizer-test.xls
index 9f9856b9cd84cd5aae9400a7b414f0e5e8fa01dd..196ec626870ea3e8213c0a55e6935df6929f1dd1 100644
GIT binary patch
literal 13824
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
Mw%NCYW5WXf2GI!XSO5S3

delta 1739
zcmZWqZA_b06h8Om_5;dChcHX&9IfMH4mM!u>SP;4mn=de8k`toqyr+$piTvXWbjrU
z2}3ljchdT6?J|MHAH*~<XyVEbqr~_X!!i;hA;y@Qm<$snb538M^Og=jZt~D`&U4PW
z_ndR@OQ<JQH(4*V_YZw0><%LO%P<U;t$7mdT1=d8_lIRq?&*=Gm4Uf0L<abUJT)YT
zlv7HrHb>o(L*jnbZ_&3s2<|q(O8}a(XpiaJA>9qQfFi&R6ayY$2XGIt6DR?^fDgDA
z*aegVWk5Ml0qh3u1NH!wKozhT*auVtH9#$}AE*ORiO+Zd!U4daG8hN(`w&pSsUJ>w
z_c}z_T5*??s439%!YhGb$<g4+-axQxKs8#QQY}`iidySMOkK4;B1pMyZV%b$c-Kpv
zfncBp<t>s%hCazvW2qLK8*Zom=N1FG<(9Z+JC~s*9W9v@B137C3KG9NEJAB_gmVts
z&XR<?RE;^hZjdJJ^p%w;n>r#BHqrpG{#%Z>&vrxna>huGg{Eok#7v9<Id*htATroL
z5Q##T&(HAAX3N*JJ0kv&kt`WDl5CrPF)r4SXZFo$a>4fS%W(lY#<_hXMv^(9qrCPD
z)si>m&FS4Tc{sNt5_)<j_GiOJF*(Wk8s&Ih2<ZFp;uP~7%(sPqJ1D?=nREVQ4*b<p
zY1bmM8ynvG;0@o(&W+;EE0?7PA4hMqV43~r!OP|@(uobRQW-T*9g?lk<Bc1|9Pn!-
zF3=ca8wbo3jnX<Q9DjR4E<)#oEVGTXE?np$j%C~RP5*!LbKuO~;mZZ}UmDf#Buo?F
z%r&ojGTEkZ65ik#0?z*MtSN8#hEQ3#ShbalHt;;@=5F$SgSaSSzCN8xsSXmg=|=MP
z@l*$wz;j{#Zrywt#2r{fg6r?49L%m@m+$vnnt~rud%4-d^a$8w=N2K(x^P(*Lae|B
zWsf$B)a4?&iG0sMkKL%1Y{MHMC*E5F{5Ehn19!SkhcP_@7YL$|<QWgHjmzVp*l{en
zOsnry3O{&mIUYoEaB4yx+tgY95i)9}^oZEj4cn<#Q4kg%HVS=~bsRda>zDy?Fb8k~
zUO#{O-1%68!#fN66DKZCu`^$)dG>>zPLT5E5v0~K_~5=)!Tuc2R`>05=Ey!m{+r;J
zW<RGk6vZP&M{xhqa#q;r0yh5bV2;4PV6nJ<dduerKi4sA9)`aN+)^G*K7ROsQSduD
zQ#|J!1k!hgeaF5n672;AViYpR<96lcTP^H5rri1ESzL)Tn`kLpHRbo{aeOl|Pa*J^
z=ej(WdfG&*N6c{iI(nbPv(2Jmd_Z`G3-fTdq^Wb%ciXpgq!;AKgBR|DmTGsZdHkO3
znpqEJU`NhGCBo3y$l4vF_&9Gw%QE>wb)<5)C{!may_wg@PG?{(P+wN=&(+KrfrCL3
zD!0lPuJI^Ob>FuCeuhcKs}ER{kMlpF#7gxpp|rXy;o3gSAtY;6-m0d=C$;tBZ{sBI
AI{*Lx

-- 
GitLab