public EventsRequestContext initEventsRequest()

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