Repository: incubator-unomi Updated Branches: refs/heads/feature-UNOMI-70-ES5X 1c11ecc10 -> 2105da7ec
Fixed most issues by making sure we use reference listeners everywhere for proper registration of actions and conditions 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/2105da7e Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/2105da7e Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/2105da7e Branch: refs/heads/feature-UNOMI-70-ES5X Commit: 2105da7eceeecb377063dca34bdbb545042691fa Parents: 1c11ecc Author: Serge Huber <[email protected]> Authored: Thu Dec 22 17:25:29 2016 +0100 Committer: Serge Huber <[email protected]> Committed: Thu Dec 22 17:25:29 2016 +0100 ---------------------------------------------------------------------- .../ElasticSearchPersistenceServiceImpl.java | 14 +++++--- .../ConditionESQueryBuilderDispatcher.java | 31 ++-------------- .../ConditionEvaluatorDispatcher.java | 31 ++-------------- .../resources/OSGI-INF/blueprint/blueprint.xml | 2 -- .../actions/ActionExecutorDispatcher.java | 24 ++----------- .../services/services/RulesServiceImpl.java | 37 +++++++++----------- .../resources/OSGI-INF/blueprint/blueprint.xml | 8 ++++- 7 files changed, 40 insertions(+), 107 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/2105da7e/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 2a074c8..8fc7a7e 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 @@ -583,20 +583,26 @@ public class ElasticSearchPersistenceServiceImpl implements PersistenceService, public void bindConditionEvaluator(ServiceReference<ConditionEvaluator> conditionEvaluatorServiceReference) { ConditionEvaluator conditionEvaluator = bundleContext.getService(conditionEvaluatorServiceReference); - conditionEvaluatorDispatcher.addEvaluator(conditionEvaluatorServiceReference.getProperty("conditionEvaluatorId").toString(), conditionEvaluatorServiceReference.getBundle().getBundleId(), conditionEvaluator); + conditionEvaluatorDispatcher.addEvaluator(conditionEvaluatorServiceReference.getProperty("conditionEvaluatorId").toString(), conditionEvaluator); } public void unbindConditionEvaluator(ServiceReference<ConditionEvaluator> conditionEvaluatorServiceReference) { - conditionEvaluatorDispatcher.removeEvaluator(conditionEvaluatorServiceReference.getProperty("conditionEvaluatorId").toString(), conditionEvaluatorServiceReference.getBundle().getBundleId()); + if (conditionEvaluatorServiceReference == null) { + return; + } + conditionEvaluatorDispatcher.removeEvaluator(conditionEvaluatorServiceReference.getProperty("conditionEvaluatorId").toString()); } public void bindConditionESQueryBuilder(ServiceReference<ConditionESQueryBuilder> conditionESQueryBuilderServiceReference) { ConditionESQueryBuilder conditionESQueryBuilder = bundleContext.getService(conditionESQueryBuilderServiceReference); - conditionESQueryBuilderDispatcher.addQueryBuilder(conditionESQueryBuilderServiceReference.getProperty("queryBuilderId").toString(), conditionESQueryBuilderServiceReference.getBundle().getBundleId(), conditionESQueryBuilder); + conditionESQueryBuilderDispatcher.addQueryBuilder(conditionESQueryBuilderServiceReference.getProperty("queryBuilderId").toString(), conditionESQueryBuilder); } public void unbindConditionESQueryBuilder(ServiceReference<ConditionESQueryBuilder> conditionESQueryBuilderServiceReference) { - conditionESQueryBuilderDispatcher.removeQueryBuilder(conditionESQueryBuilderServiceReference.getProperty("queryBuilderId").toString(), conditionESQueryBuilderServiceReference.getBundle().getBundleId()); + if (conditionESQueryBuilderServiceReference == null) { + return; + } + conditionESQueryBuilderDispatcher.removeQueryBuilder(conditionESQueryBuilderServiceReference.getProperty("queryBuilderId").toString()); } @Override http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/2105da7e/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 fbea30e..b3099bc 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 @@ -20,57 +20,30 @@ package org.apache.unomi.persistence.elasticsearch.conditions; import org.apache.unomi.api.conditions.Condition; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; -import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class ConditionESQueryBuilderDispatcher { private static final Logger logger = LoggerFactory.getLogger(ConditionESQueryBuilderDispatcher.class.getName()); - private BundleContext bundleContext; private Map<String, ConditionESQueryBuilder> queryBuilders = new ConcurrentHashMap<>(); - private Map<Long, List<String>> queryBuildersByBundle = new ConcurrentHashMap<>(); public ConditionESQueryBuilderDispatcher() { } - public void setBundleContext(BundleContext bundleContext) { - this.bundleContext = bundleContext; - } - - public void addQueryBuilder(String name, long bundleId, ConditionESQueryBuilder evaluator) { + public void addQueryBuilder(String name, ConditionESQueryBuilder evaluator) { queryBuilders.put(name, evaluator); - if (!queryBuildersByBundle.containsKey(bundleId)) { - queryBuildersByBundle.put(bundleId, new ArrayList<String>()); - } - queryBuildersByBundle.get(bundleId).add(name); } - public void removeQueryBuilder(String name, long bundleId) { + public void removeQueryBuilder(String name) { 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)) { - queryBuilders.remove(s); - } - queryBuildersByBundle.remove(bundleId); - } - } - public String getQuery(Condition condition) { return "{\"query\": " + getQueryBuilder(condition).toString() + "}"; } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/2105da7e/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 5573eed..dff7ecb 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 @@ -19,13 +19,10 @@ package org.apache.unomi.persistence.elasticsearch.conditions; import org.apache.unomi.api.Item; import org.apache.unomi.api.conditions.Condition; -import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -35,38 +32,14 @@ import java.util.concurrent.ConcurrentHashMap; public class ConditionEvaluatorDispatcher { private static final Logger logger = LoggerFactory.getLogger(ConditionEvaluatorDispatcher.class.getName()); - private BundleContext bundleContext; private Map<String, ConditionEvaluator> evaluators = new ConcurrentHashMap<>(); - private Map<Long, List<String>> evaluatorsByBundle = new ConcurrentHashMap<>(); - public void setBundleContext(BundleContext bundleContext) { - this.bundleContext = bundleContext; - } - - public void addEvaluator(String name, long bundleId, ConditionEvaluator evaluator) { + public void addEvaluator(String name, ConditionEvaluator evaluator) { evaluators.put(name, evaluator); - if (!evaluatorsByBundle.containsKey(bundleId)) { - evaluatorsByBundle.put(bundleId, new ArrayList<String>()); - } - evaluatorsByBundle.get(bundleId).add(name); } - public void removeEvaluator(String name, long bundleId) { + public void removeEvaluator(String name) { 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)) { - evaluators.remove(s); - } - evaluatorsByBundle.remove(bundleId); - } } public boolean eval(Condition condition, Item item) { http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/2105da7e/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 8b514d7..fea1879 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 @@ -75,12 +75,10 @@ <bean id="conditionESQueryBuilderDispatcher" class="org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher"> - <property name="bundleContext" ref="blueprintBundleContext"/> </bean> <bean id="conditionEvaluatorDispatcherImpl" class="org.apache.unomi.persistence.elasticsearch.conditions.ConditionEvaluatorDispatcher"> - <property name="bundleContext" ref="blueprintBundleContext"/> </bean> <bean id="elasticSearchPersistenceServiceImpl" http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/2105da7e/services/src/main/java/org/apache/unomi/services/actions/ActionExecutorDispatcher.java ---------------------------------------------------------------------- diff --git a/services/src/main/java/org/apache/unomi/services/actions/ActionExecutorDispatcher.java b/services/src/main/java/org/apache/unomi/services/actions/ActionExecutorDispatcher.java index bcd49e7..62e2463 100644 --- a/services/src/main/java/org/apache/unomi/services/actions/ActionExecutorDispatcher.java +++ b/services/src/main/java/org/apache/unomi/services/actions/ActionExecutorDispatcher.java @@ -26,15 +26,12 @@ import org.apache.unomi.api.services.EventService; import org.mvel2.MVEL; import org.mvel2.ParserConfiguration; import org.mvel2.ParserContext; -import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -43,9 +40,7 @@ public class ActionExecutorDispatcher { private static final String VALUE_NAME_SEPARATOR = "::"; private final Map<String, Serializable> mvelExpressions = new ConcurrentHashMap<>(); private final Map<String, ValueExtractor> valueExtractors = new HashMap<>(11); - private BundleContext bundleContext; private Map<String, ActionExecutor> executors = new ConcurrentHashMap<>(); - private Map<Long, List<String>> executorsByBundle = new ConcurrentHashMap<>(); public ActionExecutorDispatcher() { valueExtractors.put("profileProperty", new ValueExtractor() { @@ -101,21 +96,12 @@ public class ActionExecutorDispatcher { }); } - public void addExecutor(String name, long bundleId, ActionExecutor evaluator) { + public void addExecutor(String name, ActionExecutor evaluator) { executors.put(name, evaluator); - if (!executorsByBundle.containsKey(bundleId)) { - executorsByBundle.put(bundleId, new ArrayList<String>()); - } - executorsByBundle.get(bundleId).add(name); } - public void removeExecutors(long bundleId) { - if (executorsByBundle.containsKey(bundleId)) { - for (String s : executorsByBundle.get(bundleId)) { - executors.remove(s); - } - executorsByBundle.remove(bundleId); - } + public void removeExecutor(String name) { + executors.remove(name); } public Action getContextualAction(Action action, Event event) { @@ -177,10 +163,6 @@ public class ActionExecutorDispatcher { return false; } - public void setBundleContext(BundleContext bundleContext) { - this.bundleContext = bundleContext; - } - public int execute(Action action, Event event) { String actionKey = action.getActionType().getActionExecutor(); if (actionKey == null) { http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/2105da7e/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java ---------------------------------------------------------------------- diff --git a/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java index b1d4d51..e4deeb1 100644 --- a/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java +++ b/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java @@ -17,12 +17,13 @@ package org.apache.unomi.services.services; -import org.apache.unomi.api.*; +import org.apache.unomi.api.Event; +import org.apache.unomi.api.Item; +import org.apache.unomi.api.Metadata; +import org.apache.unomi.api.PartialList; import org.apache.unomi.api.actions.Action; import org.apache.unomi.api.actions.ActionExecutor; -import org.apache.unomi.api.actions.ActionType; import org.apache.unomi.api.conditions.Condition; -import org.apache.unomi.api.conditions.ConditionType; import org.apache.unomi.api.query.Query; import org.apache.unomi.api.rules.Rule; import org.apache.unomi.api.services.DefinitionsService; @@ -77,6 +78,18 @@ public class RulesServiceImpl implements RulesService, EventListenerService, Syn this.actionExecutorDispatcher = actionExecutorDispatcher; } + public void bindExecutor(ServiceReference<ActionExecutor> actionExecutorServiceReference) { + ActionExecutor actionExecutor = bundleContext.getService(actionExecutorServiceReference); + actionExecutorDispatcher.addExecutor(actionExecutorServiceReference.getProperty("actionExecutorId").toString(), actionExecutor); + } + + public void unbindExecutor(ServiceReference<ActionExecutor> actionExecutorServiceReference) { + if (actionExecutorServiceReference == null) { + return; + } + actionExecutorDispatcher.removeExecutor(actionExecutorServiceReference.getProperty("actionExecutorId").toString()); + } + public void postConstruct() { logger.debug("postConstruct {" + bundleContext.getBundle() + "}"); @@ -86,14 +99,6 @@ public class RulesServiceImpl implements RulesService, EventListenerService, Syn loadPredefinedRules(bundle.getBundleContext()); } } - try { - for (ServiceReference<ActionExecutor> reference : bundleContext.getServiceReferences(ActionExecutor.class, null)) { - ActionExecutor service = bundleContext.getService(reference); - actionExecutorDispatcher.addExecutor(reference.getProperty("actionExecutorId").toString(), reference.getBundle().getBundleId(), service); - } - } catch (Exception e) { - logger.error("Cannot get services",e); - } bundleContext.addBundleListener(this); @@ -117,22 +122,12 @@ public class RulesServiceImpl implements RulesService, EventListenerService, Syn return; } loadPredefinedRules(bundleContext); - - if (bundleContext.getBundle().getRegisteredServices() != null) { - for (ServiceReference<?> reference : bundleContext.getBundle().getRegisteredServices()) { - Object service = bundleContext.getService(reference); - if (service instanceof ActionExecutor) { - actionExecutorDispatcher.addExecutor(reference.getProperty("actionExecutorId").toString(), bundleContext.getBundle().getBundleId(), (ActionExecutor) service); - } - } - } } private void processBundleStop(BundleContext bundleContext) { if (bundleContext == null) { return; } - actionExecutorDispatcher.removeExecutors(bundleContext.getBundle().getBundleId()); } private void loadPredefinedRules(BundleContext bundleContext) { http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/2105da7e/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml ---------------------------------------------------------------------- diff --git a/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml index 3176639..8c0d371 100644 --- a/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -84,7 +84,6 @@ <bean id="actionExecutorDispatcherImpl" class="org.apache.unomi.services.actions.ActionExecutorDispatcher"> - <property name="bundleContext" ref="blueprintBundleContext"/> </bean> <bean id="rulesServiceImpl" class="org.apache.unomi.services.services.RulesServiceImpl" @@ -138,6 +137,13 @@ bind-method="bind" unbind-method="unbind" ref="eventServiceImpl"/> </reference-list> + <reference-list id="actionExecutors" + interface="org.apache.unomi.api.actions.ActionExecutor" + availability="optional"> + <reference-listener + bind-method="bindExecutor" unbind-method="unbindExecutor" ref="rulesServiceImpl"/> + </reference-list> + <!-- Property merge strategy executors --> <service auto-export="interfaces">
