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>
