Repository: incubator-unomi
Updated Branches:
  refs/heads/master 11c847c05 -> a171e3d8f


UNOMI-199 fix issue when multiple visitor log on the same browser, improve 
logging, refactor code to avoid duplication


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

Branch: refs/heads/master
Commit: a171e3d8f6fee354285768e112b27c6c3ebd8d2a
Parents: 11c847c
Author: dgaillard <[email protected]>
Authored: Fri Sep 21 16:45:16 2018 +0200
Committer: dgaillard <[email protected]>
Committed: Fri Sep 21 16:45:30 2018 +0200

----------------------------------------------------------------------
 .../ElasticSearchPersistenceServiceImpl.java    |  12 +-
 .../actions/MergeProfilesOnPropertyAction.java  |  91 +++-----
 .../main/java/org/apache/unomi/web/Changes.java |  43 ++++
 .../org/apache/unomi/web/ContextServlet.java    | 229 +++++++++----------
 .../unomi/web/EventsCollectorServlet.java       |  87 +++----
 .../java/org/apache/unomi/web/HttpUtils.java    |   6 +
 .../org/apache/unomi/web/ServletCommon.java     | 100 ++++++++
 .../resources/OSGI-INF/blueprint/blueprint.xml  |   2 +
 8 files changed, 328 insertions(+), 242 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/a171e3d8/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
