in plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/MergeProfilesOnPropertyAction.java [49:145]
public int execute(Action action, Event event) {
Profile eventProfile = event.getProfile();
final String mergePropName = (String) action.getParameterValues().get("mergeProfilePropertyName");
final String mergePropValue = (String) action.getParameterValues().get("mergeProfilePropertyValue");
final String clientIdFromEvent = (String) event.getAttributes().get(Event.CLIENT_ID_ATTRIBUTE);
final String clientId = clientIdFromEvent != null ? clientIdFromEvent : "defaultClientId";
boolean forceEventProfileAsMaster = action.getParameterValues().containsKey("forceEventProfileAsMaster") ? (boolean) action.getParameterValues().get("forceEventProfileAsMaster") : false;
final String currentProfileMergeValue = (String) eventProfile.getSystemProperties().get(mergePropName);
if (eventProfile instanceof Persona || eventProfile.isAnonymousProfile() || StringUtils.isEmpty(mergePropName) ||
StringUtils.isEmpty(mergePropValue)) {
return EventService.NO_CHANGE;
}
final List<Profile> profilesToBeMerge = getProfilesToBeMerge(mergePropName, mergePropValue);
// Check if the user switched to another profile
if (StringUtils.isNotEmpty(currentProfileMergeValue) && !currentProfileMergeValue.equals(mergePropValue)) {
reassignCurrentBrowsingData(event, profilesToBeMerge, forceEventProfileAsMaster, mergePropName, mergePropValue);
return EventService.PROFILE_UPDATED + EventService.SESSION_UPDATED;
}
// Store merge prop on current profile
boolean profileUpdated = false;
if (StringUtils.isEmpty(currentProfileMergeValue)) {
profileUpdated = true;
eventProfile.getSystemProperties().put(mergePropName, mergePropValue);
}
// If not profiles to merge we are done here.
if (profilesToBeMerge.isEmpty()) {
return profileUpdated ? EventService.PROFILE_UPDATED : EventService.NO_CHANGE;
}
// add current Profile to profiles to be merged
if (profilesToBeMerge.stream().noneMatch(p -> StringUtils.equals(p.getItemId(), eventProfile.getItemId()))) {
profilesToBeMerge.add(eventProfile);
}
final String eventProfileId = eventProfile.getItemId();
final Profile masterProfile = profileService.mergeProfiles(forceEventProfileAsMaster ? eventProfile : profilesToBeMerge.get(0), profilesToBeMerge);
final String masterProfileId = masterProfile.getItemId();
// Profile is still using the same profileId after being merged, no need to rewrite exists data, merge is done
if (!forceEventProfileAsMaster && masterProfileId.equals(eventProfileId)) {
return profileUpdated ? EventService.PROFILE_UPDATED : EventService.NO_CHANGE;
}
// ProfileID changed we have a lot to do
// First check for privacy stuff (inherit from previous profile if necessary)
if (privacyService.isRequireAnonymousBrowsing(eventProfile)) {
privacyService.setRequireAnonymousBrowsing(masterProfileId, true, event.getScope());
}
final boolean anonymousBrowsing = privacyService.isRequireAnonymousBrowsing(masterProfileId);
// Modify current session:
if (event.getSession() != null) {
event.getSession().setProfile(anonymousBrowsing ? privacyService.getAnonymousProfile(masterProfile) : masterProfile);
}
// Modify current event:
event.setProfileId(anonymousBrowsing ? null : masterProfileId);
event.setProfile(masterProfile);
event.getActionPostExecutors().add(() -> {
try {
// This is the list of profile Ids to be updated in browsing data (events/sessions)
List<String> mergedProfileIds = profilesToBeMerge.stream()
.map(Profile::getItemId)
.filter(mergedProfileId -> !StringUtils.equals(mergedProfileId, masterProfileId))
.collect(Collectors.toList());
// ASYNC: Update browsing data (events/sessions) for merged profiles
reassignPersistedBrowsingDatasAsync(anonymousBrowsing, mergedProfileIds, masterProfileId);
// Save event, as we dynamically changed the profileId of the current event
if (event.isPersistent()) {
persistenceService.save(event);
}
// Handle aliases
for (String mergedProfileId : mergedProfileIds) {
profileService.addAliasToProfile(masterProfileId, mergedProfileId, clientId);
if (persistenceService.load(mergedProfileId, Profile.class) != null) {
profileService.delete(mergedProfileId, false);
}
}
} catch (Exception e) {
LOGGER.error("unable to execute callback action, profile and session will not be saved", e);
return false;
}
return true;
});
return EventService.PROFILE_UPDATED + EventService.SESSION_UPDATED;
}