Repository: incubator-unomi
Updated Branches:
  refs/heads/master 4ee8adb1c -> bc064864d


UNOMI-102 : Use  OpenCsv as an RFC4180 parser


Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/bc064864
Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/bc064864
Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/bc064864

Branch: refs/heads/master
Commit: bc064864dce1b2bdf79ed531b9029a504590e7f5
Parents: 4ee8adb
Author: Abdelkader Midani <amid...@apache.org>
Authored: Wed Aug 2 04:31:56 2017 +0200
Committer: Abdelkader Midani <amid...@apache.org>
Committed: Wed Aug 2 04:31:56 2017 +0200

----------------------------------------------------------------------
 .../org/apache/unomi/router/api/RouterUtils.java |  7 +++++++
 extensions/router/router-core/pom.xml            | 19 +++++++++++++++++++
 .../core/processor/LineSplitProcessor.java       | 12 ++++++++++--
 .../services/ProfileExportServiceImpl.java       | 11 ++++++++---
 4 files changed, 44 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/bc064864/extensions/router/router-api/src/main/java/org/apache/unomi/router/api/RouterUtils.java
----------------------------------------------------------------------
diff --git 
a/extensions/router/router-api/src/main/java/org/apache/unomi/router/api/RouterUtils.java
 
b/extensions/router/router-api/src/main/java/org/apache/unomi/router/api/RouterUtils.java
index b9df06d..4584d76 100644
--- 
a/extensions/router/router-api/src/main/java/org/apache/unomi/router/api/RouterUtils.java
+++ 
b/extensions/router/router-api/src/main/java/org/apache/unomi/router/api/RouterUtils.java
@@ -59,4 +59,11 @@ public class RouterUtils {
         }
         return null;
     }
+
+    public static String removeQuotes(String propValue) {
+        if(propValue.charAt(0) == '"' && 
propValue.charAt(propValue.length()-1) == '"') {
+            return propValue.substring(1, propValue.length()-1);
+        }
+        return propValue;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/bc064864/extensions/router/router-core/pom.xml
----------------------------------------------------------------------
diff --git a/extensions/router/router-core/pom.xml 
b/extensions/router/router-core/pom.xml
index 34550d7..96c1c01 100644
--- a/extensions/router/router-core/pom.xml
+++ b/extensions/router/router-core/pom.xml
@@ -113,6 +113,25 @@
             <version>3.5</version>
         </dependency>
         <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.1.1</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.opencsv</groupId>
+            <artifactId>opencsv</artifactId>
+            <version>3.10</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.servicemix.bundles</groupId>
             <artifactId>org.apache.servicemix.bundles.jsch</artifactId>
             <version>0.1.54_1</version>

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/bc064864/extensions/router/router-core/src/main/java/org/apache/unomi/router/core/processor/LineSplitProcessor.java
----------------------------------------------------------------------
diff --git 
a/extensions/router/router-core/src/main/java/org/apache/unomi/router/core/processor/LineSplitProcessor.java
 
b/extensions/router/router-core/src/main/java/org/apache/unomi/router/core/processor/LineSplitProcessor.java
index 9e0fb66..dcd8374 100644
--- 
a/extensions/router/router-core/src/main/java/org/apache/unomi/router/core/processor/LineSplitProcessor.java
+++ 
b/extensions/router/router-core/src/main/java/org/apache/unomi/router/core/processor/LineSplitProcessor.java
@@ -16,6 +16,8 @@
  */
 package org.apache.unomi.router.core.processor;
 
+import com.opencsv.RFC4180Parser;
+import com.opencsv.RFC4180ParserBuilder;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.component.kafka.KafkaConstants;
@@ -79,7 +81,11 @@ public class LineSplitProcessor implements Processor {
             return;
         }
 
-        String[] profileData = ((String) 
exchange.getIn().getBody()).split(columnSeparator, -1);
+        RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder()
+                .withSeparator(columnSeparator.charAt(0))
+                .build();
+
+        String[] profileData = rfc4180Parser.parseLine(((String) 
exchange.getIn().getBody()));
         ProfileToImport profileToImport = new ProfileToImport();
         profileToImport.setItemId(UUID.randomUUID().toString());
         profileToImport.setItemType("profile");
@@ -100,11 +106,13 @@ public class LineSplitProcessor implements Processor {
                                 String multivalueArray = 
profileData[fieldsMapping.get(fieldMappingKey)].trim();
                                 if 
(StringUtils.isNoneBlank(multiValueDelimiter) && multiValueDelimiter.length() 
== 2) {
                                     multivalueArray = 
multivalueArray.replaceAll("\\" + multiValueDelimiter.charAt(0), 
"").replaceAll("\\" + multiValueDelimiter.charAt(1), "");
+                                    multivalueArray = 
RouterUtils.removeQuotes(multivalueArray);
                                 }
                                 String[] valuesArray = 
multivalueArray.split("\\" + multiValueSeparator);
                                 properties.put(fieldMappingKey, valuesArray);
                             } else {
-                                properties.put(fieldMappingKey, 
profileData[fieldsMapping.get(fieldMappingKey)].trim());
+                                String singleValue = 
profileData[fieldsMapping.get(fieldMappingKey)].trim();
+                                properties.put(fieldMappingKey, 
RouterUtils.removeQuotes(singleValue));
                             }
                         } else if 
