UNOMI-168 Refactor PropertyType in-memory cache

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

Branch: refs/heads/master
Commit: c638a13139fcab60867141384d4b9ffb2a0d0c72
Parents: d8bbbfa
Author: Jarek Lipski <jlip...@jahia.com>
Authored: Tue Feb 27 16:45:57 2018 +0100
Committer: Jarek Lipski <jlip...@jahia.com>
Committed: Wed Feb 28 11:56:19 2018 +0100

----------------------------------------------------------------------
 .../services/services/ProfileServiceImpl.java   | 130 ++++++++++++-------
 1 file changed, 82 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/c638a131/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 895af37..fd55496 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
@@ -42,6 +42,74 @@ import java.util.*;
 
 public class ProfileServiceImpl implements ProfileService, 
SynchronousBundleListener {
 
+    private static class PropertyTypes {
+        private List<PropertyType> allPropertyTypes;
+        private Map<String, PropertyType> propertyTypesById = new HashMap<>();
+        private Map<String, List<PropertyType>> propertyTypesByTags = new 
HashMap<>();
+        private Map<String, List<PropertyType>> propertyTypesBySystemTags = 
new HashMap<>();
+        private Map<String, List<PropertyType>> propertyTypesByTarget = new 
HashMap<>();
+
+        public PropertyTypes(List<PropertyType> allPropertyTypes) {
+            this.allPropertyTypes = allPropertyTypes;
+            this.updateMaps();
+        }
+
+        public List<PropertyType> getAll() {
+            return allPropertyTypes;
+        }
+
+        public PropertyType get(String propertyId) {
+            return propertyTypesById.get(propertyId);
+        }
+
+        public Map<String, List<PropertyType>> getAllByTarget() {
+            return propertyTypesByTarget;
+        }
+
+        public List<PropertyType> getByTag(String tag) {
+            return propertyTypesByTags.get(tag);
+        }
+
+        public List<PropertyType> getBySystemTag(String systemTag) {
+            return propertyTypesBySystemTags.get(systemTag);
+        }
+
+        public List<PropertyType> getByTarget(String target) {
+            return propertyTypesByTarget.get(target);
+        }
+
+        private void updateMaps() {
+            Map<String,PropertyType> newPropertyTypesById = new HashMap<>();
+            Map<String,List<PropertyType>> newPropertyTypesByTags = new 
HashMap<>();
+            Map<String,List<PropertyType>> newPropertyTypesBySystemTags = new 
HashMap<>();
+            Map<String,List<PropertyType>> newPropertyTypesByTarget = new 
HashMap<>();
+            for (PropertyType propertyType : allPropertyTypes) {
+                newPropertyTypesById.put(propertyType.getItemId(), 
propertyType);
+                for (String propertyTypeTag : 
propertyType.getMetadata().getTags()) {
+                    updateListMap(newPropertyTypesByTags, propertyType, 
propertyTypeTag);
+                }
+                for (String propertyTypeSystemTag : 
propertyType.getMetadata().getSystemTags()) {
+                    updateListMap(newPropertyTypesBySystemTags, propertyType, 
propertyTypeSystemTag);
+                }
+                updateListMap(newPropertyTypesByTarget, propertyType, 
propertyType.getTarget());
+            }
+            propertyTypesById = newPropertyTypesById;
+            propertyTypesByTags = newPropertyTypesByTags;
+            propertyTypesBySystemTags = newPropertyTypesBySystemTags;
+            propertyTypesByTarget = newPropertyTypesByTarget;
+        }
+
+        private void updateListMap(Map<String, List<PropertyType>> listMap, 
PropertyType propertyType, String key) {
+            List<PropertyType> propertyTypes = listMap.get(key);
+            if (propertyTypes == null) {
+                propertyTypes = new ArrayList<>();
+            }
+            propertyTypes.add(propertyType);
+            listMap.put(key, propertyTypes);
+        }
+
+    }
+
     private static final Logger logger = 
LoggerFactory.getLogger(ProfileServiceImpl.class.getName());
 
     private BundleContext bundleContext;
@@ -64,11 +132,7 @@ public class ProfileServiceImpl implements ProfileService, 
SynchronousBundleList
 
     private Timer purgeProfileTimer;
 
-    private List<PropertyType> allPropertyTypes;
-    private Map<String,PropertyType> propertyTypesById = new HashMap<>();
-    private Map<String,List<PropertyType>> propertyTypesByTags = new 
HashMap<>();
-    private Map<String,List<PropertyType>> propertyTypesBySystemTags = new 
HashMap<>();
-    private Map<String,List<PropertyType>> propertyTypesByTarget = new 
HashMap<>();
+    private PropertyTypes propertyTypes;
 
     private boolean forceRefreshOnSave = false;
 
@@ -164,39 +228,12 @@ public class ProfileServiceImpl implements 
ProfileService, SynchronousBundleList
 
     private void loadPropertyTypesFromPersistence() {
         try {
-            allPropertyTypes = 
persistenceService.getAllItems(PropertyType.class, 0, -1, "rank").getList();
-            Map<String,PropertyType> newPropertyTypesById = new HashMap<>();
-            Map<String,List<PropertyType>> newPropertyTypesByTags = new 
HashMap<>();
-            Map<String,List<PropertyType>> newPropertyTypesBySystemTags = new 
HashMap<>();
-            Map<String,List<PropertyType>> newPropertyTypesByTarget = new 
HashMap<>();
-            for (PropertyType propertyType : allPropertyTypes) {
-                newPropertyTypesById.put(propertyType.getItemId(), 
propertyType);
-                for (String propertyTypeTag : 
propertyType.getMetadata().getTags()) {
-                    updateListMap(newPropertyTypesByTags, propertyType, 
propertyTypeTag);
-                }
-                for (String propertyTypeSystemTag : 
propertyType.getMetadata().getSystemTags()) {
-                    updateListMap(newPropertyTypesBySystemTags, propertyType, 
propertyTypeSystemTag);
-                }
-                updateListMap(newPropertyTypesByTarget, propertyType, 
propertyType.getTarget());
-            }
-            propertyTypesById = newPropertyTypesById;
-            propertyTypesByTags = newPropertyTypesByTags;
-            propertyTypesBySystemTags = newPropertyTypesBySystemTags;
-            propertyTypesByTarget = newPropertyTypesByTarget;
+            this.propertyTypes = new 
PropertyTypes(persistenceService.getAllItems(PropertyType.class, 0, -1, 
"rank").getList());
         } catch (Exception e) {
             logger.error("Error loading property types from persistence 
service", e);
         }
     }
 
-    private void updateListMap(Map<String, List<PropertyType>> listMap, 
PropertyType propertyType, String key) {
-        List<PropertyType> propertyTypes = listMap.get(key);
-        if (propertyTypes == null) {
-            propertyTypes = new ArrayList<>();
-        }
-        propertyTypes.add(propertyType);
-        listMap.put(key, propertyTypes);
-    }
-
     private void cancelPropertyTypeLoad() {
         if (allPropertyTypesTimer != null) {
             allPropertyTypesTimer.cancel();
@@ -730,40 +767,37 @@ public class ProfileServiceImpl implements 
ProfileService, SynchronousBundleList
         if (target == null) {
             return null;
         }
-        List<PropertyType> propertyTypes = propertyTypesByTarget.get(target);
-        if (propertyTypes == null) {
+        Collection<PropertyType> result = propertyTypes.getByTarget(target);
+        if (result == null) {
             return new ArrayList<>();
         }
-        return propertyTypes;
+        return result;
     }
 
     public Map<String, Collection<PropertyType>> getTargetPropertyTypes() {
-        if (propertyTypesByTarget == null) {
-            return new HashMap<>();
-        }
-        return new HashMap<>(propertyTypesByTarget);
+        return new HashMap<>(propertyTypes.getAllByTarget());
     }
 
     public Set<PropertyType> getPropertyTypeByTag(String tag) {
         if (tag == null) {
             return null;
         }
-        List<PropertyType> propertyTypes = propertyTypesByTags.get(tag);
-        if (propertyTypes == null) {
+        List<PropertyType> result = propertyTypes.getByTag(tag);
+        if (result == null) {
             return new LinkedHashSet<>();
         }
-        return new LinkedHashSet<>(propertyTypes);
+        return new LinkedHashSet<>(result);
     }
 
     public Set<PropertyType> getPropertyTypeBySystemTag(String tag) {
         if (tag == null) {
             return null;
         }
-        List<PropertyType> propertyTypes = propertyTypesBySystemTags.get(tag);
-        if (propertyTypes == null) {
+        List<PropertyType> result = propertyTypes.getBySystemTag(tag);
+        if (result == null) {
             return new LinkedHashSet<>();
         }
-        return new LinkedHashSet<>(propertyTypes);
+        return new LinkedHashSet<>(result);
     }
 
     public Collection<PropertyType> getPropertyTypeByMapping(String 
propertyName) {
@@ -780,7 +814,7 @@ public class ProfileServiceImpl implements ProfileService, 
SynchronousBundleList
             }
         });
 
-        for (PropertyType propertyType : allPropertyTypes) {
+        for (PropertyType propertyType : propertyTypes.getAll()) {
             if (propertyType.getAutomaticMappingsFrom() != null && 
propertyType.getAutomaticMappingsFrom().contains(propertyName)) {
                 l.add(propertyType);
             }
@@ -789,7 +823,7 @@ public class ProfileServiceImpl implements ProfileService, 
SynchronousBundleList
     }
 
     public PropertyType getPropertyType(String id) {
-        return propertyTypesById.get(id);
+        return propertyTypes.get(id);
     }
 
     public PartialList<Session> getPersonaSessions(String personaId, int 
offset, int size, String sortBy) {

Reply via email to