From a4256675655dd95effd4ea3ab79022f1d1199ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Wed, 8 Feb 2023 16:54:54 +0100 Subject: [PATCH] add disbling control fields --- gradle.properties | 2 +- src/main/java/org/xbib/marc/Marc.java | 40 ++++++++++++------- src/main/java/org/xbib/marc/MarcField.java | 5 +++ .../java/org/xbib/marc/MarcGenerator.java | 13 ++++-- src/main/java/org/xbib/marc/MarcRecord.java | 12 +++--- .../dialects/pica/PicaXMLContentHandler.java | 2 +- .../org/xbib/marc/io/PatternInputStream.java | 4 +- .../java/org/xbib/marc/tools/MarcTool.java | 5 +-- .../field/MarcFieldTransformer.java | 4 +- .../value/MarcValueTransformers.java | 3 ++ .../marc/xml/IndentingXMLEventWriter.java | 17 ++++---- .../org/xbib/marc/xml/MarcContentHandler.java | 17 ++++++-- .../marc/xml/MarcXchangeEventConsumer.java | 30 +++++++++----- .../org/xbib/marc/xml/MarcXchangeWriter.java | 21 +++++----- .../java/org/xbib/marc/xml/MarcXmlWriter.java | 12 +++--- src/main/java/org/xbib/marc/xml/Sax2Dom.java | 5 +-- 16 files changed, 116 insertions(+), 76 deletions(-) diff --git a/gradle.properties b/gradle.properties index ca78ea0..e473f71 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group = org.xbib name = marc -version = 2.9.18 +version = 2.9.19 org.gradle.warning.mode = ALL diff --git a/src/main/java/org/xbib/marc/Marc.java b/src/main/java/org/xbib/marc/Marc.java index 1db9d0d..eaa5167 100644 --- a/src/main/java/org/xbib/marc/Marc.java +++ b/src/main/java/org/xbib/marc/Marc.java @@ -15,9 +15,6 @@ */ package org.xbib.marc; -import static org.xbib.marc.MarcXchangeConstants.BIBLIOGRAPHIC_TYPE; -import static org.xbib.marc.MarcXchangeConstants.MARCXCHANGE_FORMAT; - import org.w3c.dom.Document; import org.xbib.marc.dialects.aleph.AlephSequentialInputStream; import org.xbib.marc.dialects.bibliomondo.BiblioMondoInputStream; @@ -46,6 +43,17 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.transform.Result; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamSource; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; @@ -65,17 +73,8 @@ import java.util.regex.Pattern; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.transform.Result; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamSource; +import static org.xbib.marc.MarcXchangeConstants.BIBLIOGRAPHIC_TYPE; +import static org.xbib.marc.MarcXchangeConstants.MARCXCHANGE_FORMAT; /** * A MARC instance for top-level fluent API style access to the most viable methods of @@ -680,6 +679,8 @@ public final class Marc { private Pattern valuePattern; + private boolean disableControlFields; + private Builder() { this.charset = StandardCharsets.UTF_8; this.recordLabel = RecordLabel.EMPTY; @@ -855,6 +856,11 @@ public final class Marc { return this; } + public Builder disableControlFields() { + this.disableControlFields = true; + return this; + } + /** * Set XML content handler. * @param contentHandler the XML content handler @@ -864,6 +870,9 @@ public final class Marc { if (contentHandler instanceof MarcContentHandler) { MarcContentHandler marcContentHandler = (MarcContentHandler) contentHandler; marcContentHandler.setMarcFieldTransformers(marcFieldTransformers); + if (disableControlFields) { + marcContentHandler.disabledControlFields(); + } } this.defaultContentHandler = new InverseMarcContentHandler(contentHandler); defaultContentHandler.setSchema(schema); @@ -896,6 +905,9 @@ public final class Marc { .setMarcTransformer(marcTransformer) .setMarcFieldTransformers(marcFieldTransformers) .setMarcValueTransformers(marcValueTransformers); + if (disableControlFields) { + marcGenerator.disableControlFields(); + } return marcGenerator; } diff --git a/src/main/java/org/xbib/marc/MarcField.java b/src/main/java/org/xbib/marc/MarcField.java index 4df5bf9..1eba036 100644 --- a/src/main/java/org/xbib/marc/MarcField.java +++ b/src/main/java/org/xbib/marc/MarcField.java @@ -211,12 +211,17 @@ public class MarcField implements Comparable { /** * Returns if this MARC field is a control field. + * We invoke the isControl() function in the builder because the variable might have to be evaluated. * @return true if control field, false if not */ public boolean isControl() { return builder.isControl(); } + public boolean isControlFieldsDisabled() { + return builder.disableControlFields; + } + /** * Returns if this MARC field is empty. * @return true if MARC field is empty, false if not diff --git a/src/main/java/org/xbib/marc/MarcGenerator.java b/src/main/java/org/xbib/marc/MarcGenerator.java index 9657185..06d22d2 100644 --- a/src/main/java/org/xbib/marc/MarcGenerator.java +++ b/src/main/java/org/xbib/marc/MarcGenerator.java @@ -15,10 +15,6 @@ */ package org.xbib.marc; -import static org.xbib.marc.io.InformationSeparator.GS; -import static org.xbib.marc.io.InformationSeparator.RS; -import static org.xbib.marc.io.InformationSeparator.US; - import org.xbib.marc.io.BytesReference; import org.xbib.marc.io.Chunk; import org.xbib.marc.io.ChunkListener; @@ -33,6 +29,10 @@ import java.nio.charset.Charset; import java.util.LinkedList; import java.util.List; +import static org.xbib.marc.io.InformationSeparator.GS; +import static org.xbib.marc.io.InformationSeparator.RS; +import static org.xbib.marc.io.InformationSeparator.US; + /** * This chunk listener interprets the chunks from a stream and generates MARC events to a given MARC listener. */ @@ -128,6 +128,11 @@ public class MarcGenerator implements ChunkListener { return this; } + public MarcGenerator disableControlFields() { + builder.disableControlFields(); + return this; + } + @Override public void chunk(Chunk chunk) throws IOException { char separator = (char) chunk.separator()[0]; diff --git a/src/main/java/org/xbib/marc/MarcRecord.java b/src/main/java/org/xbib/marc/MarcRecord.java index 60722f0..2b02e00 100644 --- a/src/main/java/org/xbib/marc/MarcRecord.java +++ b/src/main/java/org/xbib/marc/MarcRecord.java @@ -15,9 +15,7 @@ */ package org.xbib.marc; -import static org.xbib.marc.json.MarcJsonWriter.FORMAT_TAG; -import static org.xbib.marc.json.MarcJsonWriter.LEADER_TAG; -import static org.xbib.marc.json.MarcJsonWriter.TYPE_TAG; +import org.xbib.marc.label.RecordLabel; import java.io.InputStream; import java.nio.charset.Charset; @@ -26,9 +24,6 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; -import java.util.stream.Stream; -import org.xbib.marc.label.RecordLabel; - import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -42,6 +37,11 @@ import java.util.TreeMap; import java.util.function.BiConsumer; import java.util.function.Predicate; import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static org.xbib.marc.json.MarcJsonWriter.FORMAT_TAG; +import static org.xbib.marc.json.MarcJsonWriter.LEADER_TAG; +import static org.xbib.marc.json.MarcJsonWriter.TYPE_TAG; /** * A MARC record. This is an extended MARC record augmented with MarcXchange information. diff --git a/src/main/java/org/xbib/marc/dialects/pica/PicaXMLContentHandler.java b/src/main/java/org/xbib/marc/dialects/pica/PicaXMLContentHandler.java index b54afa0..89c23cd 100644 --- a/src/main/java/org/xbib/marc/dialects/pica/PicaXMLContentHandler.java +++ b/src/main/java/org/xbib/marc/dialects/pica/PicaXMLContentHandler.java @@ -15,13 +15,13 @@ */ package org.xbib.marc.dialects.pica; -import java.util.HashSet; import org.xbib.marc.MarcField; import org.xbib.marc.label.RecordLabel; import org.xbib.marc.xml.MarcContentHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; +import java.util.HashSet; import java.util.Set; /** diff --git a/src/main/java/org/xbib/marc/io/PatternInputStream.java b/src/main/java/org/xbib/marc/io/PatternInputStream.java index 465a7ae..465ce6f 100644 --- a/src/main/java/org/xbib/marc/io/PatternInputStream.java +++ b/src/main/java/org/xbib/marc/io/PatternInputStream.java @@ -15,12 +15,12 @@ */ package org.xbib.marc.io; -import static java.util.Objects.requireNonNull; - import java.io.IOException; import java.io.InputStream; import java.util.Arrays; +import static java.util.Objects.requireNonNull; + /** * A buffered input stream that is organized in chunks separated by byte array patterns. * Convenience implements are give by {@code PatternInputStream.lf()} for line-feed separated diff --git a/src/main/java/org/xbib/marc/tools/MarcTool.java b/src/main/java/org/xbib/marc/tools/MarcTool.java index d777ce2..42c46bf 100644 --- a/src/main/java/org/xbib/marc/tools/MarcTool.java +++ b/src/main/java/org/xbib/marc/tools/MarcTool.java @@ -18,6 +18,8 @@ package org.xbib.marc.tools; import org.xbib.marc.Marc; import org.xbib.marc.xml.MarcXchangeWriter; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; import java.io.BufferedInputStream; import java.io.InputStream; import java.net.URL; @@ -28,9 +30,6 @@ import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.stream.StreamResult; - /** * Command line tool. */ 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 e126e01..9a5db0c 100644 --- a/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformer.java +++ b/src/main/java/org/xbib/marc/transformer/field/MarcFieldTransformer.java @@ -15,8 +15,6 @@ */ package org.xbib.marc.transformer.field; -import static org.xbib.marc.transformer.field.MarcFieldTransformer.Operator.HEAD; - import org.xbib.marc.MarcField; import java.util.Collection; @@ -28,6 +26,8 @@ import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static org.xbib.marc.transformer.field.MarcFieldTransformer.Operator.HEAD; + /** * */ diff --git a/src/main/java/org/xbib/marc/transformer/value/MarcValueTransformers.java b/src/main/java/org/xbib/marc/transformer/value/MarcValueTransformers.java index 501ef1f..805bdd5 100644 --- a/src/main/java/org/xbib/marc/transformer/value/MarcValueTransformers.java +++ b/src/main/java/org/xbib/marc/transformer/value/MarcValueTransformers.java @@ -69,6 +69,9 @@ public class MarcValueTransformers { marcValueTransformerMap.get(key) : marcValueTransformerMap.get(DEFAULT); if (transformer != null) { MarcField.Builder builder = MarcField.builder(); + if (field.isControlFieldsDisabled()) { + builder.disableControlFields(); + } builder.tag(field.getTag()).indicator(field.getIndicator()); if (field.getValue() != null) { builder.value(transformer.transform(field.getValue())); diff --git a/src/main/java/org/xbib/marc/xml/IndentingXMLEventWriter.java b/src/main/java/org/xbib/marc/xml/IndentingXMLEventWriter.java index c88a171..114a0ae 100644 --- a/src/main/java/org/xbib/marc/xml/IndentingXMLEventWriter.java +++ b/src/main/java/org/xbib/marc/xml/IndentingXMLEventWriter.java @@ -15,15 +15,6 @@ */ package org.xbib.marc.xml; -import java.util.Deque; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - import javax.xml.namespace.NamespaceContext; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventReader; @@ -32,6 +23,14 @@ import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.XMLEvent; +import java.util.Deque; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; public class IndentingXMLEventWriter implements XMLEventWriter { diff --git a/src/main/java/org/xbib/marc/xml/MarcContentHandler.java b/src/main/java/org/xbib/marc/xml/MarcContentHandler.java index 7533eff..d5e53e7 100644 --- a/src/main/java/org/xbib/marc/xml/MarcContentHandler.java +++ b/src/main/java/org/xbib/marc/xml/MarcContentHandler.java @@ -15,8 +15,6 @@ */ package org.xbib.marc.xml; -import java.util.Comparator; -import java.util.HashSet; import org.xbib.marc.MarcField; import org.xbib.marc.MarcListener; import org.xbib.marc.MarcRecord; @@ -37,8 +35,10 @@ import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import java.io.IOException; +import java.util.Comparator; import java.util.Deque; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -91,6 +91,8 @@ public class MarcContentHandler private Comparator comparator; + private boolean disabledControlFields; + public MarcContentHandler() { this.recordCounter = new AtomicInteger(); this.stack = new LinkedList<>(); @@ -175,6 +177,11 @@ public class MarcContentHandler return this; } + public MarcContentHandler disabledControlFields() { + this.disabledControlFields = true; + return this; + } + @Override public void beginCollection() { // early setup of MARC listener, even before beginRecord(format, type), it works only @@ -360,7 +367,11 @@ public class MarcContentHandler } } } - MarcField.Builder builder = MarcField.builder().tag(tag); + MarcField.Builder builder = MarcField.builder(); + if (disabledControlFields) { + builder.disableControlFields(); + } + builder.tag(tag); if (max > 0) { builder.indicator(sb.substring(min - 1, max)); } diff --git a/src/main/java/org/xbib/marc/xml/MarcXchangeEventConsumer.java b/src/main/java/org/xbib/marc/xml/MarcXchangeEventConsumer.java index 4daadfc..9de27f8 100644 --- a/src/main/java/org/xbib/marc/xml/MarcXchangeEventConsumer.java +++ b/src/main/java/org/xbib/marc/xml/MarcXchangeEventConsumer.java @@ -15,20 +15,12 @@ */ package org.xbib.marc.xml; -import java.util.HashSet; import org.xbib.marc.MarcField; import org.xbib.marc.MarcListener; import org.xbib.marc.MarcXchangeConstants; import org.xbib.marc.label.RecordLabel; import org.xbib.marc.transformer.value.MarcValueTransformers; -import java.util.Deque; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Map; -import java.util.Set; - import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; @@ -37,6 +29,13 @@ import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import javax.xml.stream.util.XMLEventConsumer; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Map; +import java.util.Set; /** * The MarcXchange event consumer listens to StaX events and converts them to MarcXchange events. @@ -63,6 +62,8 @@ public class MarcXchangeEventConsumer implements XMLEventConsumer, MarcXchangeCo private long numberOfRecords; + private boolean disabledControlFields; + public MarcXchangeEventConsumer() { this.stack = new LinkedList<>(); this.marcListeners = new HashMap<>(); @@ -95,6 +96,11 @@ public class MarcXchangeEventConsumer implements XMLEventConsumer, MarcXchangeCo return this; } + public MarcXchangeEventConsumer disableControlFields() { + this.disabledControlFields = true; + return this; + } + @Override public void beginCollection() { if (marcListener != null) { @@ -206,10 +212,12 @@ public class MarcXchangeEventConsumer implements XMLEventConsumer, MarcXchangeCo setType(thistype); beginRecord(thisformat, thistype); } - case LEADER -> { - } case CONTROLFIELD, DATAFIELD -> { - MarcField.Builder builder = MarcField.builder().tag(tag); + MarcField.Builder builder = MarcField.builder(); + if (disabledControlFields) { + builder.disableControlFields(); + } + builder.tag(tag); if (max > 0) { builder.indicator(sb.substring(min - 1, max)); } diff --git a/src/main/java/org/xbib/marc/xml/MarcXchangeWriter.java b/src/main/java/org/xbib/marc/xml/MarcXchangeWriter.java index 5dbde97..23c9079 100644 --- a/src/main/java/org/xbib/marc/xml/MarcXchangeWriter.java +++ b/src/main/java/org/xbib/marc/xml/MarcXchangeWriter.java @@ -15,7 +15,6 @@ */ package org.xbib.marc.xml; -import java.util.ArrayList; import org.xbib.marc.MarcField; import org.xbib.marc.MarcListener; import org.xbib.marc.MarcRecord; @@ -23,6 +22,15 @@ import org.xbib.marc.MarcRecordListener; import org.xbib.marc.label.RecordLabel; import org.xbib.marc.transformer.value.MarcValueTransformers; +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLEventFactory; +import javax.xml.stream.XMLEventWriter; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.Attribute; +import javax.xml.stream.events.Namespace; +import javax.xml.stream.util.XMLEventConsumer; import java.io.BufferedOutputStream; import java.io.Closeable; import java.io.Flushable; @@ -35,6 +43,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; @@ -47,16 +56,6 @@ import java.util.logging.Logger; import java.util.zip.Deflater; import java.util.zip.GZIPOutputStream; -import javax.xml.XMLConstants; -import javax.xml.namespace.QName; -import javax.xml.stream.XMLEventFactory; -import javax.xml.stream.XMLEventWriter; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.Attribute; -import javax.xml.stream.events.Namespace; -import javax.xml.stream.util.XMLEventConsumer; - /** * This MarcXchange Writer writes MarcXchange events to a StaX XML output stream or XML event consumer. * Default output format is MarcXchange. diff --git a/src/main/java/org/xbib/marc/xml/MarcXmlWriter.java b/src/main/java/org/xbib/marc/xml/MarcXmlWriter.java index 5c2e491..4a550ff 100644 --- a/src/main/java/org/xbib/marc/xml/MarcXmlWriter.java +++ b/src/main/java/org/xbib/marc/xml/MarcXmlWriter.java @@ -1,17 +1,17 @@ package org.xbib.marc.xml; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.nio.charset.StandardCharsets; -import java.util.List; import javax.xml.XMLConstants; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.Namespace; import javax.xml.stream.util.XMLEventConsumer; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.util.List; public class MarcXmlWriter extends MarcXchangeWriter { diff --git a/src/main/java/org/xbib/marc/xml/Sax2Dom.java b/src/main/java/org/xbib/marc/xml/Sax2Dom.java index 3c4b60f..c73f279 100644 --- a/src/main/java/org/xbib/marc/xml/Sax2Dom.java +++ b/src/main/java/org/xbib/marc/xml/Sax2Dom.java @@ -25,13 +25,12 @@ import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - /** * Receive SAX events and create a DOM. */