package org.jabref.model.entry.identifier;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ISSN {
private static final Pattern ISSN_PATTERN = Pattern.compile("^\\d{4}-\\d{3}[\\dxX]$");
private static final Pattern ISSN_PATTERN_NODASH = Pattern.compile("^(\\d{4})(\\d{3}[\\dxX])$");
private final String issnString;
public ISSN(String issnString) {
this.issnString = Objects.requireNonNull(issnString).trim();
}
public boolean isValidFormat() {
Matcher issnMatcher = ISSN_PATTERN.matcher(issnString);
return (issnMatcher.matches());
}
public boolean isCanBeCleaned() {
Matcher issnNoDashMatcher = ISSN_PATTERN_NODASH.matcher(issnString);
return (issnNoDashMatcher.matches());
}
public String getCleanedISSN() {
Matcher issnNoDashMatcher = ISSN_PATTERN_NODASH.matcher(issnString);
if (issnNoDashMatcher.find()) {
return issnNoDashMatcher.replaceFirst("$1-$2");
}
return issnString;
}
public boolean isValidChecksum() {
// Check that the control digit is correct, see e.g. https://en.wikipedia.org/wiki/International_Standard_Serial_Number
int sum = 0;
for (int pos = 0; pos <= 7; pos++) {
char c = issnString.charAt(pos);
if (pos != 4) {
sum += (c - '0') * ((8 - pos) + (pos > 4 ? 1 : 0));
}
}
char control = issnString.charAt(8);
if ((control == 'x') || (control == 'X')) {
control = '9' + 1;
}
return (((((sum % 11) + control) - '0') == 11) || ((sum % 11) == 0));
}
}