diff --git a/src/main/java/org/xbib/marc/MarcRecord.java b/src/main/java/org/xbib/marc/MarcRecord.java index fcf1969..60722f0 100644 --- a/src/main/java/org/xbib/marc/MarcRecord.java +++ b/src/main/java/org/xbib/marc/MarcRecord.java @@ -21,6 +21,7 @@ import static org.xbib.marc.json.MarcJsonWriter.TYPE_TAG; import java.io.InputStream; import java.nio.charset.Charset; +import java.time.DateTimeException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; @@ -178,24 +179,38 @@ public class MarcRecord implements Map { return recordLabel; } - public LocalDate getCreationDate() { + public LocalDate getCreationDate(LocalDate defaultDate) { if (marcFields != null) { - String value = getFirst("008").recoverControlFieldValue(); - if (value != null && value.length() >= 6) { - return LocalDate.parse(value.substring(0, 6), SHORT_DATE_FORMAT); + MarcField marcField = getFirst("008"); + if (marcField != null) { + String value = marcField.recoverControlFieldValue(); + if (value != null && value.length() >= 6 && value.substring(0, 6).matches("\\d+")) { + try { + return LocalDate.parse(value.substring(0, 6), SHORT_DATE_FORMAT); + } catch (DateTimeException e) { + return defaultDate; + } + } } } - return null; + return defaultDate; } - public LocalDate getLastModificationDate() { + public LocalDate getLastModificationDate(LocalDate defaultDate) { if (marcFields != null) { - String value = getFirst("005").recoverControlFieldValue(); - if (value != null && value.length() >= 8) { - return LocalDate.parse(value.substring(0, 8), DATE_FORMAT); + MarcField marcField = getFirst("005"); + if (marcField != null) { + String value = marcField.recoverControlFieldValue(); + if (value != null && value.length() >= 8 && value.substring(0, 8).matches("\\d+")) { + try { + return LocalDate.parse(value.substring(0, 8), DATE_FORMAT); + } catch (DateTimeException e) { + return defaultDate; + } + } } } - return null; + return defaultDate; } public void filterFields(Comparator comparator) { diff --git a/src/test/java/org/xbib/marc/MarcRecordTest.java b/src/test/java/org/xbib/marc/MarcRecordTest.java index 74ce3a1..0cd0140 100644 --- a/src/test/java/org/xbib/marc/MarcRecordTest.java +++ b/src/test/java/org/xbib/marc/MarcRecordTest.java @@ -104,8 +104,8 @@ public class MarcRecordTest { .setCharset(Charset.forName("ANSEL")); // only single record for (MarcRecord marcRecord : builder.iterable()) { - assertEquals(LocalDate.of(2002, 8, 5), marcRecord.getCreationDate()); - assertEquals(LocalDate.of(2003, 6, 16), marcRecord.getLastModificationDate()); + assertEquals(LocalDate.of(2002, 8, 5), marcRecord.getCreationDate(LocalDate.now())); + assertEquals(LocalDate.of(2003, 6, 16), marcRecord.getLastModificationDate(LocalDate.now())); // check if single 245 field List list = new ArrayList<>(); Pattern pattern = Pattern.compile("^245.*");