Make condition evaluator and condition ES query builders registration more 
solid by using reference listeners.

Signed-off-by: Serge Huber <[email protected]>


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

Branch: refs/heads/master
Commit: 1c11ecc109469a6c7b5bc446d4b35d4eeb82bee6
Parents: 2ff9286
Author: Serge Huber <[email protected]>
Authored: Thu Dec 22 10:42:42 2016 +0100
Committer: Serge Huber <[email protected]>
Committed: Thu Dec 22 10:42:42 2016 +0100

----------------------------------------------------------------------
 .../ElasticSearchPersistenceServiceImpl.java    | 49 +++++++-------------
 .../ConditionESQueryBuilderDispatcher.java      | 10 ++++
 .../ConditionEvaluatorDispatcher.java           |  9 ++++
 .../resources/OSGI-INF/blueprint/blueprint.xml  | 15 ++++++
 4 files changed, 52 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/1c11ecc1/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 f52dc5a..2a074c8 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
@@ -430,19 +430,6 @@ public class ElasticSearchPersistenceServiceImpl 
implements PersistenceService,
 
         bundleContext.addBundleListener(this);
 
-        try {
-            for (ServiceReference<ConditionEvaluator> reference : 
bundleContext.getServiceReferences(ConditionEvaluator.class, null)) {
-                ConditionEvaluator service = 
bundleContext.getService(reference);
-                
conditionEvaluatorDispatcher.addEvaluator(reference.getProperty("conditionEvaluatorId").toString(),
 reference.getBundle().getBundleId(), service);
-            }
-            for (ServiceReference<ConditionESQueryBuilder> reference : 
bundleContext.getServiceReferences(ConditionESQueryBuilder.class, null)) {
-                ConditionESQueryBuilder service = 
bundleContext.getService(reference);
-                
conditionESQueryBuilderDispatcher.addQueryBuilder(reference.getProperty("queryBuilderId").toString(),
 reference.getBundle().getBundleId(), service);
-            }
-        } catch (Exception e) {
-            logger.error("Cannot get services", e);
-        }
-
         timer = new Timer();
 
         timer.scheduleAtFixedRate(new TimerTask() {
@@ -594,30 +581,30 @@ public class ElasticSearchPersistenceServiceImpl 
implements PersistenceService,
         bundleContext.removeBundleListener(this);
     }
 
+    public void bindConditionEvaluator(ServiceReference<ConditionEvaluator> 
conditionEvaluatorServiceReference) {
+        ConditionEvaluator conditionEvaluator = 
bundleContext.getService(conditionEvaluatorServiceReference);
+        
conditionEvaluatorDispatcher.addEvaluator(conditionEvaluatorServiceReference.getProperty("conditionEvaluatorId").toString(),
 conditionEvaluatorServiceReference.getBundle().getBundleId(), 
conditionEvaluator);
+    }
+
+    public void unbindConditionEvaluator(ServiceReference<ConditionEvaluator> 
conditionEvaluatorServiceReference) {
+        
conditionEvaluatorDispatcher.removeEvaluator(conditionEvaluatorServiceReference.getProperty("conditionEvaluatorId").toString(),
 conditionEvaluatorServiceReference.getBundle().getBundleId());
+    }
+
+    public void 
bindConditionESQueryBuilder(ServiceReference<ConditionESQueryBuilder> 
conditionESQueryBuilderServiceReference) {
+        ConditionESQueryBuilder conditionESQueryBuilder = 
bundleContext.getService(conditionESQueryBuilderServiceReference);
+        
conditionESQueryBuilderDispatcher.addQueryBuilder(conditionESQueryBuilderServiceReference.getProperty("queryBuilderId").toString(),
 conditionESQueryBuilderServiceReference.getBundle().getBundleId(), 
conditionESQueryBuilder);
+    }
+
+    public void 
unbindConditionESQueryBuilder(ServiceReference<ConditionESQueryBuilder> 
conditionESQueryBuilderServiceReference) {
+        
conditionESQueryBuilderDispatcher.removeQueryBuilder(conditionESQueryBuilderServiceReference.getProperty("queryBuilderId").toString(),
 conditionESQueryBuilderServiceReference.getBundle().getBundleId());
+    }
+
     @Override
     public void bundleChanged(BundleEvent event) {
         switch (event.getType()) {
-            case BundleEvent.STARTED:
-                // @todo replace this with a proper service tracker/listener
-                if (event.getBundle() != null && 
event.getBundle().getRegisteredServices() != null) {
-                    for (ServiceReference<?> reference : 
event.getBundle().getRegisteredServices()) {
-                        Object service = bundleContext.getService(reference);
-                        if (service instanceof ConditionEvaluator) {
-                            
conditionEvaluatorDispatcher.addEvaluator(reference.getProperty("conditionEvaluatorId").toString(),
 event.getBundle().getBundleId(), (ConditionEvaluator) service);
-                        }
-                        if (service instanceof ConditionESQueryBuilder) {
-                            
conditionESQueryBuilderDispatcher.addQueryBuilder(reference.getProperty("queryBuilderId").toString(),
 event.getBundle().getBundleId(), (ConditionESQueryBuilder) service);
-                        }
-                    }
-                }
-                break;
             case BundleEvent.STARTING:
                 loadPredefinedMappings(event.getBundle().getBundleContext(), 
true);
                 break;
-            case BundleEvent.STOPPING:
-                
conditionEvaluatorDispatcher.removeEvaluators(event.getBundle().getBundleId());
-                
conditionESQueryBuilderDispatcher.removeQueryBuilders(event.getBundle().getBundleId());
-                break;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/1c11ecc1/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionESQueryBuilderDispatcher.java
----------------------------------------------------------------------
diff --git 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionESQueryBuilderDispatcher.java
 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionESQueryBuilderDispatcher.java
index 3ab0d5e..fbea30e 100644
--- 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionESQueryBuilderDispatcher.java
+++ 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionESQueryBuilderDispatcher.java
@@ -52,6 +52,16 @@ public class ConditionESQueryBuilderDispatcher {
         queryBuildersByBundle.get(bundleId).add(name);
     }
 
+    public void removeQueryBuilder(String name, long bundleId) {
+        queryBuilders.remove(name);
+        List<String> bundleEvaluators = queryBuildersByBundle.get(bundleId);
+        if (bundleEvaluators != null && bundleEvaluators.size() > 0) {
+            bundleEvaluators.remove(name);
+            queryBuildersByBundle.put(bundleId, bundleEvaluators);
+        }
+    }
+
+
     public void removeQueryBuilders(long bundleId) {
         if (queryBuildersByBundle.containsKey(bundleId)) {
             for (String s : queryBuildersByBundle.get(bundleId)) {

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/1c11ecc1/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionEvaluatorDispatcher.java
----------------------------------------------------------------------
diff --git 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionEvaluatorDispatcher.java
 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionEvaluatorDispatcher.java
index 0341c46..5573eed 100644
--- 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionEvaluatorDispatcher.java
+++ 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/conditions/ConditionEvaluatorDispatcher.java
@@ -51,6 +51,15 @@ public class ConditionEvaluatorDispatcher {
         evaluatorsByBundle.get(bundleId).add(name);
     }
 
+    public void removeEvaluator(String name, long bundleId) {
+        evaluators.remove(name);
+        List<String> bundleEvaluators = evaluatorsByBundle.get(bundleId);
+        if (bundleEvaluators != null && bundleEvaluators.size() > 0) {
+            bundleEvaluators.remove(name);
+            evaluatorsByBundle.put(bundleId, bundleEvaluators);
+        }
+    }
+
     public void removeEvaluators(long bundleId) {
         if (evaluatorsByBundle.containsKey(bundleId)) {
             for (String s : evaluatorsByBundle.get(bundleId)) {

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/1c11ecc1/persistence-elasticsearch/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git 
a/persistence-elasticsearch/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
 
b/persistence-elasticsearch/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 23963ac..8b514d7 100644
--- 
a/persistence-elasticsearch/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ 
b/persistence-elasticsearch/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -131,4 +131,19 @@
         <property name="karafJMXPort" value="${es.cluster.jmxPort}" />
     </bean>
 
+    <!-- We use a listener here because using the list directly for listening 
to proxies coming from the same bundle didn't seem to work -->
+    <reference-list id="conditionEvaluators"
+                    
interface="org.apache.unomi.persistence.elasticsearch.conditions.ConditionEvaluator"
+                    availability="optional">
+        <reference-listener
+                bind-method="bindConditionEvaluator" 
unbind-method="unbindConditionEvaluator" 
ref="elasticSearchPersistenceServiceImpl"/>
+    </reference-list>
+
+    <reference-list id="conditionESQueryBuilders"
+                    
interface="org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder"
+        availability="optional">
+        <reference-listener
+                bind-method="bindConditionESQueryBuilder" 
unbind-method="unbindConditionESQueryBuilder" 
ref="elasticSearchPersistenceServiceImpl"/>
+    </reference-list>
+
 </blueprint>

Reply via email to