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

pkiraly / metadata-qa-marc / #1527

22 Aug 2025 02:21PM UTC coverage: 90.345%. Remained the same
#1527

push

pkiraly
Improve timeline handling

5191 of 6416 new or added lines in 219 files covered. (80.91%)

886 existing lines in 78 files now uncovered.

36717 of 40641 relevant lines covered (90.34%)

0.9 hits per line

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

83.76
/src/main/java/de/gwdg/metadataqa/marc/definition/structure/DataFieldDefinition.java
1
package de.gwdg.metadataqa.marc.definition.structure;
2

3
import de.gwdg.metadataqa.marc.EncodedValue;
4
import de.gwdg.metadataqa.marc.Utils;
5
import de.gwdg.metadataqa.marc.definition.Cardinality;
6
import de.gwdg.metadataqa.marc.definition.CompilanceLevel;
7
import de.gwdg.metadataqa.marc.definition.FRBRFunction;
8
import de.gwdg.metadataqa.marc.definition.MarcVersion;
9
import de.gwdg.metadataqa.marc.definition.SourceSpecificationType;
10
import de.gwdg.metadataqa.marc.definition.bibliographic.BibliographicFieldDefinition;
11
import org.apache.commons.lang3.StringUtils;
12

13
import java.io.Serializable;
14
import java.util.Arrays;
15
import java.util.EnumMap;
16
import java.util.LinkedHashMap;
17
import java.util.LinkedList;
18
import java.util.List;
19
import java.util.Map;
20

