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

pkiraly / metadata-qa-api / #742

14 Jan 2026 12:45PM UTC coverage: 85.581% (-0.6%) from 86.157%
#742

push

pkiraly
Add parent check

32 of 96 new or added lines in 7 files covered. (33.33%)

2 existing lines in 2 files now uncovered.

5686 of 6644 relevant lines covered (85.58%)

0.86 hits per line

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

41.58
/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

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

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

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

56
    // if NA and dependency checker FAILED -> FAILED
57
    var allPassed = false;
1✔
58
    var isNA = false;
1✔
59
    RuleCheckerOutput output = null;
1✔
60
    List<RuleCheckingOutputStatus> statuses = new ArrayList<>();
1✔
61
    boolean parentCheckPassed = true;
1✔
62

63
    List<XmlFieldInstance> instances = selector.get(field);
1✔
64
    if (instances != null && !instances.isEmpty()) {
1✔
65
      if (isDebug())
1✔
NEW
66
        LOGGER.info("non empty - naIfNoParent: " + isNaIfNoParent());
×
67
      FieldCounter<RuleCheckerOutput> localResults2 = new FieldCounter<>();
1✔
68
      for (RuleChecker checker : checkers) {
1✔
69
        boolean isParentChecker = false;
1✔
70
        if (checker instanceof DependencyChecker) {
1✔
71
          ((DependencyChecker) checker).update(selector, localResults2, outputType, results);
×
NEW
72
          isParentChecker = ((DependencyChecker) checker).getParentCheck();
×
73
        } else if (checker instanceof AndChecker) {
1✔
74
          ((AndChecker) checker).update(selector, localResults2, outputType, results);
×
75
        } else {
76
          checker.update(selector, localResults2, outputType);
1✔
77
        }
78
        String key = outputType.equals(RuleCheckingOutputType.BOTH)
1✔
79
                   ? checker.getIdOrHeader(RuleCheckingOutputType.SCORE)
1✔
80
                   : checker.getIdOrHeader();
1✔
81
        RuleCheckingOutputStatus status = localResults2.get(key).getStatus();
1✔
82
        if (!isParentChecker)
1✔
83
          statuses.add(status);
1✔
84
        if (!priorityOnFail && status.equals(RuleCheckingOutputStatus.PASSED)) {
1✔
85
          allPassed = true;
1✔
86
          break;
1✔
87
        }
88
      }
1✔
89
    } else {
1✔
90
      if (isDebug())
×
NEW
91
        LOGGER.info("empty branch - naIfNoParent: " + isNaIfNoParent());
×
92
      isNA = true;
×
93
      for (RuleChecker checker : checkers) {
×
94
        if (checker instanceof MinCountChecker) {
×
95
          MinCountChecker minCountChecker = (MinCountChecker) checker;
×
96
          if (!minCountChecker.isEmptyInstancesAllowed() || minCountChecker.getMinCount() > 0)
×
97
            allPassed = false;
×
98
        }
×
99
        else if (alwaysCheckDependencies && checker instanceof DependencyChecker) {
×
100
          DependencyChecker dependencyChecker = (DependencyChecker) checker;
×
101
          Map<String, Boolean> localResult = dependencyChecker.getResult(outputType, results);
×
102
          boolean dependenciesPassed = localResult.get("allPassed");
×
NEW
103
          LOGGER.info("ParentCheck: " + dependencyChecker.getParentCheck() + ", passed: " + dependenciesPassed);
×
NEW
104
          if (dependencyChecker.getParentCheck() && !dependenciesPassed) {
×
NEW
105
            if (parentCheckPassed)
×
NEW
106
              parentCheckPassed = false;
×
107
            // break;
108
          }
109
          var localIsNA = localResult.get("isNA");
×
110
          if (localIsNA) {
×
111
            output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.NA);
×
112
          } else {
113
            if (dependenciesPassed)
×
114
              output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.PASSED);
×
115
            else
116
              output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.FAILED);
×
117
          }
NEW
118
          if (!dependencyChecker.getParentCheck())
×
NEW
119
            statuses.add(output.getStatus());
×
NEW
120
          LOGGER.info("statuses: " + statuses);
×
121
        }
122
        // if (!allPassed)
123
        //   break;
124
      }
×
NEW
125
      LOGGER.info("ends all checkers");
×
126
    }
127

128
    LOGGER.info("priorityOnFail: " + priorityOnFail + ", isNA: " + isNA + ", statuses: " + statuses);
1✔
129

130
    if (priorityOnFail) {
1✔
131
      output = null;
×
NEW
132
      LOGGER.info("priorityOnFail (1)! isNA: " + isNA + ", statuses: " + statuses + ", parentCheckPassed: " + parentCheckPassed);
×
133
      allPassed = statuses.contains(RuleCheckingOutputStatus.PASSED);
×
134
      // allPassed = !statuses.contains(RuleCheckingOutputStatus.FAILED);
135
      if (!statuses.isEmpty()
×
136
          && !containsOnlyNAs(statuses)
×
NEW
137
          && (!allPassed || statuses.contains(RuleCheckingOutputStatus.PASSED))
×
138
          && parentCheckPassed)
NEW
139
        isNA = false;
×
NEW
140
      LOGGER.info("priorityOnFail (2)! isNA: " + isNA + ", allPassed: " + allPassed);
×
NEW
141
      if (isNaIfNoParent() && isNA && parentCheckPassed) {
×
UNCOV
142
        isNA = false;
×
NEW
143
        LOGGER.info("priorityOnFail (3)! isNA: " + isNA + ", allPassed: " + allPassed);
×
144
      }
145
    }
146

147
    if (output != null) {
1✔
148
      addOutput(results, output, outputType);
×
149
    } else {
150
      addOutput(results, isNA, allPassed, outputType);
1✔
151
    }
152

153
    if (isDebug()) {
1✔
154
      RuleCheckingOutputStatus status = output != null
×
155
        ? output.getStatus()
×
156
        : RuleCheckingOutputStatus.create(isNA, allPassed, isMandatory());
×
157
      LOGGER.info(String.format("%s %s) isNA: %s, allPassed: %s, result: %s",
×
158
        this.getClass().getSimpleName(), this.id, isNA, allPassed, status));
×
159
    }
160
  }
1✔
161

162
  public Map<RuleCheckingOutputType, Object> getResult(RuleCheckingOutputType outputType,
163
                                                       FieldCounter<RuleCheckerOutput> globalResults) {
164
    Map<RuleCheckingOutputType, Object> result = new HashMap();
×
165
    if (outputType.equals(RuleCheckingOutputType.STATUS)) {
×
166
      result.put(RuleCheckingOutputType.STATUS, globalResults.get(getIdOrHeader()));
×
167
    } else if (outputType.equals(RuleCheckingOutputType.SCORE)) {
×
168
      result.put(RuleCheckingOutputType.SCORE, globalResults.get(getIdOrHeader()));
×
169
    } else if (outputType.equals(RuleCheckingOutputType.BOTH)) {
×
170
      result.put(RuleCheckingOutputType.STATUS, globalResults.get(getIdOrHeader() + ":status"));
×
171
      result.put(RuleCheckingOutputType.SCORE, globalResults.get(getIdOrHeader() + ":score"));
×
172
    }
173
    return result;
×
174
  }
175
}
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