index def798f..46e7cbb 100644
--- 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
+++ 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
@@ -692,11 +692,12 @@ public class ElasticSearchPersistenceServiceImpl 
implements PersistenceService,
                 try {
                     String source = 
ESCustomObjectMapper.getObjectMapper().writeValueAsString(item);
                     String itemType = item.getItemType();
-                    putInCache(item.getItemId(), item);
+                    String itemId = item.getItemId();
+                    putInCache(itemId, item);
                     String index = indexNames.containsKey(itemType) ? 
indexNames.get(itemType) :
                             (itemsMonthlyIndexed.contains(itemType) ? 
getMonthlyIndexName(((TimestampedItem) item).getTimeStamp()) : indexName);
-                    IndexRequestBuilder indexBuilder = 
client.prepareIndex(index, itemType, item.getItemId())
-                            .setSource(source);
+                    IndexRequestBuilder indexBuilder = 
client.prepareIndex(index, itemType, itemId)
+                            .setSource(source, XContentType.JSON);
                     if (routingByType.containsKey(itemType)) {
                         indexBuilder = 
indexBuilder.setRouting(routingByType.get(itemType));
                     }
@@ -708,6 +709,9 @@ public class ElasticSearchPersistenceServiceImpl implements 
PersistenceService,
                             bulkProcessor.add(indexBuilder.request());
                         }
                     } catch (IndexNotFoundException e) {
+                        logger.error("Could not find index {}, could not 
register item type {} with id {} ",
+                                index, itemType, itemId, e);
+                        return false;
                     }
                     return true;
                 } catch (IOException e) {
@@ -1172,7 +1176,7 @@ public class ElasticSearchPersistenceServiceImpl 
implements PersistenceService,
                 try {
                     logger.info("Saving query : " + queryName);
                     client.prepareIndex(indexName, ".percolator", queryName)
-                            .setSource(query)
+                            .setSource(query, XContentType.JSON)
                             
.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
                             .execute().actionGet();
                     return true;

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/a171e3d8/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/MergeProfilesOnPropertyAction.java
----------------------------------------------------------------------
diff --git 
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/MergeProfilesOnPropertyAction.java
 
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/MergeProfilesOnPropertyAction.java
index f963d9e..c1e89f4 100644
--- 
a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/MergeProfilesOnPropertyAction.java
+++ 
b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/MergeProfilesOnPropertyAction.java
@@ -39,69 +39,19 @@ import java.util.List;
 import java.util.UUID;
 
 public class MergeProfilesOnPropertyAction implements ActionExecutor {
-
     private static final Logger logger = 
LoggerFactory.getLogger(MergeProfilesOnPropertyAction.class.getName());
 
-    private String profileIdCookieName = "context-profile-id";
-    private String profileIdCookieDomain;
-    private int profileIdCookieMaxAgeInSeconds;
-
     private ProfileService profileService;
-
     private PersistenceService persistenceService;
-
     private EventService eventService;
-
     private DefinitionsService definitionsService;
-
     private PrivacyService privacyService;
-
     private ConfigSharingService configSharingService;
 
-    public void setProfileIdCookieName(String profileIdCookieName) {
-        this.profileIdCookieName = profileIdCookieName;
-    }
-
-    public void setProfileService(ProfileService profileService) {
-        this.profileService = profileService;
-    }
-
-    public PersistenceService getPersistenceService() {
-        return persistenceService;
-    }
-
-    public void setPersistenceService(PersistenceService persistenceService) {
-        this.persistenceService = persistenceService;
-    }
-
-    public EventService getEventService() {
-        return eventService;
-    }
-
-    public void setEventService(EventService eventService) {
-        this.eventService = eventService;
-    }
-
-    public DefinitionsService getDefinitionsService() {
-        return definitionsService;
-    }
-
-    public void setPrivacyService(PrivacyService privacyService) {
-        this.privacyService = privacyService;
-    }
-
-    public void setDefinitionsService(DefinitionsService definitionsService) {
-        this.definitionsService = definitionsService;
-    }
-
-    public void setConfigSharingService(ConfigSharingService 
configSharingService) {
-        this.configSharingService = configSharingService;
-    }
-
     public int execute(Action action, Event event) {
-        profileIdCookieName = (String) 
configSharingService.getProperty("profileIdCookieName");
-        profileIdCookieDomain = (String) 
configSharingService.getProperty("profileIdCookieDomain");
-        profileIdCookieMaxAgeInSeconds = (Integer) 
configSharingService.getProperty("profileIdCookieMaxAgeInSeconds");
+        String profileIdCookieName = (String) 
configSharingService.getProperty("profileIdCookieName");
+        String profileIdCookieDomain = (String) 
configSharingService.getProperty("profileIdCookieDomain");
+        Integer profileIdCookieMaxAgeInSeconds = (Integer) 
configSharingService.getProperty("profileIdCookieMaxAgeInSeconds");
 
         Profile profile = event.getProfile();
         if (profile instanceof Persona || profile.isAnonymousProfile()) {
@@ -141,7 +91,7 @@ public class MergeProfilesOnPropertyAction implements 
ActionExecutor {
         final List<Profile> profiles = persistenceService.query(c, 
"properties.firstVisit", Profile.class);
 
         // Check if the user switched to another profile
-        if (!StringUtils.isEmpty(mergeProfilePreviousPropertyValue) && 
!mergeProfilePreviousPropertyValue.equals(mergeProfilePropertyValue)) {
+        if (StringUtils.isNotEmpty(mergeProfilePreviousPropertyValue) && 
!mergeProfilePreviousPropertyValue.equals(mergeProfilePropertyValue)) {
             if (profiles.size() > 0) {
                 // Take existing profile
                 profile = profiles.get(0);
@@ -189,10 +139,12 @@ public class MergeProfilesOnPropertyAction implements 
ActionExecutor {
             // Profile has changed
             if (!masterProfile.getItemId().equals(profileId)) {
                 HttpServletResponse httpServletResponse = 
(HttpServletResponse) event.getAttributes().get(Event.HTTP_RESPONSE_ATTRIBUTE);
-                // we still send back the current profile cookie. It will be 
changed on the next request to the ContextServlet. The current profile will be 
deleted only then because we cannot delete it right now (too soon)
-                sendProfileCookie(currentSession.getProfile(), 
httpServletResponse, profileIdCookieName, profileIdCookieDomain, 
profileIdCookieMaxAgeInSeconds);
-                final String masterProfileId = masterProfile.getItemId();
+                // we still send back the current profile cookie. It will be 
changed on the next request to the ContextServlet.
+                // The current profile will be deleted only then because we 
cannot delete it right now (too soon)
+                sendProfileCookie(currentSession.getProfile(), 
httpServletResponse,
+                        profileIdCookieName, profileIdCookieDomain, 
profileIdCookieMaxAgeInSeconds);
 
+                final String masterProfileId = masterProfile.getItemId();
                 // At the end of the merge, we must set the merged profile as 
profile event to process other Actions
                 event.setProfileId(masterProfileId);
                 event.setProfile(masterProfile);
@@ -201,6 +153,7 @@ public class MergeProfilesOnPropertyAction implements 
ActionExecutor {
                 if (privacyService.isRequireAnonymousBrowsing(profile)) {
                     
privacyService.setRequireAnonymousBrowsing(masterProfileId, true, 
event.getScope());
                 }
+
                 final Boolean anonymousBrowsing = 
privacyService.isRequireAnonymousBrowsing(masterProfileId);
                 if (anonymousBrowsing) {
                     
currentSession.setProfile(privacyService.getAnonymousProfile(masterProfile));
@@ -262,4 +215,28 @@ public class MergeProfilesOnPropertyAction implements 
ActionExecutor {
         }
     }
 
+    public void setProfileService(ProfileService profileService) {
+        this.profileService = profileService;
+    }
+
+    public void setPersistenceService(PersistenceService persistenceService) {
+        this.persistenceService = persistenceService;
+    }
+
+    public void setEventService(EventService eventService) {
+        this.eventService = eventService;
+    }
+
+    public void setPrivacyService(PrivacyService privacyService) {
+        this.privacyService = privacyService;
+    }
+
+    public void setDefinitionsService(DefinitionsService definitionsService) {
+        this.definitionsService = definitionsService;
+    }
+
+    public void setConfigSharingService(ConfigSharingService 
configSharingService) {
+        this.configSharingService = configSharingService;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/a171e3d8/wab/src/main/java/org/apache/unomi/web/Changes.java
----------------------------------------------------------------------
diff --git a/wab/src/main/java/org/apache/unomi/web/Changes.java 
b/wab/src/main/java/org/apache/unomi/web/Changes.java
new file mode 100644
index 0000000..280bbb4
--- /dev/null
+++ b/wab/src/main/java/org/apache/unomi/web/Changes.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.unomi.web;
+
+import org.apache.unomi.api.Profile;
+
+/**
+ * This class is a simple object to get the updated profile without the need 
of reloading it
+ *
+ * @author dgaillard
+ */
+public class Changes {
+    private int changeType;
+    private Profile profile;
+
+    public Changes(int changeType, Profile profile) {
+        this.changeType = changeType;
+        this.profile = profile;
+    }
+
+    public int getChangeType() {
+        return changeType;
+    }
+
+    public Profile getProfile() {
+        return profile;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/a171e3d8/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
----------------------------------------------------------------------
diff --git a/wab/src/main/java/org/apache/unomi/web/ContextServlet.java 
b/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
index a3ed622..7792180 100644
--- a/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
+++ b/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
@@ -20,8 +20,8 @@ package org.apache.unomi.web;
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.unomi.api.*;
-import org.apache.unomi.api.conditions.Condition;
 import org.apache.unomi.api.services.*;
 import org.apache.unomi.persistence.spi.CustomObjectMapper;
 import org.slf4j.Logger;
@@ -31,7 +31,6 @@ import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
-import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -44,11 +43,17 @@ import java.util.*;
  * A servlet filter to serve a context-specific Javascript containing the 
current request context object.
  */
 public class ContextServlet extends HttpServlet {
-    public static final String BASE_SCRIPT_LOCATION = "/javascript/base.js";
-    public static final String IMPERSONATE_BASE_SCRIPT_LOCATION = 
"/javascript/impersonateBase.js";
-    public static final String PROFILE_OVERRIDE_MARKER = "---IGNORE---";
-    private static final Logger logger = 
LoggerFactory.getLogger(ContextServlet.class.getName());
     private static final long serialVersionUID = 2928875830103325238L;
+    private static final Logger logger = 
LoggerFactory.getLogger(ContextServlet.class.getName());
+
+    private static final String BASE_SCRIPT_LOCATION = "/javascript/base.js";
+    private static final String IMPERSONATE_BASE_SCRIPT_LOCATION = 
"/javascript/impersonateBase.js";
+    private static final int MAX_COOKIE_AGE_IN_SECONDS = 60 * 60 * 24 * 365; 
// 1 year
+
+    private String profileIdCookieName = "context-profile-id";
+    private String profileIdCookieDomain;
+    private int profileIdCookieMaxAgeInSeconds = MAX_COOKIE_AGE_IN_SECONDS;
+
     private ProfileService profileService;
     private EventService eventService;
     private RulesService rulesService;
@@ -56,11 +61,6 @@ public class ContextServlet extends HttpServlet {
     private PersonalizationService personalizationService;
     private ConfigSharingService configSharingService;
 
-    private String profileIdCookieName = "context-profile-id";
-    private String profileIdCookieDomain;
-    private static final int MAX_COOKIE_AGE_IN_SECONDS = 60 * 60 * 24 * 365; 
// 1 year
-    private int profileIdCookieMaxAgeInSeconds = MAX_COOKIE_AGE_IN_SECONDS;
-
     @Override
     public void init(ServletConfig config) throws ServletException {
         super.init(config);
@@ -71,39 +71,30 @@ public class ContextServlet extends HttpServlet {
     }
 
     @Override
-    public void service(ServletRequest request, ServletResponse response) 
throws ServletException, IOException {
+    public void service(ServletRequest request, ServletResponse response) 
throws IOException {
         final Date timestamp = new Date();
         if (request.getParameter("timestamp") != null) {
             
timestamp.setTime(Long.parseLong(request.getParameter("timestamp")));
         }
 
         HttpServletRequest httpServletRequest = (HttpServletRequest) request;
-        String httpMethod = httpServletRequest.getMethod();
 
         // set up CORS headers as soon as possible so that errors are not 
misconstrued on the client for CORS errors
         HttpUtils.setupCORSHeaders(httpServletRequest, response);
 
+        // Handle OPTIONS request
+        String httpMethod = httpServletRequest.getMethod();
         if ("options".equals(httpMethod.toLowerCase())) {
             response.flushBuffer();
-            logger.debug("OPTIONS request received. No context will be 
returned.");
+            if (logger.isDebugEnabled()) {
+                logger.debug("OPTIONS request received. No context will be 
returned.");
+            }
             return;
         }
 
+        // Handle persona
         Profile profile = null;
-        Profile sessionProfile = null;
-
-        String cookieProfileId = null;
-        Cookie[] cookies = httpServletRequest.getCookies();
-        if (cookies != null) {
-            for (Cookie cookie : cookies) {
-                if (profileIdCookieName.equals(cookie.getName())) {
-                    cookieProfileId = cookie.getValue();
-                }
-            }
-        }
-
         Session session = null;
-
         String personaId = request.getParameter("personaId");
         if (personaId != null) {
             PersonaWithSessions personaWithSessions = 
profileService.loadPersonaWithSessions(personaId);
@@ -116,6 +107,7 @@ public class ContextServlet extends HttpServlet {
             }
         }
 
+        // Extract payload
         ContextRequest contextRequest = null;
         String scope = null;
         String sessionId = null;
@@ -139,25 +131,26 @@ public class ContextServlet extends HttpServlet {
         if (sessionId == null) {
             sessionId = request.getParameter("sessionId");
         }
-        boolean invalidateSession = 
request.getParameter("invalidateSession")!=null?new 
Boolean(request.getParameter("invalidateSession")):false;
-        boolean invalidateProfile = 
request.getParameter("invalidateProfile")!=null?new 
Boolean(request.getParameter("invalidateProfile")):false;
+
+        // Get profile id from the cookie
+        String cookieProfileId = 
ServletCommon.getProfileIdCookieValue(httpServletRequest, profileIdCookieName);
 
         if (cookieProfileId == null && sessionId == null && personaId == null) 
{
             
((HttpServletResponse)response).sendError(HttpServletResponse.SC_BAD_REQUEST, 
"Check logs for more details");
             logger.error("Couldn't find cookieProfileId, sessionId or 
personaId in incoming request! Stopped processing request. See debug level for 
more information");
             if (logger.isDebugEnabled()) {
-                logger.debug("Request dump:" + 
HttpUtils.dumpRequestInfo(httpServletRequest));
+                logger.debug("Request dump: {}", 
HttpUtils.dumpRequestInfo(httpServletRequest));
             }
             return;
         }
 
-
         int changes = EventService.NO_CHANGE;
-
         if (profile == null) {
+            // Not a persona, resolve profile now
             boolean profileCreated = false;
 
-            // Not a persona, resolve profile now
+            boolean invalidateProfile = 
request.getParameter("invalidateProfile") != null ?
+                    new Boolean(request.getParameter("invalidateProfile")) : 
false;
             if (cookieProfileId == 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
                 profile = createNewProfile(null, response, timestamp);
@@ -170,41 +163,48 @@ public class ContextServlet extends HttpServlet {
                     profile = createNewProfile(null, response, timestamp);
                     profileCreated = true;
                 } else {
-                    profile = checkMergedProfile(response, profile, session);
+                    Changes changesObject = checkMergedProfile(response, 
profile, session);
+                    changes |= changesObject.getChangeType();
+                    profile = changesObject.getProfile();
                 }
             }
 
-            if (sessionId != null && sessionId.trim().length() > 0) {
+            Profile sessionProfile;
+            boolean invalidateSession = 
request.getParameter("invalidateSession") != null ?
+                    new Boolean(request.getParameter("invalidateSession")) : 
false;
+            if (StringUtils.isNotBlank(sessionId) && !invalidateSession) {
                 session = profileService.loadSession(sessionId, timestamp);
                 if (session != null) {
                     sessionProfile = session.getProfile();
-                    boolean anonymousProfile = 
sessionProfile.isAnonymousProfile();
 
-                    if (!profile.isAnonymousProfile() && !anonymousProfile && 
!profile.getItemId().equals(sessionProfile.getItemId())) {
-                        // Session user has been switched, profile id in 
cookie is not uptodate
-                        profile = sessionProfile;
+                    boolean anonymousSessionProfile = 
sessionProfile.isAnonymousProfile();
+                    if (!profile.isAnonymousProfile() && 
!anonymousSessionProfile && 
!profile.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
+                        profile = 
profileService.load(sessionProfile.getItemId());
                         HttpUtils.sendProfileCookie(profile, response, 
profileIdCookieName, profileIdCookieDomain, profileIdCookieMaxAgeInSeconds);
                     }
 
+                    // Handle anonymous situation
                     Boolean requireAnonymousBrowsing = 
privacyService.isRequireAnonymousBrowsing(profile);
-
-                    if (requireAnonymousBrowsing && anonymousProfile) {
+                    if (requireAnonymousBrowsing && anonymousSessionProfile) {
                         // User wants to browse anonymously, anonymous profile 
is already set.
-                    } else if (requireAnonymousBrowsing && !anonymousProfile) {
+                    } else if (requireAnonymousBrowsing && 
!anonymousSessionProfile) {
                         // User wants to browse anonymously, update the 
sessionProfile to anonymous profile
                         sessionProfile = 
privacyService.getAnonymousProfile(profile);
                         session.setProfile(sessionProfile);
-                        changes = EventService.SESSION_UPDATED;
-                    } else if (!requireAnonymousBrowsing && anonymousProfile) {
+                        changes |= EventService.SESSION_UPDATED;
+                    } else if (!requireAnonymousBrowsing && 
anonymousSessionProfile) {
                         // User does not want to browse anonymously anymore, 
update the sessionProfile to real profile
                         sessionProfile = profile;
                         session.setProfile(sessionProfile);
-                        changes = EventService.SESSION_UPDATED;
-                    } else if (!requireAnonymousBrowsing && !anonymousProfile) 
{
+                        changes |= 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 = profile;
                         if 
(!session.getProfileId().equals(sessionProfile.getItemId())) {
-                            changes = EventService.SESSION_UPDATED;
+                            changes |= EventService.SESSION_UPDATED;
                         }
                         session.setProfile(sessionProfile);
                     }
@@ -215,7 +215,7 @@ public class ContextServlet extends HttpServlet {
                 sessionProfile = 
privacyService.isRequireAnonymousBrowsing(profile) ? 
privacyService.getAnonymousProfile(profile) : profile;
                 session = new Session(sessionId, sessionProfile, timestamp, 
scope);
 
-                if (sessionId != null && sessionId.trim().length() > 0) {
+                if (StringUtils.isNotBlank(sessionId)) {
                     // Only save session and send event if a session id was 
provided, otherwise keep transient session
                     changes |= EventService.SESSION_UPDATED;
                     Event event = new Event("sessionCreated", session, 
profile, scope, null, session, timestamp);
@@ -225,7 +225,10 @@ public class ContextServlet extends HttpServlet {
                     }
                     event.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, 
request);
                     event.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, 
response);
-                    logger.debug("Received event " + event.getEventType() + " 
for profile=" + profile.getItemId() + " session=" + session.getItemId() + " 
target=" + event.getTarget() + " timestamp=" + timestamp);
+                    if (logger.isDebugEnabled()) {
+                        logger.debug("Received event {} for profile={} 
session={} target={} timestamp={}",
+                                event.getEventType(), profile.getItemId(), 
session.getItemId(), event.getTarget(), timestamp);
+                    }
                     changes |= eventService.send(event);
                 }
             }
@@ -238,35 +241,40 @@ public class ContextServlet extends HttpServlet {
                 
profileUpdated.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, request);
                 
profileUpdated.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, response);
 
-                logger.debug("Received event {} for profile={} {} target={} 
timestamp={}", profileUpdated.getEventType(), profile.getItemId(),
-                        session != null ? " session=" + session.getItemId() : 
"", profileUpdated.getTarget(), timestamp);
+                if (logger.isDebugEnabled()) {
+                    logger.debug("Received event {} for profile={} {} 
target={} timestamp={}", profileUpdated.getEventType(), profile.getItemId(),
+                            " session=" + session.getItemId(), 
profileUpdated.getTarget(), timestamp);
+                }
                 changes |= eventService.send(profileUpdated);
             }
         }
 
-        ContextResponse data = new ContextResponse();
-        data.setProfileId(profile.getItemId());
+        ContextResponse contextResponse = new ContextResponse();
+        contextResponse.setProfileId(profile.getItemId());
         if (session != null) {
-            data.setSessionId(session.getItemId());
+            contextResponse.setSessionId(session.getItemId());
         } else if (sessionId != null) {
-            data.setSessionId(sessionId);
+            contextResponse.setSessionId(sessionId);
         }
 
-        if (contextRequest != null){
-            changes |= handleRequest(contextRequest, profile, session, data, 
request, response, timestamp);
+        if (contextRequest != null) {
+            Changes changesObject = handleRequest(contextRequest, session, 
profile, contextResponse, request, response, timestamp);
+            changes |= changesObject.getChangeType();
+            profile = changesObject.getProfile();
         }
 
         if ((changes & EventService.PROFILE_UPDATED) == 
EventService.PROFILE_UPDATED) {
             profileService.save(profile);
+            contextResponse.setProfileId(profile.getItemId());
         }
         if ((changes & EventService.SESSION_UPDATED) == 
EventService.SESSION_UPDATED && session != null) {
             profileService.saveSession(session);
+            contextResponse.setSessionId(session.getItemId());
         }
 
-
         String extension = 
httpServletRequest.getRequestURI().substring(httpServletRequest.getRequestURI().lastIndexOf(".")
 + 1);
         boolean noScript = "json".equals(extension);
-        String contextAsJSONString = 
CustomObjectMapper.getObjectMapper().writeValueAsString(data);
+        String contextAsJSONString = 
CustomObjectMapper.getObjectMapper().writeValueAsString(contextResponse);
         Writer responseWriter;
         response.setCharacterEncoding("UTF-8");
         if (noScript) {
@@ -288,108 +296,85 @@ public class ContextServlet extends HttpServlet {
         responseWriter.flush();
     }
 
-    private Profile checkMergedProfile(ServletResponse response, Profile 
profile, Session session) {
+    private Changes checkMergedProfile(ServletResponse response, Profile 
profile, Session session) {
+        int changes = EventService.NO_CHANGE;
         if (profile.getMergedWith() != null && 
!privacyService.isRequireAnonymousBrowsing(profile) && 
!profile.isAnonymousProfile()) {
-            String profileId = profile.getMergedWith();
-            Profile profileToDelete = profile;
-            profile = profileService.load(profileId);
-            if (profile != null) {
-                logger.debug("Session profile was merged with profile " + 
profileId + ", replacing profile in session");
+            Profile currentProfile = profile;
+            String masterProfileId = profile.getMergedWith();
+            Profile masterProfile = profileService.load(masterProfileId);
+            if (masterProfile != null) {
+                if (logger.isDebugEnabled()) {
+                    logger.debug("Current profile was merged with profile {}, 
replacing profile in session", masterProfileId);
+                }
+                profile = masterProfile;
                 if (session != null) {
                     session.setProfile(profile);
-                    profileService.saveSession(session);
+                    changes = EventService.SESSION_UPDATED;
                 }
                 HttpUtils.sendProfileCookie(profile, response, 
profileIdCookieName, profileIdCookieDomain, profileIdCookieMaxAgeInSeconds);
             } else {
-                logger.warn("Couldn't find merged profile" + profileId + ", 
falling back to profile " + profileToDelete.getItemId());
-                profile = profileToDelete;
+                logger.warn("Couldn't find merged profile {}, falling back to 
profile {}", masterProfileId, currentProfile.getItemId());
+                profile = currentProfile;
                 profile.setMergedWith(null);
-                profileService.save(profile);
+                changes = EventService.PROFILE_UPDATED;
             }
         }
 
-        return profile;
+        return new Changes(changes, profile);
     }
 
-    private int handleRequest(ContextRequest contextRequest, Profile profile, 
Session session, ContextResponse data, ServletRequest request, ServletResponse 
response, Date timestamp)
-            throws IOException {
-        List<String> filteredEventTypes = 
privacyService.getFilteredEventTypes(profile);
-
-        String thirdPartyId = 
eventService.authenticateThirdPartyServer(((HttpServletRequest)request).getHeader("X-Unomi-Peer"),
 request.getRemoteAddr());
-
-        int changes = EventService.NO_CHANGE;
-        // execute provided events if any
-        if(contextRequest.getEvents() != null && !(profile instanceof 
Persona)) {
-            for (Event event : contextRequest.getEvents()){
-                if(event.getEventType() != null) {
-                    Profile sessionProfile = session.getProfile();
-                    Event eventToSend = new Event(event.getEventType(), 
session, sessionProfile, contextRequest.getSource().getScope(),
-                            event.getSource(), event.getTarget(), 
event.getProperties(), timestamp, event.isPersistent());
-                    if (!eventService.isEventAllowed(event, thirdPartyId)) {
-                        logger.debug("Event is not allowed : {}", 
event.getEventType());
-                        continue;
-                    }
-                    if (filteredEventTypes != null && 
filteredEventTypes.contains(event.getEventType())) {
-                        logger.debug("Profile is filtering event type {}", 
event.getEventType());
-                        continue;
-                    }
-                    if (sessionProfile.isAnonymousProfile()) {
-                        // Do not keep track of profile in event
-                        event.setProfileId(null);
-                    }
+    private Changes handleRequest(ContextRequest contextRequest, Session 
session, Profile profile, ContextResponse data,
+                                ServletRequest request, ServletResponse 
response, Date timestamp) {
+        Changes changes = 
ServletCommon.handleEvents(contextRequest.getEvents(), session, profile, 
request, response, timestamp,
+                privacyService, eventService);
 
-                    event.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, 
request);
-                    event.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, 
response);
-                    logger.debug("Received event " + event.getEventType() + " 
for profile=" + session.getProfileId() + " session=" + session.getItemId() + " 
target=" + event.getTarget() + " timestamp=" + timestamp);
-                    changes |= eventService.send(eventToSend);
-                }
-            }
-        }
+        profile = changes.getProfile();
 
         if (contextRequest.isRequireSegments()) {
             data.setProfileSegments(profile.getSegments());
         }
 
         if (contextRequest.getRequiredProfileProperties() != null) {
-            Map<String, Object> profileProperties = new HashMap<String, 
Object>(profile.getProperties());
+            Map<String, Object> profileProperties = new 
HashMap<>(profile.getProperties());
             if (!contextRequest.getRequiredProfileProperties().contains("*")) {
                 
profileProperties.keySet().retainAll(contextRequest.getRequiredProfileProperties());
             }
             data.setProfileProperties(profileProperties);
         }
-        if (session != null) {
-            data.setSessionId(session.getItemId());
-            if (contextRequest.getRequiredSessionProperties() != null) {
-                Map<String, Object> sessionProperties = new HashMap<String, 
Object>(session.getProperties());
-                if 
(!contextRequest.getRequiredSessionProperties().contains("*")) {
-                    
sessionProperties.keySet().retainAll(contextRequest.getRequiredSessionProperties());
-                }
-                data.setSessionProperties(sessionProperties);
+
+        data.setSessionId(session.getItemId());
+        if (contextRequest.getRequiredSessionProperties() != null) {
+            Map<String, Object> sessionProperties = new 
HashMap<>(session.getProperties());
+            if (!contextRequest.getRequiredSessionProperties().contains("*")) {
+                
sessionProperties.keySet().retainAll(contextRequest.getRequiredSessionProperties());
             }
+            data.setSessionProperties(sessionProperties);
         }
 
         processOverrides(contextRequest, profile, session);
 
         List<PersonalizationService.PersonalizedContent> filterNodes = 
contextRequest.getFilters();
         if (filterNodes != null) {
-            data.setFilteringResults(new HashMap<String, Boolean>());
+            data.setFilteringResults(new HashMap<>());
             for (PersonalizationService.PersonalizedContent 
personalizedContent : filterNodes) {
-                data.getFilteringResults().put(personalizedContent.getId(), 
personalizationService.filter(profile, session, personalizedContent));
+                data.getFilteringResults().put(personalizedContent.getId(), 
personalizationService.filter(profile,
+                        session, personalizedContent));
             }
         }
 
         List<PersonalizationService.PersonalizationRequest> personalizations = 
contextRequest.getPersonalizations();
         if (personalizations != null) {
-            data.setPersonalizations(new HashMap<String, List<String>>());
+            data.setPersonalizations(new HashMap<>());
             for (PersonalizationService.PersonalizationRequest personalization 
: personalizations) {
-                data.getPersonalizations().put(personalization.getId(), 
personalizationService.personalizeList(profile, session, personalization));
+                data.getPersonalizations().put(personalization.getId(), 
personalizationService.personalizeList(profile,
+                        session, personalization));
             }
         }
 
-        if(!(profile instanceof Persona)) {
+        if (!(profile instanceof Persona)) {
             
data.setTrackedConditions(rulesService.getTrackedConditions(contextRequest.getSource()));
         } else {
-            data.setTrackedConditions(Collections.<Condition>emptySet());
+            data.setTrackedConditions(Collections.emptySet());
         }
 
         
data.setAnonymousBrowsing(privacyService.isRequireAnonymousBrowsing(profile));
@@ -410,16 +395,16 @@ public class ContextServlet extends HttpServlet {
     private void processOverrides(ContextRequest contextRequest, Profile 
profile, Session session) {
         if (profile instanceof Persona) {
             if (contextRequest.getProfileOverrides() != null) {
-                if(contextRequest.getProfileOverrides().getScores()!=null){
+                if (contextRequest.getProfileOverrides().getScores()!=null) {
                     
profile.setScores(contextRequest.getProfileOverrides().getScores());
                 }
-                if(contextRequest.getProfileOverrides().getSegments()!=null){
+                if (contextRequest.getProfileOverrides().getSegments()!=null) {
                     
profile.setSegments(contextRequest.getProfileOverrides().getSegments());
                 }
-                if(contextRequest.getProfileOverrides().getProperties()!=null){
+                if 
(contextRequest.getProfileOverrides().getProperties()!=null) {
                     
profile.setProperties(contextRequest.getProfileOverrides().getProperties());
                 }
-                if(contextRequest.getSessionPropertiesOverrides()!=null){
+                if (contextRequest.getSessionPropertiesOverrides()!=null) {
                     
session.setProperties(contextRequest.getSessionPropertiesOverrides());
                 }
             }

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/a171e3d8/wab/src/main/java/org/apache/unomi/web/EventsCollectorServlet.java
----------------------------------------------------------------------
diff --git a/wab/src/main/java/org/apache/unomi/web/EventsCollectorServlet.java 
b/wab/src/main/java/org/apache/unomi/web/EventsCollectorServlet.java
index 2f21354..a55adf8 100644
--- a/wab/src/main/java/org/apache/unomi/web/EventsCollectorServlet.java
+++ b/wab/src/main/java/org/apache/unomi/web/EventsCollectorServlet.java
@@ -30,20 +30,19 @@ import org.slf4j.LoggerFactory;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
-import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Date;
-import java.util.List;
 import java.util.UUID;
 
 public class EventsCollectorServlet extends HttpServlet {
+    private static final long serialVersionUID = 2008054804885122957L;
     private static final Logger logger = 
LoggerFactory.getLogger(EventsCollectorServlet.class.getName());
 
-    private static final long serialVersionUID = 2008054804885122957L;
+    private String profileIdCookieName = "context-profile-id";
 
     private EventService eventService;
     private ProfileService profileService;
@@ -63,13 +62,11 @@ public class EventsCollectorServlet extends HttpServlet {
 
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
-
         doEvent(req, resp);
     }
 
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
-
         doEvent(req, resp);
     }
 
@@ -89,30 +86,34 @@ public class EventsCollectorServlet extends HttpServlet {
         HttpUtils.setupCORSHeaders(request, response);
 
         String payload = HttpUtils.getPayload(request);
-        if (payload == null){
+        if (payload == null) {
+            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Check logs 
for more details");
             logger.error("No event payload found for request, aborting !");
             return;
         }
 
         ObjectMapper mapper = CustomObjectMapper.getObjectMapper();
         JsonFactory factory = mapper.getFactory();
-        EventsCollectorRequest events = null;
+        EventsCollectorRequest eventsCollectorRequest;
         try {
-            events = mapper.readValue(factory.createParser(payload), 
EventsCollectorRequest.class);
+            eventsCollectorRequest = 
mapper.readValue(factory.createParser(payload), EventsCollectorRequest.class);
         } catch (Exception e) {
-            logger.error("Cannot read payload " + payload,e);
+            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Check logs 
for more details");
+            logger.error("Cannot read payload " + payload, e);
             return;
         }
-        if (events == null || events.getEvents() == null) {
+        if (eventsCollectorRequest == null || 
eventsCollectorRequest.getEvents() == null) {
+            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Check logs 
for more details");
             logger.error("No events found in payload");
             return;
         }
 
-        String sessionId = events.getSessionId();
+        String sessionId = eventsCollectorRequest.getSessionId();
         if (sessionId == null) {
             sessionId = request.getParameter("sessionId");
         }
         if (sessionId == null) {
+            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Check logs 
for more details");
             logger.error("No sessionId found in incoming request, aborting 
processing. See debug level for more information");
             if (logger.isDebugEnabled()) {
                 logger.debug("Request dump:" + 
HttpUtils.dumpRequestInfo(request));
@@ -121,12 +122,11 @@ public class EventsCollectorServlet extends HttpServlet {
         }
 
         Session session = profileService.loadSession(sessionId, timestamp);
-        Profile sessionProfile;
         Profile profile = null;
         if (session == null) {
             String scope = "systemscope";
             // Get the first available scope that is not equal to systemscope 
to create the session otherwise systemscope will be used
-            for (Event event : events.getEvents()) {
+            for (Event event : eventsCollectorRequest.getEvents()) {
                 if (StringUtils.isNotBlank(event.getEventType())) {
                     if (StringUtils.isNotBlank(event.getScope()) && 
!event.getScope().equals("systemscope")) {
                         scope = event.getScope();
@@ -147,70 +147,35 @@ public class EventsCollectorServlet extends HttpServlet {
             if (logger.isDebugEnabled()) {
                 logger.debug("No session found for sessionId={}, creating new 
session!", sessionId);
             }
-            sessionProfile = session.getProfile();
         } else {
-            String profileIdCookieName = "context-profile-id";
-
-            sessionProfile = session.getProfile();
+            Profile sessionProfile = session.getProfile();
             if (sessionProfile.getItemId() != null) {
                 // Reload up-to-date profile
                 profile = profileService.load(sessionProfile.getItemId());
                 if (profile == null || profile instanceof Persona) {
+                    response.sendError(HttpServletResponse.SC_BAD_REQUEST, 
"Check logs for more details");
                     logger.error("No valid profile found or persona found for 
profileId={}, aborting request !", session.getProfileId());
                     return;
                 }
             } else {
                 // Session uses anonymous profile, try to find profile from 
cookie
-                Cookie[] cookies = request.getCookies();
-                if (cookies != null) {
-                    for (Cookie cookie : cookies) {
-                        if (profileIdCookieName.equals(cookie.getName())) {
-                            profile = profileService.load(cookie.getValue());
-                        }
-                    }
+                String cookieProfileId = 
ServletCommon.getProfileIdCookieValue(request, profileIdCookieName);
+                if (StringUtils.isNotBlank(cookieProfileId)) {
+                    profile = profileService.load(cookieProfileId);
                 }
+
                 if (profile == null) {
+                    response.sendError(HttpServletResponse.SC_BAD_REQUEST, 
"Check logs for more details");
                     logger.error("No valid profile found or persona found for 
profileId={}, aborting request !", session.getProfileId());
                     return;
                 }
             }
         }
 
-        String thirdPartyId = 
eventService.authenticateThirdPartyServer(((HttpServletRequest)request).getHeader("X-Unomi-Peer"),
 request.getRemoteAddr());
-
-        int changes = 0;
-
-        List<String> filteredEventTypes = 
privacyService.getFilteredEventTypes(profile);
-
-        for (Event event : events.getEvents()){
-            if(event.getEventType() != null){
-                Event eventToSend = new Event(event.getEventType(), session, 
profile, event.getScope(), event.getSource(),
-                        event.getTarget(), event.getProperties(), timestamp, 
event.isPersistent());
-                if (sessionProfile.isAnonymousProfile()) {
-                    // Do not keep track of profile in event
-                    eventToSend.setProfileId(null);
-                }
-
-                if (!eventService.isEventAllowed(event, thirdPartyId)) {
-                    logger.warn("Event is not allowed : {}", 
event.getEventType());
-                    continue;
-                }
-                if (filteredEventTypes != null && 
filteredEventTypes.contains(event.getEventType())) {
-                    logger.debug("Profile is filtering event type {}", 
event.getEventType());
-                    continue;
-                }
-
-                eventToSend.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, 
request);
-                eventToSend.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, 
response);
-                logger.debug("Received event " + event.getEventType() + " for 
profile=" + sessionProfile.getItemId() + " session=" + session.getItemId() + " 
target=" + event.getTarget() + " timestamp=" + timestamp);
-                int eventChanged = eventService.send(eventToSend);
-                //if the event execution changes the profile
-                if ((eventChanged & EventService.PROFILE_UPDATED) == 
EventService.PROFILE_UPDATED) {
-                    profile = eventToSend.getProfile();
-                }
-                changes |= eventChanged;
-            }
-        }
+        Changes changesObject = 
ServletCommon.handleEvents(eventsCollectorRequest.getEvents(), session, 
profile, request, response,
+                timestamp, privacyService, eventService);
+        int changes = changesObject.getChangeType();
+        profile = changesObject.getProfile();
 
         if ((changes & EventService.PROFILE_UPDATED) == 
EventService.PROFILE_UPDATED) {
             profileService.save(profile);
@@ -236,4 +201,8 @@ public class EventsCollectorServlet extends HttpServlet {
     public void setPrivacyService(PrivacyService privacyService) {
         this.privacyService = privacyService;
     }
+
+    public void setProfileIdCookieName(String profileIdCookieName) {
+        this.profileIdCookieName = profileIdCookieName;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/a171e3d8/wab/src/main/java/org/apache/unomi/web/HttpUtils.java
----------------------------------------------------------------------
diff --git a/wab/src/main/java/org/apache/unomi/web/HttpUtils.java 
b/wab/src/main/java/org/apache/unomi/web/HttpUtils.java
index 5a015d3..6837c0d 100644
--- a/wab/src/main/java/org/apache/unomi/web/HttpUtils.java
+++ b/wab/src/main/java/org/apache/unomi/web/HttpUtils.java
@@ -32,6 +32,12 @@ import java.util.Map;
 
 public class HttpUtils {
 
+    /**
+     * Setup CORS headers as soon as possible so that errors are not 
misconstrued on the client for CORS errors
+     * @param httpServletRequest
+     * @param response
+     * @throws IOException
+     */
     public static void setupCORSHeaders(HttpServletRequest httpServletRequest, 
ServletResponse response) throws IOException {
         if (response instanceof HttpServletResponse) {
             HttpServletResponse httpServletResponse = (HttpServletResponse) 
response;

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/a171e3d8/wab/src/main/java/org/apache/unomi/web/ServletCommon.java
----------------------------------------------------------------------
diff --git a/wab/src/main/java/org/apache/unomi/web/ServletCommon.java 
b/wab/src/main/java/org/apache/unomi/web/ServletCommon.java
new file mode 100644
index 0000000..da27fca
--- /dev/null
+++ b/wab/src/main/java/org/apache/unomi/web/ServletCommon.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.unomi.web;
+
+import org.apache.unomi.api.Event;
+import org.apache.unomi.api.Persona;
+import org.apache.unomi.api.Profile;
+import org.apache.unomi.api.Session;
+import org.apache.unomi.api.services.EventService;
+import org.apache.unomi.api.services.PrivacyService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author dgaillard
+ */
+public class ServletCommon {
+    private static final Logger logger = 
LoggerFactory.getLogger(ServletCommon.class.getName());
+
+    public static String getProfileIdCookieValue(HttpServletRequest 
httpServletRequest, String profileIdCookieName) {
+        String cookieProfileId = null;
+
+        Cookie[] cookies = httpServletRequest.getCookies();
+        if (cookies != null) {
+            for (Cookie cookie : cookies) {
+                if (profileIdCookieName.equals(cookie.getName())) {
+                    cookieProfileId = cookie.getValue();
+                }
+            }
+        }
+
+        return cookieProfileId;
+    }
+
+    public static Changes handleEvents(List<Event> events, Session session, 
Profile profile,
+                                    ServletRequest request, ServletResponse 
response, Date timestamp,
+                                    PrivacyService privacyService, 
EventService eventService) {
+        List<String> filteredEventTypes = 
privacyService.getFilteredEventTypes(profile);
+
+        String thirdPartyId = 
eventService.authenticateThirdPartyServer(((HttpServletRequest) 
request).getHeader("X-Unomi-Peer"),
+                request.getRemoteAddr());
+
+        int changes = EventService.NO_CHANGE;
+        // execute provided events if any
+        if (events != null && !(profile instanceof Persona)) {
+            for (Event event : events) {
+                if (event.getEventType() != null) {
+                    Event eventToSend = new Event(event.getEventType(), 
session, profile, event.getScope(), event.getSource(),
+                            event.getTarget(), event.getProperties(), 
timestamp, event.isPersistent());
+                    if (!eventService.isEventAllowed(event, thirdPartyId)) {
+                        logger.warn("Event is not allowed : {}", 
event.getEventType());
+                        continue;
+                    }
+                    if (filteredEventTypes != null && 
filteredEventTypes.contains(event.getEventType())) {
+                        logger.debug("Profile is filtering event type {}", 
event.getEventType());
+                        continue;
+                    }
+                    if (profile.isAnonymousProfile()) {
+                        // Do not keep track of profile in event
+                        eventToSend.setProfileId(null);
+                    }
+
+                    
eventToSend.getAttributes().put(Event.HTTP_REQUEST_ATTRIBUTE, request);
+                    
eventToSend.getAttributes().put(Event.HTTP_RESPONSE_ATTRIBUTE, response);
+                    logger.debug("Received event " + event.getEventType() + " 
for profile=" + profile.getItemId() + " session="
+                            + session.getItemId() + " target=" + 
event.getTarget() + " timestamp=" + timestamp);
+                    changes = eventService.send(eventToSend);
+                    // If the event execution changes the profile we need to 
update it so the next event use the right profile
+                    if ((changes & EventService.PROFILE_UPDATED) == 
EventService.PROFILE_UPDATED) {
+                        profile = eventToSend.getProfile();
+                    }
+                }
+            }
+        }
+
+        return new Changes(changes, profile);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/a171e3d8/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git a/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml 
b/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 416d920..9dc06b8 100644
--- a/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/wab/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -72,7 +72,9 @@
         <property name="profileService" ref="profileService"/>
         <property name="eventService" ref="eventService"/>
         <property name="privacyService" ref="privacyService" />
+        <property name="profileIdCookieName" 
value="${web.contextserver.profileIdCookieName}"/>
     </bean>
+
     <service id="eventsCollectorServletService" ref="eventsCollectorServlet">
         <interfaces>
             <value>javax.servlet.Servlet</value>

Reply via email to