From 28b9a2d86dc9500d503acba4d9f46dd9b4c00808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Fri, 21 Oct 2022 17:07:08 +0200 Subject: [PATCH] add stable field order in record building, use delegate map in MarcRecord, more filters for field processing in MarcRecord --- gradle.properties | 2 +- .../marc/LightweightMarcRecordAdapter.java | 5 +- src/main/java/org/xbib/marc/Marc.java | 17 +- src/main/java/org/xbib/marc/MarcField.java | 12 +- .../java/org/xbib/marc/MarcFieldHandler.java | 8 + src/main/java/org/xbib/marc/MarcRecord.java | 193 +++++++++++++----- .../java/org/xbib/marc/MarcRecordAdapter.java | 11 +- .../java/org/xbib/marc/MarcRecordHandler.java | 7 + .../org/xbib/marc/MarcRecordListener.java | 2 +- .../mab/xml/MabXMLContentHandler.java | 4 +- .../org/xbib/marc/label/TypeOfControl.java | 1 + .../org/xbib/marc/xml/MarcContentHandler.java | 15 +- .../java/org/xbib/marc/MarcRecordTest.java | 43 ++-- .../xbib/marc/json/MarcJsonWriterTest.java | 10 +- .../org/xbib/marc/json/HT016424175.xml.json | 2 +- .../json/chabon-loc.mrc.record.adapter.json | 1 + .../xbib/marc/json/chabon-loc.mrc.record.json | 1 + .../marc/json/chabon.mrc.record.adapter.json | 1 + .../org/xbib/marc/json/chabon.mrc.record.json | 1 + .../json/summerland.mrc.record.adapter.json | 1 + .../xbib/marc/json/summerland.mrc.record.json | 1 + 21 files changed, 249 insertions(+), 89 deletions(-) create mode 100644 src/main/java/org/xbib/marc/MarcFieldHandler.java create mode 100644 src/main/java/org/xbib/marc/MarcRecordHandler.java create mode 100644 src/test/resources/org/xbib/marc/json/chabon-loc.mrc.record.adapter.json create mode 100644 src/test/resources/org/xbib/marc/json/chabon-loc.mrc.record.json create mode 100644 src/test/resources/org/xbib/marc/json/chabon.mrc.record.adapter.json create mode 100644 src/test/resources/org/xbib/marc/json/chabon.mrc.record.json create mode 100644 src/test/resources/org/xbib/marc/json/summerland.mrc.record.adapter.json create mode 100644 src/test/resources/org/xbib/marc/json/summerland.mrc.record.json diff --git a/gradle.properties b/gradle.properties index b333f3f..6e1b3d4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group = org.xbib name = marc -version = 2.8.0 +version = 2.9.0 org.gradle.warning.mode = ALL diff --git a/src/main/java/org/xbib/marc/LightweightMarcRecordAdapter.java b/src/main/java/org/xbib/marc/LightweightMarcRecordAdapter.java index fe463df..e060d0f 100644 --- a/src/main/java/org/xbib/marc/LightweightMarcRecordAdapter.java +++ b/src/main/java/org/xbib/marc/LightweightMarcRecordAdapter.java @@ -15,13 +15,10 @@ */ package org.xbib.marc; -/** - * - */ public class LightweightMarcRecordAdapter extends MarcRecordAdapter { public LightweightMarcRecordAdapter(MarcRecordListener marcRecordListener) { - super(marcRecordListener); + super(marcRecordListener, false); this.builder = Marc.builder().lightweightRecord(); } diff --git a/src/main/java/org/xbib/marc/Marc.java b/src/main/java/org/xbib/marc/Marc.java index 80b110c..a97a426 100644 --- a/src/main/java/org/xbib/marc/Marc.java +++ b/src/main/java/org/xbib/marc/Marc.java @@ -662,7 +662,9 @@ public final class Marc { private MarcGenerator marcGenerator; - private boolean islightweightRecord; + private boolean isLightweightRecord; + + private boolean isStableFieldOrder; private Pattern keyPattern; @@ -1116,8 +1118,8 @@ public final class Marc { } public Marc.Builder addField(MarcField marcField) { - boolean keymatch = keyPattern == null || marcField.matchKey(keyPattern) != null; - boolean valuematch = valuePattern == null || marcField.matchValue(valuePattern) != null; + boolean keymatch = keyPattern == null || marcField.matchesKey(keyPattern); + boolean valuematch = valuePattern == null || marcField.matchesValue(valuePattern); if (keymatch && valuematch) { this.marcFieldList.add(marcField); } @@ -1125,7 +1127,12 @@ public final class Marc { } public Marc.Builder lightweightRecord() { - this.islightweightRecord = true; + this.isLightweightRecord = true; + return this; + } + + public Marc.Builder stableFieldOrder() { + this.isStableFieldOrder = true; return this; } @@ -1134,7 +1141,7 @@ public final class Marc { * @return MARC record */ public MarcRecord buildRecord() { - return new MarcRecord(format, type, recordLabel, marcFieldList, islightweightRecord); + return new MarcRecord(format, type, recordLabel, marcFieldList, isLightweightRecord, isStableFieldOrder); } /** diff --git a/src/main/java/org/xbib/marc/MarcField.java b/src/main/java/org/xbib/marc/MarcField.java index 2470b27..1f542f2 100644 --- a/src/main/java/org/xbib/marc/MarcField.java +++ b/src/main/java/org/xbib/marc/MarcField.java @@ -199,8 +199,8 @@ public class MarcField implements Comparable { * @param pattern the pattern * @return this MARC field if pattern macthes, otherwise null */ - public MarcField matchKey(Pattern pattern) { - return pattern.matcher(toTagIndicatorKey()).matches() ? this : null; + public boolean matchesKey(Pattern pattern) { + return pattern.matcher(toTagIndicatorKey()).matches(); } /** @@ -208,16 +208,16 @@ public class MarcField implements Comparable { * @param pattern the pattern to match * @return thhis MARC field if pattern matches, or null if not */ - public MarcField matchValue(Pattern pattern) { + public boolean matchesValue(Pattern pattern) { if (builder.value != null && pattern.matcher(builder.value).matches()) { - return this; + return true; } for (Subfield subfield : builder.subfields) { if (pattern.matcher(subfield.getValue()).matches()) { - return this; + return true; } } - return null; + return false; } /** diff --git a/src/main/java/org/xbib/marc/MarcFieldHandler.java b/src/main/java/org/xbib/marc/MarcFieldHandler.java new file mode 100644 index 0000000..b5924dc --- /dev/null +++ b/src/main/java/org/xbib/marc/MarcFieldHandler.java @@ -0,0 +1,8 @@ +package org.xbib.marc; + +@FunctionalInterface +public interface MarcFieldHandler { + + void field(MarcField marcField); + +} diff --git a/src/main/java/org/xbib/marc/MarcRecord.java b/src/main/java/org/xbib/marc/MarcRecord.java index 04cb983..e827657 100644 --- a/src/main/java/org/xbib/marc/MarcRecord.java +++ b/src/main/java/org/xbib/marc/MarcRecord.java @@ -26,19 +26,21 @@ import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; +import java.util.Set; +import java.util.TreeMap; import java.util.function.BiConsumer; +import java.util.function.Predicate; import java.util.regex.Pattern; -import java.util.stream.Collectors; /** * A MARC record. This is an extended MARC record augmented with MarcXchange information. */ -@SuppressWarnings("serial") -public class MarcRecord extends LinkedHashMap { +public class MarcRecord implements Map { private static final MarcRecord EMPTY_RECORD = Marc.builder().buildRecord(); + private final Map delegate; + private String format; private String type; @@ -47,8 +49,8 @@ public class MarcRecord extends LinkedHashMap { private final transient List marcFields; - private MarcRecord(Map map) { - super(map); + private MarcRecord(Map delegate) { + this.delegate = delegate; this.marcFields = new LinkedList<>(); } @@ -65,8 +67,8 @@ public class MarcRecord extends LinkedHashMap { String type, RecordLabel recordLabel, List marcFields, - boolean lightweight) { - super(); + boolean lightweight, + boolean stable) { this.format = format; this.type = type; this.recordLabel = recordLabel; @@ -74,9 +76,7 @@ public class MarcRecord extends LinkedHashMap { throw new NullPointerException("record label must not be null"); } this.marcFields = marcFields; - if (!lightweight) { - createMap(); - } + this.delegate = lightweight ? Map.of() : createMap(stable); } /** @@ -97,9 +97,8 @@ public class MarcRecord extends LinkedHashMap { String leaderTag, RecordLabel recordLabel) { MarcRecord marcRecord = new MarcRecord(map); - marcRecord.parseMap(map, ".", "", (key, value) -> { - marcRecord.marcFields.add(MarcField.builder().key(key, "\\.", value.toString()).build()); - }); + marcRecord.parseMap(map, ".", "", (key, value) -> + marcRecord.marcFields.add(MarcField.builder().key(key, "\\.", value.toString()).build())); if (map.containsKey(formatTag)) { marcRecord.format = map.get(formatTag).toString(); } @@ -151,38 +150,134 @@ public class MarcRecord extends LinkedHashMap { } /** - * Return the MARC fields of this record with a given tag. + * Filter the MARC fields of this record with a given tag. * * @param tag the MARC 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()); + public void filter(String tag, MarcFieldHandler handler) { + filter(marcField -> marcField.getTag().equals(tag), handler); } - /** - * Return a list of MARC fields of this record where key pattern matches were found. - * - * @param pattern the pattern - * @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()); + public void filter(String tag, String indicator, MarcFieldHandler handler) { + filter(marcField -> marcField.getTag().equals(tag) && marcField.getIndicator().equals(indicator), handler); } - /** - * Return a list of MARC fields of this record where pattern matches were found. - * - * @param pattern the pattern - * @return a list of MARC fields - */ - public List filterValue(Pattern pattern) { - return marcFields.stream().map(field -> - field.matchValue(pattern)).filter(Objects::nonNull).collect(Collectors.toList()); + public void filter(String tag, String indicator, String subfieldId, MarcFieldHandler handler) { + filter(marcField -> marcField.getTag().equals(tag) && + marcField.getIndicator().equals(indicator) && + marcField.getSubfieldIds().contains(subfieldId), handler); + } + + public void filter(Pattern pattern, MarcFieldHandler handler) { + filter(field -> field.matchesKey(pattern), handler); + } + + public void filter(Predicate predicate, MarcFieldHandler handler) { + marcFields.stream().filter(predicate).forEach(handler::field); + } + + public void filterFirst(Predicate predicate, MarcFieldHandler handler) { + marcFields.stream().filter(predicate).findFirst().ifPresent(handler::field); + } + + public MarcField getFirst(String tag) { + return getFirst(marcField -> marcField.getTag().equals(tag)); + } + + public MarcField getFirst(String tag, String indicator) { + return getFirst(marcField -> marcField.getTag().equals(tag) && marcField.getIndicator().equals(indicator)); + } + + public MarcField getFirst(String tag, String indicator, String subfieldId) { + return getFirst(marcField -> marcField.getTag().equals(tag) && + marcField.getIndicator().equals(indicator) && + marcField.getSubfieldIds().contains(subfieldId)); + } + + public MarcField getFirst(Predicate predicate) { + final MarcField[] array = new MarcField[1]; + filterFirst(predicate, marcField -> array[0] = marcField); + return array[0]; + } + + public List getAll(String tag) { + return getAll(marcField -> marcField.getTag().equals(tag)); + } + + public List getAll(String tag, String indicator) { + return getAll(marcField -> marcField.getTag().equals(tag) && marcField.getIndicator().equals(indicator)); + } + + public List getAll(String tag, String indicator, String subfieldId) { + return getAll(marcField -> marcField.getTag().equals(tag) && + marcField.getIndicator().equals(indicator) && + marcField.getSubfieldIds().contains(subfieldId)); + } + + public List getAll(Predicate predicate) { + List list = new LinkedList<>(); + filter(predicate, list::add); + return list; + } + + @Override + public int size() { + return delegate.size(); + } + + @Override + public boolean isEmpty() { + return delegate.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return delegate.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return delegate.containsValue(value); + } + + @Override + public Object get(Object key) { + return delegate.get(key); + } + + @Override + public Object put(String key, Object value) { + return delegate.put(key, value); + } + + @Override + public Object remove(Object key) { + return delegate.remove(key); + } + + @Override + public void putAll(Map m) { + delegate.putAll(m); + } + + @Override + public void clear() { + delegate.clear(); + } + + @Override + public Set keySet() { + return delegate.keySet(); + } + + @Override + public Collection values() { + return delegate.values(); + } + + @Override + public Set> entrySet() { + return delegate.entrySet(); } @Override @@ -197,21 +292,26 @@ public class MarcRecord extends LinkedHashMap { return (recordLabel.toString() + marcFields.toString()).hashCode(); } + public String toString() { + return delegate.toString(); + } + @SuppressWarnings("unchecked") - private void createMap() { - put(FORMAT_TAG, format); - put(TYPE_TAG, type); - put(LEADER_TAG, recordLabel.toString()); + private Map createMap(boolean stable) { + Map map = stable ? new TreeMap<>() : new LinkedHashMap<>(); + map.put(FORMAT_TAG, format); + map.put(TYPE_TAG, type); + map.put(LEADER_TAG, recordLabel.toString()); for (MarcField marcField : marcFields) { String tag = marcField.getTag(); int repeat; Map repeatMap; - if (!containsKey(tag)) { + if (!map.containsKey(tag)) { repeatMap = new LinkedHashMap<>(); repeat = 1; - put(tag, repeatMap); + map.put(tag, repeatMap); } else { - repeatMap = (Map) get(tag); + repeatMap = (Map) map.get(tag); repeat = repeatMap.size() + 1; } String indicator = marcField.getIndicator(); @@ -246,6 +346,7 @@ public class MarcRecord extends LinkedHashMap { repeatMap.put(Integer.toString(repeat), marcField.getValue()); } } + return map; } @SuppressWarnings("unchecked") diff --git a/src/main/java/org/xbib/marc/MarcRecordAdapter.java b/src/main/java/org/xbib/marc/MarcRecordAdapter.java index 7699985..9320cec 100644 --- a/src/main/java/org/xbib/marc/MarcRecordAdapter.java +++ b/src/main/java/org/xbib/marc/MarcRecordAdapter.java @@ -28,9 +28,15 @@ public class MarcRecordAdapter implements MarcListener { protected Marc.Builder builder; - public MarcRecordAdapter(MarcRecordListener marcRecordListener) { + private boolean isStableFieldOrder; + + public MarcRecordAdapter(MarcRecordListener marcRecordListener, boolean isStableFieldOrder) { this.marcRecordListener = marcRecordListener; this.builder = Marc.builder(); + this.isStableFieldOrder = isStableFieldOrder; + if (isStableFieldOrder) { + this.builder.stableFieldOrder(); + } } @Override @@ -58,6 +64,9 @@ public class MarcRecordAdapter implements MarcListener { public void endRecord() { marcRecordListener.record(builder.buildRecord()); builder = Marc.builder(); + if (isStableFieldOrder) { + builder.stableFieldOrder(); + } } @Override diff --git a/src/main/java/org/xbib/marc/MarcRecordHandler.java b/src/main/java/org/xbib/marc/MarcRecordHandler.java new file mode 100644 index 0000000..6611bcc --- /dev/null +++ b/src/main/java/org/xbib/marc/MarcRecordHandler.java @@ -0,0 +1,7 @@ +package org.xbib.marc; + +@FunctionalInterface +public interface MarcRecordHandler { + + void record(MarcRecord marcRecord); +} diff --git a/src/main/java/org/xbib/marc/MarcRecordListener.java b/src/main/java/org/xbib/marc/MarcRecordListener.java index 9e766d4..c616d5a 100644 --- a/src/main/java/org/xbib/marc/MarcRecordListener.java +++ b/src/main/java/org/xbib/marc/MarcRecordListener.java @@ -16,7 +16,7 @@ package org.xbib.marc; /** - * Interface for catching MARC records. + * Interface for handling MARC records in collections. */ public interface MarcRecordListener { diff --git a/src/main/java/org/xbib/marc/dialects/mab/xml/MabXMLContentHandler.java b/src/main/java/org/xbib/marc/dialects/mab/xml/MabXMLContentHandler.java index 893da92..61211a1 100644 --- a/src/main/java/org/xbib/marc/dialects/mab/xml/MabXMLContentHandler.java +++ b/src/main/java/org/xbib/marc/dialects/mab/xml/MabXMLContentHandler.java @@ -126,7 +126,7 @@ public class MabXMLContentHandler extends MarcContentHandler implements MabXMLCo } case FELD: { String s = content.toString(); - MarcField marcField = stack.pop().value(trim ? s.trim() : s).build(); + MarcField marcField = stack.pop().value(isTrim ? s.trim() : s).build(); if (marcValueTransformers != null) { marcField = marcValueTransformers.transformValue(marcField); } @@ -135,7 +135,7 @@ public class MabXMLContentHandler extends MarcContentHandler implements MabXMLCo } case UF: { String s = content.toString(); - stack.peek().subfieldValue(trim ? s.trim() : s); + stack.peek().subfieldValue(isTrim ? s.trim() : s); break; } default: diff --git a/src/main/java/org/xbib/marc/label/TypeOfControl.java b/src/main/java/org/xbib/marc/label/TypeOfControl.java index 332ba02..556a180 100644 --- a/src/main/java/org/xbib/marc/label/TypeOfControl.java +++ b/src/main/java/org/xbib/marc/label/TypeOfControl.java @@ -51,6 +51,7 @@ public enum TypeOfControl { switch (ch) { case ' ': case '#': + case '0': return UNSPECIFIED; case 'a': return ARCHIVAL; diff --git a/src/main/java/org/xbib/marc/xml/MarcContentHandler.java b/src/main/java/org/xbib/marc/xml/MarcContentHandler.java index a6ab810..d699077 100644 --- a/src/main/java/org/xbib/marc/xml/MarcContentHandler.java +++ b/src/main/java/org/xbib/marc/xml/MarcContentHandler.java @@ -75,7 +75,7 @@ public class MarcContentHandler protected MarcValueTransformers marcValueTransformers; - protected boolean trim; + protected boolean isTrim; private MarcFieldTransformers marcFieldTransformers; @@ -85,6 +85,8 @@ public class MarcContentHandler private final Set validNamespaces; + private boolean isStableFieldOrder; + public MarcContentHandler() { this.recordCounter = new AtomicInteger(); this.stack = new LinkedList<>(); @@ -160,7 +162,12 @@ public class MarcContentHandler } public MarcContentHandler setTrim(boolean trim) { - this.trim = trim; + this.isTrim = trim; + return this; + } + + public MarcContentHandler setStableFieldOrder(boolean stableFieldOrder) { + this.isStableFieldOrder = stableFieldOrder; return this; } @@ -247,7 +254,7 @@ public class MarcContentHandler } else { MarcRecord marcRecord = new MarcRecord(getFormat(), getType(), RecordLabel.builder().from(label).build(), - marcFieldList, false); + marcFieldList, false, isStableFieldOrder); marcRecordListener.record(marcRecord); } } @@ -405,7 +412,7 @@ public class MarcContentHandler } case SUBFIELD: { String s = content.toString(); - stack.peek().subfieldValue(trim ? s.trim() : s); + stack.peek().subfieldValue(isTrim ? s.trim() : s); break; } default: { diff --git a/src/test/java/org/xbib/marc/MarcRecordTest.java b/src/test/java/org/xbib/marc/MarcRecordTest.java index 9ff914a..cab9f9f 100644 --- a/src/test/java/org/xbib/marc/MarcRecordTest.java +++ b/src/test/java/org/xbib/marc/MarcRecordTest.java @@ -21,6 +21,8 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; import org.junit.jupiter.api.Test; +import org.xbib.content.XContentBuilder; +import org.xbib.content.json.JsonXContent; import org.xbib.marc.label.RecordLabel; import org.xbib.marc.transformer.value.MarcValueTransformers; import org.xbib.marc.xml.MarcXchangeWriter; @@ -29,7 +31,10 @@ import java.io.InputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.text.Normalizer; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.TreeMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Pattern; @@ -97,7 +102,10 @@ public class MarcRecordTest { // only single record for (MarcRecord marcRecord : builder.iterable()) { // single 245 field - assertEquals(1, marcRecord.filterKey(Pattern.compile("^245.*")).size()); + List list = new ArrayList<>(); + Pattern pattern = Pattern.compile("^245.*"); + marcRecord.filter(field -> pattern.matcher(field.getTag()).matches(), list::add); + assertEquals(1, list.size()); } } } @@ -117,19 +125,6 @@ public class MarcRecordTest { } } - @Test - public void testFilterValueIterable() throws Exception { - String s = "summerland.mrc"; - try (InputStream in = getClass().getResource(s).openStream()) { - Marc.Builder builder = Marc.builder() - .setInputStream(in) - .setCharset(Charset.forName("ANSEL")); - for (MarcRecord marcRecord : builder.iterable()) { - assertEquals(2, marcRecord.filterValue(Pattern.compile(".*?Chabon.*")).size()); - } - } - } - @Test public void testFilterValue() throws Exception { String s = "summerland.mrc"; @@ -220,4 +215,24 @@ public class MarcRecordTest { assertEquals("123", marcRecord.getFields().stream().filter(m -> m.getTag().equals("001")).findFirst().get().getValue()); assertEquals("Hello World", marcRecord.getFields().stream().filter(m -> m.getTag().equals("100")).findFirst().get().getFirstSubfieldValue("a")); } + + @Test + public void testMarcRecordFromMapAsMap() throws IOException { + Map map = new TreeMap<>(Map.of("001", "123", + "100", Map.of("_", Map.of("a", "Hello World")))); + MarcRecord marcRecord = MarcRecord.from(map); + assertEquals("{001=123, 100={_={a=Hello World}}}", marcRecord.toString()); + XContentBuilder builder = JsonXContent.contentBuilder(); + builder.map(marcRecord); + assertEquals("{\"001\":\"123\",\"100\":{\"_\":{\"a\":\"Hello World\"}}}", builder.string()); + } + + @Test + public void testMarcRecordFilter() { + Map map = Map.of("001", "123", + "100", Map.of("_", Map.of("a", "Hello World"))); + MarcRecord marcRecord = MarcRecord.from(map); + marcRecord.filter("001", field -> assertEquals("123", field.getValue())); + marcRecord.filter("100", field -> assertEquals("Hello World", field.getFirstSubfieldValue("a"))); + } } diff --git a/src/test/java/org/xbib/marc/json/MarcJsonWriterTest.java b/src/test/java/org/xbib/marc/json/MarcJsonWriterTest.java index 7e75d4d..2a0245d 100644 --- a/src/test/java/org/xbib/marc/json/MarcJsonWriterTest.java +++ b/src/test/java/org/xbib/marc/json/MarcJsonWriterTest.java @@ -56,6 +56,7 @@ public class MarcJsonWriterTest { .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) ) { Marc.builder() + .stableFieldOrder() .setInputStream(inputStream) .setCharset(Charset.forName("ANSEL")) .setMarcListener(writer) @@ -78,10 +79,11 @@ public class MarcJsonWriterTest { "chabon.mrc", "chabon-loc.mrc" }) { - StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> { + StreamMatcher.fileMatch(getClass(), s, ".record.json", (inputStream, outputStream) -> { try (MarcJsonWriter writer = new MarcJsonWriter(outputStream) ) { Marc.builder() + .stableFieldOrder() .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) .setInputStream(inputStream) @@ -107,14 +109,14 @@ public class MarcJsonWriterTest { "chabon.mrc", "chabon-loc.mrc" }) { - StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> { + StreamMatcher.fileMatch(getClass(), s, ".record.adapter.json", (inputStream, outputStream) -> { try (MarcJsonWriter writer = new MarcJsonWriter(outputStream)) { Marc.builder() .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) .setInputStream(inputStream) .setCharset(Charset.forName("ANSEL")) - .setMarcListener(new MarcRecordAdapter(writer)) + .setMarcListener(new MarcRecordAdapter(writer, true)) .build() .writeCollection(); } @@ -134,7 +136,7 @@ public class MarcJsonWriterTest { contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd"); contentHandler.setFormat("MARC21"); contentHandler.setType("Bibliographic"); - contentHandler.setMarcListener(new MarcRecordAdapter(writer)); + contentHandler.setMarcListener(new MarcRecordAdapter(writer, true)); Marc.builder() .setInputStream(inputStream) .setContentHandler(contentHandler) diff --git a/src/test/resources/org/xbib/marc/json/HT016424175.xml.json b/src/test/resources/org/xbib/marc/json/HT016424175.xml.json index 7170329..25ab19b 100644 --- a/src/test/resources/org/xbib/marc/json/HT016424175.xml.json +++ b/src/test/resources/org/xbib/marc/json/HT016424175.xml.json @@ -1 +1 @@ -{"_FORMAT":"MARC21","_TYPE":"Bibliographic","_LEADER":"00000 M2.01200024 000h","LDR":["------M2.01200024------h"],"FMT":["MH"],"001":[{" 1":[{"a":"HT016424175"}]}],"002":[{"a1":[{"a":"20100705"}]}],"026":[{" 1":[{"a":"HBZHT016424175"}]}],"030":["a|1uc||||||1|"],"036":[{"a1":[{"a":"DE"}]}],"037":[{"b1":[{"a":"lat"}]}],"050":["a|||||||||||||"],"051":["am||||||"],"070":[{" 1":[{"a":"575"}]}],"080":[{" 1":[{"a":"60"}]}],"100":[{" 1":[{"p":"Hildegardis"},{"c":"Bingensis"},{"d":"1098-1179"},{"9":"(DE-588)118550993"}]}],"101":[{" 1":[{"p":"Hildegard"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Heilige, 1098-1179"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Sankt"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Sancta"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abbatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarde"},{"c":"Sainte"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Monte Sancti Ruperti"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"die Heilige"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardt"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Hildegard <>"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"of Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Sancta Abatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"Santa"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"Sant'"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abbess"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Heilige"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarde"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"di Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarda"},{"c":"di Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarda"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Bingeniläinen"},{"d":"1098-1179"}]},{" 1":[{"p":"Childegard"},{"c":"ot Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Childegard <>"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Hildegarde <>"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"von Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis von Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Sainte"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Alemannia"},{"d":"1098-1179"}]}],"104":[{"b1":[{"p":"Escot, Pozzi"},{"d":"1933-"},{"b":"[Bearb.]"},{"9":"(DE-588)128917687"}]}],"105":[{" 1":[{"p":"Pozzi Escot, Olga"},{"d":"1933-"}]}],"304":[{"b1":[{"a":"Unde quocumque"}]}],"331":[{" 1":[{"a":"Unde quocumque"}]}],"334":[{" 1":[{"a":"Musikdruck"}]}],"359":[{" 1":[{"a":"Hildegard von Bingen"}]}],"425":[{" 1":[{"a":"c 1994"}]},{"a1":[{"a":"1994"}]}],"503":[{"a1":[{"a":"Transkription der mittelalterlichen Neumen in moderne Notation"}]}],"516":[{" 1":[{"a":"Melodien mit unterlegtem Text"}]}],"590":[{" 1":[{"a":"<> Ursula Antiphons ... [Musikdruck]"}]}],"591":[{" 1":[{"a":"Hildegard von Bingen"}]}],"594":[{" 1":[{"a":"[Kassel]"}]}],"595":[{" 1":[{"a":"1994"}]}],"599":[{" 1":[{"a":"HT016424145"}]}],"SYS":["018117852"]} \ No newline at end of file +{"001":[{" 1":[{"a":"HT016424175"}]}],"002":[{"a1":[{"a":"20100705"}]}],"026":[{" 1":[{"a":"HBZHT016424175"}]}],"030":["a|1uc||||||1|"],"036":[{"a1":[{"a":"DE"}]}],"037":[{"b1":[{"a":"lat"}]}],"050":["a|||||||||||||"],"051":["am||||||"],"070":[{" 1":[{"a":"575"}]}],"080":[{" 1":[{"a":"60"}]}],"100":[{" 1":[{"p":"Hildegardis"},{"c":"Bingensis"},{"d":"1098-1179"},{"9":"(DE-588)118550993"}]}],"101":[{" 1":[{"p":"Hildegard"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Heilige, 1098-1179"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Sankt"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Sancta"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abbatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarde"},{"c":"Sainte"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Monte Sancti Ruperti"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"die Heilige"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardt"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Hildegard <>"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"of Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Sancta Abatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"Santa"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"Sant'"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abbess"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Heilige"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarde"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"di Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarda"},{"c":"di Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarda"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Bingeniläinen"},{"d":"1098-1179"}]},{" 1":[{"p":"Childegard"},{"c":"ot Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Childegard <>"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Hildegarde <>"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"von Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis von Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Sainte"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Alemannia"},{"d":"1098-1179"}]}],"104":[{"b1":[{"p":"Escot, Pozzi"},{"d":"1933-"},{"b":"[Bearb.]"},{"9":"(DE-588)128917687"}]}],"105":[{" 1":[{"p":"Pozzi Escot, Olga"},{"d":"1933-"}]}],"304":[{"b1":[{"a":"Unde quocumque"}]}],"331":[{" 1":[{"a":"Unde quocumque"}]}],"334":[{" 1":[{"a":"Musikdruck"}]}],"359":[{" 1":[{"a":"Hildegard von Bingen"}]}],"425":[{" 1":[{"a":"c 1994"}]},{"a1":[{"a":"1994"}]}],"503":[{"a1":[{"a":"Transkription der mittelalterlichen Neumen in moderne Notation"}]}],"516":[{" 1":[{"a":"Melodien mit unterlegtem Text"}]}],"590":[{" 1":[{"a":"<> Ursula Antiphons ... [Musikdruck]"}]}],"591":[{" 1":[{"a":"Hildegard von Bingen"}]}],"594":[{" 1":[{"a":"[Kassel]"}]}],"595":[{" 1":[{"a":"1994"}]}],"599":[{" 1":[{"a":"HT016424145"}]}],"FMT":["MH"],"LDR":["------M2.01200024------h"],"SYS":["018117852"],"_FORMAT":"MARC21","_LEADER":"00000 M2.01200024 000h","_TYPE":"Bibliographic"} \ No newline at end of file diff --git a/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.record.adapter.json b/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.record.adapter.json new file mode 100644 index 0000000..568af90 --- /dev/null +++ b/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.record.adapter.json @@ -0,0 +1 @@ +[{"001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"010":[{" ":[{"a":" 00029063 "}]}],"020":[{" ":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"043":[{" ":[{"a":"n-us-ny"}]}],"050":[{"00":[{"a":"PS3553.H15"},{"b":"A82 2000"}]}],"082":[{"00":[{"a":"813/.54"},{"2":"21"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{" ":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{" 0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{" 0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{" 0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{" 0":[{"a":"Young men"},{"v":"Fiction."}]},{" 0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{" 0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{" 7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{" 7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}],"856":[{"42":[{"3":"Contributor biographical information"},{"u":"http://www.loc.gov/catdir/bios/random052/00029063.html"}]},{"41":[{"3":"Sample text"},{"u":"http://www.loc.gov/catdir/samples/random044/00029063.html"}]},{"42":[{"3":"Publisher description"},{"u":"http://www.loc.gov/catdir/description/random0411/00029063.html"}]}],"906":[{" ":[{"a":"7"},{"b":"cbc"},{"c":"orignew"},{"d":"1"},{"e":"ocip"},{"f":"20"},{"g":"y-gencatlg"}]}],"925":[{"0 ":[{"a":"acquire"},{"b":"2 shelf copies"},{"x":"policy default"}]}],"955":[{" ":[{"a":"to HLCD pc03 03-13-00; lh08 to subj. 03-14-00; lh06 03-22-00; lk02 03-22-00; to Dewey 03-22-00; aa05 03-23-00; ps13 2001-11-06 bk rec'd, to CIP ver."},{"f":"pv08 2001-11-07 CIP ver. to BCCD"}]}],"_FORMAT":"MarcXchange","_LEADER":"01488cam 2200349 a 4500","_TYPE":"Bibliographic"},{"001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"010":[{" ":[{"a":" 2002027497"}]}],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"042":[{" ":[{"a":"lcac"}]}],"050":[{"00":[{"a":"PZ7.C3315"},{"b":"Su 2002"}]}],"082":[{"00":[{"a":"[Fic]"},{"2":"21"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}],"906":[{" ":[{"a":"7"},{"b":"cbc"},{"c":"orignew"},{"d":"1"},{"e":"ocip"},{"f":"20"},{"g":"y-gencatlg"}]}],"925":[{"0 ":[{"a":"acquire"},{"b":"2 shelf copies"},{"x":"policy default"}]}],"952":[{" ":[{"a":"II lb11 09-05-02"}]}],"955":[{" ":[{"a":["pc14 2002-08-05 to HLCD","ps09 2003-03-04 1 copy rec'd., to CIP ver.","ld11 2003-05-12 cp2 to BCCD"]},{"c":"lh08 2002-08-06 to subj.;"},{"d":"lb11 2002-09-05"},{"e":"lb05 2002-09-06 to cip"},{"f":"pv01 2003-03-17 CIP ver to BCCD"}]}],"_FORMAT":"MarcXchange","_LEADER":"01185cam 2200301 a 4500","_TYPE":"Bibliographic"}] \ No newline at end of file diff --git a/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.record.json b/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.record.json new file mode 100644 index 0000000..568af90 --- /dev/null +++ b/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.record.json @@ -0,0 +1 @@ +[{"001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"010":[{" ":[{"a":" 00029063 "}]}],"020":[{" ":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"043":[{" ":[{"a":"n-us-ny"}]}],"050":[{"00":[{"a":"PS3553.H15"},{"b":"A82 2000"}]}],"082":[{"00":[{"a":"813/.54"},{"2":"21"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{" ":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{" 0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{" 0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{" 0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{" 0":[{"a":"Young men"},{"v":"Fiction."}]},{" 0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{" 0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{" 7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{" 7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}],"856":[{"42":[{"3":"Contributor biographical information"},{"u":"http://www.loc.gov/catdir/bios/random052/00029063.html"}]},{"41":[{"3":"Sample text"},{"u":"http://www.loc.gov/catdir/samples/random044/00029063.html"}]},{"42":[{"3":"Publisher description"},{"u":"http://www.loc.gov/catdir/description/random0411/00029063.html"}]}],"906":[{" ":[{"a":"7"},{"b":"cbc"},{"c":"orignew"},{"d":"1"},{"e":"ocip"},{"f":"20"},{"g":"y-gencatlg"}]}],"925":[{"0 ":[{"a":"acquire"},{"b":"2 shelf copies"},{"x":"policy default"}]}],"955":[{" ":[{"a":"to HLCD pc03 03-13-00; lh08 to subj. 03-14-00; lh06 03-22-00; lk02 03-22-00; to Dewey 03-22-00; aa05 03-23-00; ps13 2001-11-06 bk rec'd, to CIP ver."},{"f":"pv08 2001-11-07 CIP ver. to BCCD"}]}],"_FORMAT":"MarcXchange","_LEADER":"01488cam 2200349 a 4500","_TYPE":"Bibliographic"},{"001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"010":[{" ":[{"a":" 2002027497"}]}],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"042":[{" ":[{"a":"lcac"}]}],"050":[{"00":[{"a":"PZ7.C3315"},{"b":"Su 2002"}]}],"082":[{"00":[{"a":"[Fic]"},{"2":"21"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}],"906":[{" ":[{"a":"7"},{"b":"cbc"},{"c":"orignew"},{"d":"1"},{"e":"ocip"},{"f":"20"},{"g":"y-gencatlg"}]}],"925":[{"0 ":[{"a":"acquire"},{"b":"2 shelf copies"},{"x":"policy default"}]}],"952":[{" ":[{"a":"II lb11 09-05-02"}]}],"955":[{" ":[{"a":["pc14 2002-08-05 to HLCD","ps09 2003-03-04 1 copy rec'd., to CIP ver.","ld11 2003-05-12 cp2 to BCCD"]},{"c":"lh08 2002-08-06 to subj.;"},{"d":"lb11 2002-09-05"},{"e":"lb05 2002-09-06 to cip"},{"f":"pv01 2003-03-17 CIP ver to BCCD"}]}],"_FORMAT":"MarcXchange","_LEADER":"01185cam 2200301 a 4500","_TYPE":"Bibliographic"}] \ No newline at end of file diff --git a/src/test/resources/org/xbib/marc/json/chabon.mrc.record.adapter.json b/src/test/resources/org/xbib/marc/json/chabon.mrc.record.adapter.json new file mode 100644 index 0000000..473b1a0 --- /dev/null +++ b/src/test/resources/org/xbib/marc/json/chabon.mrc.record.adapter.json @@ -0,0 +1 @@ +[{"001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"020":[{" ":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{" ":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{" 0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{" 0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{" 0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{" 0":[{"a":"Young men"},{"v":"Fiction."}]},{" 0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{" 0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{" 7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{" 7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}],"_FORMAT":"MarcXchange","_LEADER":"00759cam a2200229 a 4500","_TYPE":"Bibliographic"},{"001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}],"_FORMAT":"MarcXchange","_LEADER":"00714cam a2200205 a 4500","_TYPE":"Bibliographic"}] \ No newline at end of file diff --git a/src/test/resources/org/xbib/marc/json/chabon.mrc.record.json b/src/test/resources/org/xbib/marc/json/chabon.mrc.record.json new file mode 100644 index 0000000..473b1a0 --- /dev/null +++ b/src/test/resources/org/xbib/marc/json/chabon.mrc.record.json @@ -0,0 +1 @@ +[{"001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"020":[{" ":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{" ":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{" 0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{" 0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{" 0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{" 0":[{"a":"Young men"},{"v":"Fiction."}]},{" 0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{" 0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{" 7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{" 7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}],"_FORMAT":"MarcXchange","_LEADER":"00759cam a2200229 a 4500","_TYPE":"Bibliographic"},{"001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}],"_FORMAT":"MarcXchange","_LEADER":"00714cam a2200205 a 4500","_TYPE":"Bibliographic"}] \ No newline at end of file diff --git a/src/test/resources/org/xbib/marc/json/summerland.mrc.record.adapter.json b/src/test/resources/org/xbib/marc/json/summerland.mrc.record.adapter.json new file mode 100644 index 0000000..ffb2679 --- /dev/null +++ b/src/test/resources/org/xbib/marc/json/summerland.mrc.record.adapter.json @@ -0,0 +1 @@ +[{"001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}],"_FORMAT":"MarcXchange","_LEADER":"00714cam a2200205 a 4500","_TYPE":"Bibliographic"}] \ No newline at end of file diff --git a/src/test/resources/org/xbib/marc/json/summerland.mrc.record.json b/src/test/resources/org/xbib/marc/json/summerland.mrc.record.json new file mode 100644 index 0000000..ffb2679 --- /dev/null +++ b/src/test/resources/org/xbib/marc/json/summerland.mrc.record.json @@ -0,0 +1 @@ +[{"001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}],"_FORMAT":"MarcXchange","_LEADER":"00714cam a2200205 a 4500","_TYPE":"Bibliographic"}] \ No newline at end of file