diff --git a/src/main/java/org/xbib/marc/MarcRecord.java b/src/main/java/org/xbib/marc/MarcRecord.java index 6143d33..a1d699f 100644 --- a/src/main/java/org/xbib/marc/MarcRecord.java +++ b/src/main/java/org/xbib/marc/MarcRecord.java @@ -35,10 +35,8 @@ import java.util.stream.Collectors; */ public class MarcRecord extends LinkedHashMap { - private static final long serialVersionUID = 5305809148724342653L; - public static final MarcRecord EMPTY = Marc.builder().buildRecord(); - + private static final long serialVersionUID = 5305809148724342653L; private final String format; private final String type; @@ -49,14 +47,15 @@ public class MarcRecord extends LinkedHashMap { /** * Create a MARC record. Use {@link Marc.Builder} to create a MARC record. - * @param format the format of the record - * @param type the type + * + * @param format the format of the record + * @param type the type * @param recordLabel the record label - * @param marcFields the MARC field + * @param marcFields the MARC field * @param lightweight true if MARC record fields should not be entered into the underlying hash map. */ MarcRecord(String format, String type, RecordLabel recordLabel, - List marcFields, boolean lightweight) { + List marcFields, boolean lightweight) { super(); this.format = format; this.type = type; @@ -69,6 +68,7 @@ public class MarcRecord extends LinkedHashMap { /** * Return the MARC record format. + * * @return the MARC record format */ public String getFormat() { @@ -77,6 +77,7 @@ public class MarcRecord extends LinkedHashMap { /** * Return the MARC record type. + * * @return the MARC record type */ public String getType() { @@ -85,6 +86,7 @@ public class MarcRecord extends LinkedHashMap { /** * Return MARC record label. + * * @return the MARC record label */ public RecordLabel getRecordLabel() { @@ -93,6 +95,7 @@ public class MarcRecord extends LinkedHashMap { /** * Return the MARC fields of this record. + * * @return the MARC field list */ public List getFields() { @@ -101,6 +104,7 @@ public class MarcRecord extends LinkedHashMap { /** * 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 */ @@ -108,8 +112,10 @@ public class MarcRecord extends LinkedHashMap { return marcFields.stream().map(field -> field.matchKey(pattern)).filter(Objects::nonNull).collect(Collectors.toList()); } + /** * Return a list of MARC fields of this record where pattern matches were found. + * * @param pattern the pattern * @return a list of MARC fields */ @@ -138,13 +144,21 @@ public class MarcRecord extends LinkedHashMap { put(LEADER_TAG, recordLabel.toString()); for (MarcField marcField : marcFields) { String tag = marcField.getTag(); + int repeat; + Map repeatMap; if (!containsKey(tag)) { - put(tag, new LinkedHashMap<>()); + repeatMap = new LinkedHashMap<>(); + repeat = 1; + put(tag, repeatMap); + } else { + repeatMap = (Map) get(tag); + repeat = repeatMap.size() + 1; } - String indicator = marcField.getIndicator(); + String indicator = marcField.getIndicator(); if (indicator != null && !indicator.isEmpty()) { indicator = indicator.replace(' ', '_'); - Map indicators = (Map) get(tag); + Map indicators = new LinkedHashMap<>(); + repeatMap.put(Integer.toString(repeat), indicators); if (!indicators.containsKey(indicator)) { indicators.put(indicator, new LinkedHashMap<>()); } @@ -164,7 +178,7 @@ public class MarcRecord extends LinkedHashMap { } } } else { - put(tag, marcField.getValue()); + repeatMap.put(Integer.toString(repeat), marcField.getValue()); } } } diff --git a/src/main/java/org/xbib/marc/json/MarcJsonWriter.java b/src/main/java/org/xbib/marc/json/MarcJsonWriter.java index 7b8264a..490a10e 100644 --- a/src/main/java/org/xbib/marc/json/MarcJsonWriter.java +++ b/src/main/java/org/xbib/marc/json/MarcJsonWriter.java @@ -82,6 +82,10 @@ public class MarcJsonWriter extends MarcContentHandler implements Flushable, Clo this.builder = Marc.builder(); } + private static String escape(String value) { + return value != null ? value.replaceAll("\"", "\\\"") : null; + } + public MarcJsonWriter setFatalErrors(boolean fatalErrors) { this.fatalErrors = fatalErrors; return this; @@ -197,6 +201,7 @@ public class MarcJsonWriter extends MarcContentHandler implements Flushable, Clo /** * Format MARC record as key-oriented JSON. + * * @param sb a string builder to append JSON to */ @SuppressWarnings("unchecked") @@ -216,88 +221,99 @@ public class MarcJsonWriter extends MarcContentHandler implements Flushable, Clo String tag = tags.getKey(); sb.append("\"").append(tag).append("\":"); Object o = tags.getValue(); - if (!(o instanceof List)) { - o = Collections.singletonList(o); - } - List list = (List) o; - if (list.size() > 1) { + if (o instanceof Map) { + int c00 = 0; + Map repeatMap = (Map) o; sb.append("["); - } - int c1 = 0; - for (Object value : list) { - if (c1 > 0) { - sb.append(","); - } - if (value instanceof Map) { - sb.append("{"); - int c2 = 0; - for (Map.Entry indicators : ((Map) value).entrySet()) { - if (c2 > 0) { + for (Map.Entry repeats : repeatMap.entrySet()) { + if (c00 > 0) { + sb.append(","); + } + o = repeats.getValue(); + if (!(o instanceof List)) { + o = Collections.singletonList(o); + } + List list = (List) o; + if (list.size() > 1) { + sb.append("["); + } + int c1 = 0; + for (Object value : list) { + if (c1 > 0) { sb.append(","); } - String indicator = indicators.getKey(); - sb.append("\"").append(indicator).append("\":"); - o = indicators.getValue(); - if (!(o instanceof List)) { - o = Collections.singletonList(o); - } - List list2 = (List) o; - if (list2.size() > 1) { - sb.append("["); - } - int c3 = 0; - for (Object value2 : list2) { - if (c3 > 0) { - sb.append(","); - } - if (value2 instanceof Map) { - sb.append("{"); - Map map = (Map) value2; - int c4 = 0; - for (Map.Entry subfield : map.entrySet()) { - if (c4 > 0) { + if (value instanceof Map) { + sb.append("{"); + int c2 = 0; + for (Map.Entry indicators : ((Map) value).entrySet()) { + if (c2 > 0) { + sb.append(","); + } + String indicator = indicators.getKey(); + sb.append("\"").append(indicator).append("\":"); + o = indicators.getValue(); + if (!(o instanceof List)) { + o = Collections.singletonList(o); + } + List list2 = (List) o; + sb.append("["); + int c3 = 0; + for (Object value2 : list2) { + if (c3 > 0) { sb.append(","); } - sb.append("\"").append(subfield.getKey()).append("\":"); - if (subfield.getValue() instanceof List) { - sb.append("["); - int c5 = 0; - for (String s : (List)subfield.getValue()) { - if (c5 > 0) { + if (value2 instanceof Map) { + Map map = (Map) value2; + int c4 = 0; + for (Map.Entry subfield : map.entrySet()) { + if (c4 > 0) { sb.append(","); } - sb.append("\"").append(escape(s)).append("\""); - c5++; + sb.append("{"); + sb.append("\"").append(subfield.getKey()).append("\":"); + if (subfield.getValue() instanceof List) { + sb.append("["); + int c5 = 0; + for (String s : (List) subfield.getValue()) { + if (c5 > 0) { + sb.append(","); + } + sb.append("\"").append(escape(s)).append("\""); + c5++; + } + sb.append("]"); + } else { + sb.append("\"").append(escape(subfield.getValue().toString())).append("\""); + } + c4++; + sb.append("}"); } - sb.append("]"); } else { - sb.append("\"").append(escape(subfield.getValue().toString())).append("\""); + sb.append("\"").append(escape(value2.toString())).append("\""); } - c4++; + c3++; } - sb.append("}"); - } else { - sb.append("\"").append(escape(value2.toString())).append("\""); + sb.append("]"); + c2++; + } + sb.append("}"); + } else { + if (value == null) { + sb.append("null"); + } else { + sb.append("\"").append(escape(value.toString())).append("\""); } - c3++; } - if (list2.size() > 1) { - sb.append("]"); - } - c2++; + c1++; } - sb.append("}"); - } else { - if (value == null) { - sb.append("null"); - } else { - sb.append("\"").append(escape(value.toString())).append("\""); + if (list.size() > 1) { + sb.append("]"); } + c00++; } - c1++; - } - if (list.size() > 1) { sb.append("]"); + } else { + sb.append("\"").append(escape(o.toString())).append("\""); } c0++; } @@ -308,10 +324,6 @@ public class MarcJsonWriter extends MarcContentHandler implements Flushable, Clo return exception; } - private static String escape(String value) { - return value != null ? value.replaceAll("\"", "\\\"") : null; - } - private void handleException(IOException e) { exception = e; if (fatalErrors) { 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 2e98055..fd7bf4e 100644 --- a/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformer.java +++ b/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformer.java @@ -22,6 +22,8 @@ import org.xbib.marc.MarcField; import java.util.LinkedHashMap; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -31,8 +33,13 @@ import java.util.regex.Pattern; public class MarcFieldTransformer extends LinkedHashMap { private static final long serialVersionUID = -3250616818472683245L; - // the repeat counter pattern + + private static final Logger logger = Logger.getLogger(MarcFieldTransformer.class.getName()); + + // the repeat counter pattern, simple integer private static final Pattern REP = Pattern.compile("\\{r\\}"); + // the two-string numeric repeat counter pattern + private static final Pattern NREP = Pattern.compile("\\{n\\}"); private final boolean ignoreIndicator; private final boolean ignoreSubfieldIds; private transient MarcField lastReceived; @@ -114,7 +121,7 @@ public class MarcFieldTransformer extends LinkedHashMap { if (ignoreIndicator) { builder.indicator(marcField.getIndicator()); } else { - builder.indicator(interpolate(newMarcField.getIndicator())); + builder.indicator(interpolate(marcField, newMarcField.getIndicator())); } if (!builder.isEmpty()) { if (ignoreSubfieldIds) { @@ -173,7 +180,7 @@ public class MarcFieldTransformer extends LinkedHashMap { if (ignoreIndicator) { builder.indicator(marcField.getIndicator()); } else { - builder.indicator(interpolate(newMarcField.getIndicator())); + builder.indicator(interpolate(marcField, newMarcField.getIndicator())); } } if (ignoreSubfieldIds) { @@ -198,15 +205,26 @@ public class MarcFieldTransformer extends LinkedHashMap { /** * Interpolate variables. * + * @param marcField MARC field * @param value the input value * @return the interpolated string */ - private String interpolate(String value) { + private String interpolate(MarcField marcField, String value) { if (value == null) { return null; } Matcher m = REP.matcher(value); - return m.find() ? m.replaceAll(Integer.toString(repeatCounter)) : value; + if (m.find()) { + return m.replaceAll(Integer.toString(repeatCounter)); + } + m = NREP.matcher(value); + if (m.find()) { + if (repeatCounter > 99) { + logger.log(Level.WARNING, "counter > 99, overflow in " + marcField); + } + return m.replaceAll(String.format("%02d", repeatCounter)); + } + return value; } /** diff --git a/src/test/java/org/xbib/marc/json/MarcJsonWriterTest.java b/src/test/java/org/xbib/marc/json/MarcJsonWriterTest.java index 5790248..f77271a 100644 --- a/src/test/java/org/xbib/marc/json/MarcJsonWriterTest.java +++ b/src/test/java/org/xbib/marc/json/MarcJsonWriterTest.java @@ -136,6 +136,7 @@ public class MarcJsonWriterTest { String s = "HT016424175.xml"; InputStream in = getClass().getResource("/org/xbib/marc/dialects/mab/" + s).openStream(); File file = File.createTempFile(s + ".", ".json"); + file.deleteOnExit(); FileOutputStream out = new FileOutputStream(file); try (MarcJsonWriter writer = new MarcJsonWriter(out, true) .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) 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 ea6f47d..c1b3182 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","Hildegard","Hildegard","Hildegardis","Hildegardis","Hildegarde","Ildegarda","Hildegardis","Hildegard","Hildegardis","Hildegardt","Hildegardis","Bingen, Hildegard <>","Hildegard","Hildegardis","Ildegarda","Ildegarda","Hildegardis","Hildegard","Hildegarde","Ildegarda","Hildegardis","Hildegarda","Hildegarda","Hildegard","Childegard","Bingen, Childegard <>","Bingen, Hildegarde <>","Hildegard","Hildegardis von Bingen","Hildegard","Hildegardis"],"d":["1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179","1098-1179"],"c":["Heilige, 1098-1179","Sankt","Sancta","Abbatissa","Sainte","de Bingen","de Monte Sancti Ruperti","die Heilige","de Bingen","of Bingen","Sancta Abatissa","Santa","Sant'","Abbess","Heilige","de Bingen","di Bingen","Abatissa","di Bingen","de Bingen","Bingeniläinen","ot Bingen","von Bingen","Sainte","de Alemannia"]}},"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"} +{"_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 diff --git a/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.json b/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.json index 776e37d..b6b4ee8 100644 --- a/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.json +++ b/src/test/resources/org/xbib/marc/json/chabon-loc.mrc.json @@ -1 +1 @@ -[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01488cam 2200349 a 4500","001":"11939876","005":"20041229190604.0","008":"000313s2000 nyu 000 1 eng ","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"}},"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.","Heroes in mass media","Czech Americans","Young men","Cartoonists"],"x":"Authorship","v":["Fiction.","Fiction.","Fiction.","Fiction.","Fiction."]}},"651":{"_0":{"a":"New York (N.Y.)","v":"Fiction."}},"655":{"_7":{"a":["Humorous stories.","Bildungsromane."],"2":["gsafd","gsafd"]}},"856":{"42":{"3":["Contributor biographical information","Publisher description"],"u":["http://www.loc.gov/catdir/bios/random052/00029063.html","http://www.loc.gov/catdir/description/random0411/00029063.html"]},"41":{"3":"Sample text","u":"http://www.loc.gov/catdir/samples/random044/00029063.html"}}},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01185cam 2200301 a 4500","001":"12883376","005":"20030616111422.0","008":"020805s2002 nyu j 000 1 eng ","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":["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"}},"010":{"__":{"a":" 2002027497"}},"020":{"__":{"a":["0786808772","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.","Baseball","Magic"],"v":["Fiction.","Fiction."]}},"952":{"__":{"a":"II lb11 09-05-02"}}}] \ No newline at end of file +[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01488cam 2200349 a 4500","001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"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"}]}],"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"}]}]},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01185cam 2200301 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"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":["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"}]}],"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."}]}],"952":[{"__":[{"a":"II lb11 09-05-02"}]}]}] \ No newline at end of file diff --git a/src/test/resources/org/xbib/marc/json/chabon.mrc.json b/src/test/resources/org/xbib/marc/json/chabon.mrc.json index 25e56cd..34d7139 100644 --- a/src/test/resources/org/xbib/marc/json/chabon.mrc.json +++ b/src/test/resources/org/xbib/marc/json/chabon.mrc.json @@ -1 +1 @@ -[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00759cam a2200229 a 4500","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.","Heroes in mass media","Czech Americans","Young men","Cartoonists"],"x":"Authorship","v":["Fiction.","Fiction.","Fiction.","Fiction.","Fiction."]}},"651":{"_0":{"a":"New York (N.Y.)","v":"Fiction."}},"655":{"_7":{"a":["Humorous stories.","Bildungsromane."],"2":["gsafd","gsafd"]}}},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":"12883376","005":"20030616111422.0","008":"020805s2002 nyu j 000 1 eng ","020":{"__":{"a":["0786808772","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.","Baseball","Magic"],"v":["Fiction.","Fiction."]}}}] \ No newline at end of file +[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00759cam a2200229 a 4500","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","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","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."}]}]}] \ No newline at end of file diff --git a/src/test/resources/org/xbib/marc/json/summerland.mrc.json b/src/test/resources/org/xbib/marc/json/summerland.mrc.json index dd06d31..658f465 100644 --- a/src/test/resources/org/xbib/marc/json/summerland.mrc.json +++ b/src/test/resources/org/xbib/marc/json/summerland.mrc.json @@ -1 +1 @@ -[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":"12883376","005":"20030616111422.0","008":"020805s2002 nyu j 000 1 eng ","020":{"__":{"a":["0786808772","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.","Baseball","Magic"],"v":["Fiction.","Fiction."]}}}] \ No newline at end of file +[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","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."}]}]}] \ No newline at end of file