• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In
Build has been canceled!

pkiraly / metadata-qa-api / #634

13 Mar 2025 08:06PM UTC coverage: 87.186% (-0.1%) from 87.296%
#634

push

pkiraly
Fix dependency checker #223

20 of 74 new or added lines in 11 files covered. (27.03%)

1 existing line in 1 file now uncovered.

5375 of 6165 relevant lines covered (87.19%)

0.87 hits per line

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

82.54
/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.MQAFPatternChecker;
20
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MaxCountChecker;
21
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MaxLengthChecker;
22
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MaxWordsChecker;
23
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MinCountChecker;
24
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MinLengthChecker;
25
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MinWordsChecker;
26
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MultilingualChecker;
27
import de.gwdg.metadataqa.api.rule.singlefieldchecker.NumericValueChecker;
28
import de.gwdg.metadataqa.api.rule.singlefieldchecker.PatternChecker;
29
import de.gwdg.metadataqa.api.rule.RuleChecker;
30
import de.gwdg.metadataqa.api.rule.singlefieldchecker.UniquenessChecker;
31
import org.apache.commons.lang3.StringUtils;
32

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

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

42
public class SchemaUtils {
×
43

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

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

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

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

78
    if (rule.getMqafPattern() != null)
1✔
NEW
79
      ruleCheckers.add(new MQAFPatternChecker(dataElement, rule.getMqafPattern()));
×
80

81
    if (StringUtils.isNotBlank(rule.getEquals()))
1✔
82
      pair(schema, ruleCheckers, dataElement, rule.getEquals(), "equals");
1✔
83

84
    if (StringUtils.isNotBlank(rule.getDisjoint()))
1✔
85
      pair(schema, ruleCheckers, dataElement, rule.getDisjoint(), "disjoint");
1✔
86

87
    if (rule.getIn() != null && !rule.getIn().isEmpty())
1✔
88
      ruleCheckers.add(new EnumerationChecker(dataElement, rule.getIn()));
1✔
89

90
    if (rule.getMinCount() != null)
1✔
91
      ruleCheckers.add(new MinCountChecker(dataElement, rule.getMinCount(), rule.getAllowEmptyInstances()));
1✔
92

93
    if (rule.getMaxCount() != null)
1✔
94
      ruleCheckers.add(new MaxCountChecker(dataElement, rule.getMaxCount(), rule.getAllowEmptyInstances()));
1✔
95

96
    if (rule.getMinLength() != null)
1✔
97
      ruleCheckers.add(new MinLengthChecker(dataElement, rule.getMinLength()));
1✔
98

99
    if (rule.getMaxLength() != null)
1✔
100
      ruleCheckers.add(new MaxLengthChecker(dataElement, rule.getMaxLength()));
1✔
101

102
    if (rule.getMaxWords() != null)
1✔
103
      ruleCheckers.add(new MaxWordsChecker(dataElement, rule.getMaxWords()));
×
104

105
    if (rule.getMinWords() != null)
1✔
106
      ruleCheckers.add(new MinWordsChecker(dataElement, rule.getMinWords()));
×
107

108
    if (StringUtils.isNotBlank(rule.getHasValue()))
1✔
109
      ruleCheckers.add(new HasValueChecker(dataElement, rule.getHasValue()));
1✔
110

111
    if (rule.getHasChildren() != null && !rule.getHasChildren().isEmpty())
1✔
112
      ruleCheckers.add(new HasChildrenChecker(dataElement, rule.getHasChildren()));
×
113

114
    if (rule.getMinInclusive() != null)
1✔
115
      ruleCheckers.add(new NumericValueChecker(dataElement, rule.getMinInclusive(), MIN_INCLUSIVE));
×
116

117
    if (rule.getMaxInclusive() != null)
1✔
118
      ruleCheckers.add(new NumericValueChecker(dataElement, rule.getMinInclusive(), MAX_INCLUSIVE));
×
119

120
    if (rule.getMinExclusive() != null)
1✔
121
      ruleCheckers.add(new NumericValueChecker(dataElement, rule.getMinInclusive(), MIN_EXCLUSIVE));
×
122

123
    if (rule.getMaxExclusive() != null)
1✔
124
      ruleCheckers.add(new NumericValueChecker(dataElement, rule.getMinInclusive(), MAX_EXCLUSIVE));
×
125

126
    if (rule.getContentType() != null && !rule.getContentType().isEmpty())
1✔
127
      ruleCheckers.add(new ContentTypeChecker(dataElement, rule.getContentType()));
1✔
128

129
    if (rule.getDimension() != null)
1✔
130
      ruleCheckers.add(new ImageDimensionChecker(dataElement, rule.getDimension()));
1✔
131

132
    if (rule.getDependencies() != null && !rule.getDependencies().isEmpty())
1✔
133
      ruleCheckers.add(new DependencyChecker(dataElement, rule.getDependencies()));
1✔
134

135
    if (rule.getUnique() != null && rule.getUnique().equals(Boolean.TRUE))
1✔
136
      ruleCheckers.add(new UniquenessChecker(dataElement));
×
137

138
    if (rule.getMultilingual() != null && rule.getMultilingual().equals(Boolean.TRUE))
1✔
139
      ruleCheckers.add(new MultilingualChecker(dataElement));
×
140

141
    if (rule.getHasLanguageTag() != null)
1✔
142
      ruleCheckers.add(new LanguageTagChecker(dataElement).withScope(rule.getHasLanguageTag()));
×
143

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

147
    if (rule.getLessThanOrEquals() != null)
1✔
148
      pair(schema, ruleCheckers, dataElement, rule.getLessThan(), "lessThanOrEquals");
×
149

150
    if (rule.getLessThanOrEquals() != null)
1✔
151
      ruleCheckers.add(new DependencyChecker(dataElement, rule.getDependencies()));
×
152

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

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

163
    if (rule.getNot() != null) {
1✔
164
      List<RuleChecker> childRuleCheckers = getChildRuleCheckers(schema, dataElement, rule.getNot(), rule.getId());
1✔
165
      ruleCheckers.add(new NotChecker(dataElement, childRuleCheckers));
1✔
166
    }
167

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

188
    return ruleCheckers;
1✔
189
  }
190

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

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

221
      if (ruleChecker != null)
1✔
222
        ruleCheckers.add(ruleChecker);
1✔
223
    } else
1✔
224
      LOGGER.warning(
×
225
        String.format("invalid field reference in %s: %s", type, fieldReference));
×
226
  }
1✔
227

228
  public static void setSchemaForFields(Schema schema) {
229
    for (DataElement dataElement : schema.getPaths())
1✔
230
      dataElement.setSchema(schema);
1✔
231
  }
1✔
232
}
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