Skip to content

Commit 73c9ea9

Browse files
authored
UNOMI-901: change condition evaluator injection to avoid reference issue on stop" (#730)
1 parent d3d2d16 commit 73c9ea9

File tree

17 files changed

+62
-113
lines changed

17 files changed

+62
-113
lines changed

persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@
7474
import org.apache.unomi.persistence.spi.aggregate.DateRangeAggregate;
7575
import org.apache.unomi.persistence.spi.aggregate.IpRangeAggregate;
7676
import org.apache.unomi.persistence.spi.conditions.ConditionContextHelper;
77-
import org.apache.unomi.persistence.spi.conditions.ConditionEvaluator;
78-
import org.apache.unomi.persistence.spi.conditions.ConditionEvaluatorDispatcher;
77+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluatorDispatcher;
7978
import org.elasticsearch.client.*;
8079

8180
import org.osgi.framework.*;
@@ -611,19 +610,6 @@ protected Object execute(Object... args) throws IOException {
611610
bundleContext.removeBundleListener(this);
612611
}
613612

614-
public void bindConditionEvaluator(ServiceReference<ConditionEvaluator> conditionEvaluatorServiceReference) {
615-
ConditionEvaluator conditionEvaluator = bundleContext.getService(conditionEvaluatorServiceReference);
616-
conditionEvaluatorDispatcher.addEvaluator(conditionEvaluatorServiceReference.getProperty("conditionEvaluatorId").toString(),
617-
conditionEvaluator);
618-
}
619-
620-
public void unbindConditionEvaluator(ServiceReference<ConditionEvaluator> conditionEvaluatorServiceReference) {
621-
if (conditionEvaluatorServiceReference == null) {
622-
return;
623-
}
624-
conditionEvaluatorDispatcher.removeEvaluator(conditionEvaluatorServiceReference.getProperty("conditionEvaluatorId").toString());
625-
}
626-
627613
public void bindConditionESQueryBuilder(ServiceReference<ConditionESQueryBuilder> conditionESQueryBuilderServiceReference) {
628614
ConditionESQueryBuilder conditionESQueryBuilder = bundleContext.getService(conditionESQueryBuilderServiceReference);
629615
conditionESQueryBuilderDispatcher.addQueryBuilder(conditionESQueryBuilderServiceReference.getProperty("queryBuilderId").toString(),

persistence-elasticsearch/core/src/main/resources/OSGI-INF/blueprint/blueprint.xml

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@
7575

7676
<reference id="metricsService" interface="org.apache.unomi.metrics.MetricsService"/>
7777
<reference id="scriptExecutor" interface="org.apache.unomi.scripting.ScriptExecutor"/>
78-
<reference id="conditionEvaluatorDispatcherService" interface="org.apache.unomi.persistence.spi.conditions.ConditionEvaluatorDispatcher"/>
78+
<reference id="conditionEvaluatorDispatcherService"
79+
interface="org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluatorDispatcher"/>
7980

8081
<service id="elasticSearchPersistenceService" ref="elasticSearchPersistenceServiceImpl">
8182
<interfaces>
@@ -148,15 +149,6 @@
148149
<property name="logLevelRestClient" value="${es.logLevelRestClient}"/>
149150
</bean>
150151

151-
<!-- We use a listener here because using the list directly for listening to proxies coming from the same bundle didn't seem to work -->
152-
<reference-list id="conditionEvaluators"
153-
interface="org.apache.unomi.persistence.spi.conditions.ConditionEvaluator"
154-
availability="optional">
155-
<reference-listener
156-
bind-method="bindConditionEvaluator" unbind-method="unbindConditionEvaluator"
157-
ref="elasticSearchPersistenceServiceImpl"/>
158-
</reference-list>
159-
160152
<reference-list id="conditionESQueryBuilders"
161153
interface="org.apache.unomi.persistence.elasticsearch.ConditionESQueryBuilder"
162154
availability="optional">

persistence-spi/pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@
5757
<artifactId>unomi-metrics</artifactId>
5858
<scope>provided</scope>
5959
</dependency>
60+
<dependency>
61+
<groupId>org.osgi</groupId>
62+
<artifactId>org.osgi.service.component.annotations</artifactId>
63+
<scope>provided</scope>
64+
</dependency>
6065
<dependency>
6166
<groupId>com.fasterxml.jackson.core</groupId>
6267
<artifactId>jackson-core</artifactId>
@@ -121,9 +126,9 @@
121126
<extensions>true</extensions>
122127
<configuration>
123128
<instructions>
129+
<_dsannotations>*</_dsannotations>
124130
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
125131
<Import-Package>
126-
127132
*
128133
</Import-Package>
129134
</instructions>

persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/ConditionEvaluator.java renamed to persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/evaluator/ConditionEvaluator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* limitations under the License.
1616
*/
1717

18-
package org.apache.unomi.persistence.spi.conditions;
18+
package org.apache.unomi.persistence.spi.conditions.evaluator;
1919

2020
import org.apache.unomi.api.Item;
2121
import org.apache.unomi.api.conditions.Condition;

persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/ConditionEvaluatorDispatcher.java renamed to persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/evaluator/ConditionEvaluatorDispatcher.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* See the License for the specific language governing permissions and
1515
* limitations under the License.
1616
*/
17-
package org.apache.unomi.persistence.spi.conditions;
17+
package org.apache.unomi.persistence.spi.conditions.evaluator;
1818

1919
import org.apache.unomi.api.Item;
2020
import org.apache.unomi.api.conditions.Condition;
@@ -23,10 +23,6 @@
2323

2424
public interface ConditionEvaluatorDispatcher {
2525

26-
void addEvaluator(String name, ConditionEvaluator evaluator);
27-
28-
void removeEvaluator(String name);
29-
3026
boolean eval(Condition condition, Item item);
3127

3228
boolean eval(Condition condition, Item item, Map<String, Object> context);

persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/ConditionEvaluatorDispatcherImpl.java renamed to persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/evaluator/impl/ConditionEvaluatorDispatcherImpl.java

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,21 @@
1515
* limitations under the License.
1616
*/
1717

18-
package org.apache.unomi.persistence.spi.conditions;
18+
package org.apache.unomi.persistence.spi.conditions.evaluator.impl;
1919

2020
import org.apache.unomi.api.Item;
2121
import org.apache.unomi.api.conditions.Condition;
2222
import org.apache.unomi.metrics.MetricAdapter;
2323
import org.apache.unomi.metrics.MetricsService;
24+
import org.apache.unomi.persistence.spi.conditions.ConditionContextHelper;
25+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluator;
26+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluatorDispatcher;
2427
import org.apache.unomi.scripting.ScriptExecutor;
28+
import org.osgi.annotation.bundle.Requirement;
29+
import org.osgi.service.component.annotations.Component;
30+
import org.osgi.service.component.annotations.Reference;
31+
import org.osgi.service.component.annotations.ReferenceCardinality;
32+
import org.osgi.service.component.annotations.ReferencePolicy;
2533
import org.slf4j.Logger;
2634
import org.slf4j.LoggerFactory;
2735

@@ -32,33 +40,37 @@
3240
/**
3341
* Entry point for condition evaluation. Will dispatch to all evaluators.
3442
*/
35-
//TODO change to delarative services remove blueprint
36-
public class ConditionEvaluatorDispatcherImpl implements ConditionEvaluatorDispatcher {
37-
private static final Logger LOGGER = LoggerFactory.getLogger(ConditionEvaluatorDispatcher.class.getName());
43+
44+
@Component(service = ConditionEvaluatorDispatcher.class)
45+
public class ConditionEvaluatorDispatcherImpl
46+
implements ConditionEvaluatorDispatcher {
47+
private static final Logger LOGGER = LoggerFactory.getLogger(ConditionEvaluatorDispatcherImpl.class.getName());
3848

3949
private Map<String, ConditionEvaluator> evaluators = new ConcurrentHashMap<>();
4050

4151
private MetricsService metricsService;
4252
private ScriptExecutor scriptExecutor;
4353

44-
public ConditionEvaluatorDispatcherImpl() {}
54+
public ConditionEvaluatorDispatcherImpl() {
55+
}
4556

57+
@Reference
4658
public void setMetricsService(MetricsService metricsService) {
4759
this.metricsService = metricsService;
4860
}
4961

62+
@Reference
5063
public void setScriptExecutor(ScriptExecutor scriptExecutor) {
5164
this.scriptExecutor = scriptExecutor;
5265
}
5366

54-
@Override
55-
public void addEvaluator(String name, ConditionEvaluator evaluator) {
56-
evaluators.put(name, evaluator);
67+
@Reference(service = ConditionEvaluator.class, cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
68+
public void bindEvaluator(ConditionEvaluator evaluator, Map<String, Object> props) {
69+
evaluators.put((String) props.get("conditionEvaluatorId"), evaluator);
5770
}
5871

59-
@Override
60-
public void removeEvaluator(String name) {
61-
evaluators.remove(name);
72+
public void unbindEvaluator(ConditionEvaluator evaluator, Map<String, Object> props) {
73+
evaluators.remove((String) props.get("conditionEvaluatorId"));
6274
}
6375

6476
@Override
@@ -83,8 +95,7 @@ public boolean eval(Condition condition, Item item, Map<String, Object> context)
8395
final ConditionEvaluatorDispatcher dispatcher = this;
8496
try {
8597
return new MetricAdapter<Boolean>(metricsService, this.getClass().getName() + ".conditions." + conditionEvaluatorKey) {
86-
@Override
87-
public Boolean execute(Object... args) throws Exception {
98+
@Override public Boolean execute(Object... args) throws Exception {
8899
Condition contextualCondition = ConditionContextHelper.getContextualCondition(condition, context, scriptExecutor);
89100
if (contextualCondition != null) {
90101
return evaluator.eval(contextualCondition, item, context, dispatcher);

persistence-spi/src/main/resources/OSGI-INF/blueprint/blueprint.xml

Lines changed: 0 additions & 41 deletions
This file was deleted.

plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionEvaluator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
import org.apache.unomi.api.Item;
2121
import org.apache.unomi.api.conditions.Condition;
22-
import org.apache.unomi.persistence.spi.conditions.ConditionEvaluator;
23-
import org.apache.unomi.persistence.spi.conditions.ConditionEvaluatorDispatcher;
22+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluator;
23+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluatorDispatcher;
2424

2525
import java.util.List;
2626
import java.util.Map;

plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/GeoLocationByPointSessionConditionEvaluator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
import org.apache.commons.beanutils.BeanUtils;
2121
import org.apache.unomi.api.Item;
2222
import org.apache.unomi.api.conditions.Condition;
23-
import org.apache.unomi.persistence.spi.conditions.ConditionEvaluator;
24-
import org.apache.unomi.persistence.spi.conditions.ConditionEvaluatorDispatcher;
23+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluator;
24+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluatorDispatcher;
2525
import org.apache.unomi.persistence.spi.conditions.geo.DistanceUnit;
2626
import org.apache.unomi.persistence.spi.conditions.geo.GeoDistance;
2727
import org.slf4j.Logger;

plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/IdsConditionEvaluator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
import org.apache.unomi.api.Item;
2020
import org.apache.unomi.api.conditions.Condition;
21-
import org.apache.unomi.persistence.spi.conditions.ConditionEvaluator;
22-
import org.apache.unomi.persistence.spi.conditions.ConditionEvaluatorDispatcher;
21+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluator;
22+
import org.apache.unomi.persistence.spi.conditions.evaluator.ConditionEvaluatorDispatcher;
2323

2424
import java.util.Collection;
2525
import java.util.Map;

0 commit comments

Comments
 (0)