fix NPE in XML writing, restore MAB hack for subfield 'a' in control field
This commit is contained in:
parent
e99f75c473
commit
52b4462332
7 changed files with 42 additions and 16 deletions
|
@ -1,5 +1,5 @@
|
|||
group = org.xbib
|
||||
name = marc
|
||||
version = 2.9.11
|
||||
version = 2.9.13
|
||||
|
||||
org.gradle.warning.mode = ALL
|
||||
|
|
|
@ -714,6 +714,16 @@ public class MarcField implements Comparable<MarcField> {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to create a subfield.
|
||||
* @param id the subfield ID
|
||||
* @param value the subfeild value
|
||||
* @return the subfield
|
||||
*/
|
||||
public static Subfield subfield(String id, String value) {
|
||||
return new Subfield(id, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* MARC subfield. A subfield consists of an ID and a value.
|
||||
*/
|
||||
|
|
|
@ -159,6 +159,12 @@ public class MarcRecord implements Map<String, Object> {
|
|||
return recordLabel;
|
||||
}
|
||||
|
||||
public void filterFields(Predicate<? super MarcField> predicate) {
|
||||
if (marcFields != null) {
|
||||
marcFields = marcFields.stream().filter(predicate).toList();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the MARC fields of this record.
|
||||
*
|
||||
|
@ -376,7 +382,7 @@ public class MarcRecord implements Map<String, Object> {
|
|||
this.delegate = createMapFromMarcFields(Comparator.naturalOrder());
|
||||
}
|
||||
|
||||
public void rebuildFields(Comparator<MarcField> comparator) {
|
||||
public void sortFields(Comparator<MarcField> comparator) {
|
||||
this.marcFields.sort(comparator);
|
||||
}
|
||||
|
||||
|
|
|
@ -346,21 +346,22 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
|
|||
return;
|
||||
}
|
||||
if (field.isControl()) {
|
||||
Iterator<Attribute> attrs =
|
||||
Collections.singletonList(eventFactory.createAttribute(TAG_ATTRIBUTE,
|
||||
transform(field.getTag()))).iterator();
|
||||
xmlEventConsumer.add(eventFactory.createStartElement(getControlfieldElement(), attrs, namespaces));
|
||||
String value = field.getValue();
|
||||
if (value != null && !value.isEmpty()) {
|
||||
xmlEventConsumer.add(eventFactory.createCharacters(transform(value)));
|
||||
} else {
|
||||
if (value == null || value.isEmpty()) {
|
||||
// the control field is disguised as a data field, try lookup value in first subfield of " "
|
||||
value = field.getFirstSubfieldValue(" ");
|
||||
// still no value? Then it is some exotic like MAB with subfield "a"?
|
||||
if (value == null || value.isEmpty()) {
|
||||
value = field.getFirstSubfieldValue("a");
|
||||
}
|
||||
}
|
||||
if (value != null && !value.isEmpty()) {
|
||||
Iterator<Attribute> attrs = Collections.singletonList(eventFactory.createAttribute(TAG_ATTRIBUTE,
|
||||
transform(field.getTag()))).iterator();
|
||||
xmlEventConsumer.add(eventFactory.createStartElement(getControlfieldElement(), attrs, namespaces));
|
||||
xmlEventConsumer.add(eventFactory.createCharacters(transform(value)));
|
||||
}
|
||||
}
|
||||
xmlEventConsumer.add(eventFactory.createEndElement(getControlfieldElement(), namespaces));
|
||||
}
|
||||
} else if (!field.isEmpty()) {
|
||||
String tag = field.getTag();
|
||||
String indicator = field.getIndicator();
|
||||
|
@ -372,6 +373,12 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
|
|||
attrs.add(eventFactory.createAttribute(IND_ATTRIBUTE + "2", transform(ind2)));
|
||||
xmlEventConsumer.add(eventFactory.createStartElement(getDatafieldElement(), attrs.iterator(), namespaces));
|
||||
for (MarcField.Subfield subfield : field.getSubfields()) {
|
||||
String value = subfield.getValue();
|
||||
// we skip null values because XML event consumer will fail on length() with NPE.
|
||||
// we do not skip empty values because of subfield ID transport in MAB or UNIMARC.
|
||||
if (value == null) {
|
||||
continue;
|
||||
}
|
||||
String code = subfield.getId();
|
||||
// From https://www.loc.gov/standards/iso25577/ISO_DIS_25577_2(E)070727.doc
|
||||
// "There is one restriction. A special mode (identifier length = 0) of ISO 2709 operates with
|
||||
|
@ -385,7 +392,7 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
|
|||
subfieldattrs.add(eventFactory.createAttribute(CODE_ATTRIBUTE, transform(code)));
|
||||
xmlEventConsumer.add(eventFactory.createStartElement(getSubfieldElement(),
|
||||
subfieldattrs.iterator(), namespaces));
|
||||
xmlEventConsumer.add(eventFactory.createCharacters(transform(subfield.getValue())));
|
||||
xmlEventConsumer.add(eventFactory.createCharacters(transform(value)));
|
||||
xmlEventConsumer.add(eventFactory.createEndElement(getSubfieldElement(), namespaces));
|
||||
}
|
||||
String value = field.getValue();
|
||||
|
|
|
@ -26,6 +26,9 @@ import java.io.ByteArrayOutputStream;
|
|||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.xbib.marc.Marc;
|
||||
import org.xbib.marc.MarcField;
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
<datafield ind2=" " ind1=" " tag="FMT">
|
||||
<subfield code=" ">MH</subfield>
|
||||
</datafield>
|
||||
<controlfield tag="001"></controlfield>
|
||||
<controlfield tag="002"></controlfield>
|
||||
<controlfield tag="001">HT004330420</controlfield>
|
||||
<controlfield tag="002">19921110</controlfield>
|
||||
<datafield ind2=" " ind1=" " tag="030">
|
||||
<subfield code=" ">a|1uc||||||17</subfield>
|
||||
</datafield>
|
||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue