• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pkiraly / metadata-qa-api / #738

03 Dec 2025 10:03PM UTC coverage: 86.157% (-0.1%) from 86.256%
#738

push

pkiraly
Improve OR

0 of 8 new or added lines in 1 file covered. (0.0%)

42 existing lines in 3 files now uncovered.

5670 of 6581 relevant lines covered (86.16%)

0.86 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

60.71
/src/main/java/de/gwdg/metadataqa/api/rule/logical/AndChecker.java
1
package de.gwdg.metadataqa.api.rule.logical;
2

3
import de.gwdg.metadataqa.api.counter.FieldCounter;
4
import de.gwdg.metadataqa.api.json.DataElement;
5
import de.gwdg.metadataqa.api.model.XmlFieldInstance;
6
import de.gwdg.metadataqa.api.model.selector.Selector;
7
import de.gwdg.metadataqa.api.rule.RuleChecker;
8
import de.gwdg.metadataqa.api.rule.RuleCheckerOutput;
9
import de.gwdg.metadataqa.api.rule.RuleCheckingOutputStatus;
10
import de.gwdg.metadataqa.api.rule.RuleCheckingOutputType;
11
import de.gwdg.metadataqa.api.rule.singlefieldchecker.DependencyChecker;
12
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MinCountChecker;
13

14
import java.util.ArrayList;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.logging.Logger;
18

