+ fix csv parser : ',' character are not removed anymore in quoted string correspondi...
authorBruno Sinou <bsinou@argeo.org>
Thu, 16 Jun 2011 15:48:26 +0000 (15:48 +0000)
committerBruno Sinou <bsinou@argeo.org>
Thu, 16 Jun 2011 15:48:26 +0000 (15:48 +0000)
+ fix user handling in JcrUtils

git-svn-id: https://svn.argeo.org/commons/trunk@4574 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

basic/runtime/org.argeo.basic.nodeps/.classpath
basic/runtime/org.argeo.basic.nodeps/build.properties
basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/util/CsvParser.java
basic/runtime/org.argeo.basic.nodeps/src/test/java/org/argeo/util/CsvParserWithQuotedSeparatorTest.java [new file with mode: 0644]
basic/runtime/org.argeo.basic.nodeps/src/test/resources/org/argeo/util/ReferenceFile.csv
eclipse/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/DownloadServiceHandler.java
eclipse/runtime/org.argeo.eclipse.ui.rap/src/main/java/org/argeo/eclipse/ui/specific/GenericUploadControl.java
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java

index 3bf070c69cfa5727c6f9142bb04801884d8126ec..f0a6d79aa9111244d25f94657aa71a463bae2977 100644 (file)
@@ -2,6 +2,7 @@
 <classpath>
        <classpathentry kind="src" output="target/classes" path="src/main/java"/>
        <classpathentry kind="src" path="src/test/java"/>
+       <classpathentry kind="src" path="src/test/resources"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
        <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
        <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
index 0b396f9128816fdbb2ec93e29f959c678076d458..5f242a355bb338e482b8e975b15a5c2b0568ede4 100644 (file)
@@ -1,4 +1,5 @@
 source.. = src/main/java/,\
+           src/test/resources/,\
            src/test/java/
 bin.includes = META-INF/,\
                .
