Skip to content

Commit

Permalink
Adding XML serialization for PICA #232
Browse files Browse the repository at this point in the history
  • Loading branch information
pkiraly committed Feb 24, 2023
1 parent 2a69088 commit 4115633
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -855,7 +855,6 @@ public List<DataField> getSubjects() {
default:
tags = MARC21_SUBJECT_TAGS; break;
}
logger.info("tags: " + tags);
for (String tag : tags) {
List<DataField> fields = getDatafield(tag);
if (fields != null && !fields.isEmpty())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package de.gwdg.metadataqa.marc.utils.pica;

import org.marc4j.marc.Subfield;
import org.marc4j.marc.impl.DataFieldImpl;

public class PicaDataField extends DataFieldImpl {

private String occurrence;

/**
* Creates a new <code>DataField</code> and sets the tag name and the first and second indicator.
*
* @param tag The tag name
*/
public PicaDataField(String tag) {
super(tag, ' ', ' ');
}

public PicaDataField(String tag, String occurrence) {
this(tag);
this.occurrence = occurrence;
}

public String getOccurrence() {
return occurrence;
}

public void setOccurrence(String occurrence) {
this.occurrence = occurrence;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(getTag());
if (occurrence != null)
sb.append("/" + getOccurrence());
if (!getSubfields().isEmpty())
sb.append(' ');
// sb.append(getIndicator1());
// sb.append(getIndicator2());

for (final Subfield sf : getSubfields()) {
sb.append(sf.toString());
}
return sb.toString();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package de.gwdg.metadataqa.marc.utils.pica.xml;

import de.gwdg.metadataqa.marc.utils.pica.PicaLine;
import de.gwdg.metadataqa.marc.utils.pica.PicaSubfield;
import de.gwdg.metadataqa.marc.utils.pica.PicaDataField;
import org.marc4j.MarcError;
import org.marc4j.MarcException;
import org.marc4j.RecordStack;
Expand All @@ -12,8 +11,6 @@
import org.marc4j.marc.Record;
import org.marc4j.marc.Subfield;
import org.marc4j.marc.impl.ControlFieldImpl;
import org.marc4j.marc.impl.DataFieldImpl;
import org.marc4j.marc.impl.SubfieldImpl;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
Expand All @@ -36,7 +33,7 @@ public class PicaXmlHandler implements ContentHandler {

private ControlField controlField;

private DataField dataField;
private PicaDataField dataField;

private String tag;

Expand Down Expand Up @@ -169,6 +166,10 @@ record = factory.newRecord();
sb = new StringBuffer();
break;
case DATAFIELD_ID:
for (int i = 0; i < atts.getLength(); i++) {
if (!atts.getLocalName(i).equals(TAG_ATTR))
System.err.println("unhandled attr: " + atts.getLocalName(i));
}
tag = atts.getValue(TAG_ATTR);

if (tag == null) {
Expand All @@ -179,7 +180,12 @@ record = factory.newRecord();
}
break;
}
dataField = factory.newDataField(tag, ' ', ' ');
dataField = new PicaDataField(tag);
String occurrence = atts.getValue("occurrence");
if (occurrence != null) {
System.err.println(String.format("occurrence in %s: %s", tag, occurrence));
dataField.setOccurrence(occurrence);
}
break;

case SUBFIELD_ID:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package de.gwdg.metadataqa.marc.utils.pica;

import org.junit.Test;
import org.marc4j.marc.impl.SubfieldImpl;

import static org.junit.Assert.*;

public class PicaDataFieldTest {

@Test
public void constructor_withTag() {
PicaDataField dataField = new PicaDataField("029F");
assertEquals("029F", dataField.getTag());
assertEquals(null, dataField.getOccurrence());
assertEquals("029F", dataField.toString());
}

@Test
public void constructor_withTagAndOccurence() {
PicaDataField dataField = new PicaDataField("029F", "01");
assertEquals("029F", dataField.getTag());
assertEquals("01", dataField.getOccurrence());
assertEquals("029F/01", dataField.toString());
}

@Test
public void addSubfields() {
PicaDataField dataField = new PicaDataField("029F", "01");
dataField.addSubfield(new SubfieldImpl('a', "something"));
assertEquals("029F", dataField.getTag());
assertEquals("01", dataField.getOccurrence());
assertEquals("029F/01 $asomething", dataField.toString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,15 @@
import de.gwdg.metadataqa.marc.cli.CliTestUtils;
import de.gwdg.metadataqa.marc.dao.record.BibliographicRecord;
import de.gwdg.metadataqa.marc.definition.MarcFormat;
import de.gwdg.metadataqa.marc.definition.MarcVersion;
import de.gwdg.metadataqa.marc.model.SolrFieldType;
import de.gwdg.metadataqa.marc.utils.QAMarcReaderFactory;
import org.junit.Test;
import org.marc4j.MarcReader;
import org.marc4j.marc.DataField;
import org.marc4j.marc.Record;

import java.util.List;
import java.util.Map;

import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

public class PicaXmlReaderTest {

Expand All @@ -31,6 +29,9 @@ public void xml() {
assertEquals("PicaXmlReader", reader.getClass().getSimpleName());
assertTrue(reader.hasNext());
Record record = reader.next();
assertEquals("org.marc4j.marc.impl.RecordImpl", record.getClass().getCanonicalName());
assertEquals("de.gwdg.metadataqa.marc.utils.pica.PicaDataField", record.getDataFields().get(0).getClass().getCanonicalName());
assertEquals("029F/01 $a@CDA Vrouwenberaad", record.getVariableField("029F").toString());
BibliographicRecord marcRecord = MarcFactory.createPicaFromMarc4j(record, schema);
// Map<String, List<String>> map = marcRecord.getKeyValuePairs(SolrFieldType.HUMAN, true, MarcVersion.MARC21);

Expand Down

0 comments on commit 4115633

Please sign in to comment.