• 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

0.0
/src/main/java/de/gwdg/metadataqa/marc/cli/utils/MappingToJson.java
1
package de.gwdg.metadataqa.marc.cli.utils;
2

3
import de.gwdg.metadataqa.marc.EncodedValue;
4
import de.gwdg.metadataqa.marc.cli.parameters.MappingParameters;
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.controlpositions.Control006Positions;
10
import de.gwdg.metadataqa.marc.definition.controlpositions.Control007Positions;
11
import de.gwdg.metadataqa.marc.definition.controlpositions.Control008Positions;
12
import de.gwdg.metadataqa.marc.definition.controlpositions.ControlfieldPositionList;
13
import de.gwdg.metadataqa.marc.definition.controlpositions.LeaderPositions;
14
import de.gwdg.metadataqa.marc.definition.general.codelist.CodeList;
15
import de.gwdg.metadataqa.marc.definition.general.parser.LinkageParser;
16
import de.gwdg.metadataqa.marc.definition.general.parser.RecordControlNumberParser;
17
import de.gwdg.metadataqa.marc.definition.general.validator.RegexValidator;
18
import de.gwdg.metadataqa.marc.definition.structure.ControlFieldDefinition;
19
import de.gwdg.metadataqa.marc.definition.structure.ControlfieldPositionDefinition;
20
import de.gwdg.metadataqa.marc.definition.structure.DataFieldDefinition;
21
import de.gwdg.metadataqa.marc.definition.structure.Indicator;
22
import de.gwdg.metadataqa.marc.definition.structure.SubfieldDefinition;
23
import de.gwdg.metadataqa.marc.definition.tags.control.Control001Definition;
24
import de.gwdg.metadataqa.marc.definition.tags.control.Control003Definition;
25
import de.gwdg.metadataqa.marc.definition.tags.control.Control005Definition;
26
import de.gwdg.metadataqa.marc.definition.tags.control.Control006Definition;
27
import de.gwdg.metadataqa.marc.definition.tags.control.Control007Definition;
28
import de.gwdg.metadataqa.marc.definition.tags.control.Control008Definition;
29
import de.gwdg.metadataqa.marc.definition.tags.control.LeaderDefinition;
30
import de.gwdg.metadataqa.marc.utils.MarcTagLister;
31
import de.gwdg.metadataqa.marc.utils.keygenerator.DataFieldKeyGenerator;
32
import de.gwdg.metadataqa.marc.utils.keygenerator.DataFieldKeyGeneratorFactory;
33
import de.gwdg.metadataqa.marc.utils.keygenerator.PositionalControlFieldKeyGenerator;
34
import net.minidev.json.JSONValue;
35
import org.apache.commons.cli.Options;
36
import org.apache.commons.cli.ParseException;
37

38
import java.lang.reflect.InvocationTargetException;
39
import java.lang.reflect.Method;
40
import java.util.ArrayList;
41
import java.util.Arrays;
42
import java.util.Collections;
43
import java.util.HashMap;
44
import java.util.LinkedHashMap;
45
import java.util.List;
46
import java.util.Map;
47
import java.util.logging.Level;
48
import java.util.logging.Logger;
49