index ca81bc98305700e3be83f5ebac44c02f8718f40b..9acbfe246ce07ec67da94721fa25b7c23a5e7a9e 100644 (file)
@@ -111,7 +111,7 @@ public abstract class CsvParser {
                        StringBuffer currStr, Boolean wasInquote) {
                // List<String> tokens = new ArrayList<String>();
 
-               //System.out.println("#LINE: " + str);
+               // System.out.println("#LINE: " + str);
 
                if (wasInquote)
                        currStr.append('\n');
@@ -126,6 +126,11 @@ public abstract class CsvParser {
                                        tokens.add(currStr.toString());
                                        //System.out.println("# TOKEN: " + currStr);
                                        currStr.delete(0, currStr.length());
+                               } else {
+                                       // we don't remove separator that are in a quoted substring
+                                       // System.out
+                                       // .println("IN QUOTE, got a separator: [" + c + "]");
+                                       currStr.append(c);
                                }
                        } else if (c == quote) {
                                if (inQuote && (i + 1) < arr.length && arr[i + 1] == quote) {
@@ -142,7 +147,7 @@ public abstract class CsvParser {
 
                if (!inQuote) {
                        tokens.add(currStr.toString());
-                       //System.out.println("# TOKEN: " + currStr);
+                       // System.out.println("# TOKEN: " + currStr);
                }
                // if (inQuote)
                // throw new ArgeoException("Missing quote at the end of the line "
diff --git a/basic/runtime/org.argeo.basic.nodeps/src/test/java/org/argeo/util/CsvParserWithQuotedSeparatorTest.java b/basic/runtime/org.argeo.basic.nodeps/src/test/java/org/argeo/util/CsvParserWithQuotedSeparatorTest.java
new file mode 100644 (file)
index 0000000..fb77075
--- /dev/null
@@ -0,0 +1,63 @@
+package org.argeo.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+public class CsvParserWithQuotedSeparatorTest extends TestCase {
+       public void testSimpleParse() throws Exception {
+               String toParse = "Header1,\"Header2\",Header3,\"Header4\"\n"
+                               + "\"Col1, Col2\",\"Col\n2\",Col3,\"\"\"Col4\"\"\"\n";
+
+               InputStream in = new ByteArrayInputStream(toParse.getBytes());
+
+               CsvParser csvParser = new CsvParser() {
+                       protected void processLine(Integer lineNumber, List<String> header,
+                                       List<String> tokens) {
+                               assertEquals(header.size(), tokens.size());
+                               assertEquals(4, tokens.size());
+                               assertEquals("Col1, Col2", tokens.get(0));
+                       }
+               };
+               // System.out.println(toParse);
+               csvParser.parse(in);
+               in.close();
+
+       }
+
+       public void testParseFile() throws Exception {
+
+               final Map<Integer, Map<String, String>> lines = new HashMap<Integer, Map<String, String>>();
+               InputStream in = getClass().getResourceAsStream(
+                               "/org/argeo/util/ReferenceFile.csv");
+
+               CsvParserWithLinesAsMap parser = new CsvParserWithLinesAsMap() {
+                       protected void processLine(Integer lineNumber,
+                                       Map<String, String> line) {
+                               // System.out.println("processing line #" + lineNumber);
+                               lines.put(lineNumber, line);
+                       }
+               };
+
+               parser.parse(in);
+               in.close();
+
+               Map<String, String> line = lines.get(2);
+               assertEquals(",,,,", line.get("Coma testing"));
+               line = lines.get(3);
+               assertEquals(",, ,,", line.get("Coma testing"));
+               line = lines.get(4);
+               assertEquals("module1, module2", line.get("Coma testing"));
+               line = lines.get(5);
+               assertEquals("module1,module2", line.get("Coma testing"));
+               line = lines.get(6);
+               assertEquals(",module1,module2, \nmodule3, module4",
+                               line.get("Coma testing"));
+               assertEquals(5, lines.size());
+
+       }
+}
index dc2f246bd9db8be2581808d3871d930c74208597..351453d1052bb6e2c04ce3a3b367f95bc92feca3 100644 (file)
@@ -1,22 +1,23 @@
-"ID","A long Text","Name","Other","Number","Reference","Target","Date","Update","Language","ID Ref","weird chars","line feeds","after line feed","Empty column","Status comment","Comments","Empty"
-"AK251","Everything & with some line feed \n more “some” quote","B TY",,78.6,"A1155222221111268515131",,12/12/12,03/12/08,,9821308500721,"%%%ùù","ao","alf",,,"Bruno/Antoine what is the real identity?",
+"ID","A long Text","Name","Other","Number","Reference","Target","Date","Update","Language","ID Ref","Weird chars","line feeds","after line feed","Empty column","Status comment","Comments","Empty","Coma testing"
+"AK251","Everything & with some line feed 
+ more “some” quote","Marge S.",,78.6,"A1155222221111268515131",,12/12/12,03/12/08,,9821308500721,"%%%ùù","ao","Nothing special",,,"Some very usefull comment",,",,,,"
 "AG254","same","Roger “wallace” Big","15 – JI",78.5,"A1155222221111268515131","next milestone",12/12/12,03/12/08,"_fr (French - France)",9812309500953,"***µ”","a
 
 
 
 
-o","alf",,"Do the job",,
+o","after line feed",,"Do the job",,,",, ,,"
 "FG211","Very long text with some bullets.
 1 first
 2 second
-3. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long","None","15 – JI",15.4,"A1155222221111268515131","next milestone",12/12/12,03/12/08,"_fr (French - France)",9812309500952,"///","a
+3. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long. some more very very very long","Father & Son","15 – JI",15.4,"A1155222221111268515131","next milestone",12/12/12,03/12/08,"_fr (French - France)",9812309500952,"///","a
 
 
 
 
 
 
-o","alf",,"Be fast",,
+o","module1,module2",,"Be fast",,,"module1, module2"
 "RRT152","Very long text with some bullets.
 1 first
 2 second
@@ -25,7 +26,12 @@ o","alf",,"Be fast",,
 o
 
 
-","alf",,,,
+","module1,module2",,,,,"module1,module2"
 "YU121","Another use case : “blank line”
 
-After the blank.","nothing with brackets( )","15 – JI",15.2,"A1155222221111268515131",,12/12/12,03/12/08,"_fr (French - France)",9812309500925,",;:?./","ao","alf",,,,
+After the blank.","nothing with brackets( )","15 – JI",15.2,"A1155222221111268515131",,12/12/12,03/12/08,"_fr (French - France)",9812309500925,",;:?./","ao","
+
+
+
+After line feed again",,,,,",module1,module2, 
+module3, module4"
index 7d47d5652db00dc11dba7835f9ff28f7fc0f4d6f..0c7eac67f1415f702127d33307c4a499a1d5239b 100644 (file)
@@ -31,6 +31,8 @@ public class DownloadServiceHandler implements IServiceHandler {
                response.setContentLength(download.length);
                String contentDisposition = "attachment; filename=\"" + fileName + "\"";
                response.setHeader("Content-Disposition", contentDisposition);
+               // response.setHeader( "Cache-Control", "no-cache" );
+
                try {
                        response.getOutputStream().write(download);
                } catch (IOException ioe) {
index 6fcd21a89eca47304c8985cb9d4b13343976a062..aff7c5ac35fe0ad14a6f3332b32d90ee30196ac1 100644 (file)
@@ -31,7 +31,7 @@ public class GenericUploadControl extends Composite {
 
                upload = new Upload(parent, SWT.BORDER);
                upload.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-               upload.setBrowseButtonText(browseLabel);
+               // upload.setBrowseButtonText(browseLabel);
                // upload.addModifyListener(new UploadListener());
                parent.pack();
        }
@@ -49,6 +49,11 @@ public class GenericUploadControl extends Composite {
        public byte[] performUpload() {
                boolean success = upload.performUpload();
                if (success) {
+                       if (upload.getUploadItem().getFileSize() == -1)
+                               throw new ArgeoException("File "
+                                               + upload.getUploadItem().getFileName()
+                                               + "has not been uploaded : its size = -1");
+
                        InputStream inStream = null;
                        byte[] fileBA = null;
                        try {
index b03be7396bdce3cd4b17733bd73058d5692d60d7..19a3f7703b8677b3584324d26e3cec5a28940745 100644 (file)
@@ -858,7 +858,8 @@ public class JcrUtils implements ArgeoJcrConstants {
                                } catch (Exception e) {
                                        // we use this workaround to be sure to get the stack trace
                                        // to identify the sink of the bug.
-                                       log.warn("trying to create an already existing userHome. Stack trace : ");
+                                       log.warn("trying to create an already existing userHome at path:"
+                                                       + homePath + ". Stack trace : ");
                                        e.printStackTrace();
                                }
                        }
@@ -866,8 +867,8 @@ public class JcrUtils implements ArgeoJcrConstants {
                        Node userHome = JcrUtils.mkdirs(session, homePath);
                        Node userProfile;
                        if (userHome.hasNode(ArgeoNames.ARGEO_PROFILE)) {
-                               log.warn("User profile node already exists. We do not add a new one");
-
+                               log.warn("userProfile node already exists for userHome path: "
+                                               + homePath + ". We do not add a new one");
                        } else {
                                userProfile = userHome.addNode(ArgeoNames.ARGEO_PROFILE);
                                userProfile.addMixin(ArgeoTypes.ARGEO_USER_PROFILE);