Repository: incubator-unomi
Updated Branches:
  refs/heads/master d2e1b724b -> 484c9fe53


UNOMI-33: Profile CSV export should contain custom properties as well (e.g. set 
by form mapping)


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

Branch: refs/heads/master
Commit: 484c9fe53b7c697741260d9a541eec760d124382
Parents: d2e1b72
Author: Quentin Lamerand <[email protected]>
Authored: Mon Jun 27 18:08:34 2016 +0200
Committer: Quentin Lamerand <[email protected]>
Committed: Mon Jun 27 18:08:34 2016 +0200

----------------------------------------------------------------------
 .../services/services/ProfileServiceImpl.java   | 30 +++++++++++++-------
 1 file changed, 20 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/484c9fe5/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
 
b/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
index 8b4f055..aa756b6 100644
--- 
a/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
+++ 
b/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
@@ -308,15 +308,25 @@ public class ProfileServiceImpl implements 
ProfileService, SynchronousBundleList
 
     public String exportProfilesPropertiesToCsv(Query query) {
         StringBuilder sb = new StringBuilder();
-        Set<PropertyType> profileProperties = 
getExistingProperties("profileProperties", Profile.ITEM_TYPE);
-        PropertyType[] propertyTypes = profileProperties.toArray(new 
PropertyType[profileProperties.size()]);
+        Set<PropertyType> propertyTypes = 
getExistingProperties("profileProperties", Profile.ITEM_TYPE);
         PartialList<Profile> profiles = search(query, Profile.class);
 
+        HashMap<String, PropertyType> propertyTypesById = new 
LinkedHashMap<>();
+        for (PropertyType propertyType : propertyTypes) {
+            propertyTypesById.put(propertyType.getMetadata().getId(), 
propertyType);
+        }
+        for (Profile profile : profiles.getList()) {
+            for (String key : profile.getProperties().keySet()) {
+                if (!propertyTypesById.containsKey(key)) {
+                    propertyTypesById.put(key, null);
+                }
+            }
+        }
+
         sb.append("profileId;");
         // headers
-        for (int i = 0; i < propertyTypes.length; i++) {
-            PropertyType propertyType = propertyTypes[i];
-            sb.append(propertyType.getMetadata().getId());
+        for (String propertyId : propertyTypesById.keySet()) {
+            sb.append(propertyId);
             sb.append(";");
         }
         sb.append("segments\n");
@@ -325,10 +335,10 @@ public class ProfileServiceImpl implements 
ProfileService, SynchronousBundleList
         for (Profile profile : profiles.getList()) {
             sb.append(profile.getItemId());
             sb.append(";");
-            for (int i = 0; i < propertyTypes.length; i++) {
-                PropertyType propertyType = propertyTypes[i];
-                if 
(profile.getProperties().get(propertyType.getMetadata().getId()) != null) {
-                    handleExportProperty(sb, 
profile.getProperties().get(propertyType.getMetadata().getId()), propertyType);
+            for (Map.Entry<String, PropertyType> propertyIdAndType : 
propertyTypesById.entrySet()) {
+                String propertyId = propertyIdAndType.getKey();
+                if (profile.getProperties().get(propertyId) != null) {
+                    handleExportProperty(sb, 
profile.getProperties().get(propertyId), propertyIdAndType.getValue());
                 } else {
                     sb.append("");
                 }
@@ -347,7 +357,7 @@ public class ProfileServiceImpl implements ProfileService, 
SynchronousBundleList
 
     // TODO may be moved this in a specific Export Utils Class and improve it 
to handle date format, ...
     private void handleExportProperty(StringBuilder sb, Object propertyValue, 
PropertyType propertyType) {
-        if (propertyValue instanceof Collection && 
propertyType.isMultivalued()) {
+        if (propertyValue instanceof Collection && propertyType != null && 
propertyType.isMultivalued()) {
             Collection propertyValues = (Collection) propertyValue;
             Collection encodedValues = new ArrayList(propertyValues.size());
             for (Object value : propertyValues) {

Reply via email to