You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by jk...@apache.org on 2019/01/04 12:14:45 UTC

incubator-unomi git commit: UNOMI-217 merge system properties during profile merge [Forced Update!]

Repository: incubator-unomi
Updated Branches:
  refs/heads/master 44c820370 -> d3b1e950d (forced update)


UNOMI-217 merge system properties during profile merge


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

Branch: refs/heads/master
Commit: d3b1e950d7f1ec6c1efe876b69160da007a23dc2
Parents: 4b447c2
Author: Kevan <ke...@jahia.com>
Authored: Fri Jan 4 13:10:06 2019 +0100
Committer: Kevan <ke...@jahia.com>
Committed: Fri Jan 4 13:13:41 2019 +0100

----------------------------------------------------------------------
 .../services/services/ProfileServiceImpl.java   | 51 ++++++++++++++++++++
 1 file changed, 51 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/d3b1e950/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 92c80b8..1e79c68 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
@@ -628,10 +628,16 @@ public class ProfileServiceImpl implements ProfileService, SynchronousBundleList
 
         }
 
+        // merge System properties
+        for (Profile profile : profilesToMerge) {
+            masterProfileChanged = mergeSystemProperties(masterProfile.getSystemProperties(), profile.getSystemProperties()) || masterProfileChanged;
+        }
+
         // we now have to merge the profile's segments
         for (Profile profile : profilesToMerge) {
             if (profile.getSegments() != null && profile.getSegments().size() > 0) {
                 masterProfile.getSegments().addAll(profile.getSegments());
+                // TODO better segments diff calculation
                 masterProfileChanged = true;
             }
         }
@@ -1010,4 +1016,49 @@ public class ProfileServiceImpl implements ProfileService, SynchronousBundleList
         return changed;
     }
 
+    private boolean mergeSystemProperties(Map<String, Object> targetProperties, Map<String, Object> toBeMergeProperties) {
+        boolean changed = false;
+        for (Map.Entry<String, Object> toBeMergeProperty : toBeMergeProperties.entrySet()) {
+            if (toBeMergeProperty.getValue() != null) {
+                if (!targetProperties.containsKey(toBeMergeProperty.getKey())) {
+                    targetProperties.put(toBeMergeProperty.getKey(), toBeMergeProperty.getValue());
+                    changed = true;
+                } else {
+                    Object targetProperty = targetProperties.get(toBeMergeProperty.getKey());
+
+                    if (targetProperty instanceof Map && toBeMergeProperty.getValue() instanceof Map) {
+                        // merge Maps like "goals", "campaigns"
+                        @SuppressWarnings("unchecked")
+                        Map<String, Object> mapToBeMergeProp = (Map<String, Object>) toBeMergeProperty.getValue();
+                        @SuppressWarnings("unchecked")
+                        Map<String, Object> mapTargetProp = (Map<String, Object>) targetProperty;
+
+                        for (Map.Entry<String, ?> mapToBeMergeEntry : mapToBeMergeProp.entrySet()) {
+                            if (!mapTargetProp.containsKey(mapToBeMergeEntry.getKey())) {
+                                mapTargetProp.put(mapToBeMergeEntry.getKey(), mapToBeMergeEntry.getValue());
+                                changed = true;
+                            }
+                        }
+                    } else if (targetProperty instanceof Collection && toBeMergeProperty.getValue() instanceof Collection) {
+                        // merge Collections like "lists"
+                        Collection collectionToBeMerge = (Collection) toBeMergeProperty.getValue();
+                        Collection collectionTarget = (Collection) targetProperty;
+
+                        for (Object itemToBeMerge : collectionToBeMerge) {
+                            if (!collectionTarget.contains(itemToBeMerge)) {
+                                try {
+                                    collectionTarget.add(itemToBeMerge);
+                                    changed = true;
+                                } catch (Exception e) {
+                                    // may be Collection type issue
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return changed;
+    }
 }