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

pkiraly / metadata-qa-api / #730

23 Oct 2025 09:26AM UTC coverage: 86.354% (-0.06%) from 86.412%
#730

push

pkiraly
Fix OR, AND and ContentType checkers

15 of 34 new or added lines in 5 files covered. (44.12%)

1 existing line in 1 file now uncovered.

5670 of 6566 relevant lines covered (86.35%)

0.86 hits per line

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

46.84
/src/main/java/de/gwdg/metadataqa/api/rule/logical/OrChecker.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.HashMap;
18
import java.util.logging.Logger;
19

20
public class OrChecker extends LogicalChecker {
21

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

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

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

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

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

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

53
    if (globalResults == null) {
1✔
54
      globalResults = results;
1✔
55
    }
56

57
    // if NA and dependency checker FAILED -> FAILED
58
    var allPassed = false;
1✔
59
    var isNA = false;
1✔
60
    RuleCheckerOutput output = null;
1✔
61
    List<XmlFieldInstance> instances = selector.get(field);
1✔
62
    List<RuleCheckingOutputStatus> statuses = new ArrayList<>();
1✔
63
    if (instances != null && !instances.isEmpty()) {
1✔
64
      FieldCounter<RuleCheckerOutput> localResults2 = new FieldCounter<>();
1✔
65
      for (RuleChecker checker : checkers) {
1✔
66
        if (checker instanceof DependencyChecker) {
1✔
67
          ((DependencyChecker) checker).update(selector, localResults2, outputType, results);
×
68
        } else {
69
          checker.update(selector, localResults2, outputType);
1✔
70
        }
71
        String key = outputType.equals(RuleCheckingOutputType.BOTH)
1✔
72
                   ? checker.getIdOrHeader(RuleCheckingOutputType.SCORE)
1✔
73
                   : checker.getIdOrHeader();
1✔
74
        RuleCheckingOutputStatus status = localResults2.get(key).getStatus();
1✔
75
        statuses.add(status);
1✔
76
        if (status.equals(RuleCheckingOutputStatus.PASSED)) {
1✔
77
          allPassed = true;
1✔
78
          break;
1✔
79
        }
80
      }
1✔
81
    } else {
1✔
82
      isNA = true;
×
83
      for (RuleChecker checker : checkers) {
×
84
        if (checker instanceof MinCountChecker) {
×
85
          MinCountChecker minCountChecker = (MinCountChecker) checker;
×
86
          if (!minCountChecker.isEmptyInstancesAllowed() || minCountChecker.getMinCount() > 0)
×
87
            allPassed = false;
×
88
        }
×
89
        else if (alwaysCheckDependencies && checker instanceof DependencyChecker) {
×
90
          DependencyChecker dependencyChecker = (DependencyChecker) checker;
×
91
          Map<String, Boolean> localResult = dependencyChecker.getResult(outputType, results);
×
92
          boolean dependenciesPassed = localResult.get("allPassed");
×
93
          isNA = localResult.get("isNA");
×
94
          if (isNA) {
×
95
            output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.NA);
×
96
          } else {
97
            if (dependenciesPassed)
×
98
              output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.PASSED);
×
99
            else
100
              output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.FAILED);
×
101
          }
NEW
102
          statuses.add(output.getStatus());
×
103
        }
104

105
        // if (!allPassed)
106
        //   break;
UNCOV
107
      }
×
108
    }
109

110
    if (priorityOnFail) {
1✔
NEW
111
      output = null;
×
NEW
112
      allPassed = !statuses.contains(RuleCheckingOutputStatus.FAILED);
×
NEW
113
      if (!allPassed || statuses.contains(RuleCheckingOutputStatus.PASSED))
×
NEW
114
        isNA = false;
×
115
    }
116

117
    if (output != null) {
1✔
118
      addOutput(results, output, outputType);
×
119
    } else {
120
      addOutput(results, isNA, allPassed, outputType);
1✔
121
    }
122

123
    if (isDebug()) {
1✔
124
      RuleCheckingOutputStatus status = output != null
×
125
        ? output.getStatus()
×
126
        : RuleCheckingOutputStatus.create(isNA, allPassed, isMandatory());
×
127
      LOGGER.info(String.format("%s %s) isNA: %s, allPassed: %s, result: %s",
×
128
        this.getClass().getSimpleName(), this.id, isNA, allPassed, status));
×
129
    }
130
  }
1✔
131

132
  public Map<RuleCheckingOutputType, Object> getResult(RuleCheckingOutputType outputType,
133
                                                       FieldCounter<RuleCheckerOutput> globalResults) {
134
    Map<RuleCheckingOutputType, Object> result = new HashMap();
×
135
    if (outputType.equals(RuleCheckingOutputType.STATUS)) {
×
136
      result.put(RuleCheckingOutputType.STATUS, globalResults.get(getIdOrHeader()));
×
137
    } else if (outputType.equals(RuleCheckingOutputType.SCORE)) {
×
138
      result.put(RuleCheckingOutputType.SCORE, globalResults.get(getIdOrHeader()));
×
139
    } else if (outputType.equals(RuleCheckingOutputType.BOTH)) {
×
140
      result.put(RuleCheckingOutputType.STATUS, globalResults.get(getIdOrHeader() + ":status"));
×
141
      result.put(RuleCheckingOutputType.SCORE, globalResults.get(getIdOrHeader() + ":score"));
×
142
    }
143
    return result;
×
144
  }
145

146
  public void setPriorityOnFail(boolean priorityOnFail) {
NEW
147
    this.priorityOnFail = priorityOnFail;
×
NEW
148
  }
×
149
}
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