in rest/src/main/java/org/apache/unomi/rest/service/impl/RestServiceUtilsImpl.java [88:222]
public EventsRequestContext initEventsRequest(String scope, String sessionId, String profileId, String personaId,
boolean invalidateProfile, boolean invalidateSession,
HttpServletRequest request, HttpServletResponse response, Date timestamp) {
// Build context
EventsRequestContext eventsRequestContext = new EventsRequestContext(timestamp, null, null, request, response);
// Handle persona
if (personaId != null) {
PersonaWithSessions personaWithSessions = profileService.loadPersonaWithSessions(personaId);
if (personaWithSessions == null) {
LOGGER.error("Couldn't find persona, please check your personaId parameter");
} else {
eventsRequestContext.setProfile(personaWithSessions.getPersona());
eventsRequestContext.setSession(personaWithSessions.getLastSession());
}
}
if (profileId == null) {
// Get profile id from the cookie
profileId = getProfileIdCookieValue(request);
}
if (profileId == null && sessionId == null && personaId == null) {
LOGGER.warn("Couldn't find profileId, sessionId or personaId in incoming request! Stopped processing request. See debug level for more information");
if (LOGGER.isDebugEnabled()) LOGGER.debug("Request dump: {}", HttpUtils.dumpRequestInfo(request));
throw new BadRequestException("Couldn't find profileId, sessionId or personaId in incoming request!");
}
boolean profileCreated = false;
if (eventsRequestContext.getProfile() == null) {
if (profileId == null || invalidateProfile) {
// no profileId cookie was found or the profile has to be invalidated, we generate a new one and create the profile in the profile service
eventsRequestContext.setProfile(createNewProfile(null, timestamp));
profileCreated = true;
} else {
eventsRequestContext.setProfile(profileService.load(profileId));
if (eventsRequestContext.getProfile() == null) {
// this can happen if we have an old cookie but have reset the server,
// or if we merged the profiles and somehow this cookie didn't get updated.
eventsRequestContext.setProfile(createNewProfile(profileId, timestamp));
profileCreated = true;
}
}
// Try to recover existing session
Profile sessionProfile;
if (StringUtils.isNotBlank(sessionId) && !invalidateSession) {
eventsRequestContext.setSession(profileService.loadSession(sessionId));
if (eventsRequestContext.getSession() != null) {
sessionProfile = eventsRequestContext.getSession().getProfile();
boolean anonymousSessionProfile = sessionProfile.isAnonymousProfile();
if (!eventsRequestContext.getProfile().isAnonymousProfile() &&
!anonymousSessionProfile &&
!eventsRequestContext.getProfile().getItemId().equals(sessionProfile.getItemId())) {
// Session user has been switched, profile id in cookie is not up to date
// We must reload the profile with the session ID as some properties could be missing from the session profile
// #personalIdentifier
eventsRequestContext.setProfile(profileService.load(sessionProfile.getItemId()));
}
// Handle anonymous situation
Boolean requireAnonymousBrowsing = privacyService.isRequireAnonymousBrowsing(eventsRequestContext.getProfile());
if (requireAnonymousBrowsing && anonymousSessionProfile) {
// User wants to browse anonymously, anonymous profile is already set.
} else if (requireAnonymousBrowsing && !anonymousSessionProfile) {
// User wants to browse anonymously, update the sessionProfile to anonymous profile
sessionProfile = privacyService.getAnonymousProfile(eventsRequestContext.getProfile());
eventsRequestContext.getSession().setProfile(sessionProfile);
eventsRequestContext.addChanges(EventService.SESSION_UPDATED);
} else if (!requireAnonymousBrowsing && anonymousSessionProfile) {
// User does not want to browse anonymously anymore, update the sessionProfile to real profile
sessionProfile = eventsRequestContext.getProfile();
eventsRequestContext.getSession().setProfile(sessionProfile);
eventsRequestContext.addChanges(EventService.SESSION_UPDATED);
} else if (!requireAnonymousBrowsing && !anonymousSessionProfile) {
// User does not want to browse anonymously, use the real profile. Check that session contains the current profile.
sessionProfile = eventsRequestContext.getProfile();
if (!eventsRequestContext.getSession().getProfileId().equals(sessionProfile.getItemId())) {
eventsRequestContext.addChanges(EventService.SESSION_UPDATED);
}
eventsRequestContext.getSession().setProfile(sessionProfile);
}
}
}
// Try to create new session
if (eventsRequestContext.getSession() == null || invalidateSession) {
sessionProfile = privacyService.isRequireAnonymousBrowsing(eventsRequestContext.getProfile()) ?
privacyService.getAnonymousProfile(eventsRequestContext.getProfile()) : eventsRequestContext.getProfile();
if (StringUtils.isNotBlank(sessionId)) {
// Only save session and send event if a session id was provided, otherwise keep transient session
Session session = new Session(sessionId, sessionProfile, timestamp, scope);
eventsRequestContext.setSession(session);
eventsRequestContext.setNewSession(true);
eventsRequestContext.addChanges(EventService.SESSION_UPDATED);
Event event = new Event("sessionCreated", eventsRequestContext.getSession(), eventsRequestContext.getProfile(),
scope, null, eventsRequestContext.getSession(), null, timestamp, false);
if (sessionProfile.isAnonymousProfile()) {
// Do not keep track of profile in event
event.setProfileId(null);
}
event.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, request);
event.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, response);
if (LOGGER.isDebugEnabled()) LOGGER.debug("Received event {} for profile={} session={} target={} timestamp={}", event.getEventType(),
eventsRequestContext.getProfile().getItemId(), eventsRequestContext.getSession().getItemId(), event.getTarget(), timestamp);
eventsRequestContext.addChanges(eventService.send(event));
}
}
// Handle new profile creation
if (profileCreated) {
eventsRequestContext.addChanges(EventService.PROFILE_UPDATED);
Event profileUpdated = new Event("profileUpdated", eventsRequestContext.getSession(), eventsRequestContext.getProfile(),
scope, null, eventsRequestContext.getProfile(), timestamp);
profileUpdated.setPersistent(false);
profileUpdated.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, request);
profileUpdated.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, response);
profileUpdated.getAttributes().put(Event.CLIENT_ID_ATTRIBUTE, DEFAULT_CLIENT_ID);
if (LOGGER.isDebugEnabled()) LOGGER.debug("Received event {} for profile={} {} target={} timestamp={}", profileUpdated.getEventType(),
eventsRequestContext.getProfile().getItemId(),
" session=" + (eventsRequestContext.getSession() != null ? eventsRequestContext.getSession().getItemId() : null),
profileUpdated.getTarget(), timestamp);
eventsRequestContext.addChanges(eventService.send(profileUpdated));
}
}
return eventsRequestContext;
}