You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by sh...@apache.org on 2016/09/21 11:55:47 UTC

[06/16] incubator-unomi git commit: UNOMI-39 - anonymous browsing : anonymize removed profile properties. implements default denied properties, copy allowed properties from profile to anonymous. Cleaned profile and segment queries.

UNOMI-39 - anonymous browsing : anonymize removed profile properties. implements default denied properties, copy allowed properties from profile to anonymous. Cleaned profile and segment queries.


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

Branch: refs/heads/UNOMI-28-ES-2-X-UPGRADE
Commit: 685f67ffa889b9dd329255cf74c6a4029ac82200
Parents: eee8d6f
Author: Thomas Draier <dr...@apache.org>
Authored: Thu Aug 18 16:32:40 2016 +0200
Committer: Thomas Draier <dr...@apache.org>
Committed: Thu Aug 18 16:32:40 2016 +0200

----------------------------------------------------------------------
 .../unomi/api/services/PrivacyService.java      |  8 +--
 .../privacy/rest/PrivacyServiceEndPoint.java    |  4 +-
 extensions/privacy-extension/services/pom.xml   | 26 ++++++++++
 .../privacy/internal/PrivacyServiceImpl.java    | 53 ++++++++++++++------
 .../resources/OSGI-INF/blueprint/blueprint.xml  | 10 +++-
 .../main/resources/org.apache.unomi.privacy.cfg | 18 +++++++
 kar/src/main/feature/feature.xml                |  1 +
 .../AllEventToProfilePropertiesAction.java      | 18 ++++---
 .../actions/EventToProfilePropertyAction.java   | 15 ++++--
 .../baseplugin/actions/SetPropertyAction.java   | 14 +++---
 .../BooleanConditionESQueryBuilder.java         |  2 +-
 .../resources/OSGI-INF/blueprint/blueprint.xml  | 10 +++-
 pom.xml                                         |  2 -
 .../services/services/ProfileServiceImpl.java   |  5 +-
 .../services/services/SegmentServiceImpl.java   | 19 ++++---
 .../org/apache/unomi/web/ContextServlet.java    | 27 +++++++---
 .../unomi/web/EventsCollectorServlet.java       |  2 +-
 17 files changed, 169 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/api/src/main/java/org/apache/unomi/api/services/PrivacyService.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/unomi/api/services/PrivacyService.java b/api/src/main/java/org/apache/unomi/api/services/PrivacyService.java
index 6d22678..4dd9c64 100644
--- a/api/src/main/java/org/apache/unomi/api/services/PrivacyService.java
+++ b/api/src/main/java/org/apache/unomi/api/services/PrivacyService.java
@@ -27,13 +27,13 @@ import java.util.List;
  */
 public interface PrivacyService {
 
-    String GLOBAL_ANONYMOUS_PROFILE_ID = "global-anonymous-profile";
-
     ServerInfo getServerInfo();
 
     Boolean deleteProfile(String profileId);
 
-    String anonymizeBrowsingData(String profileId);
+    Boolean anonymizeProfile(String profileId);
+
+    Boolean anonymizeBrowsingData(String profileId);
 
     Boolean deleteProfileData(String profileId);
 
@@ -41,7 +41,7 @@ public interface PrivacyService {
 
     Boolean isRequireAnonymousBrowsing(String profileId);
 
-    Profile getAnonymousProfile();
+    Profile getAnonymousProfile(Profile profile);
 
     List<String> getFilteredEventTypes(String profileId);
 

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java
----------------------------------------------------------------------
diff --git a/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java b/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java
index 6895305..5ef088c 100644
--- a/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java
+++ b/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java
@@ -66,8 +66,8 @@ public class PrivacyServiceEndPoint {
 
     @POST
     @Path("/profiles/{profileId}/anonymize")
-    public void anonymizeBrowsingData(@PathParam("profileId") String profileId) {
-        privacyService.anonymizeBrowsingData(profileId);
+    public void anonymizeProfile(@PathParam("profileId") String profileId) {
+        privacyService.anonymizeProfile(profileId);
     }
 
     @GET

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/extensions/privacy-extension/services/pom.xml
----------------------------------------------------------------------
diff --git a/extensions/privacy-extension/services/pom.xml b/extensions/privacy-extension/services/pom.xml
index 9fad09c..b6c8d3c 100644
--- a/extensions/privacy-extension/services/pom.xml
+++ b/extensions/privacy-extension/services/pom.xml
@@ -66,6 +66,32 @@
                     </instructions>
                 </configuration>
             </plugin>
+
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>attach-artifacts</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>attach-artifact</goal>
+                        </goals>
+                        <configuration>
+                            <artifacts>
+                                <artifact>
+                                    <file>
+                                        src/main/resources/org.apache.unomi.privacy.cfg
+                                    </file>
+                                    <type>cfg</type>
+                                    <classifier>privacycfg</classifier>
+                                </artifact>
+                            </artifacts>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
         </plugins>
     </build>
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/extensions/privacy-extension/services/src/main/java/org/apache/unomi/privacy/internal/PrivacyServiceImpl.java
----------------------------------------------------------------------
diff --git a/extensions/privacy-extension/services/src/main/java/org/apache/unomi/privacy/internal/PrivacyServiceImpl.java b/extensions/privacy-extension/services/src/main/java/org/apache/unomi/privacy/internal/PrivacyServiceImpl.java
index e05d245..22ec95a 100644
--- a/extensions/privacy-extension/services/src/main/java/org/apache/unomi/privacy/internal/PrivacyServiceImpl.java
+++ b/extensions/privacy-extension/services/src/main/java/org/apache/unomi/privacy/internal/PrivacyServiceImpl.java
@@ -18,8 +18,6 @@
 package org.apache.unomi.privacy.internal;
 
 import org.apache.unomi.api.*;
-import org.apache.unomi.api.conditions.Condition;
-import org.apache.unomi.api.services.DefinitionsService;
 import org.apache.unomi.api.services.EventService;
 import org.apache.unomi.api.services.PrivacyService;
 import org.apache.unomi.api.services.ProfileService;
@@ -34,18 +32,14 @@ import java.util.*;
 public class PrivacyServiceImpl implements PrivacyService {
 
     private PersistenceService persistenceService;
-    private DefinitionsService definitionsService;
     private ProfileService profileService;
     private EventService eventService;
+    private List<String> defaultDeniedProperties;
 
     public void setPersistenceService(PersistenceService persistenceService) {
         this.persistenceService = persistenceService;
     }
 
-    public void setDefinitionsService(DefinitionsService definitionsService) {
-        this.definitionsService = definitionsService;
-    }
-
     public void setProfileService(ProfileService profileService) {
         this.profileService = profileService;
     }
@@ -54,6 +48,14 @@ public class PrivacyServiceImpl implements PrivacyService {
         this.eventService = eventService;
     }
 
+    public void setDefaultDeniedProperties(List<String> defaultDeniedProperties) {
+        this.defaultDeniedProperties = defaultDeniedProperties;
+    }
+
+    public void setDefaultDeniedProperties(String defaultDeniedProperties) {
+        this.defaultDeniedProperties = Arrays.asList(defaultDeniedProperties.split(","));
+    }
+
     @Override
     public ServerInfo getServerInfo() {
         ServerInfo serverInfo = new ServerInfo();
@@ -88,15 +90,35 @@ public class PrivacyServiceImpl implements PrivacyService {
     }
 
     @Override
-    public String anonymizeBrowsingData(String profileId) {
+    public Boolean anonymizeProfile(String profileId) {
+        Profile profile = profileService.load(profileId);
+        if (profile == null) {
+            return false;
+        }
+        boolean res = profile.getProperties().keySet().removeAll(getDeniedProperties(profile.getItemId()));
+
+        Event profileUpdated = new Event("profileUpdated", null, profile, null, null, profile, new Date());
+        profileUpdated.setPersistent(false);
+        eventService.send(profileUpdated);
+
+        profileService.save(profile);
+
+        return res;
+    }
+
+    @Override
+    public Boolean anonymizeBrowsingData(String profileId) {
         Profile profile = profileService.load(profileId);
         if (profile == null) {
-            return profileId;
+            return false;
         }
 
         List<Session> sessions = profileService.getProfileSessions(profileId, null, 0, -1, null).getList();
+        if (sessions.isEmpty()) {
+            return false;
+        }
         for (Session session : sessions) {
-            Profile newProfile = getAnonymousProfile();
+            Profile newProfile = getAnonymousProfile(session.getProfile());
             session.setProfile(newProfile);
             persistenceService.save(session);
             List<Event> events = eventService.searchEvents(session.getItemId(), new String[0], null, 0, -1, null).getList();
@@ -105,7 +127,7 @@ public class PrivacyServiceImpl implements PrivacyService {
             }
         }
 
-        return profileId;
+        return true;
     }
 
     @Override
@@ -135,10 +157,11 @@ public class PrivacyServiceImpl implements PrivacyService {
         return anonymous != null && anonymous;
     }
 
-    public Profile getAnonymousProfile() {
-        String id = UUID.randomUUID().toString();
-        Profile anonymousProfile = new Profile(id);
+    public Profile getAnonymousProfile(Profile profile) {
+        Profile anonymousProfile = new Profile(UUID.randomUUID().toString());
         anonymousProfile.getSystemProperties().put("isAnonymousProfile", true);
+        anonymousProfile.getProperties().putAll(profile.getProperties());
+        anonymousProfile.getProperties().keySet().removeAll(getDeniedProperties(profile.getItemId()));
         profileService.save(anonymousProfile);
         return anonymousProfile;
     }
@@ -165,7 +188,7 @@ public class PrivacyServiceImpl implements PrivacyService {
 
     @Override
     public List<String> getDeniedProperties(String profileId) {
-        return null;
+        return defaultDeniedProperties;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/extensions/privacy-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git a/extensions/privacy-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/extensions/privacy-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 64b8db2..ea4df97 100644
--- a/extensions/privacy-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/extensions/privacy-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -17,8 +17,16 @@
   -->
 
 <blueprint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
            xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
 
+    <cm:property-placeholder persistent-id="org.apache.unomi.privacy"
+                             update-strategy="reload">
+        <cm:default-properties>
+            <cm:property name="defaultDeniedProperties" value="firstName,lastName"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+
     <reference id="persistenceService"
                interface="org.apache.unomi.persistence.spi.PersistenceService"/>
 
@@ -32,9 +40,9 @@
 
     <bean id="privacyServiceImpl" class="org.apache.unomi.privacy.internal.PrivacyServiceImpl">
         <property name="persistenceService" ref="persistenceService"/>
-        <property name="definitionsService" ref="definitionsService"/>
         <property name="eventService" ref="eventService" />
         <property name="profileService" ref="profileService" />
+        <property name="defaultDeniedProperties" value="${defaultDeniedProperties}" />
     </bean>
     <service id="privacyService" ref="privacyServiceImpl" auto-export="interfaces"/>
 </blueprint>

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/extensions/privacy-extension/services/src/main/resources/org.apache.unomi.privacy.cfg
----------------------------------------------------------------------
diff --git a/extensions/privacy-extension/services/src/main/resources/org.apache.unomi.privacy.cfg b/extensions/privacy-extension/services/src/main/resources/org.apache.unomi.privacy.cfg
new file mode 100644
index 0000000..320273c
--- /dev/null
+++ b/extensions/privacy-extension/services/src/main/resources/org.apache.unomi.privacy.cfg
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+defaultDeniedProperties=firstName,lastName,email,phoneNumber,address,facebookId,googleId,linedInId,twitterId

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/kar/src/main/feature/feature.xml
----------------------------------------------------------------------
diff --git a/kar/src/main/feature/feature.xml b/kar/src/main/feature/feature.xml
index 5e63b8b..fff6799 100644
--- a/kar/src/main/feature/feature.xml
+++ b/kar/src/main/feature/feature.xml
@@ -28,6 +28,7 @@
         <configfile finalname="/etc/org.apache.unomi.plugins.request.cfg">mvn:org.apache.unomi/unomi-plugins-request/${project.version}/cfg/requestcfg</configfile>
         <configfile finalname="/etc/org.apache.unomi.services.cfg">mvn:org.apache.unomi/unomi-services/${project.version}/cfg/servicescfg</configfile>
         <configfile finalname="/etc/org.apache.unomi.thirdparty.cfg">mvn:org.apache.unomi/unomi-services/${project.version}/cfg/thirdpartycfg</configfile>
+        <configfile finalname="/etc/org.apache.unomi.privacy.cfg">mvn:org.apache.unomi/cxs-privacy-extension-services/${project.version}/cfg/privacycfg</configfile>
         <configfile finalname="/etc/org.apache.unomi.geonames.cfg">mvn:org.apache.unomi/cxs-geonames-services/${project.version}/cfg/geonamescfg</configfile>
         <configfile finalname="/etc/elasticsearch.yml">mvn:org.apache.unomi/unomi-persistence-elasticsearch-core/${project.version}/yml/elasticsearchconfig</configfile>
         <bundle start-level="75">mvn:commons-io/commons-io/2.4</bundle>

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/AllEventToProfilePropertiesAction.java
----------------------------------------------------------------------
diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/AllEventToProfilePropertiesAction.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/AllEventToProfilePropertiesAction.java
index 33b79e9..850e489 100644
--- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/AllEventToProfilePropertiesAction.java
+++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/AllEventToProfilePropertiesAction.java
@@ -22,6 +22,7 @@ import org.apache.unomi.api.Event;
 import org.apache.unomi.api.actions.Action;
 import org.apache.unomi.api.actions.ActionExecutor;
 import org.apache.unomi.api.services.EventService;
+import org.apache.unomi.api.services.PrivacyService;
 import org.apache.unomi.api.services.ProfileService;
 
 import java.util.HashMap;
@@ -30,16 +31,18 @@ import java.util.Map;
 public class AllEventToProfilePropertiesAction implements ActionExecutor {
 
     private ProfileService profileService;
+    private PrivacyService privacyService;
 
     public void setProfileService(ProfileService profileService) {
         this.profileService = profileService;
     }
 
+    public void setPrivacyService(PrivacyService privacyService) {
+        this.privacyService = privacyService;
+    }
+
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public int execute(Action action, Event event) {
-        if (event.getProfile().isAnonymousProfile()) {
-            return EventService.NO_CHANGE;
-        }
         boolean changed = false;
         Map<String, Object> properties = new HashMap<String,Object>();
         if (event.getProperties() != null) {
@@ -58,12 +61,11 @@ public class AllEventToProfilePropertiesAction implements ActionExecutor {
         for (Map.Entry<String, Object> entry : properties.entrySet()) {
             if (event.getProfile().getProperty(entry.getKey()) == null || !event.getProfile().getProperty(entry.getKey()).equals(event.getProperty(entry.getKey()))) {
                 String propertyMapping = profileService.getPropertyTypeMapping(entry.getKey());
-                if (propertyMapping != null) {
-                    event.getProfile().setProperty(propertyMapping, entry.getValue());
-                } else {
-                    event.getProfile().setProperty(entry.getKey(), entry.getValue());
+                String propertyName = (propertyMapping != null) ? propertyMapping : entry.getKey();
+                if (!event.getProfile().isAnonymousProfile() || !privacyService.getDeniedProperties(event.getProfileId()).contains(propertyName)) {
+                    event.getProfile().setProperty(propertyName, entry.getValue());
+                    changed = true;
                 }
-                changed = true;
             }
         }
         return changed ? EventService.PROFILE_UPDATED : EventService.NO_CHANGE;

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/EventToProfilePropertyAction.java
----------------------------------------------------------------------
diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/EventToProfilePropertyAction.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/EventToProfilePropertyAction.java
index f8391d7..8efb43e 100644
--- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/EventToProfilePropertyAction.java
+++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/EventToProfilePropertyAction.java
@@ -21,18 +21,27 @@ import org.apache.unomi.api.Event;
 import org.apache.unomi.api.actions.Action;
 import org.apache.unomi.api.actions.ActionExecutor;
 import org.apache.unomi.api.services.EventService;
+import org.apache.unomi.api.services.PrivacyService;
 
 /**
  * A action to copy an event property to a profile property
  */
 public class EventToProfilePropertyAction implements ActionExecutor {
 
+    private PrivacyService privacyService;
+
+    public void setPrivacyService(PrivacyService privacyService) {
+        this.privacyService = privacyService;
+    }
+
     public int execute(Action action, Event event) {
-        if (event.getProfile().isAnonymousProfile()) {
-            return EventService.NO_CHANGE;
-        }
         String eventPropertyName = (String) action.getParameterValues().get("eventPropertyName");
         String profilePropertyName = (String) action.getParameterValues().get("profilePropertyName");
+
+        if (event.getProfile().isAnonymousProfile() && privacyService.getDeniedProperties(event.getProfileId()).contains(profilePropertyName)) {
+            return EventService.NO_CHANGE;
+        }
+
         if (event.getProfile().getProperty(profilePropertyName) == null || !event.getProfile().getProperty(profilePropertyName).equals(event.getProperty(eventPropertyName))) {
             event.getProfile().setProperty(profilePropertyName, event.getProperty(eventPropertyName));
             return EventService.PROFILE_UPDATED;

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetPropertyAction.java
----------------------------------------------------------------------
diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetPropertyAction.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetPropertyAction.java
index 0b1a877..e384960 100644
--- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetPropertyAction.java
+++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/actions/SetPropertyAction.java
@@ -21,6 +21,7 @@ import org.apache.unomi.api.Event;
 import org.apache.unomi.api.actions.Action;
 import org.apache.unomi.api.actions.ActionExecutor;
 import org.apache.unomi.api.services.EventService;
+import org.apache.unomi.api.services.PrivacyService;
 import org.apache.unomi.persistence.spi.PropertyHelper;
 
 import java.text.SimpleDateFormat;
@@ -28,17 +29,19 @@ import java.util.TimeZone;
 
 public class SetPropertyAction implements ActionExecutor {
 
-    public SetPropertyAction() {
-    }
+    private PrivacyService privacyService;
 
-    public String getActionId() {
-        return "setPropertyAction";
+    public void setPrivacyService(PrivacyService privacyService) {
+        this.privacyService = privacyService;
     }
 
     public int execute(Action action, Event event) {
         boolean storeInSession = Boolean.TRUE.equals(action.getParameterValues().get("storeInSession"));
 
-        if (event.getProfile().isAnonymousProfile() && !storeInSession) {
+        String propertyName = (String) action.getParameterValues().get("setPropertyName");
+
+        if (event.getProfile().isAnonymousProfile() && !storeInSession
+                && privacyService.getDeniedProperties(event.getProfileId()).contains(propertyName)) {
             return EventService.NO_CHANGE;
         }
 
@@ -54,7 +57,6 @@ public class SetPropertyAction implements ActionExecutor {
             format.setTimeZone(TimeZone.getTimeZone("UTC"));
             propertyValue = format.format(event.getTimeStamp());
         }
-        String propertyName = (String) action.getParameterValues().get("setPropertyName");
 
 
         Object target = storeInSession ? event.getSession() : event.getProfile();

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java
----------------------------------------------------------------------
diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java
index c41309b..d69d939 100644
--- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java
+++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java
@@ -47,7 +47,7 @@ public class BooleanConditionESQueryBuilder implements ConditionESQueryBuilder {
 
         FilterBuilder[] l = new FilterBuilder[conditionCount];
         for (int i = 0; i < conditionCount; i++) {
-            l[i] = dispatcher.buildFilter(conditions.get(i));
+            l[i] = dispatcher.buildFilter(conditions.get(i), context);
         }
 
         return isAndOperator ? FilterBuilders.andFilter(l) : FilterBuilders.orFilter(l);

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/plugins/baseplugin/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git a/plugins/baseplugin/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/plugins/baseplugin/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 125d52a..73144ec 100644
--- a/plugins/baseplugin/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/plugins/baseplugin/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -22,6 +22,7 @@
     <reference id="definitionsService" interface="org.apache.unomi.api.services.DefinitionsService"/>
     <reference id="persistenceService" interface="org.apache.unomi.persistence.spi.PersistenceService"/>
     <reference id="profileService" interface="org.apache.unomi.api.services.ProfileService"/>
+    <reference id="privacyService" interface="org.apache.unomi.api.services.PrivacyService"/>
     <reference id="segmentService" interface="org.apache.unomi.api.services.SegmentService"/>
     <reference id="eventService" interface="org.apache.unomi.api.services.EventService"/>
 
@@ -149,6 +150,7 @@
         </service-properties>
         <bean class="org.apache.unomi.plugins.baseplugin.actions.AllEventToProfilePropertiesAction">
             <property name="profileService" ref="profileService"/>
+            <property name="privacyService" ref="privacyService"/>
         </bean>
     </service>
 
@@ -156,14 +158,18 @@
         <service-properties>
             <entry key="actionExecutorId" value="eventToProfileProperty"/>
         </service-properties>
-        <bean class="org.apache.unomi.plugins.baseplugin.actions.EventToProfilePropertyAction"/>
+        <bean class="org.apache.unomi.plugins.baseplugin.actions.EventToProfilePropertyAction">
+            <property name="privacyService" ref="privacyService"/>
+        </bean>
     </service>
 
     <service auto-export="interfaces">
         <service-properties>
             <entry key="actionExecutorId" value="setProperty"/>
         </service-properties>
-        <bean class="org.apache.unomi.plugins.baseplugin.actions.SetPropertyAction"/>
+        <bean class="org.apache.unomi.plugins.baseplugin.actions.SetPropertyAction">
+            <property name="privacyService" ref="privacyService"/>
+        </bean>
     </service>
 
     <service auto-export="interfaces">

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index db4e1dd..24ee5c2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -827,8 +827,6 @@
         <module>plugins</module>
         <module>extensions</module>
         <module>kar</module>
-        <module>samples</module>
-        <module>package</module>
     </modules>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/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 521826e..bc716fb 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
@@ -249,10 +249,7 @@ public class ProfileServiceImpl implements ProfileService, SynchronousBundleList
     }
 
     public long getAllProfilesCount() {
-        Condition condition = new Condition(definitionsService.getConditionType("profilePropertyCondition"));
-        condition.setParameter("propertyName", "mergedWith");
-        condition.setParameter("comparisonOperator", "missing");
-        return persistenceService.queryCount(condition, Profile.ITEM_TYPE);
+        return persistenceService.getAllItemsCount(Profile.ITEM_TYPE);
     }
 
     public <T extends Profile> PartialList<T> search(Query query, final Class<T> clazz) {

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
index c82aad2..85c6dc3 100644
--- a/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
@@ -418,7 +418,12 @@ public class SegmentServiceImpl implements SegmentService, SynchronousBundleList
         if (segment == null) {
             return new PartialList<Profile>();
         }
-        return persistenceService.query(segment.getCondition(), sortBy, Profile.class, offset, size);
+        Condition segmentCondition = new Condition(definitionsService.getConditionType("profilePropertyCondition"));
+        segmentCondition.setParameter("propertyName", "segments");
+        segmentCondition.setParameter("comparisonOperator", "equals");
+        segmentCondition.setParameter("propertyValue", segmentID);
+
+        return persistenceService.query(segmentCondition, sortBy, Profile.class, offset, size);
     }
 
     public long getMatchingIndividualsCount(String segmentID) {
@@ -426,14 +431,12 @@ public class SegmentServiceImpl implements SegmentService, SynchronousBundleList
             return 0;
         }
 
-        Condition excludeMergedProfilesCondition = new Condition(definitionsService.getConditionType("profilePropertyCondition"));
-        excludeMergedProfilesCondition.setParameter("propertyName", "mergedWith");
-        excludeMergedProfilesCondition.setParameter("comparisonOperator", "missing");
-        Condition condition = new Condition(definitionsService.getConditionType("booleanCondition"));
-        condition.setParameter("operator", "and");
-        condition.setParameter("subConditions", Arrays.asList(getSegmentDefinition(segmentID).getCondition(), excludeMergedProfilesCondition));
+        Condition segmentCondition = new Condition(definitionsService.getConditionType("profilePropertyCondition"));
+        segmentCondition.setParameter("propertyName", "segments");
+        segmentCondition.setParameter("comparisonOperator", "equals");
+        segmentCondition.setParameter("propertyValue", segmentID);
 
-        return persistenceService.queryCount(condition, Profile.ITEM_TYPE);
+        return persistenceService.queryCount(segmentCondition, Profile.ITEM_TYPE);
     }
 
     public Boolean isProfileInSegment(Profile profile, String segmentId) {

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/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 e858e75..5051780 100644
--- a/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
+++ b/wab/src/main/java/org/apache/unomi/web/ContextServlet.java
@@ -143,7 +143,7 @@ public class ContextServlet extends HttpServlet {
                 if (session != null) {
                     profileId = session.getProfileId();
                     profile = profileService.load(profileId);
-                    profile = checkMergedProfile(response, profile, session);
+                    profile = checkMergedOrAnonymizedProfile(response, profile, session);
                 }
             }
             if (profile == null) {
@@ -161,7 +161,7 @@ public class ContextServlet extends HttpServlet {
                         profileCreated = true;
                         HttpUtils.sendProfileCookie(profile, response, profileIdCookieName, profileIdCookieDomain);
                     } else {
-                        profile = checkMergedProfile(response, profile, session);
+                        profile = checkMergedOrAnonymizedProfile(response, profile, session);
                     }
                 }
             } else if ((cookieProfileId == null || !cookieProfileId.equals(profile.getItemId())) && !profile.isAnonymousProfile()) {
@@ -198,9 +198,11 @@ public class ContextServlet extends HttpServlet {
         data.setProfileId(profile.isAnonymousProfile() ? cookieProfileId : profile.getItemId());
 
         if (privacyService.isRequireAnonymousBrowsing(profile.getItemId())) {
-            profile = privacyService.getAnonymousProfile();
-            session.setProfile(profile);
-            changes = EventService.SESSION_UPDATED;
+            if (!session.getProfile().isAnonymousProfile()) {
+                profile = privacyService.getAnonymousProfile(profile);
+                session.setProfile(profile);
+                changes = EventService.SESSION_UPDATED;
+            }
         }
 
         if(contextRequest != null){
@@ -239,10 +241,9 @@ public class ContextServlet extends HttpServlet {
         responseWriter.flush();
     }
 
-    private Profile checkMergedProfile(ServletResponse response, Profile profile, Session session) {
-        String profileId;
+    private Profile checkMergedOrAnonymizedProfile(ServletResponse response, Profile profile, Session session) {
         if (profile != null && profile.getMergedWith() != null && !profile.isAnonymousProfile()) {
-            profileId = profile.getMergedWith();
+            String profileId = profile.getMergedWith();
             Profile profileToDelete = profile;
             profile = profileService.load(profileId);
             if (profile != null) {
@@ -259,6 +260,16 @@ public class ContextServlet extends HttpServlet {
                 profileService.save(profile);
             }
         }
+        if (profile != null && !profile.isAnonymousProfile() && privacyService.isRequireAnonymousBrowsing(profile.getItemId())) {
+            if (session == null || !session.getProfile().isAnonymousProfile()) {
+                profile = privacyService.getAnonymousProfile(profile);
+                if (session != null) {
+                    session.setProfile(profile);
+                    profileService.saveSession(session);
+                }
+            }
+        }
+
         return profile;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/685f67ff/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 cf27e0a..8d2cb3b 100644
--- a/wab/src/main/java/org/apache/unomi/web/EventsCollectorServlet.java
+++ b/wab/src/main/java/org/apache/unomi/web/EventsCollectorServlet.java
@@ -128,7 +128,7 @@ public class EventsCollectorServlet extends HttpServlet {
         int changes = 0;
 
         if (privacyService.isRequireAnonymousBrowsing(profile.getItemId())) {
-            profile = privacyService.getAnonymousProfile();
+            profile = privacyService.getAnonymousProfile(profile);
             session.setProfile(profile);
             changes = EventService.SESSION_UPDATED;
         }