50
public class MappingToJson {
51

UNCOV
52
  private static final Logger logger = Logger.getLogger(MappingToJson.class.getCanonicalName());
×
53

54
  private boolean exportSubfieldCodes = false;
×
UNCOV
55
  private boolean exportSelfDescriptiveCodes = false;
×
56
  private Map<String, Object> mapping;
57
  private final Options options;
58
  private MappingParameters parameters;
59
  private Map<String, List<EncodedValue>> referencesCodeLists;
60

UNCOV
61
  public MappingToJson(String[] args) throws ParseException {
×
UNCOV
62
    parameters = new MappingParameters(args);
×
63
    options = parameters.getOptions();
×
64

65
    exportSubfieldCodes = parameters.doExportSubfieldCodes();
×
UNCOV
66
    exportSelfDescriptiveCodes = parameters.doExportSelfDescriptiveCodes();
×
67

68
    mapping = new LinkedHashMap<>();
×
UNCOV
69
    mapping.put("$schema", "https://format.gbv.de/schema/avram/schema.json");
×
70
    mapping.put("title", "MARC 21 Format for Bibliographic Data.");
×
71
    mapping.put("description", "MARC 21 Format for Bibliographic Data.");
×
72
    mapping.put("url", "https://www.loc.gov/marc/bibliographic/");
×
73
  }
×
74

75
  public void setExportSubfieldCodes(boolean exportSubfieldCodes) {
UNCOV
76
    this.exportSubfieldCodes = exportSubfieldCodes;
×
UNCOV
77
  }
×
78

79
  public String toJson() {
UNCOV
80
    return JSONValue.toJSONString(mapping);
×
81
  }
82

83
  public void build() {
UNCOV
84
    Map<String, Object> fields = new LinkedHashMap<>();
×
85

86
    referencesCodeLists = new LinkedHashMap<>();
×
87

88
    fields.put("LDR", buildLeader());
×
UNCOV
89
    fields.putAll(buildSimpleControlFields());
×
90

91
    fields.put("006", buildControlField(Control006Definition.getInstance(), Control006Positions.getInstance()));
×
UNCOV
92
    fields.put("007", buildControlField(Control007Definition.getInstance(), Control007Positions.getInstance()));
×
93
    fields.put("008", buildControlField(Control008Definition.getInstance(), Control008Positions.getInstance()));
×
94

95
    for (Class<? extends DataFieldDefinition> tagClass : MarcTagLister.listTags()) {
×
96
      try {
97
        Method getInstance = tagClass.getMethod("getInstance");
×
UNCOV
98
        DataFieldDefinition fieldTag = (DataFieldDefinition) getInstance.invoke(tagClass);
×
99
        if (!parameters.isWithLocallyDefinedFields() && !fieldTag.getMarcVersion().equals(MarcVersion.MARC21))
×
100
          continue;
×
101
        dataFieldToJson(fields, fieldTag);
×
102
      } catch (NoSuchMethodException
×
103
        | IllegalAccessException
104
        | InvocationTargetException e) {
UNCOV
105
        logger.log(Level.SEVERE, "build", e);
×
UNCOV
106
      }
×
107
    }
×
108
    mapping.put("fields", fields);
×
109

110
    Map<String, Object> codelists = new LinkedHashMap<>();
×
UNCOV
111
    for (Map.Entry<String, List<EncodedValue>> entry : referencesCodeLists.entrySet()) {
×
112
      String url = entry.getKey();
×
113
      Map<String, Map<String, Object>> codes = new LinkedHashMap<>();
×
114
      for (EncodedValue code : entry.getValue()) {
×
NEW
115
        addCodeOrRange(codes, code, false);
×
116
      }
×
NEW
117
      Map<String, Object> codelist = new LinkedHashMap<>();
×
NEW
118
      codelist.put("codes", codes);
×
NEW
119
      codelist.put("url", url);
×
NEW
120
      codelists.put(url, codelist);
×
121
    }
×
122
    mapping.put("codelists", codelists);
×
123

124
    // System.err.println(referencesCodeLists.keySet());
125
  }
×
126

127
  static void addCodeOrRange(Map<String, Map<String, Object>> codes, EncodedValue code, boolean deprecated) {
128

NEW
129
    if (code.getRange() != null) {
×
NEW
130
      String[] range = code.getCode().split("-");
×
131
      try {
NEW
132
        int from = Integer.parseInt(range[0]);
×
NEW
133
        int to = Integer.parseInt(range[1]);
×
NEW
134
        for (int i=from; i<=to; i++) {
×
NEW
135
          String codeNumber = Integer.toString(i);
×
NEW
136
          Map<String, Object> map = new LinkedHashMap<>();
×
NEW
137
          map.put("code", codeNumber);
×
NEW
138
          map.put("label", code.getLabel());
×
NEW
139
          if (deprecated) {
×
NEW
140
            map.put("deprecated", true);
×
141
          }
NEW
142
          codes.put(codeNumber, map);
×
143
        }
NEW
144
      } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
×
NEW
145
        System.err.println("Invalid range in codelist!");
×
NEW
146
      }
×
NEW
147
    } else {
×
NEW
148
      Map<String, Object> map = new LinkedHashMap<>();
×
NEW
149
      map.put("code", code.getCode());
×
NEW
150
      map.put("label", code.getLabel());
×
NEW
151
      if (deprecated) {
×
NEW
152
        map.put("deprecated", true);
×
153
      }
NEW
154
      codes.put(code.getCode(), map);
×
155
    }
NEW
156
  }
×
157

158
  private Map<String, Object> buildControlField(ControlFieldDefinition field, ControlfieldPositionList positionDefinition) {
159
    Map<String, Object> positions;
UNCOV
160
    Map<String, Object> tag = new LinkedHashMap<>();
×
UNCOV
161
    tag.put("tag", field.getTag());
×
UNCOV
162
    tag.put("label", field.getLabel());
×
163
    tag.put("repeatable", resolveCardinality(field.getCardinality()));
×
164
    Map<String, Object> types = new LinkedHashMap<>();
×
UNCOV
165
    PositionalControlFieldKeyGenerator generator = getPositionalControlFieldKeyGenerator(field);
×
166
    for (String type : positionDefinition.getPositions().keySet()) {
×
167
      Map<String, Object> typeMap = new LinkedHashMap<>();
×
168
      positions = new LinkedHashMap<>();
×
169
      for (ControlfieldPositionDefinition subfield : positionDefinition.getPositions().get(type)) {
×
170
        Map<String, Object> position = controlPositionToJson(subfield, generator);
×
171
        String key = (String) position.remove("position");
×
172
        positions.put(key, position);
×
173
      }
×
174
      typeMap.put("positions", positions);
×
UNCOV
175
      types.put(type, typeMap);
×
176
    }
×
UNCOV
177
    tag.put("types", types);
×
178
    return tag;
×
179
  }
180

181
  private Map<String, Object> buildSimpleControlFields() {
182
    Map fields = new HashMap();
×
183
    List<DataFieldDefinition> simpleControlFields = Arrays.asList(
×
184
      Control001Definition.getInstance(),
×
185
      Control003Definition.getInstance(),
×
186
      Control005Definition.getInstance()
×
187
    );
188
    for (DataFieldDefinition field : simpleControlFields)
×
UNCOV
189
      fields.put(field.getTag(), buildSImpleControlField(field));
×
190

UNCOV
191
    return fields;
×
192
  }
193

194
  private Map<String, Object> buildSImpleControlField(DataFieldDefinition field) {
195
    Map<String, Object> tag;
196
    PositionalControlFieldKeyGenerator keyGenerator = new PositionalControlFieldKeyGenerator(field.getTag(), field.getMqTag(), parameters.getSolrFieldType());
×
197
    tag = new LinkedHashMap<>();
×
198
    tag.put("tag", field.getTag());
×
199
    tag.put("label", field.getLabel());
×
200
    tag.put("repeatable", resolveCardinality(field.getCardinality()));
×
201
    if (exportSelfDescriptiveCodes)
×
202
      tag.put("solr", keyGenerator.forTag());
×
203
    return tag;
×
204
  }
205

206
  private Map<String, Object> buildLeader() {
207
    Map<String, Object> tag = new LinkedHashMap<>();
×
208
    tag.put("repeatable", false);
×
209
    Map<String, Object> positions = new LinkedHashMap<>();
×
210

211
    ControlFieldDefinition field = LeaderDefinition.getInstance();
×
212
    PositionalControlFieldKeyGenerator generator = getPositionalControlFieldKeyGenerator(field);
×
213

UNCOV
214
    LeaderPositions leaderSubfields = LeaderPositions.getInstance();
×
UNCOV
215
    for (ControlfieldPositionDefinition subfield : leaderSubfields.getPositionList()) {
×
216
      Map<String, Object> position = controlPositionToJson(subfield, generator);
×
217
      String key = (String) position.remove("position");
×
218
      positions.put(key, position);
×
219
    }
×
220
    tag.put("positions", positions);
×
UNCOV
221
    return tag;
×
222
  }
223

224
  private PositionalControlFieldKeyGenerator getPositionalControlFieldKeyGenerator(ControlFieldDefinition field) {
225
    return exportSelfDescriptiveCodes
×
UNCOV
226
      ? new PositionalControlFieldKeyGenerator(field.getTag(), field.getMqTag(), parameters.getSolrFieldType())
×
UNCOV
227
      : null;
×
228
  }
229

230
  private static Map<String, Object> controlPositionToJson(ControlfieldPositionDefinition subfield, PositionalControlFieldKeyGenerator generator) {
231
    Map<String, Object> values = new LinkedHashMap<>();
×
232
    values.put("position", subfield.formatPositon());
×
233
    values.put("label", subfield.getLabel());
×
234
    values.put("url", subfield.getDescriptionUrl());
×
235
    values.put("start", subfield.getPositionStart());
×
236
    values.put("end", subfield.getPositionEnd() - 1);
×
237

UNCOV
238
    if (generator != null)
×
239
      values.put("solr", generator.forSubfield(subfield));
×
240

NEW
241
    LinkedHashMap<String, Object> codes = new LinkedHashMap<>();
×
242
    if (subfield.getCodes() != null) {
×
243
      for (EncodedValue code : subfield.getCodes()) {
×
UNCOV
244
        Map<String, Object> codeMap = new LinkedHashMap<>();
×
NEW
245
        codeMap.put("code", code.getCode());
×
246
        codeMap.put("label", code.getLabel());
×
247
        codes.put(code.getCode(), codeMap);
×
248
      }
×
249
    }
250
    if (subfield.getHistoricalCodes() != null) {
×
UNCOV
251
      for (EncodedValue code : subfield.getHistoricalCodes()) {
×
UNCOV
252
        Map<String, Object> codeMap = new LinkedHashMap<>();
×
NEW
253
        codeMap.put("code", code.getCode());
×
254
        codeMap.put("label", code.getLabel());
×
NEW
255
        codeMap.put("deprecated", true);
×
UNCOV
256
        codes.put(code.getCode(), codeMap);
×
UNCOV
257
      }
×
258
    }
NEW
259
    if (!codes.isEmpty()) {
×
NEW
260
      String codesOrFlags = subfield.isRepeatableContent() ? "flags" : "codes";
×
NEW
261
      values.put("codes", codes);
×
262
    }
263
    return values;
×
264
  }
265

266
  private void dataFieldToJson(Map fields, DataFieldDefinition fieldDefinition) {
NEW
267
    DataFieldKeyGenerator keyGenerator = DataFieldKeyGeneratorFactory.create(parameters.getSolrFieldType(), fieldDefinition);
×
268

UNCOV
269
    Map<String, Object> tagMap = new LinkedHashMap<>();
×
NEW
270
    tagMap.put("tag", fieldDefinition.getTag());
×
NEW
271
    tagMap.put("label", fieldDefinition.getLabel());
×
NEW
272
    tagMap.put("url", fieldDefinition.getDescriptionUrl());
×
NEW
273
    tagMap.put("repeatable", resolveCardinality(fieldDefinition.getCardinality()));
×
274
    if (exportSelfDescriptiveCodes)
×
275
      tagMap.put("solr", keyGenerator.getIndexTag());
×
276

277
    if (parameters.doExportFrbrFunctions())
×
NEW
278
      extractFunctions(tagMap, fieldDefinition.getFrbrFunctions());
×
279

280
    if (parameters.doExportCompilanceLevel())
×
NEW
281
      extractCompilanceLevel(tagMap, fieldDefinition.getNationalCompilanceLevel(), fieldDefinition.getMinimalCompilanceLevel());
×
282

283
    if (parameters.isWithLocallyDefinedFields())
×
NEW
284
      tagMap.put("version", fieldDefinition.getMarcVersion().getCode());
×
285

NEW
286
    tagMap.put("indicator1", indicatorToJson(fieldDefinition.getInd1()));
×
NEW
287
    tagMap.put("indicator2", indicatorToJson(fieldDefinition.getInd2()));
×
288

289
    Map<String, Object> subfields = new LinkedHashMap<>();
×
NEW
290
    if (fieldDefinition.getSubfields() != null) {
×
NEW
291
      for (SubfieldDefinition subfield : fieldDefinition.getSubfields()) {
×
292
        subfields.put(subfield.getCode(), subfieldToJson(subfield, keyGenerator));
×
293
      }
×
294
    } else {
NEW
295
      logger.info(fieldDefinition + " does not have subfields");
×
296
    }
297

NEW
298
    if (fieldDefinition.getHistoricalSubfields() != null) {
×
NEW
299
      for (EncodedValue code : fieldDefinition.getHistoricalSubfields()) {
×
NEW
300
        Map<String, Object> subfieldDefinition = new LinkedHashMap<>();
×
NEW
301
        subfieldDefinition.put("label", code.getLabel());
×
NEW
302
        subfieldDefinition.put("deprecated", true);
×
NEW
303
        subfields.put(code.getCode(), subfieldDefinition);
×
NEW
304
      }
×
305
    }
306

UNCOV
307
    tagMap.put("subfields", subfields);
×
308

309
    if (parameters.isWithLocallyDefinedFields()) {
×
NEW
310
      Map<MarcVersion, List<SubfieldDefinition>> versionSpecificSubfields = fieldDefinition.getVersionSpecificSubfields();
×
311
      if (versionSpecificSubfields != null && !versionSpecificSubfields.isEmpty()) {
×
312
        Map<String, Map<String, Object>> versionSpecificSubfieldsMap = new LinkedHashMap<>();
×
313
        for (Map.Entry<MarcVersion, List<SubfieldDefinition>> entry : versionSpecificSubfields.entrySet()) {
×
314
          String version = entry.getKey().getCode();
×
315
          subfields = new LinkedHashMap<>();
×
316
          for (SubfieldDefinition subfield : entry.getValue()) {
×
317
            subfields.put(subfield.getCode(), subfieldToJson(subfield, keyGenerator));
×
UNCOV
318
          }
×
319
          versionSpecificSubfieldsMap.put(version, subfields);
×
320
        }
×
UNCOV
321
        if (!versionSpecificSubfieldsMap.isEmpty())
×
322
          tagMap.put("versionSpecificSubfields", versionSpecificSubfieldsMap);
×
323
      }
324
    }
325

NEW
326
    if (fields.containsKey(fieldDefinition.getTag())) {
×
NEW
327
      Object existing = fields.get(fieldDefinition.getTag());
×
UNCOV
328
      List<Map> list = null;
×
UNCOV
329
      if (existing instanceof Map) {
×
330
        list = new ArrayList<>();
×
331
        list.add((Map) existing);
×
332
      } else if (existing instanceof List) {
×
333
        list = (List) existing;
×
334
      } else {
335
        System.err.println("a strange object: " + existing.getClass().getCanonicalName());
×
336
        list = new ArrayList<>();
×
337
      }
UNCOV
338
      list.add(tagMap);
×
NEW
339
      fields.put(fieldDefinition.getTag(), list);
×
UNCOV
340
    } else {
×
NEW
341
      fields.put(fieldDefinition.getTag(), tagMap);
×
342
    }
343
  }
×
344

345
  private void extractFunctions(Map<String, Object> tagMap, List<FRBRFunction> functions) {
346
    if (functions != null && !functions.isEmpty()) {
×
347
      List<String> paths = new ArrayList<>();
×
348
      for (FRBRFunction function : functions) {
×
349
        paths.add(function.getPath());
×
350
      }
×
351
      tagMap.put("frbr-functions", paths);
×
352
    }
353
  }
×
354

355
  private Map<String, Object> subfieldToJson(SubfieldDefinition subfieldDefinition, DataFieldKeyGenerator keyGenerator) {
UNCOV
356
    Map<String, Object> codeMap = new LinkedHashMap<>();
×
NEW
357
    codeMap.put("label", subfieldDefinition.getLabel());
×
NEW
358
    codeMap.put("repeatable", resolveCardinality(subfieldDefinition.getCardinality()));
×
359

360
    if (exportSelfDescriptiveCodes)
×
NEW
361
      codeMap.put("solr", keyGenerator.forSubfieldDefinition(subfieldDefinition));
×
362

NEW
363
    if (subfieldDefinition.getContentParser() instanceof LinkageParser)
×
NEW
364
      codeMap.put("pattern", ((LinkageParser)subfieldDefinition.getContentParser()).getPattern());
×
365

NEW
366
    if (subfieldDefinition.getContentParser() instanceof RecordControlNumberParser)
×
NEW
367
      codeMap.put("pattern", ((RecordControlNumberParser)subfieldDefinition.getContentParser()).getPattern());
×
368

NEW
369
    if (subfieldDefinition.getValidator() instanceof RegexValidator)
×
NEW
370
      codeMap.put("pattern", ((RegexValidator)subfieldDefinition.getValidator()).getPattern());
×
371

NEW
372
    if (subfieldDefinition.getCodeList() != null
×
NEW
373
        && !subfieldDefinition.getCodeList().getCodes().isEmpty()) {
×
NEW
374
      CodeList codeList = subfieldDefinition.getCodeList();
×
UNCOV
375
      referencesCodeLists.put(codeList.getUrl(), codeList.getCodes());
×
UNCOV
376
      codeMap.put("codes", codeList.getUrl());
×
377

378
      /*
379
      Map<String, Object> meta = new LinkedHashMap<>();
380
      meta.put("name", codeList.getName());
381
      meta.put("url", codeList.getUrl());
382

383
      if (exportSubfieldCodes
384
          && !codeList.getName().equals("MARC Organization Codes")
385
          && subfield.getCodeList() != null) {
386
        Map<String, Object> codes = new LinkedHashMap<>();
387
        for (EncodedValue code : subfield.getCodeList().getCodes()) {
388
          Map<String, Object> codeListMap = new LinkedHashMap<>();
389
          codeListMap.put("label", code.getLabel());
390
          codes.put(code.getCode(), codeListMap);
391
        }
392
        meta.put("codes", codes);
393
      }
394
      codeMap.put("codelist", meta);
395
       */
396
    }
397

NEW
398
    if (subfieldDefinition.hasPositions())
×
NEW
399
      codeMap.put("positions", getSubfieldPositions(subfieldDefinition));
×
400

401
    if (parameters.doExportFrbrFunctions())
×
NEW
402
      extractFunctions(codeMap, subfieldDefinition.getFrbrFunctions());
×
403

404
    if (parameters.doExportCompilanceLevel())
×
NEW
405
      extractCompilanceLevel(codeMap, subfieldDefinition.getNationalCompilanceLevel(), subfieldDefinition.getMinimalCompilanceLevel());
×
406

407
    return codeMap;
×
408
  }
409

410
  private Map<String, Object> getSubfieldPositions(SubfieldDefinition subfield) {
UNCOV
411
    Map<String, Object> positionListMap = new LinkedHashMap<>();
×
UNCOV
412
    for (ControlfieldPositionDefinition position : subfield.getPositions()) {
×
UNCOV
413
      Map<String, Object> positionMap = new LinkedHashMap<>();
×
UNCOV
414
      positionMap.put("label", position.getLabel());
×
UNCOV
415
      positionMap.put("start", position.getPositionStart());
×
UNCOV
416
      positionMap.put("end", position.getPositionEnd() - 1);
×
417

UNCOV
418
      if (position.hasCodelist()) {
×
NEW
419
        String codesOrFlags = position.isRepeatableContent() ? "flags" : "codes";
×
UNCOV
420
        if (position.getCodes() != null && !position.getCodes().isEmpty()) {
×
NEW
421
          positionMap.put(codesOrFlags, extractCodes(position.getCodes()));
×
UNCOV
422
        } else if (position.getCodeList() != null) {
×
UNCOV
423
          referencesCodeLists.put(position.getCodeList().getUrl(), position.getCodeList().getCodes());
×
NEW
424
          positionMap.put(codesOrFlags, position.getCodeList().getUrl());
×
UNCOV
425
        } else if (position.getCodeListReference() != null) {
×
UNCOV
426
          String url = String.format("%s#%s", position.getCodeListReference().getDescriptionUrl(), position.getCodeListReference().getPositionStart());
×
427
          referencesCodeLists.put(url, position.getCodeListReference().getCodes());
×
NEW
428
          positionMap.put(codesOrFlags, url);
×
UNCOV
429
        } else {
×
430
          logger.log(Level.WARNING, "{0}${1}/{2}: missing code list!", new Object[]{
×
UNCOV
431
            subfield.getParent().getTag(), subfield.getCode(), position.getPositionStart()});
×
432
        }
433
      } else if (position.getValidator() != null) {
×
UNCOV
434
        if (position.getValidator() instanceof RegexValidator)
×
435
          positionMap.put("pattern", ((RegexValidator)position.getValidator()).getPattern());
×
436
      } else {
UNCOV
437
        logger.log(Level.WARNING, "{0}${1}/{2}: missing code list and validation!", new Object[]{
×
UNCOV
438
          subfield.getParent().getTag(), subfield.getCode(), position.getPositionStart()});
×
439
      }
440
      positionListMap.put(position.formatPositon(), positionMap);
×
441
    }
×
442
    return positionListMap;
×
443
  }
444

445
  private static Map<String, Map<String, Object>> extractCodes(List<EncodedValue> codeList) {
446
    Map<String, Map<String, Object>> codes = new HashMap<>();
×
447
    for (EncodedValue code : codeList) {
×
NEW
448
      addCodeOrRange(codes, code, false);
×
449
    }
×
450
    return codes;
×
451
  }
452

453
  private void extractCompilanceLevel(Map<String, Object> codeMap,
454
                                      CompilanceLevel nationalCompilanceLevel,
455
                                      CompilanceLevel minimalCompilanceLevel) {
UNCOV
456
    Map<String, String> levels = new LinkedHashMap<>();
×
457
    if (nationalCompilanceLevel != null)
×
458
      levels.put("national", nationalCompilanceLevel.getLabel());
×
459

UNCOV
460
    if (minimalCompilanceLevel != null)
×
461
      levels.put("minimal", minimalCompilanceLevel.getLabel());
×
462

UNCOV
463
    if (!levels.isEmpty())
×
464
      codeMap.put("compilance-level", levels);
×
465
  }
×
466

467
  private static Map<String, Object> indicatorToJson(Indicator indicator) {
UNCOV
468
    if (!indicator.exists()) {
×
UNCOV
469
      return null;
×
470
    }
471
    Map<String, Object> value = new LinkedHashMap<>();
×
472
    value.put("label", indicator.getLabel());
×
473

NEW
474
    Map<String, Map<String, Object>> codes = new LinkedHashMap<>();
×
NEW
475
    if (indicator.getCodes() != null) {
×
NEW
476
      for (EncodedValue code : indicator.getCodes()) {
×
NEW
477
        addCodeOrRange(codes, code, false);
×
NEW
478
      }
×
479
    }
UNCOV
480
    if (indicator.getHistoricalCodes() != null) {
×
481
      for (EncodedValue code : indicator.getHistoricalCodes()) {
×
NEW
482
        addCodeOrRange(codes, code, true);
×
483
      }
×
484
    }
NEW
485
    if (codes.size() > 0) { 
×
NEW
486
      value.put("codes", codes);
×
487
    }
488

UNCOV
489
    return value;
×
490
  }
491

492
  private boolean resolveCardinality(Cardinality cardinality) {
493
    return cardinality.getCode().equals("R");
×
494
  }
495

496
  public static void main(String[] args) {
497
    try {
498
      MappingToJson mapping = new MappingToJson(args);
×
499
      mapping.build();
×
500
      System.out.println(mapping.toJson());
×
501
    } catch (ParseException e) {
×
502
      System.err.println("ERROR. " + e.getLocalizedMessage());
×
UNCOV
503
      System.exit(1);
×
504
    }
×
505
  }
×
506
}
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