Possible to skip bad indicators. Replace control characters with space.
[marc4j.git] / src / org / marc4j / MarcStreamReader.java
index 3fc1d9b..9b6f637 100644 (file)
@@ -28,9 +28,6 @@ import java.io.IOException;
 import java.io.InputStream;\r
 import java.io.InputStreamReader;\r
 import java.io.UnsupportedEncodingException;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
 \r
 import org.marc4j.converter.CharConverter;\r
 import org.marc4j.converter.impl.AnselToUnicode;\r
@@ -40,7 +37,6 @@ import org.marc4j.marc.Leader;
 import org.marc4j.marc.MarcFactory;\r
 import org.marc4j.marc.Record;\r
 import org.marc4j.marc.Subfield;\r
-import org.marc4j.marc.VariableField;\r
 import org.marc4j.marc.impl.Verifier;\r
 \r
 /**\r
@@ -87,6 +83,8 @@ public class MarcStreamReader implements MarcReader {
        \r
     private CharConverter converterAnsel = null;\r
 \r
+    private boolean setBadIndicators = true;\r
+\r
     /**\r
      * Constructs an instance with the specified input stream.\r
      */\r
@@ -216,7 +214,7 @@ public class MarcStreamReader implements MarcReader {
             \r
             for (int i = 0; i < size; i++) \r
             {\r
-                int fieldLength = getFieldLength(inputrec);\r
+                //int fieldLength = getFieldLength(inputrec);\r
                 if (Verifier.isControlField(tags[i])) \r
                 {\r
                     byteArray = new byte[lengths[i] - 1];\r
@@ -238,7 +236,10 @@ public class MarcStreamReader implements MarcReader {
                     inputrec.readFully(byteArray);\r
     \r
                     try {\r
-                        record.addVariableField(parseDataField(tags[i], byteArray));\r
+                      DataField dataField = parseDataField(tags[i], byteArray);\r
+                      // dataField could be null if bad indicators\r
+                      if (dataField != null) \r
+                       record.addVariableField(dataField);\r
                     } catch (IOException e) {\r
                         throw new MarcException(\r
                                 "error parsing data field for tag: " + tags[i]\r
@@ -267,9 +268,16 @@ public class MarcStreamReader implements MarcReader {
 \r
         DataField dataField = factory.newDataField();\r
         dataField.setTag(tag);\r
-        dataField.setIndicator1(ind1);\r
-        dataField.setIndicator2(ind2);\r
 \r
+        boolean badIndicatorFound = false;\r
+        if (setBadIndicators || ind1 >= ' ' )\r
+          dataField.setIndicator1(ind1);\r
+        else\r
+          badIndicatorFound = true;\r
+        if (setBadIndicators || ind2 >= ' ')\r
+          dataField.setIndicator2(ind2);\r
+        else\r
+          badIndicatorFound = true;\r
         int code;\r
         int size;\r
         int readByte;\r
@@ -298,9 +306,13 @@ public class MarcStreamReader implements MarcReader {
                 break;\r
             }\r
         }\r
+        /* Bad Indicators was found, so dropping field */\r
+        if (badIndicatorFound)\r
+          return null;\r
         return dataField;\r
     }\r
     \r
+    @SuppressWarnings("unused")\r
     private int getFieldLength(DataInputStream bais) throws IOException \r
     {\r
         bais.mark(9999);\r
@@ -409,7 +421,12 @@ public class MarcStreamReader implements MarcReader {
         else if (encoding.equals("MARC-8") || encoding.equals("MARC8"))\r
         {\r
             if (converterAnsel == null) converterAnsel = new AnselToUnicode();\r
+\r
+            for (int index = 0; index < bytes.length; index++)\r
+              if (bytes[index] < 32)\r
+               bytes[index] = ' ';\r
             dataElement = converterAnsel.convert(bytes);\r
+            //dataElement = dataElement.replaceAll("\0", " ");\r
         }\r
         else if (encoding.equals("ISO-8859-1") || encoding.equals("ISO8859_1"))\r
         {\r
@@ -422,5 +439,13 @@ public class MarcStreamReader implements MarcReader {
         }\r
         return dataElement;\r
     }\r
+\r
+    public boolean isBadIndicators() {\r
+      return setBadIndicators;\r
+    }\r
+\r
+    public void setBadIndicators(boolean trueFalse) {\r
+      this.setBadIndicators = trueFalse;\r
+    }\r
     \r
 }
\ No newline at end of file