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

pkiraly / metadata-qa-api / #631

26 Feb 2025 09:29PM UTC coverage: 87.328% (-0.4%) from 87.722%
#631

push

pkiraly
Add hasChildren rule #221

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

62 existing lines in 3 files now uncovered.

5341 of 6116 relevant lines covered (87.33%)

0.87 hits per line

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

83.06
/src/main/java/de/gwdg/metadataqa/api/schema/SchemaUtils.java
1
package de.gwdg.metadataqa.api.schema;
2

3
import de.gwdg.metadataqa.api.configuration.schema.Rule;
4
import de.gwdg.metadataqa.api.json.DataElement;
5
import de.gwdg.metadataqa.api.rule.logical.AndChecker;
6
import de.gwdg.metadataqa.api.rule.logical.LogicalChecker;
7
import de.gwdg.metadataqa.api.rule.logical.NotChecker;
8
import de.gwdg.metadataqa.api.rule.logical.OrChecker;
9
import de.gwdg.metadataqa.api.rule.pairchecker.DisjointChecker;
10
import de.gwdg.metadataqa.api.rule.pairchecker.LessThanPairChecker;
11
import de.gwdg.metadataqa.api.rule.singlefieldchecker.ContentTypeChecker;
12
import de.gwdg.metadataqa.api.rule.singlefieldchecker.DependencyChecker;
13
import de.gwdg.metadataqa.api.rule.singlefieldchecker.EnumerationChecker;
14
import de.gwdg.metadataqa.api.rule.pairchecker.EqualityChecker;
15
import de.gwdg.metadataqa.api.rule.singlefieldchecker.HasChildrenChecker;
16
import de.gwdg.metadataqa.api.rule.singlefieldchecker.HasValueChecker;
17
import de.gwdg.metadataqa.api.rule.singlefieldchecker.ImageDimensionChecker;
18
import de.gwdg.metadataqa.api.rule.singlefieldchecker.LanguageTagChecker;
19
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MaxCountChecker;
20
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MaxLengthChecker;
21
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MaxWordsChecker;
22
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MinCountChecker;
23
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MinLengthChecker;
24
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MinWordsChecker;
25
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MultilingualChecker;
26
import de.gwdg.metadataqa.api.rule.singlefieldchecker.NumericValueChecker;
27
import de.gwdg.metadataqa.api.rule.singlefieldchecker.PatternChecker;
28
import de.gwdg.metadataqa.api.rule.RuleChecker;
29
import de.gwdg.metadataqa.api.rule.singlefieldchecker.UniquenessChecker;
30
import org.apache.commons.lang3.StringUtils;
31

32
import java.util.ArrayList;
33
import java.util.List;
34
import java.util.logging.Logger;
35

36
import static de.gwdg.metadataqa.api.rule.singlefieldchecker.NumericValueChecker.TYPE.MAX_EXCLUSIVE;
37
import static de.gwdg.metadataqa.api.rule.singlefieldchecker.NumericValueChecker.TYPE.MAX_INCLUSIVE;
38
import static de.gwdg.metadataqa.api.rule.singlefieldchecker.NumericValueChecker.TYPE.MIN_EXCLUSIVE;
39
import static de.gwdg.metadataqa.api.rule.singlefieldchecker.NumericValueChecker.TYPE.MIN_INCLUSIVE;
40

UNCOV
41
public class SchemaUtils {
×
42

43
  private static final Logger LOGGER = Logger.getLogger(SchemaUtils.class.getCanonicalName());
1✔
44
  static int id = 0;
1✔
45

46
  /**
47
   * Create rule checkers based on the schema
48
   *
49
   * @param schema
50
   * @return The list of rule checkers
51
   */
52
  public static List<RuleChecker> getRuleCheckers(Schema schema) {
53
    setSchemaForFields(schema);
1✔
54
    id = 0;
1✔
55
    List<RuleChecker> allRuleCheckers = new ArrayList<>();
1✔
56
    for (DataElement dataElement : schema.getPaths()) {
1✔
57
      if (dataElement.getRules() != null) {
1✔
58
        List<Rule> rules = dataElement.getRules();
1✔
59
        for (Rule rule : rules) {
1✔
60
          List<RuleChecker> ruleCheckers = processRule(schema, dataElement, rule);
1✔
61
          if (!ruleCheckers.isEmpty())
1✔
62
            allRuleCheckers.addAll(ruleCheckers);
1✔
63
        }
1✔
64
      }
65
    }
1✔
66
    return allRuleCheckers;
1✔
67
  }
68

69
  private static List<RuleChecker> processRule(Schema schema, DataElement dataElement, Rule rule) {
70
    List<RuleChecker> ruleCheckers = new ArrayList<>();
1✔
71
    if (rule.getSkip().equals(Boolean.TRUE))
1✔
UNCOV
72
      return ruleCheckers;
×
73

74
    if (StringUtils.isNotBlank(rule.getPattern()))
1✔
75
      ruleCheckers.add(new PatternChecker(dataElement, rule.getPattern()));
1✔
76

77
    if (StringUtils.isNotBlank(rule.getEquals()))
1✔
78
      pair(schema, ruleCheckers, dataElement, rule.getEquals(), "equals");
1✔
79

80
    if (StringUtils.isNotBlank(rule.getDisjoint()))
1✔
81
      pair(schema, ruleCheckers, dataElement, rule.getDisjoint(), "disjoint");
1✔
82

83
    if (rule.getIn() != null && !rule.getIn().isEmpty())
1✔
84
      ruleCheckers.add(new EnumerationChecker(dataElement, rule.getIn()));
1✔
85

86
    if (rule.getMinCount() != null)
1✔
87
      ruleCheckers.add(new MinCountChecker(dataElement, rule.getMinCount(), rule.getAllowEmptyInstances()));
1✔
88

89
    if (rule.getMaxCount() != null)
1✔
90
      ruleCheckers.add(new MaxCountChecker(dataElement, rule.getMaxCount(), rule.getAllowEmptyInstances()));
1✔
91

92
    if (rule.getMinLength() != null)
1✔
93
      ruleCheckers.add(new MinLengthChecker(dataElement, rule.getMinLength()));
1✔
94

95
    if (rule.getMaxLength() != null)
1✔
96
      ruleCheckers.add(new MaxLengthChecker(dataElement, rule.getMaxLength()));
1✔
97

98
    if (rule.getMaxWords() != null)
1✔
UNCOV
99
      ruleCheckers.add(new MaxWordsChecker(dataElement, rule.getMaxWords()));
×
100

101
    if (rule.getMinWords() != null)
1✔
UNCOV
102
      ruleCheckers.add(new MinWordsChecker(dataElement, rule.getMinWords()));
×
103

104
    if (StringUtils.isNotBlank(rule.getHasValue()))
1✔
105
      ruleCheckers.add(new HasValueChecker(dataElement, rule.getHasValue()));
1✔
106

107
    if (rule.getHasChildren() != null && !rule.getHasChildren().isEmpty())
1✔
UNCOV
108
      ruleCheckers.add(new HasChildrenChecker(dataElement, rule.getHasChildren()));
×
109

110
    if (rule.getMinInclusive() != null)
1✔
UNCOV
111
      ruleCheckers.add(new NumericValueChecker(dataElement, rule.getMinInclusive(), MIN_INCLUSIVE));
×
112

113
    if (rule.getMaxInclusive() != null)
1✔
UNCOV
114
      ruleCheckers.add(new NumericValueChecker(dataElement, rule.getMinInclusive(), MAX_INCLUSIVE));
×
115

116
    if (rule.getMinExclusive() != null)
1✔
UNCOV
117
      ruleCheckers.add(new NumericValueChecker(dataElement, rule.getMinInclusive(), MIN_EXCLUSIVE));
×
118

119
    if (rule.getMaxExclusive() != null)
1✔
UNCOV
120
      ruleCheckers.add(new NumericValueChecker(dataElement, rule.getMinInclusive(), MAX_EXCLUSIVE));
×
121

122
    if (rule.getContentType() != null && !rule.getContentType().isEmpty())
1✔
123
      ruleCheckers.add(new ContentTypeChecker(dataElement, rule.getContentType()));
1✔
124

125
    if (rule.getDimension() != null)
1✔
126
      ruleCheckers.add(new ImageDimensionChecker(dataElement, rule.getDimension()));
1✔
127

128
    if (rule.getDependencies() != null && !rule.getDependencies().isEmpty())
1✔
129
      ruleCheckers.add(new DependencyChecker(dataElement, rule.getDependencies()));
1✔
130

131
    if (rule.getUnique() != null && rule.getUnique().equals(Boolean.TRUE))
1✔
132
      ruleCheckers.add(new UniquenessChecker(dataElement));
×
133

134
    if (rule.getMultilingual() != null && rule.getMultilingual().equals(Boolean.TRUE))
1✔
135
      ruleCheckers.add(new MultilingualChecker(dataElement));
×
136

137
    if (rule.getHasLanguageTag() != null)
1✔
138
      ruleCheckers.add(new LanguageTagChecker(dataElement).withScope(rule.getHasLanguageTag()));
×
139

140
    if (rule.getLessThan() != null)
1✔
141
      pair(schema, ruleCheckers, dataElement, rule.getLessThan(), "LessThan");
×
142

143
    if (rule.getLessThanOrEquals() != null)
1✔
144
      pair(schema, ruleCheckers, dataElement, rule.getLessThan(), "lessThanOrEquals");
×
145

146
    if (rule.getLessThanOrEquals() != null)
1✔
UNCOV
147
      ruleCheckers.add(new DependencyChecker(dataElement, rule.getDependencies()));
×
148

149
    if (rule.getAnd() != null) {
1✔
150
      List<RuleChecker> childRuleCheckers = getChildRuleCheckers(schema, dataElement, rule.getAnd(), rule.getId());
1✔
151
      ruleCheckers.add(new AndChecker(dataElement, childRuleCheckers));
1✔
152
    }
153

154
    if (rule.getOr() != null) {
1✔
155
      List<RuleChecker> childRuleCheckers = getChildRuleCheckers(schema, dataElement, rule.getOr(), rule.getId());
1✔
156
      ruleCheckers.add(new OrChecker(dataElement, childRuleCheckers));
1✔
157
    }
158

159
    if (rule.getNot() != null) {
1✔
160
      List<RuleChecker> childRuleCheckers = getChildRuleCheckers(schema, dataElement, rule.getNot(), rule.getId());
1✔
161
      ruleCheckers.add(new NotChecker(dataElement, childRuleCheckers));
1✔
162
    }
163

164
    if (!ruleCheckers.isEmpty()) {
1✔
165
      for (RuleChecker ruleChecker : ruleCheckers) {
1✔
166
        ruleChecker.setFailureScore(rule.getFailureScore());
1✔
167
        ruleChecker.setSuccessScore(rule.getSuccessScore());
1✔
168
        ruleChecker.setNaScore(rule.getNaScore());
1✔
169
        String idValue = StringUtils.isNotBlank(rule.getId()) ? rule.getId() : String.valueOf(++id);
1✔
170
        ruleChecker.setId(idValue);
1✔
171
        if (rule.getHidden().equals(Boolean.TRUE))
1✔
172
          ruleChecker.setHidden();
1✔
173
        if (rule.getDebug().equals(Boolean.TRUE)) {
1✔
174
          ruleChecker.setDebug();
1✔
175
          if (ruleChecker instanceof LogicalChecker) {
1✔
176
            for (RuleChecker child : ((LogicalChecker) ruleChecker).getCheckers()) {
1✔
177
              child.setDebug();
1✔
178
            }
1✔
179
          }
180
        }
181
      }
1✔
182
    }
183

184
    return ruleCheckers;
1✔
185
  }
186

187
  private static List<RuleChecker> getChildRuleCheckers(Schema schema, DataElement dataElement, List<Rule> rules, String id) {
188
    List<RuleChecker> childRuleCheckers = new ArrayList<>();
1✔
189
    for (Rule childRule : rules) {
1✔
190
      if (StringUtils.isBlank(childRule.getId()))
1✔
191
        childRule.setId(id);
1✔
192
      List<RuleChecker> localChildRuleCheckers = processRule(schema, dataElement, childRule);
1✔
193
      if (!localChildRuleCheckers.isEmpty())
1✔
194
        childRuleCheckers.addAll(localChildRuleCheckers);
1✔
195
    }
1✔
196
    return childRuleCheckers;
1✔
197
  }
198

199
  private static void pair(Schema schema,
200
                           List<RuleChecker> ruleCheckers,
201
                           DataElement dataElement,
202
                           String fieldReference,
203
                           String type) {
204
    DataElement field2 = schema.getPathByLabel(fieldReference);
1✔
205
    if (field2 != null) {
1✔
206
      RuleChecker ruleChecker = null;
1✔
207
      if ("equals".equals(type)) {
1✔
208
        ruleChecker = new EqualityChecker(dataElement, field2);
1✔
209
      } else if ("disjoint".equals(type)) {
1✔
210
        ruleChecker = new DisjointChecker(dataElement, field2);
1✔
211
      } else if ("lessThan".equals(type)) {
×
UNCOV
212
        ruleChecker = new LessThanPairChecker(dataElement, field2, LessThanPairChecker.TYPE.LESS_THAN);
×
UNCOV
213
      } else if ("lessThanOrEquals".equals(type)) {
×
UNCOV
214
        ruleChecker = new LessThanPairChecker(dataElement, field2, LessThanPairChecker.TYPE.LESS_THAN_OR_EQUALS);
×
215
      }
216

217
      if (ruleChecker != null)
1✔
218
        ruleCheckers.add(ruleChecker);
1✔
219
    } else
1✔
UNCOV
220
      LOGGER.warning(
×
UNCOV
221
        String.format("invalid field reference in %s: %s", type, fieldReference));
×
222
  }
1✔
223

224
  public static void setSchemaForFields(Schema schema) {
225
    for (DataElement dataElement : schema.getPaths())
1✔
226
      dataElement.setSchema(schema);
1✔
227
  }
1✔
228
}
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