in services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java [413:468]
public Set<Condition> getTrackedConditions(Item source) {
Set<Condition> trackedConditions = new HashSet<>();
for (Rule r : allRules) {
if (!r.getMetadata().isEnabled()) {
continue;
}
Condition ruleCondition = r.getCondition();
Condition trackedCondition = definitionsService.extractConditionBySystemTag(ruleCondition, "trackedCondition");
if (trackedCondition != null) {
Condition evalCondition = definitionsService.extractConditionBySystemTag(ruleCondition, "sourceEventCondition");
if (evalCondition != null) {
if (persistenceService.testMatch(evalCondition, source)) {
trackedConditions.add(trackedCondition);
}
} else if (
trackedCondition.getConditionType() != null &&
trackedCondition.getConditionType().getParameters() != null && !trackedCondition.getConditionType()
.getParameters().isEmpty()
) {
// lookup for track parameters
Map<String, Object> trackedParameters = new HashMap<>();
trackedCondition.getConditionType().getParameters().forEach(parameter -> {
try {
if (TRACKED_PARAMETER.equals(parameter.getId())) {
Arrays.stream(StringUtils.split(parameter.getDefaultValue(), ",")).forEach(trackedParameter -> {
String[] param = StringUtils.split(StringUtils.trim(trackedParameter), ":");
trackedParameters.put(StringUtils.trim(param[1]), trackedCondition.getParameter(StringUtils.trim(param[0])));
});
}
} catch (Exception e) {
LOGGER.warn("Unable to parse tracked parameter from {} for condition type {}", parameter, trackedCondition.getConditionType().getItemId());
}
});
if (!trackedParameters.isEmpty()) {
evalCondition = new Condition(definitionsService.getConditionType("booleanCondition"));
evalCondition.setParameter("operator", "and");
ArrayList<Condition> conditions = new ArrayList<>();
trackedParameters.forEach((key, value) -> {
Condition propCondition = new Condition(definitionsService.getConditionType("eventPropertyCondition"));
propCondition.setParameter("comparisonOperator", "equals");
propCondition.setParameter("propertyName", key);
propCondition.setParameter("propertyValue", value);
conditions.add(propCondition);
});
evalCondition.setParameter("subConditions", conditions);
if (persistenceService.testMatch(evalCondition, source)) {
trackedConditions.add(trackedCondition);
}
} else {
trackedConditions.add(trackedCondition);
}
}
}
}
return trackedConditions;
}