From 195abf74de8c6989febdbaba57cdd780fc108b99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=CC=88rg=20Prante?= Date: Thu, 16 Nov 2017 09:29:40 +0100 Subject: [PATCH] getField() and getSubfield() methods --- gradle.properties | 2 +- src/main/java/org/xbib/marc/Marc.java | 4 ++ src/main/java/org/xbib/marc/MarcField.java | 55 ++++++++++++++----- src/main/java/org/xbib/marc/MarcRecord.java | 16 +++++- .../field/MarcFieldTransformer.java | 2 +- .../field/MarcFieldTransformers.java | 2 +- .../transformer/MarcFieldTransformerTest.java | 4 +- 7 files changed, 65 insertions(+), 20 deletions(-) diff --git a/gradle.properties b/gradle.properties index 51f2cd1..beb39f1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ group = org.xbib name = marc -version = 1.0.15 +version = 1.0.16 xbib-content.version = 1.0.7 xbib-bibliographic-character-sets.version = 1.0.0 diff --git a/src/main/java/org/xbib/marc/Marc.java b/src/main/java/org/xbib/marc/Marc.java index ea6f9c0..96dab1d 100644 --- a/src/main/java/org/xbib/marc/Marc.java +++ b/src/main/java/org/xbib/marc/Marc.java @@ -1057,6 +1057,10 @@ public final class Marc { return this; } + public RecordLabel getRecordLabel() { + return recordLabel; + } + public Marc.Builder addField(MarcField marcField) { boolean keymatch = keyPattern == null || marcField.matchKey(keyPattern) != null; boolean valuematch = valuePattern == null || marcField.matchValue(valuePattern) != null; diff --git a/src/main/java/org/xbib/marc/MarcField.java b/src/main/java/org/xbib/marc/MarcField.java index 8778b92..58bd98e 100644 --- a/src/main/java/org/xbib/marc/MarcField.java +++ b/src/main/java/org/xbib/marc/MarcField.java @@ -22,13 +22,16 @@ import org.xbib.marc.label.RecordLabel; import java.util.LinkedList; import java.util.ListIterator; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * A MARC field. */ public class MarcField implements Comparable { - public static final MarcField EMPTY = builder().build(); + private static final MarcField EMPTY = builder().build(); + + private static final Subfield EMPTY_SUBFIELD = new Subfield(null, null); public static final String KEY_DELIMITER = "$"; @@ -73,6 +76,14 @@ public class MarcField implements Comparable { return new Builder(); } + public static MarcField emptyMarcField() { + return EMPTY; + } + + public static Subfield emptySubfield() { + return EMPTY_SUBFIELD; + } + /** * Return the MARC field tag. * @return the tag @@ -113,12 +124,28 @@ public class MarcField implements Comparable { return subfields; } + /** + * Return all subfields of a given subfield ID. Multiple occurences may occur. + * @param subfieldId subfield ID + * @return list of subfields + */ + public LinkedList getSubfield(String subfieldId) { + return subfields.stream() + .filter(subfield -> subfield.getId().equals(subfieldId)) + .collect(Collectors.toCollection(LinkedList::new)); + } + /** * Return first subfield or null. Avoids NoSuchElementException of java.util.LinkedList. * @return first subfield or null */ public Subfield getFirstSubfield() { - return subfields.isEmpty() ? Subfield.EMPTY_SUBFIELD : subfields.getFirst(); + return subfields.isEmpty() ? MarcField.emptySubfield() : subfields.getFirst(); + } + + public String getFirstSubfieldValue(String subfieldId) { + LinkedList list = getSubfield(subfieldId); + return list.isEmpty() ? null : list.getFirst().getValue(); } /** @@ -126,7 +153,12 @@ public class MarcField implements Comparable { * @return last subfield or null */ public Subfield getLastSubfield() { - return subfields.isEmpty() ? Subfield.EMPTY_SUBFIELD : subfields.getLast(); + return subfields.isEmpty() ? MarcField.emptySubfield() : subfields.getLast(); + } + + public String getLastSubfieldValue(String subfieldId) { + LinkedList list = getSubfield(subfieldId); + return list.isEmpty() ? null : list.getLast().getValue(); } /** @@ -415,6 +447,12 @@ public class MarcField implements Comparable { return this; } + public Builder subfield(Subfield subfield) { + subfields.add(subfield); + subfieldIds.add(subfield.getId()); + return this; + } + /** * Set subfield with subfield ID and value. * @param subfieldId the subfield ID @@ -472,8 +510,7 @@ public class MarcField implements Comparable { public Builder value(RecordLabel recordLabel, String value) { if (value.length() > 0) { int len = recordLabel.getSubfieldIdentifierLength() - 1; /* minus length of US separator char */ - boolean createSubfields = len > 0 && value.length() > len; - if (createSubfields) { + if (!isControl() && len > 0 && value.length() > len) { String id = value.substring(0, len); String content = value.substring(len); subfield(id, content); @@ -525,12 +562,6 @@ public class MarcField implements Comparable { indicator(raw.substring(3, pos)); value(format, type, recordLabel, raw.substring(pos)); } - /*int subfieldidlen = label.getSubfieldIdentifierLength(); - if (raw.length() >= pos + subfieldidlen) { - String subfieldId = raw.substring(pos, pos + subfieldidlen); - this.subfields.add(new Subfield(subfieldId, raw.substring(pos + subfieldidlen))); - subfieldIds.add(subfieldId); - }*/ } return this; } @@ -610,8 +641,6 @@ public class MarcField implements Comparable { */ public static class Subfield { - static final Subfield EMPTY_SUBFIELD = new Subfield(null, null); - private final String id; private final String value; diff --git a/src/main/java/org/xbib/marc/MarcRecord.java b/src/main/java/org/xbib/marc/MarcRecord.java index 0ea1761..f1953a0 100644 --- a/src/main/java/org/xbib/marc/MarcRecord.java +++ b/src/main/java/org/xbib/marc/MarcRecord.java @@ -110,6 +110,16 @@ public class MarcRecord extends LinkedHashMap { return marcFields; } + /** + * Return the MARC fields of this record with a given tag. + * + * @return the MARC field list matching the given tag. + */ + public List getFields(String tag) { + return marcFields.stream().filter(marcField -> marcField.getTag().equals(tag)) + .collect(Collectors.toList()); + } + /** * Return a list of MARC fields of this record where key pattern matches were found. * @@ -117,8 +127,10 @@ public class MarcRecord extends LinkedHashMap { * @return a list of MARC fields */ public List filterKey(Pattern pattern) { - return marcFields.stream().map(field -> - field.matchKey(pattern)).filter(Objects::nonNull).collect(Collectors.toList()); + return marcFields.stream() + .map(field -> field.matchKey(pattern)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); } /** diff --git a/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformer.java b/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformer.java index 9e001b3..f4d0cc1 100644 --- a/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformer.java +++ b/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformer.java @@ -316,7 +316,7 @@ public class MarcFieldTransformer extends LinkedHashMap { } public Builder drop(MarcField a) { - map.put(getTransformKey(a), MarcField.EMPTY); + map.put(getTransformKey(a), MarcField.emptyMarcField()); return this; } diff --git a/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformers.java b/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformers.java index 5c1a97a..3d33275 100644 --- a/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformers.java +++ b/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformers.java @@ -40,7 +40,7 @@ public class MarcFieldTransformers extends LinkedList { if (key != null) { MarcField transformedMarcField = marcFieldTransformer. transform(op, marcField, key, lastBuilt); - if (!transformedMarcField.equals(MarcField.EMPTY)) { + if (!transformedMarcField.equals(MarcField.emptyMarcField())) { if (op == MarcFieldTransformer.Operator.TAIL && list.size() > 0) { list.removeLast(); // tail operation means to nullify previous result } diff --git a/src/test/java/org/xbib/marc/transformer/MarcFieldTransformerTest.java b/src/test/java/org/xbib/marc/transformer/MarcFieldTransformerTest.java index c8da53f..2522d1f 100644 --- a/src/test/java/org/xbib/marc/transformer/MarcFieldTransformerTest.java +++ b/src/test/java/org/xbib/marc/transformer/MarcFieldTransformerTest.java @@ -115,7 +115,7 @@ public class MarcFieldTransformerTest { .build(); MarcField a = MarcField.builder().tag("001").subfield("a", "Hello").subfield("b", "World").build(); MarcField b = marcFieldTransformer.transform(a); - assertEquals(MarcField.EMPTY, b); + assertEquals(MarcField.emptyMarcField(), b); } @Test @@ -126,7 +126,7 @@ public class MarcFieldTransformerTest { .build(); MarcField a = MarcField.builder().tag("001").subfield("a", "Hello").subfield("b", "World").build(); MarcField b = marcFieldTransformer.transform(a); - assertEquals(MarcField.EMPTY, b); + assertEquals(MarcField.emptyMarcField(), b); } @Test