This is an automated email from the ASF dual-hosted git repository.

dgriffon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/unomi.git


The following commit(s) were added to refs/heads/master by this push:
     new 71efb77  UNOMI-532 : avoid displaying warnings too many times. (#366)
71efb77 is described below

commit 71efb77961de76cadce04892825438f79449c332
Author: David Griffon <[email protected]>
AuthorDate: Mon Nov 22 18:03:05 2021 +0100

    UNOMI-532 : avoid displaying warnings too many times. (#366)
---
 .../org/apache/unomi/api/utils/ParserHelper.java   | 14 ++++++----
 .../services/impl/rules/RulesServiceImpl.java      | 30 ++++++++++++++--------
 2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/api/src/main/java/org/apache/unomi/api/utils/ParserHelper.java 
b/api/src/main/java/org/apache/unomi/api/utils/ParserHelper.java
index 6396e19..57adc7f 100644
--- a/api/src/main/java/org/apache/unomi/api/utils/ParserHelper.java
+++ b/api/src/main/java/org/apache/unomi/api/utils/ParserHelper.java
@@ -134,15 +134,19 @@ public class ParserHelper {
         visitor.postVisit(rootCondition);
     }
 
-    public static boolean resolveActionTypes(DefinitionsService 
definitionsService, Rule rule) {
+    public static boolean resolveActionTypes(DefinitionsService 
definitionsService, Rule rule, boolean ignoreErrors) {
         boolean result = true;
         if (rule.getActions() == null) {
-            logger.warn("Rule {}:{} has null actions", rule.getItemId(), 
rule.getMetadata().getName());
+            if (!ignoreErrors) {
+                logger.warn("Rule {}:{} has null actions", rule.getItemId(), 
rule.getMetadata().getName());
+            }
             return false;
         }
         if (rule.getActions().isEmpty()) {
-            logger.warn("Rule {}:{} has empty actions", rule.getItemId(), 
rule.getMetadata().getName());
-            return result;
+            if (!ignoreErrors) {
+                logger.warn("Rule {}:{} has empty actions", rule.getItemId(), 
rule.getMetadata().getName());
+            }
+            return false;
         }
         for (Action action : rule.getActions()) {
             result &= ParserHelper.resolveActionType(definitionsService, 
action);
@@ -196,7 +200,7 @@ public class ParserHelper {
 
         public void visit(Condition condition) {
             conditionTypeStack.push(condition.getConditionTypeId());
-             if ("eventTypeCondition".equals(condition.getConditionTypeId())) {
+            if ("eventTypeCondition".equals(condition.getConditionTypeId())) {
                 String eventTypeId = (String) 
condition.getParameter("eventTypeId");
                 if (eventTypeId == null) {
                     logger.warn("Null eventTypeId found!");
diff --git 
a/services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java
 
b/services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java
index d7b7186..d87e036 100644
--- 
a/services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java
+++ 
b/services/src/main/java/org/apache/unomi/services/impl/rules/RulesServiceImpl.java
@@ -58,6 +58,7 @@ public class RulesServiceImpl implements RulesService, 
EventListenerService, Syn
 
     private ActionExecutorDispatcher actionExecutorDispatcher;
     private List<Rule> allRules;
+    private final Set<String> invalidRulesId = new HashSet<>();
 
     private Map<String, RuleStatistics> allRuleStatistics = new 
ConcurrentHashMap<>();
 
@@ -278,9 +279,17 @@ public class RulesServiceImpl implements RulesService, 
EventListenerService, Syn
     private List<Rule> getAllRules() {
         List<Rule> rules = persistenceService.getAllItems(Rule.class, 0, -1, 
"priority").getList();
         for (Rule rule : rules) {
-            ParserHelper.resolveConditionType(definitionsService, 
rule.getCondition(), "rule " + rule.getItemId());
-            ParserHelper.resolveActionTypes(definitionsService, rule);
+            // Check rule integrity
+            boolean isValid = 
ParserHelper.resolveConditionType(definitionsService, rule.getCondition(), 
"rule " + rule.getItemId());
+            isValid = isValid && 
ParserHelper.resolveActionTypes(definitionsService, rule, 
invalidRulesId.contains(rule.getItemId()));
+            // check if rule status has changed
+            if (!isValid) {
+                invalidRulesId.add(rule.getItemId());
+            } else {
+                invalidRulesId.remove(rule.getItemId());
+            }
         }
+
         return rules;
     }
 
@@ -377,7 +386,7 @@ public class RulesServiceImpl implements RulesService, 
EventListenerService, Syn
         Rule rule = persistenceService.load(ruleId, Rule.class);
         if (rule != null) {
             ParserHelper.resolveConditionType(definitionsService, 
rule.getCondition(), "rule " + rule.getItemId());
-            ParserHelper.resolveActionTypes(definitionsService, rule);
+            ParserHelper.resolveActionTypes(definitionsService, rule, 
invalidRulesId.contains(rule.getItemId()));
         }
         return rule;
     }
@@ -390,6 +399,8 @@ public class RulesServiceImpl implements RulesService, 
EventListenerService, Syn
         if (condition != null) {
             if (rule.getMetadata().isEnabled() && 
!rule.getMetadata().isMissingPlugins()) {
                 ParserHelper.resolveConditionType(definitionsService, 
condition, "rule " + rule.getItemId());
+                ParserHelper.resolveActionTypes(definitionsService, rule, 
invalidRulesId.contains(rule.getItemId()));
+                // Check rule's condition validity, throws an exception if not 
set properly.
                 definitionsService.extractConditionBySystemTag(condition, 
"eventCondition");
             }
         }
@@ -412,19 +423,19 @@ public class RulesServiceImpl implements RulesService, 
EventListenerService, Syn
                     }
                 } else if (
                         trackedCondition.getConditionType() != null &&
-                        trackedCondition.getConditionType().getParameters() != 
null &&
-                        
trackedCondition.getConditionType().getParameters().size() > 0
+                                
trackedCondition.getConditionType().getParameters() != null &&
+                                
trackedCondition.getConditionType().getParameters().size() > 0
                 ) {
                     // 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 -> {
+                            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());
                         }
@@ -590,5 +601,4 @@ public class RulesServiceImpl implements RulesService, 
EventListenerService, Syn
             rulesByEventType.put(eventTypeId, rules);
         }
     }
-
 }

Reply via email to