19
public class AndChecker extends LogicalChecker {
20

21
  private static final Logger LOGGER = Logger.getLogger(AndChecker.class.getCanonicalName());
1✔
22

23
  private static final long serialVersionUID = 1114999259831619599L;
24
  public static final String PREFIX = "and";
25
  private boolean priorityOnFail = false;
1✔
26

27
  /**
28
   * @param field The field
29
   * @param checkers The list of checkers
30
   */
31
  public AndChecker(DataElement field, List<RuleChecker> checkers) {
32
    this(field, field.getLabel(), checkers);
1✔
33
  }
1✔
34

35
  public AndChecker(DataElement field, String header, List<RuleChecker> checkers) {
36
    super(field,header + ":" + PREFIX + ":" + getChildrenHeader(checkers));
1✔
37
    this.checkers = checkers;
1✔
38
  }
1✔
39

40
  @Override
41
  public void update(Selector selector, FieldCounter<RuleCheckerOutput> results, RuleCheckingOutputType outputType) {
42
    update(selector, results, outputType, null);
1✔
43
  }
1✔
44

45

46
  public void update(Selector selector,
47
                     FieldCounter<RuleCheckerOutput> results,
48
                     RuleCheckingOutputType outputType,
49
                     FieldCounter<RuleCheckerOutput> globalResults) {
50
    if (isDebug())
1✔
51
      LOGGER.info(String.format("%s %s,  alwaysCheckDependencies: %s, priorityOnFail: %s", this.getClass().getSimpleName(), this.id, alwaysCheckDependencies, priorityOnFail));
1✔
52

53
    var allPassed = true;
1✔
54
    var isNA = false;
1✔
55
    List<RuleCheckingOutputStatus> statuses = new ArrayList<>();
1✔
56
    List<XmlFieldInstance> instances = selector.get(field);
1✔
57
    if (instances != null && !instances.isEmpty()) {
1✔
58
      FieldCounter<RuleCheckerOutput> localResults = new FieldCounter<>();
1✔
59
      for (RuleChecker checker : checkers) {
1✔
60
        if (checker instanceof DependencyChecker) {
1✔
61
          ((DependencyChecker) checker).update(selector, localResults, outputType, results);
1✔
62
        } else if (checker instanceof OrChecker) {
1✔
UNCOV
63
          ((OrChecker) checker).update(selector, localResults, outputType, results);
×
64
        } else if (checker instanceof NotChecker) {
1✔
UNCOV
65
          ((NotChecker) checker).update(selector, localResults, outputType, results);
×
66
        } else {
67
          checker.update(selector, localResults, outputType);
1✔
68
        }
69
        String key = outputType.equals(RuleCheckingOutputType.BOTH)
1✔
70
          ? checker.getIdOrHeader(RuleCheckingOutputType.SCORE)
1✔
71
          : checker.getIdOrHeader();
1✔
72
        RuleCheckingOutputStatus status = localResults.get(key).getStatus();
1✔
73
        statuses.add(status);
1✔
74
        if (status.equals(RuleCheckingOutputStatus.NA))
1✔
UNCOV
75
          isNA = true;
×
76

77
        if (!status.equals(RuleCheckingOutputStatus.PASSED) && !priorityOnFail) {
1✔
78
          allPassed = false;
1✔
79
          break;
1✔
80
        }
81
      }
1✔
82
    } else {
1✔
83
      if (isDebug())
1✔
UNCOV
84
        LOGGER.info("empty branch");
×
85
      isNA = true;
1✔
86
      for (RuleChecker checker : checkers) {
1✔
87
        if (checker instanceof MinCountChecker) {
1✔
88
          MinCountChecker minCountChecker = (MinCountChecker) checker;
1✔
89
          if (!minCountChecker.isEmptyInstancesAllowed() || minCountChecker.getMinCount() > 0)
1✔
90
            allPassed = false;
1✔
91
        }
1✔
92
        else if (alwaysCheckDependencies) {
1✔
93
          if (checker instanceof DependencyChecker) {
×
94
            DependencyChecker dependencyChecker = (DependencyChecker) checker;
×
95
            Map<String, Boolean> localResult = dependencyChecker.getResult(outputType, results);
×
96
            if (isDebug())
×
97
              LOGGER.info(String.format("DependencyChecker result for %s: %s",
×
98
                dependencyChecker.getDependencies(), localResult));
×
99
            allPassed = localResult.get("allPassed");
×
100
            isNA = localResult.get("isNA");
×
UNCOV
101
            statuses.add(allPassed ? RuleCheckingOutputStatus.PASSED : RuleCheckingOutputStatus.FAILED);
×
102
          } else if (checker instanceof OrChecker) {
×
103
            OrChecker orChecker = (OrChecker) checker;
×
104
            boolean hasDependency = false;
×
105
            for (RuleChecker current : orChecker.getCheckers()) {
×
106
              if (current instanceof DependencyChecker) {
×
107
                hasDependency = true;
×
108
                break;
×
109
              }
UNCOV
110
            }
×
UNCOV
111
            if (hasDependency) {
×
UNCOV
112
              orChecker.update(selector, results, outputType);
×
UNCOV
113
              Map<RuleCheckingOutputType, Object> orResult = orChecker.getResult(outputType, results);
×
UNCOV
114
              RuleCheckerOutput orStatus = (RuleCheckerOutput) orResult.get(RuleCheckingOutputType.STATUS);
×
UNCOV
115
              if (orStatus.getStatus().equals(RuleCheckingOutputStatus.FAILED)) {
×
UNCOV
116
                allPassed = false;
×
UNCOV
117
                isNA = false;
×
118
              }
119
            }
120
          }
121
        }
122

123
        // if (!allPassed)
124
        //  break;
125
      }
1✔
126
    }
127

128
    if (priorityOnFail) {
1✔
UNCOV
129
      allPassed = !statuses.contains(RuleCheckingOutputStatus.FAILED);
×
UNCOV
130
      if (!allPassed || statuses.contains(RuleCheckingOutputStatus.PASSED))
×
UNCOV
131
        isNA = false;
×
132
    }
133

134
    if (isDebug())
1✔
135
      LOGGER.info(String.format("isNA: %s, allPassed: %s", isNA, allPassed));
1✔
136
    addOutput(results, isNA, allPassed, outputType);
1✔
137

138
    if (isDebug())
1✔
139
      LOGGER.info(this.getClass().getSimpleName() + " " + this.id + ") result: " + RuleCheckingOutputStatus.create(isNA, allPassed, isMandatory()));
1✔
140
  }
1✔
141

142
  public void setPriorityOnFail(boolean priorityOnFail) {
UNCOV
143
    this.priorityOnFail = priorityOnFail;
×
UNCOV
144
  }
×
145
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc