• 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

85.0
/src/main/java/de/gwdg/metadataqa/marc/utils/alephseq/MarclineLine.java
1
package de.gwdg.metadataqa.marc.utils.alephseq;
2

3
import de.gwdg.metadataqa.marc.dao.DataField;
4
import org.apache.commons.lang3.StringUtils;
5

6
import java.util.ArrayList;
7
import java.util.List;
8
import java.util.logging.Logger;
9
import java.util.regex.Pattern;
10

11
public class MarclineLine {
12
  private static final Logger logger = Logger.getLogger(MarclineLine.class.getCanonicalName());
1✔
13

14
  private static final String LDR = "LDR";
15
  private static final Pattern numericTag = Pattern.compile("^\\d\\d\\d$");
1✔
16
  private static final Pattern controlField = Pattern.compile("^00\\d$");
1✔
17
  public static final String SEPARATOR = "\\$";
18
  private int lineNumber = 0;
1✔
19

20
  private String recordID;
21
  private String tag;
22
  private String ind1;
23
  private String ind2;
24
  private String content;
25
  private boolean valid = true;
1✔
26
  private boolean isLeader = false;
1✔
27

28
  public MarclineLine() {
×
29
  }
×
30

31
  public MarclineLine(String raw) {
1✔
32
    parse(raw);
1✔
33
  }
1✔
34

35
  public MarclineLine(String raw, int lineNumber) {
1✔
36
    this.lineNumber = lineNumber;
1✔
37
    parse(raw);
1✔
38
  }
1✔
39

40
  public boolean isLeader() {
41
    return isLeader;
1✔
42
  }
43

44
  public boolean isNumericTag() {
45
    if (tag == null)
1✔
UNCOV
46
      return false;
×
47

48
    return numericTag.matcher(tag).matches();
1✔
49
  }
50

51
  public boolean isControlField() {
52
    if (tag == null)
1✔
UNCOV
53
      return false;
×
54

55
    return controlField.matcher(tag).matches();
1✔
56
  }
57

58
  public boolean isValidTag() {
59
    return (isValid() && (isLeader() || isNumericTag()));
1✔
60
  }
61

62
  public String getRecordID() {
63
    return recordID;
1✔
64
  }
65

66
  public String getTag() {
67
    return tag;
1✔
68
  }
69

70
  public String getInd1() {
71
    return ind1;
1✔
72
  }
73

74
  public String getInd2() {
75
    return ind2;
1✔
76
  }
77

78
  public String getContent() {
79
    if (content == null)
1✔
UNCOV
80
      return content;
×
81

82
    if (isLeader() || isControlField())
1✔
83
      return content.replace("^", " ");
1✔
84
    else
85
      return content.replace("$$", "$");
1✔
86
  }
87

88
  public String getRawContent() {
UNCOV
89
    return content;
×
90
  }
91

92
  private void parse(String raw) {
93
    // Check if the tag is longer than 3 characters
94
    if (raw.charAt(3) != ' ') {
1✔
95
      isLeader = true;
1✔
96
      content = raw.replaceAll("^(LEADER|LDR) ", "");
1✔
97
      return;
1✔
98
    }
99

100
    // If it's not longer than 3 characters, it's either an LDR field a regular data/control field with a 3-digit tag
101
    tag = raw.substring(0, 3);
1✔
102
    if (tag.equals(LDR)) {
1✔
103
      isLeader = true;
1✔
104
      content = raw.replaceAll("^LDR ", "");
1✔
105
      tag = null;
1✔
106
      return;
1✔
107
    }
108

109
    // If it's not a control field, then it's a data field
110
    if (!isControlField())
1✔
111
    {
112
      ind1 = raw.substring(4, 5);
1✔
113
      ind2 = raw.substring(5, 6);
1✔
114
      content = raw.substring(6);
1✔
115
      return;
1✔
116
    }
117

118
    content = raw.substring(4);
1✔
119
  }
1✔
120

121
  public List<String[]> parseSubfields() {
122
    List<String[]> subfields = new ArrayList<>();
1✔
123
    String[] segments = content.split(SEPARATOR);
1✔
124
    for (String segment : segments) {
1✔
125
      if (StringUtils.isNotBlank(segment))
1✔
126
        subfields.add(new String[]{segment.substring(0, 1), segment.substring(1)});
1✔
127
    }
128
    return subfields;
1✔
129
  }
130

131
  public boolean isValid() {
132
    return valid;
1✔
133
  }
134

135
  @Override
136
  public String toString() {
NEW
137
    return "MarclineLine{" +
×
138
      "recordID='" + recordID + '\'' +
139
      ", tag='" + tag + '\'' +
140
      ", ind1='" + ind1 + '\'' +
141
      ", ind2='" + ind2 + '\'' +
UNCOV
142
      ", content='" + getContent() + '\'' +
×
143
      '}';
144
  }
145

146
  public List<String[]> getSubfields() {
UNCOV
147
    return DataField.parseSubfields(getContent());
×
148
  }
149
}
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