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; + } }