21
public abstract class DataFieldDefinition implements BibliographicFieldDefinition, Serializable {
1✔
22

23
  private static final long serialVersionUID = 4422093591547118076L;
24
  protected String tag;
25
  protected String bibframeTag;
26
  protected String mqTag;
27
  protected String label;
28
  protected Cardinality cardinality = Cardinality.Nonrepeatable;
1✔
29
  protected Indicator ind1;
30
  protected Indicator ind2;
31
  protected String descriptionUrl;
32
  protected List<SubfieldDefinition> subfields;
33
  protected Map<String, SubfieldDefinition> subfieldIndex = new LinkedHashMap<>();
1✔
34
  protected List<EncodedValue> historicalSubfields;
35
  protected Map<String, EncodedValue> historicalSubfieldsIndex;
36
  protected String indexTag = null;
1✔
37
  protected Map<MarcVersion, List<SubfieldDefinition>> versionSpecificSubfields;
38
  protected List<FRBRFunction> functions;
39
  protected SourceSpecificationType sourceSpecificationType = null;
1✔
40
  protected boolean obsolete = false;
1✔
41
  private CompilanceLevel nationalCompilanceLevel;
42
  private CompilanceLevel minimalCompilanceLevel;
43
  private MarcVersion marcVersion;
44

45
  public String getTag() {
46
    return tag;
1✔
47
  }
48

49
  public String getIndexTag() {
50
    if (indexTag != null) {
1✔
51
      return indexTag;
1✔
52
    }
53
    if (mqTag != null) {
1✔
54
      indexTag = mqTag;
1✔
55
    } else if (bibframeTag != null) {
1✔
56
      indexTag = bibframeTag.replace("/", "");
1✔
57
    } else {
58
      indexTag = tag;
1✔
59
    }
60

61
    return indexTag;
1✔
62
  }
63

64
  public String getLabel() {
65
    return label;
1✔
66
  }
67

68
  public Cardinality getCardinality() {
69
    return cardinality;
1✔
70
  }
71

72
  public Indicator getInd1() {
73
    return ind1;
1✔
74
  }
75

76
  public Indicator getInd2() {
77
    return ind2;
1✔
78
  }
79

80
  public List<Indicator> getIndicators() {
81
    return Arrays.asList(ind1, ind2);
1✔
82
  }
83

84
  protected void postCreation() {
85
    setIndicatorFlags();
1✔
86
  }
1✔
87

88
  protected void setIndicatorFlags() {
89
    if (ind1 != null) {
1✔
90
      ind1.setParent(this);
1✔
91
      ind1.setIndicatorFlag("ind1");
1✔
92
    }
93
    if (ind2 != null) {
1✔
94
      ind2.setParent(this);
1✔
95
      ind2.setIndicatorFlag("ind2");
1✔
96
    }
97
  }
1✔
98

99
  public List<SubfieldDefinition> getSubfields() {
100
    return subfields;
1✔
101
  }
102

103
  protected void setSubfields(String... input) {
UNCOV
104
    subfields = new LinkedList<>();
×
UNCOV
105
    for (int i = 0; i < input.length; i += 2) {
×
UNCOV
106
      subfields.add(new SubfieldDefinition(input[i], input[i + 1]));
×
107
    }
UNCOV
108
    indexSubfields();
×
109
  }
×
110

111
  protected void setSubfieldsWithCardinality(String... input) {
112
    subfields = new LinkedList<>();
1✔
113
    for (int i = 0; i < input.length; i += 3) {
1✔
114
      String code = input[i];
1✔
115
      String subfieldLabel = input[i + 1];
1✔
116
      String subfieldCardinality = input[i + 2];
1✔
117
      SubfieldDefinition definition = new SubfieldDefinition(code, subfieldLabel, subfieldCardinality);
1✔
118
      definition.setParent(this);
1✔
119
      subfields.add(definition);
1✔
120
    }
121
    indexSubfields();
1✔
122
  }
1✔
123

124
  /**
125
   * Populates the subfield index hash map. The key is the subfield code.
126
   */
127
  protected void indexSubfields() {
128
    for (SubfieldDefinition subfield : subfields) {
1✔
129
      subfieldIndex.put(subfield.getCode(), subfield);
1✔
130
    }
1✔
131
  }
1✔
132

133
  protected DataFieldDefinition setHistoricalSubfields(String... input) {
134
    historicalSubfields = new LinkedList<>();
1✔
135
    for (int i = 0; i<input.length; i+=2) {
1✔
136
      historicalSubfields.add(new EncodedValue(input[i], input[i+1]));
1✔
137
    }
138
    indexHistoricalSubfields();
1✔
139
    return this;
1✔
140
  }
141

142
  private void indexHistoricalSubfields() {
143
    historicalSubfieldsIndex = new LinkedHashMap<>();
1✔
144
    for (EncodedValue code : historicalSubfields) {
1✔
145
      historicalSubfieldsIndex.put(code.getCode(), code);
1✔
146
    }
1✔
147
  }
1✔
148

149
  public boolean isHistoricalSubfield(String code) {
UNCOV
150
    return historicalSubfields != null
×
UNCOV
151
      && !historicalSubfields.isEmpty()
×
UNCOV
152
      && historicalSubfieldsIndex.containsKey(code);
×
153
  }
154

155
  public String getDescriptionUrl() {
156
    return descriptionUrl;
1✔
157
  }
158

159
  public SubfieldDefinition getSubfield(String code) {
160
    return subfieldIndex.getOrDefault(code, null);
1✔
161
  }
162

163
  public void putVersionSpecificSubfields(MarcVersion marcVersion,
164
                                          List<SubfieldDefinition> subfieldDefinitions) {
165
    if (versionSpecificSubfields == null)
1✔
166
      versionSpecificSubfields = new EnumMap<>(MarcVersion.class);
1✔
167

168
    for (SubfieldDefinition subfieldDefinition : subfieldDefinitions) {
1✔
169
      subfieldDefinition.setParent(this);
1✔
170
      subfieldDefinition.setMarcVersion(marcVersion);
1✔
171
    }
1✔
172

173
    versionSpecificSubfields.put(marcVersion, subfieldDefinitions);
1✔
174
  }
1✔
175

176
  public Map<MarcVersion, List<SubfieldDefinition>> getVersionSpecificSubfields() {
177
    return versionSpecificSubfields;
1✔
178
  }
179

180
  public boolean hasVersionSpecificSubfields(MarcVersion marcVersion) {
UNCOV
181
    return versionSpecificSubfields.containsKey(marcVersion);
×
182
  }
183

184
  public boolean isVersionSpecificSubfields(MarcVersion marcVersion, String code) {
185
    if (versionSpecificSubfields == null
1✔
186
      || versionSpecificSubfields.isEmpty()
1✔
187
      || !versionSpecificSubfields.containsKey(marcVersion)
1✔
188
      || versionSpecificSubfields.get(marcVersion).isEmpty()) {
1✔
189
      return false;
1✔
190
    }
191

192
    for (SubfieldDefinition subfieldDefinition : versionSpecificSubfields.get(marcVersion)) {
1✔
193
      if (subfieldDefinition.getCode().equals(code)) {
1✔
194
        return true;
1✔
195
      }
196
    }
1✔
UNCOV
197
    return false;
×
198
  }
199

200
  public SubfieldDefinition getVersionSpecificDefinition(MarcVersion marcVersion, String code) {
201
    if (!isVersionSpecificSubfields(marcVersion, code)) {
1✔
202
      return null;
1✔
203
    }
204

205
    for (SubfieldDefinition subfieldDefinition : versionSpecificSubfields.get(marcVersion)) {
1✔
206
      if (subfieldDefinition.getCode().equals(code)) {
1✔
207
        return subfieldDefinition;
1✔
208
      }
209
    }
1✔
UNCOV
210
    return null;
×
211
  }
212

213
  public List<EncodedValue> getHistoricalSubfields() {
UNCOV
214
    return historicalSubfields;
×
215
  }
216

217
  public String getMqTag() {
218
    return mqTag;
1✔
219
  }
220

221
  public List<FRBRFunction> getFrbrFunctions() {
222
    return functions;
1✔
223
  }
224

225
  public SourceSpecificationType getSourceSpecificationType() {
226
    return sourceSpecificationType;
1✔
227
  }
228

229
  public void setCompilanceLevels(String national) {
230
    setNationalCompilanceLevel(national);
1✔
231
  }
1✔
232

233
  public void setCompilanceLevels(String national, String minimal) {
234
    setNationalCompilanceLevel(national);
1✔
235
    setMinimalCompilanceLevel(minimal);
1✔
236
  }
1✔
237

238
  public CompilanceLevel getNationalCompilanceLevel() {
UNCOV
239
    return nationalCompilanceLevel;
×
240
  }
241

242
  public void setNationalCompilanceLevel(CompilanceLevel nationalLevel) {
UNCOV
243
    this.nationalCompilanceLevel = nationalLevel;
×
UNCOV
244
  }
×
245

246
  public void setNationalCompilanceLevel(String level) {
247
    if (StringUtils.isNotBlank(level))
1✔
248
      this.nationalCompilanceLevel = CompilanceLevel.byAbbreviation(level);
1✔
249
  }
1✔
250

251
  public CompilanceLevel getMinimalCompilanceLevel() {
252
    return minimalCompilanceLevel;
×
253
  }
254

255
  public void setMinimalCompilanceLevel(String level) {
256
    if (StringUtils.isNotBlank(level))
1✔
257
      this.minimalCompilanceLevel = CompilanceLevel.byAbbreviation(level);
1✔
258
  }
1✔
259

260
  public void setMinimalCompilanceLevel(CompilanceLevel minimalLevel) {
261
    this.minimalCompilanceLevel = minimalLevel;
×
UNCOV
262
  }
×
263

264
  public MarcVersion getMarcVersion() {
265
    if (marcVersion == null)
1✔
266
      marcVersion = Utils.getVersion(this);
1✔
267
    return marcVersion;
1✔
268
  }
269

270
  public boolean isObsolete() {
271
    return obsolete;
×
272
  }
273

274

275
  @Override
276
  public String toString() {
277
    return "DataFieldDefinition{" +
1✔
278
      "tag='" + tag + '\'' +
279
      ", label='" + label + '\'' +
280
      ", cardinality=" + cardinality +
281
      // ", ind1=" + ind1 +
282
      // ", ind2=" + ind2 +
283
      ", descriptionUrl='" + descriptionUrl + '\'' +
284
      // ", subfields=" + subfields +
285
      '}';
286
  }
287
}
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