Skip to content

Commit

Permalink
issue #75: implementing 'disallow in schema' feature
Browse files Browse the repository at this point in the history
  • Loading branch information
pkiraly committed Dec 4, 2020
1 parent 73b4309 commit 9daf340
Show file tree
Hide file tree
Showing 8 changed files with 175 additions and 40 deletions.
28 changes: 16 additions & 12 deletions src/main/java/de/gwdg/metadataqa/marc/MarcSubfield.java
Original file line number Diff line number Diff line change
Expand Up @@ -174,20 +174,24 @@ public boolean validate(MarcVersion marcVersion) {
addError(field.getDefinition().getTag(), SUBFIELD_NULL_CODE, code);
isValid = false;
} else {
if (definition.hasValidator()) {
if (!validateWithValidator())
isValid = false;
} else if (definition.hasContentParser()) {
if (!validateWithParser())
if (definition.isDisallowedIn(marcVersion))
isValid = false;
else {
if (definition.hasValidator()) {
if (!validateWithValidator())
isValid = false;
} else if (definition.hasContentParser()) {
if (!validateWithParser())
isValid = false;
} else if (definition.getCodes() != null && definition.getCode(value) == null) {
String message = value;
if (referencePath != null) {
message += String.format(" (the field is embedded in %s)", referencePath);
}
String path = (referencePath == null ? definition.getPath() : referencePath + "->" + definition.getPath());
addError(path, ValidationErrorType.SUBFIELD_INVALID_VALUE, message);
isValid = false;
} else if (definition.getCodes() != null && definition.getCode(value) == null) {
String message = value;
if (referencePath != null) {
message += String.format(" (the field is embedded in %s)", referencePath);
}
String path = (referencePath == null ? definition.getPath() : referencePath + "->" + definition.getPath());
addError(path, ValidationErrorType.SUBFIELD_INVALID_VALUE, message);
isValid = false;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public class SubfieldDefinition implements Serializable {
private List<FRBRFunction> functions;
private CompilanceLevel nationalCompilanceLevel;
private CompilanceLevel minimalCompilanceLevel;
private List<MarcVersion> disallowedIn;

public String getCodeForIndex() {
if (codeForIndex == null) {
Expand Down Expand Up @@ -292,17 +293,32 @@ public SubfieldDefinition setMinimalCompilanceLevel(CompilanceLevel minimalLevel
return this;
}

public SubfieldDefinition setFrbrFunctions(FRBRFunction... functions) {
this.functions = Arrays.asList(functions);
return this;
}

public SubfieldDefinition disallowIn(MarcVersion... versions) {
this.disallowedIn = Arrays.asList(versions);
return this;
}

public List<MarcVersion> getDisallowedIn() {
return disallowedIn;
}

public boolean isDisallowedIn(MarcVersion marcVersion) {
return disallowedIn != null &&
disallowedIn.contains(marcVersion);
}

@Override
public String toString() {
return "MarcSubfield{" +
"code='" + code + '\'' +
", typeCode='" + cardinalityCode + '\'' +
", label='" + label + '\'' +
'}';
"code='" + code + '\'' +
", typeCode='" + cardinalityCode + '\'' +
", label='" + label + '\'' +
'}';
}

public SubfieldDefinition setFrbrFunctions(FRBRFunction... functions) {
this.functions = Arrays.asList(functions);
return this;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ public ValidatorResponse isValid(MarcSubfield subfield) {

if (StringUtils.isNotBlank(value)) {
Matcher matcher = pattern.matcher(value);
System.err.println(value);
System.err.println(pattern.pattern());
System.err.println(matcher.matches());
if (!matcher.matches()) {
response.addValidationError(
new ValidationError(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ private void initialize() {

ind1 = new Indicator("National Bibliography Issue Number")
.setCodes(
"1", "British National Bibliography or British Catalogue of Music – Interim issue",
"2", "British Catalogue of Music – Annual cumulation"
"0", "British National Bibliography or British Catalogue of Music – Interim issue",
"1", "British Catalogue of Music – Annual cumulation"
)
.setMqTag("source");

Expand All @@ -50,10 +50,11 @@ private void initialize() {
);

getSubfield("a")
.setValidator(new RegexValidator("^\\d\\d0[1-3]$"))
.setValidator(new RegexValidator("^\\d\\d(\\d{2}|0[1-3])$"))
.setMqTag("nationalBibliographyIssueNumber");

getSubfield("p")
.setValidator(new RegexValidator("^\\d\\d(\\d{2}|0[1-3])$"))
.setMqTag("correctionIssueNumber");
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
/**
* This package contains the tags specifics at British Library
*
* The source of the classes is this document:
* The source of the classes is a PDF file shared with the developer by Christina Morris (BL)
*
* Feldbeschreibung der Titeldaten der Deutschen Nationalbibliothek und der
* Zeitschriftendatenbank im Format MARC 21
*
* Version 2.4
* Stand: 16. Oktober 2017
*
* Available at http://www.dnb.de/EN/Standardisierung/Formate/MARC21/marc21_node.html
* BL local fields information.pdf
* October 2014
*/
package de.gwdg.metadataqa.marc.definition.tags.bltags;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import de.gwdg.metadataqa.marc.definition.Cardinality;
import de.gwdg.metadataqa.marc.definition.DataFieldDefinition;
import de.gwdg.metadataqa.marc.definition.Indicator;
import de.gwdg.metadataqa.marc.definition.MarcVersion;
import de.gwdg.metadataqa.marc.definition.general.parser.LinkageParser;
import static de.gwdg.metadataqa.marc.definition.FRBRFunction.*;

Expand Down Expand Up @@ -72,17 +73,20 @@ private void initialize() {
getSubfield("c")
.setBibframeTag("acquisitionTerms")
.setFrbrFunctions(DiscoverySelect, DiscoveryObtain)
.setCompilanceLevels("O");
.setCompilanceLevels("O")
.disallowIn(MarcVersion.BL);

getSubfield("f")
.setBibframeTag("note").setMqTag("formOfIssue")
.setFrbrFunctions(DiscoveryIdentify, DiscoverySelect, DiscoveryObtain, UseManage, UseOperate)
.setCompilanceLevels("O");
.setCompilanceLevels("O")
.disallowIn(MarcVersion.BL);

getSubfield("g")
.setBibframeTag("note").setMqTag("format")
.setFrbrFunctions(DiscoveryIdentify, DiscoverySelect, DiscoveryObtain, UseManage, UseOperate)
.setCompilanceLevels("O");
.setCompilanceLevels("O")
.disallowIn(MarcVersion.BL);

getSubfield("n")
.setBibframeTag("note")
Expand All @@ -97,11 +101,13 @@ private void initialize() {
getSubfield("6")
.setBibframeTag("linkage")
.setFrbrFunctions(ManagementIdentify, ManagementProcess)
.setCompilanceLevels("A");
.setCompilanceLevels("A")
.disallowIn(MarcVersion.BL);

getSubfield("8")
.setMqTag("fieldLink")
.setFrbrFunctions(ManagementIdentify, ManagementProcess)
.setCompilanceLevels("O");
.setCompilanceLevels("O")
.disallowIn(MarcVersion.BL);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package de.gwdg.metadataqa.marc.definition.tags.bltags;

import de.gwdg.metadataqa.marc.DataField;
import de.gwdg.metadataqa.marc.MarcRecord;
import de.gwdg.metadataqa.marc.definition.MarcVersion;
import de.gwdg.metadataqa.marc.definition.tags.tags01x.Tag037;
import org.junit.Test;

import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;

public class Tag037Test {

@Test
public void testDisallowedSubfield_c() {
MarcRecord record = new MarcRecord("test");
DataField field = new DataField(Tag037.getInstance(), " ", " ", "c", "$175.00");
field.setRecord(record);

assertTrue("037$c should be valid in normal case", field.validate(MarcVersion.MARC21));
assertFalse("037$c should be invalid in BL", field.validate(MarcVersion.BL));
}

@Test
public void testDisallowedSubfield_f() {
MarcRecord record = new MarcRecord("test");
DataField field = new DataField(Tag037.getInstance(), " ", " ", "f", "paperbound");
field.setRecord(record);

assertTrue("037$f should be valid in normal case", field.validate(MarcVersion.MARC21));
assertFalse("037$f should be invalid in BL", field.validate(MarcVersion.BL));
}

@Test
public void testDisallowedSubfield_g() {
MarcRecord record = new MarcRecord("test");
DataField field = new DataField(Tag037.getInstance(), " ", " ", "g", "paperbound");
field.setRecord(record);

assertTrue("037$g should be valid in normal case", field.validate(MarcVersion.MARC21));
assertFalse("037$g should be invalid in BL", field.validate(MarcVersion.BL));
}

@Test
public void testDisallowedSubfield_6() {
MarcRecord record = new MarcRecord("test");
DataField field = new DataField(Tag037.getInstance(), " ", " ", "6", "100-01/(N");
field.setRecord(record);

assertTrue("037$6 should be valid in normal case", field.validate(MarcVersion.MARC21));
assertFalse("037$6 should be invalid in BL", field.validate(MarcVersion.BL));
}

@Test
public void testDisallowedSubfield_8() {
MarcRecord record = new MarcRecord("test");
DataField field = new DataField(Tag037.getInstance(), " ", " ", "8", "1.5\\a");
field.setRecord(record);

assertTrue("037$8 should be valid in normal case", field.validate(MarcVersion.MARC21));
assertFalse("037$8 should be invalid in BL", field.validate(MarcVersion.BL));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package de.gwdg.metadataqa.marc.definition.tags.bltags;

import de.gwdg.metadataqa.marc.DataField;
import de.gwdg.metadataqa.marc.MarcRecord;
import de.gwdg.metadataqa.marc.definition.MarcVersion;
import org.junit.Test;

import java.util.regex.Pattern;

import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;

public class Tag039Test {

@Test
public void testRegex() {
assertTrue(Pattern.compile("^\\d\\d(\\d{2}|0[1-3])$").matcher("1785").matches());
}

@Test
public void testFieldDefinition() {
validateField("0", "a", "1785");
validateField("0", "a", "8901");
validateField("1", "a", "8903");
validateField("0", "a", "1754");
validateField("0", "a", "9602");
validateField(new DataField(Tag039.getInstance(), "0", " ", "p", "1627", "a", "1608"));
validateField("0", "a", "8901");
validateField("1", "a", "8903");
}

public void validateField(String ind1, String subfield, String value) {
DataField field = new DataField(Tag039.getInstance(), ind1, " ", subfield, value);

MarcRecord record = new MarcRecord("test");
field.setRecord(record);

assertFalse(
String.format("039$%s=%s should be invalid in normal case", subfield, value),
field.validate(MarcVersion.MARC21));
assertTrue(
String.format("039$%s=%s should be valid in normal case", subfield, value),
field.validate(MarcVersion.BL));
}

public void validateField(DataField field) {
MarcRecord record = new MarcRecord("test");
field.setRecord(record);

assertFalse("039 should be invalid in normal case", field.validate(MarcVersion.MARC21));
assertTrue("039 should be valid in normal case", field.validate(MarcVersion.BL));
}
}

0 comments on commit 9daf340

Please sign in to comment.