diff --git a/CHANGELOG.md b/CHANGELOG.md index 50c4e8d7002..dfb42faef45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `# - We fixed an issue when JabRef restores its session and a shared database was used: The error message "No suitable driver found" will not appear. - We fixed an issue which caused a metadata loss on reconnection to shared database. [#2219](https://github.com/JabRef/jabref/issues/2219) - We fixed an issue which caused an internal error when leaving the file path field empty and connecting to a shared database. - +- We fixed an issue where the BibLaTeX Cleanup did not move the contents of the fields `year` and `month` to the field `date`. [#2335](https://github.com/JabRef/jabref/issues/2335) ### Removed diff --git a/src/main/java/net/sf/jabref/logic/cleanup/BiblatexCleanup.java b/src/main/java/net/sf/jabref/logic/cleanup/BiblatexCleanup.java index b6948266c17..9a098de7ad0 100644 --- a/src/main/java/net/sf/jabref/logic/cleanup/BiblatexCleanup.java +++ b/src/main/java/net/sf/jabref/logic/cleanup/BiblatexCleanup.java @@ -3,13 +3,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; import net.sf.jabref.model.FieldChange; import net.sf.jabref.model.cleanup.CleanupJob; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.model.entry.EntryConverter; import net.sf.jabref.model.entry.FieldName; +import net.sf.jabref.model.strings.StringUtil; /** * Converts the entry to BibLatex format. @@ -25,32 +25,21 @@ public List cleanup(BibEntry entry) { entry.getField(oldFieldName).ifPresent(oldValue -> { if (!oldValue.isEmpty() && (!entry.getField(newFieldName).isPresent())) { // There is content in the old field and no value in the new, so just copy - entry.setField(newFieldName, oldValue); - changes.add(new FieldChange(entry, newFieldName, null, oldValue)); - - entry.clearField(oldFieldName); - changes.add(new FieldChange(entry, oldFieldName, oldValue, null)); + entry.setField(newFieldName, oldValue).ifPresent(changes::add); + entry.clearField(oldFieldName).ifPresent(changes::add); } }); } - // Dates: create date out of year and month, save it and delete old fields - entry.getField(FieldName.DATE).ifPresent(date -> { - if (date.isEmpty()) { - entry.getFieldOrAlias(FieldName.DATE).ifPresent(newDate -> { - Optional oldYear = entry.getField(FieldName.YEAR); - Optional oldMonth = entry.getField(FieldName.MONTH); - - entry.setField(FieldName.DATE, newDate); - entry.clearField(FieldName.YEAR); - entry.clearField(FieldName.MONTH); - - changes.add(new FieldChange(entry, FieldName.DATE, null, newDate)); - changes.add(new FieldChange(entry, FieldName.YEAR, oldYear.orElse(null), null)); - changes.add(new FieldChange(entry, FieldName.MONTH, oldMonth.orElse(null), null)); - }); - } - }); + // If there already exists a non blank/empty value for the field date, it is not overwritten + if (StringUtil.isBlank(entry.getField(FieldName.DATE))) { + entry.getFieldOrAlias(FieldName.DATE).ifPresent(newDate -> { + entry.setField(FieldName.DATE, newDate).ifPresent(changes::add); + entry.clearField(FieldName.YEAR).ifPresent(changes::add); + entry.clearField(FieldName.MONTH).ifPresent(changes::add); + }); + } return changes; } + } diff --git a/src/test/java/net/sf/jabref/logic/cleanup/BiblatexCleanupTest.java b/src/test/java/net/sf/jabref/logic/cleanup/BiblatexCleanupTest.java new file mode 100644 index 00000000000..8403006d581 --- /dev/null +++ b/src/test/java/net/sf/jabref/logic/cleanup/BiblatexCleanupTest.java @@ -0,0 +1,45 @@ +package net.sf.jabref.logic.cleanup; + +import java.util.Optional; + +import net.sf.jabref.model.entry.BibEntry; +import net.sf.jabref.model.entry.FieldName; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class BiblatexCleanupTest { + + private BiblatexCleanup worker; + + @Before + public void setUp() { + worker = new BiblatexCleanup(); + } + + @Test + public void convertToBiblatexMovesYearMonthToDate() { + BibEntry entry = new BibEntry(); + entry.setField("year", "2011"); + entry.setField("month", "#jan#"); + + worker.cleanup(entry); + Assert.assertEquals(Optional.empty(), entry.getField(FieldName.YEAR)); + Assert.assertEquals(Optional.empty(), entry.getField(FieldName.MONTH)); + Assert.assertEquals(Optional.of("2011-01"), entry.getField(FieldName.DATE)); + } + + @Test + public void convertToBiblatexDateAlreadyPresent() { + BibEntry entry = new BibEntry(); + entry.setField("year", "2011"); + entry.setField("month", "#jan#"); + entry.setField("date", "2012"); + + worker.cleanup(entry); + Assert.assertEquals(Optional.of("2011"), entry.getField(FieldName.YEAR)); + Assert.assertEquals(Optional.of("#jan#"), entry.getField(FieldName.MONTH)); + Assert.assertEquals(Optional.of("2012"), entry.getField(FieldName.DATE)); + } +}