(propertyType.getValueTypeId().equals("boolean")) {
                             properties.put(fieldMappingKey, new 
Boolean(profileData[fieldsMapping.get(fieldMappingKey)].trim()));

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/bc064864/extensions/router/router-service/src/main/java/org/apache/unomi/router/services/ProfileExportServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/extensions/router/router-service/src/main/java/org/apache/unomi/router/services/ProfileExportServiceImpl.java
 
b/extensions/router/router-service/src/main/java/org/apache/unomi/router/services/ProfileExportServiceImpl.java
index 832ed46..9e5b792 100644
--- 
a/extensions/router/router-service/src/main/java/org/apache/unomi/router/services/ProfileExportServiceImpl.java
+++ 
b/extensions/router/router-service/src/main/java/org/apache/unomi/router/services/ProfileExportServiceImpl.java
@@ -68,13 +68,14 @@ public class ProfileExportServiceImpl extends 
AbstractCustomServiceImpl implemen
         for (int i = 0; i < mapping.size(); i++) {
             String propertyName = mapping.get(String.valueOf(i));
             PropertyType propType = 
RouterUtils.getPropertyTypeById(propertiesDef, propertyName);
+            Object propertyValue = profile.getProperty(propertyName);
             if (BooleanUtils.isTrue(propType.isMultivalued())) {
-                List<String> multiValue = (List<String>) 
profile.getProperty(propertyName);
+                List<String> multiValue = (List<String>) propertyValue;
 
                 lineToWrite += 
StringUtils.isNotBlank(exportConfiguration.getMultiValueDelimiter()) ? 
exportConfiguration.getMultiValueDelimiter().charAt(0) : "";
                 int j = 0;
                 for (String entry : multiValue) {
-                    lineToWrite += entry;
+                    lineToWrite += entry.replaceAll("\"", "\"\"");
                     if (j + 1 < multiValue.size()) {
                         lineToWrite += 
exportConfiguration.getMultiValueSeparator();
                     }
@@ -83,7 +84,11 @@ public class ProfileExportServiceImpl extends 
AbstractCustomServiceImpl implemen
                 lineToWrite += 
StringUtils.isNotBlank(exportConfiguration.getMultiValueDelimiter()) ? 
exportConfiguration.getMultiValueDelimiter().charAt(1) : "";
 
             } else {
-                lineToWrite += profile.getProperty(propertyName) != null ? 
profile.getProperty(propertyName) : "";
+                propertyValue = propertyValue.toString().replaceAll("\"", 
"\"\"");
+                if (StringUtils.contains(propertyValue.toString(), 
exportConfiguration.getColumnSeparator())) {
+                    propertyValue = "\"" + propertyValue + "\"";
+                }
+                lineToWrite += propertyValue.toString() != null ? 
propertyValue.toString() : "";
             }
             if (i + 1 < mapping.size()) {
                 lineToWrite += exportConfiguration.getColumnSeparator();

Reply via email to