From 6ae850ab628bec600a537aad447d04a695465d06 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 5 May 2020 13:50:15 -0400 Subject: [PATCH 01/33] Add modifier to truncate a BibTex key --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 8c0d7ff3a83..8781782375f 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -377,6 +377,11 @@ static String applyModifiers(final String label, final List parts, final } } resultingLabel = abbreviateSB.toString(); + } else if (modifier.matches("truncate[\\d]+")) { + // Truncate by keeping the first N characters and remove trailing white spaces. + int N = Integer.parseInt(modifier.substring(8)); + N = Math.min(N, resultingLabel.length()); + resultingLabel = resultingLabel.substring(0, N).stripTrailing(); } else { Optional formatter = Formatters.getFormatterForModifier(modifier); if (formatter.isPresent()) { From 19fbbb379f549068bead2f19a53b6fe37efd770c Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 5 May 2020 13:52:31 -0400 Subject: [PATCH 02/33] Add tests for the truncate BibTex key modifier --- .../BibtexKeyGeneratorTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 254a9c50bf0..a1fa67f4a8f 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -1026,6 +1026,48 @@ void generateKeyWithTwoModifiers() throws Exception { assertEquals("theinterestingtitle", BibtexKeyGenerator.generateKey(entry, "title:lower:(_)")); } + @Test + void generateKeyWithTruncate4Modifier() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.TITLE, "The Interesting Title"); + assertEquals("TheI", BibtexKeyGenerator.generateKey(entry, "title:truncate4")); + } + + @Test + void generateKeyWithTruncate5Modifier() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.TITLE, "The Interesting Title"); + assertEquals("TheIn", BibtexKeyGenerator.generateKey(entry, "title:truncate5")); + } + + @Test + void generateKeyWithTruncate6Modifier() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.TITLE, "The Interesting Title"); + assertEquals("TheInt", BibtexKeyGenerator.generateKey(entry, "title:truncate6")); + } + + @Test + void generateKeyWithShortTruncateModifier() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.TITLE, "The Interesting Title"); + assertEquals("", BibtexKeyGenerator.generateKey(entry, "title:truncate0")); + } + + @Test + void generateKeyWithLongTruncateModifier() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.TITLE, "The Interesting Title"); + assertEquals("TheInterestingTitle", BibtexKeyGenerator.generateKey(entry, "title:truncate99")); + } + + @Test + void generateKeyWithTwoTruncateModifiers() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.TITLE, "The Interesting Title"); + assertEquals("The", BibtexKeyGenerator.generateKey(entry, "title:truncate5:truncate3")); + } + @Test void generateKeyWithTitleCapitalizeModifier() throws Exception { BibEntry entry = new BibEntry(); From efb5e7268be478c80b8e5f32d94c578e9d9cb1db Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 5 May 2020 15:39:57 -0400 Subject: [PATCH 03/33] Revert "Add tests for the truncate BibTex key modifier" This reverts commit 19fbbb37 The tests were placed in the wrong file. --- .../BibtexKeyGeneratorTest.java | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index a1fa67f4a8f..254a9c50bf0 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -1026,48 +1026,6 @@ void generateKeyWithTwoModifiers() throws Exception { assertEquals("theinterestingtitle", BibtexKeyGenerator.generateKey(entry, "title:lower:(_)")); } - @Test - void generateKeyWithTruncate4Modifier() { - BibEntry entry = new BibEntry(); - entry.setField(StandardField.TITLE, "The Interesting Title"); - assertEquals("TheI", BibtexKeyGenerator.generateKey(entry, "title:truncate4")); - } - - @Test - void generateKeyWithTruncate5Modifier() { - BibEntry entry = new BibEntry(); - entry.setField(StandardField.TITLE, "The Interesting Title"); - assertEquals("TheIn", BibtexKeyGenerator.generateKey(entry, "title:truncate5")); - } - - @Test - void generateKeyWithTruncate6Modifier() { - BibEntry entry = new BibEntry(); - entry.setField(StandardField.TITLE, "The Interesting Title"); - assertEquals("TheInt", BibtexKeyGenerator.generateKey(entry, "title:truncate6")); - } - - @Test - void generateKeyWithShortTruncateModifier() { - BibEntry entry = new BibEntry(); - entry.setField(StandardField.TITLE, "The Interesting Title"); - assertEquals("", BibtexKeyGenerator.generateKey(entry, "title:truncate0")); - } - - @Test - void generateKeyWithLongTruncateModifier() { - BibEntry entry = new BibEntry(); - entry.setField(StandardField.TITLE, "The Interesting Title"); - assertEquals("TheInterestingTitle", BibtexKeyGenerator.generateKey(entry, "title:truncate99")); - } - - @Test - void generateKeyWithTwoTruncateModifiers() { - BibEntry entry = new BibEntry(); - entry.setField(StandardField.TITLE, "The Interesting Title"); - assertEquals("The", BibtexKeyGenerator.generateKey(entry, "title:truncate5:truncate3")); - } - @Test void generateKeyWithTitleCapitalizeModifier() throws Exception { BibEntry entry = new BibEntry(); From 87b4bad72960c006415f78da42de8ad5f3b12dcb Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 5 May 2020 16:21:16 -0400 Subject: [PATCH 04/33] Add tests for the truncate bracketed pattern modifier --- .../BracketedPatternTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java new file mode 100644 index 00000000000..fb0667c1027 --- /dev/null +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -0,0 +1,66 @@ +package org.jabref.logic.bibtexkeypattern; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ParseException; +import org.jabref.logic.importer.fileformat.BibtexParser; +import org.jabref.model.database.BibDatabase; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; +import org.jabref.model.util.DummyFileUpdateMonitor; +import org.jabref.model.util.FileUpdateMonitor; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Answers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; + +class BracketedPatternTest { + private static final String TITLE_STRING_THE_INTERESTING_TITLE = "The Interesting Title"; + + /** + * Test the [:truncate] modifier + */ + @Test + void applyTruncate4Modifier() { + assertEquals("The", + BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate4"), 0)); + } + + @Test + void applyTruncate5Modifier() { + assertEquals("The I", + BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate5"), 0)); + } + + @Test + void applyShortTruncateModifier() { + assertEquals("", + BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate0"), 0)); + } + + @Test + void applyLongTruncateModifier() { + assertEquals(TITLE_STRING_THE_INTERESTING_TITLE, + BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate99"), 0)); + } + + @Test + void applyTwoTruncateModifiers() { + assertEquals("The", + BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Arrays.asList("truncate5", "truncate4"), 0)); + } + + @Test + void applyEmptyTruncateModifiers() { + assertEquals(TITLE_STRING_THE_INTERESTING_TITLE, + BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate"), 0)); + } +} From 8fb49e3315ff3649b2ed5ec1bd23d39929d6d3d4 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 5 May 2020 16:32:11 -0400 Subject: [PATCH 05/33] Remove unnecessary imports in the test for the truncate bracketed pattern modifier --- .../bibtexkeypattern/BracketedPatternTest.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java index fb0667c1027..fcbfd25e4df 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -2,25 +2,10 @@ import java.util.Arrays; import java.util.Collections; -import java.util.List; -import java.util.Optional; -import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.importer.ParseException; -import org.jabref.logic.importer.fileformat.BibtexParser; -import org.jabref.model.database.BibDatabase; -import org.jabref.model.entry.BibEntry; -import org.jabref.model.entry.field.StandardField; -import org.jabref.model.util.DummyFileUpdateMonitor; -import org.jabref.model.util.FileUpdateMonitor; - -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Answers; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mock; class BracketedPatternTest { private static final String TITLE_STRING_THE_INTERESTING_TITLE = "The Interesting Title"; From b39ec9881d88ecfca4b4e319d42143b0f89e8489 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 6 May 2020 13:27:39 -0400 Subject: [PATCH 06/33] Fix code style of local variable --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 8781782375f..95d873e63d2 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -379,9 +379,9 @@ static String applyModifiers(final String label, final List parts, final resultingLabel = abbreviateSB.toString(); } else if (modifier.matches("truncate[\\d]+")) { // Truncate by keeping the first N characters and remove trailing white spaces. - int N = Integer.parseInt(modifier.substring(8)); - N = Math.min(N, resultingLabel.length()); - resultingLabel = resultingLabel.substring(0, N).stripTrailing(); + int truncateAfter = Integer.parseInt(modifier.substring(8)); + truncateAfter = Math.min(truncateAfter, resultingLabel.length()); + resultingLabel = resultingLabel.substring(0, truncateAfter).stripTrailing(); } else { Optional formatter = Formatters.getFormatterForModifier(modifier); if (formatter.isPresent()) { From 572f724de4db44a9834f719273199bde26080631 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 6 May 2020 14:43:41 -0400 Subject: [PATCH 07/33] Refactor BracketedPatternTest to maintain a parallel directory structure --- .../BracketedPatternTest.java | 238 +++++++++++++++++ .../logic/util/BracketedPatternTest.java | 244 ------------------ 2 files changed, 238 insertions(+), 244 deletions(-) delete mode 100644 src/test/java/org/jabref/logic/util/BracketedPatternTest.java diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java index fcbfd25e4df..885643ae934 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -3,11 +3,249 @@ import java.util.Arrays; import java.util.Collections; +import org.jabref.logic.bibtexkeypattern.BracketedPattern; +import org.jabref.model.database.BibDatabase; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.BibtexString; +import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.types.StandardEntryType; + +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class BracketedPatternTest { + + private BibEntry bibentry; + private BibDatabase database; + private BibEntry dbentry; + + @BeforeEach + void setUp() throws Exception { + bibentry = new BibEntry(); + bibentry.setField(StandardField.AUTHOR, "O. Kitsune"); + bibentry.setField(StandardField.YEAR, "2017"); + bibentry.setField(StandardField.PAGES, "213--216"); + + dbentry = new BibEntry(); + dbentry.setType(StandardEntryType.Article); + dbentry.setCiteKey("HipKro03"); + dbentry.setField(StandardField.AUTHOR, "Eric von Hippel and Georg von Krogh"); + dbentry.setField(StandardField.TITLE, "Open Source Software and the \"Private-Collective\" Innovation Model: Issues for Organization Science"); + dbentry.setField(StandardField.JOURNAL, "Organization Science"); + dbentry.setField(StandardField.YEAR, "2003"); + dbentry.setField(StandardField.VOLUME, "14"); + dbentry.setField(StandardField.PAGES, "209--223"); + dbentry.setField(StandardField.NUMBER, "2"); + dbentry.setField(StandardField.ADDRESS, "Institute for Operations Research and the Management Sciences (INFORMS), Linthicum, Maryland, USA"); + dbentry.setField(StandardField.DOI, "http://dx.doi.org/10.1287/orsc.14.2.209.14992"); + dbentry.setField(StandardField.ISSN, "1526-5455"); + dbentry.setField(StandardField.PUBLISHER, "INFORMS"); + + database = new BibDatabase(); + database.insertEntry(dbentry); + } + + @Test + void bibentryExpansionTest() { + BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); + assertEquals("2017_Kitsune_213", pattern.expand(bibentry)); + } + + @Test + void nullDatabaseExpansionTest() { + BibDatabase another_database = null; + BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); + assertEquals("2017_Kitsune_213", pattern.expand(bibentry, another_database)); + } + + @Test + void pureauthReturnsAuthorIfEditorIsAbsent() { + BibDatabase emptyDatabase = new BibDatabase(); + BracketedPattern pattern = new BracketedPattern("[pureauth]"); + assertEquals("Kitsune", pattern.expand(bibentry, emptyDatabase)); + } + + @Test + void pureauthReturnsAuthorIfEditorIsPresent() { + BibDatabase emptyDatabase = new BibDatabase(); + BracketedPattern pattern = new BracketedPattern("[pureauth]"); + bibentry.setField(StandardField.EDITOR, "Editorlastname, Editorfirstname"); + assertEquals("Kitsune", pattern.expand(bibentry, emptyDatabase)); + } + + @Test + void pureauthReturnsEmptyStringIfAuthorIsAbsent() { + BibDatabase emptyDatabase = new BibDatabase(); + BracketedPattern pattern = new BracketedPattern("[pureauth]"); + bibentry.clearField(StandardField.AUTHOR); + assertEquals("", pattern.expand(bibentry, emptyDatabase)); + } + + @Test + void pureauthReturnsEmptyStringIfAuthorIsAbsentAndEditorIsPresent() { + BibDatabase emptyDatabase = new BibDatabase(); + BracketedPattern pattern = new BracketedPattern("[pureauth]"); + bibentry.clearField(StandardField.AUTHOR); + bibentry.setField(StandardField.EDITOR, "Editorlastname, Editorfirstname"); + assertEquals("", pattern.expand(bibentry, emptyDatabase)); + } + + @Test + void emptyDatabaseExpansionTest() { + BibDatabase another_database = new BibDatabase(); + BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); + assertEquals("2017_Kitsune_213", pattern.expand(bibentry, another_database)); + } + + @Test + void databaseWithStringsExpansionTest() { + BibDatabase another_database = new BibDatabase(); + BibtexString string = new BibtexString("sgr", "Saulius Gražulis"); + another_database.addString(string); + bibentry = new BibEntry(); + bibentry.setField(StandardField.AUTHOR, "#sgr#"); + bibentry.setField(StandardField.YEAR, "2017"); + bibentry.setField(StandardField.PAGES, "213--216"); + BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); + assertEquals("2017_Gražulis_213", pattern.expand(bibentry, + another_database)); + } + + @Test + void unbalancedBracketsExpandToSomething() { + BracketedPattern pattern = new BracketedPattern("[year]_[auth_[firstpage]"); + assertNotEquals("", pattern.expand(bibentry)); + } + + @Test + void unbalancedLastBracketExpandsToSomething() { + BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage"); + assertNotEquals("", pattern.expand(bibentry)); + } + + @Test + void entryTypeExpansionTest() { + BracketedPattern pattern = new BracketedPattern("[entrytype]:[year]_[auth]_[pages]"); + assertEquals("Misc:2017_Kitsune_213--216", pattern.expand(bibentry)); + } + + @Test + void entryTypeExpansionLowercaseTest() { + BracketedPattern pattern = new BracketedPattern("[entrytype:lower]:[year]_[auth]_[firstpage]"); + assertEquals("misc:2017_Kitsune_213", pattern.expand(bibentry)); + } + + @Test + void suppliedBibentryBracketExpansionTest() { + BibDatabase another_database = null; + BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); + BibEntry another_bibentry = new BibEntry(); + another_bibentry.setField(StandardField.AUTHOR, "Gražulis, Saulius"); + another_bibentry.setField(StandardField.YEAR, "2017"); + another_bibentry.setField(StandardField.PAGES, "213--216"); + assertEquals("2017_Gražulis_213", pattern.expand(another_bibentry, ';', another_database)); + } + + @Test + void nullBibentryBracketExpansionTest() { + BibDatabase another_database = null; + BibEntry another_bibentry = null; + BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); + assertThrows(NullPointerException.class, () -> pattern.expand(another_bibentry, ';', another_database)); + } + + @Test + void bracketedExpressionDefaultConstructorTest() { + BibDatabase another_database = null; + BracketedPattern pattern = new BracketedPattern(); + assertThrows(NullPointerException.class, () -> pattern.expand(bibentry, ';', another_database)); + } + + @Test + void unknownKeyExpandsToEmptyString() { + assertEquals("", BracketedPattern.expandBrackets("[unknownkey]", ';', dbentry, database)); + } + + @Test + void emptyPatternAndEmptyModifierExpandsToEmptyString() { + assertEquals("", BracketedPattern.expandBrackets("[:]", ';', dbentry, database)); + } + + @Test + void emptyPatternAndValidModifierExpandsToEmptyString() { + Character separator = ';'; + assertEquals("", BracketedPattern.expandBrackets("[:lower]", separator, dbentry, database)); + } + + @Test + void bibtexkeyPatternExpandsToBibTeXKey() { + Character separator = ';'; + assertEquals("HipKro03", BracketedPattern.expandBrackets("[bibtexkey]", separator, dbentry, database)); + } + + @Test + void bibtexkeyPatternWithEmptyModifierExpandsToBibTeXKey() { + assertEquals("HipKro03", BracketedPattern.expandBrackets("[bibtexkey:]", ';', dbentry, database)); + } + + @Test + void authorPatternTreatsVonNamePrefixCorrectly() { + assertEquals("Eric von Hippel and Georg von Krogh", + BracketedPattern.expandBrackets("[author]", ';', dbentry, database)); + } + + @Test + void lowerFormatterWorksOnVonNamePrefixes() { + assertEquals("eric von hippel and georg von krogh", + BracketedPattern.expandBrackets("[author:lower]", ';', dbentry, database)); + } + + @Test + void testResolvedFieldAndFormat() { + BibEntry child = new BibEntry(); + child.setField(StandardField.CROSSREF, "HipKro03"); + database.insertEntry(child); + + Character separator = ';'; + assertEquals("Eric von Hippel and Georg von Krogh", + BracketedPattern.expandBrackets("[author]", separator, child, database)); + + assertEquals("", BracketedPattern.expandBrackets("[unknownkey]", separator, child, database)); + + assertEquals("", BracketedPattern.expandBrackets("[:]", separator, child, database)); + + assertEquals("", BracketedPattern.expandBrackets("[:lower]", separator, child, database)); + + assertEquals("eric von hippel and georg von krogh", + BracketedPattern.expandBrackets("[author:lower]", separator, child, database)); + + // the bibtexkey is not inherited + assertEquals("", BracketedPattern.expandBrackets("[bibtexkey]", separator, child, database)); + + assertEquals("", BracketedPattern.expandBrackets("[bibtexkey:]", separator, child, database)); + } + + @Test + void testResolvedParentNotInDatabase() { + BibEntry child = new BibEntry(); + child.setField(StandardField.CROSSREF, "HipKro03"); + database.removeEntry(dbentry); + database.insertEntry(child); + + assertEquals("", BracketedPattern.expandBrackets("[author]", ';', child, database)); + } + + @Test + void regularExpressionReplace() { + assertEquals("2003-JabRef Science", + BracketedPattern.expandBrackets("[year]-[journal:regex(\"Organization\",\"JabRef\")]", ';', dbentry, database)); + } + + private static final String TITLE_STRING_THE_INTERESTING_TITLE = "The Interesting Title"; /** diff --git a/src/test/java/org/jabref/logic/util/BracketedPatternTest.java b/src/test/java/org/jabref/logic/util/BracketedPatternTest.java deleted file mode 100644 index 41bfbad9622..00000000000 --- a/src/test/java/org/jabref/logic/util/BracketedPatternTest.java +++ /dev/null @@ -1,244 +0,0 @@ -package org.jabref.logic.util; - -import org.jabref.logic.bibtexkeypattern.BracketedPattern; -import org.jabref.model.database.BibDatabase; -import org.jabref.model.entry.BibEntry; -import org.jabref.model.entry.BibtexString; -import org.jabref.model.entry.field.StandardField; -import org.jabref.model.entry.types.StandardEntryType; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class BracketedPatternTest { - - private BibEntry bibentry; - private BibDatabase database; - private BibEntry dbentry; - - @BeforeEach - void setUp() throws Exception { - bibentry = new BibEntry(); - bibentry.setField(StandardField.AUTHOR, "O. Kitsune"); - bibentry.setField(StandardField.YEAR, "2017"); - bibentry.setField(StandardField.PAGES, "213--216"); - - dbentry = new BibEntry(); - dbentry.setType(StandardEntryType.Article); - dbentry.setCiteKey("HipKro03"); - dbentry.setField(StandardField.AUTHOR, "Eric von Hippel and Georg von Krogh"); - dbentry.setField(StandardField.TITLE, "Open Source Software and the \"Private-Collective\" Innovation Model: Issues for Organization Science"); - dbentry.setField(StandardField.JOURNAL, "Organization Science"); - dbentry.setField(StandardField.YEAR, "2003"); - dbentry.setField(StandardField.VOLUME, "14"); - dbentry.setField(StandardField.PAGES, "209--223"); - dbentry.setField(StandardField.NUMBER, "2"); - dbentry.setField(StandardField.ADDRESS, "Institute for Operations Research and the Management Sciences (INFORMS), Linthicum, Maryland, USA"); - dbentry.setField(StandardField.DOI, "http://dx.doi.org/10.1287/orsc.14.2.209.14992"); - dbentry.setField(StandardField.ISSN, "1526-5455"); - dbentry.setField(StandardField.PUBLISHER, "INFORMS"); - - database = new BibDatabase(); - database.insertEntry(dbentry); - } - - @Test - void bibentryExpansionTest() { - BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); - assertEquals("2017_Kitsune_213", pattern.expand(bibentry)); - } - - @Test - void nullDatabaseExpansionTest() { - BibDatabase another_database = null; - BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); - assertEquals("2017_Kitsune_213", pattern.expand(bibentry, another_database)); - } - - @Test - void pureauthReturnsAuthorIfEditorIsAbsent() { - BibDatabase emptyDatabase = new BibDatabase(); - BracketedPattern pattern = new BracketedPattern("[pureauth]"); - assertEquals("Kitsune", pattern.expand(bibentry, emptyDatabase)); - } - - @Test - void pureauthReturnsAuthorIfEditorIsPresent() { - BibDatabase emptyDatabase = new BibDatabase(); - BracketedPattern pattern = new BracketedPattern("[pureauth]"); - bibentry.setField(StandardField.EDITOR, "Editorlastname, Editorfirstname"); - assertEquals("Kitsune", pattern.expand(bibentry, emptyDatabase)); - } - - @Test - void pureauthReturnsEmptyStringIfAuthorIsAbsent() { - BibDatabase emptyDatabase = new BibDatabase(); - BracketedPattern pattern = new BracketedPattern("[pureauth]"); - bibentry.clearField(StandardField.AUTHOR); - assertEquals("", pattern.expand(bibentry, emptyDatabase)); - } - - @Test - void pureauthReturnsEmptyStringIfAuthorIsAbsentAndEditorIsPresent() { - BibDatabase emptyDatabase = new BibDatabase(); - BracketedPattern pattern = new BracketedPattern("[pureauth]"); - bibentry.clearField(StandardField.AUTHOR); - bibentry.setField(StandardField.EDITOR, "Editorlastname, Editorfirstname"); - assertEquals("", pattern.expand(bibentry, emptyDatabase)); - } - - @Test - void emptyDatabaseExpansionTest() { - BibDatabase another_database = new BibDatabase(); - BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); - assertEquals("2017_Kitsune_213", pattern.expand(bibentry, another_database)); - } - - @Test - void databaseWithStringsExpansionTest() { - BibDatabase another_database = new BibDatabase(); - BibtexString string = new BibtexString("sgr", "Saulius Gražulis"); - another_database.addString(string); - bibentry = new BibEntry(); - bibentry.setField(StandardField.AUTHOR, "#sgr#"); - bibentry.setField(StandardField.YEAR, "2017"); - bibentry.setField(StandardField.PAGES, "213--216"); - BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); - assertEquals("2017_Gražulis_213", pattern.expand(bibentry, - another_database)); - } - - @Test - void unbalancedBracketsExpandToSomething() { - BracketedPattern pattern = new BracketedPattern("[year]_[auth_[firstpage]"); - assertNotEquals("", pattern.expand(bibentry)); - } - - @Test - void unbalancedLastBracketExpandsToSomething() { - BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage"); - assertNotEquals("", pattern.expand(bibentry)); - } - - @Test - void entryTypeExpansionTest() { - BracketedPattern pattern = new BracketedPattern("[entrytype]:[year]_[auth]_[pages]"); - assertEquals("Misc:2017_Kitsune_213--216", pattern.expand(bibentry)); - } - - @Test - void entryTypeExpansionLowercaseTest() { - BracketedPattern pattern = new BracketedPattern("[entrytype:lower]:[year]_[auth]_[firstpage]"); - assertEquals("misc:2017_Kitsune_213", pattern.expand(bibentry)); - } - - @Test - void suppliedBibentryBracketExpansionTest() { - BibDatabase another_database = null; - BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); - BibEntry another_bibentry = new BibEntry(); - another_bibentry.setField(StandardField.AUTHOR, "Gražulis, Saulius"); - another_bibentry.setField(StandardField.YEAR, "2017"); - another_bibentry.setField(StandardField.PAGES, "213--216"); - assertEquals("2017_Gražulis_213", pattern.expand(another_bibentry, ';', another_database)); - } - - @Test - void nullBibentryBracketExpansionTest() { - BibDatabase another_database = null; - BibEntry another_bibentry = null; - BracketedPattern pattern = new BracketedPattern("[year]_[auth]_[firstpage]"); - assertThrows(NullPointerException.class, () -> pattern.expand(another_bibentry, ';', another_database)); - } - - @Test - void bracketedExpressionDefaultConstructorTest() { - BibDatabase another_database = null; - BracketedPattern pattern = new BracketedPattern(); - assertThrows(NullPointerException.class, () -> pattern.expand(bibentry, ';', another_database)); - } - - @Test - void unknownKeyExpandsToEmptyString() { - assertEquals("", BracketedPattern.expandBrackets("[unknownkey]", ';', dbentry, database)); - } - - @Test - void emptyPatternAndEmptyModifierExpandsToEmptyString() { - assertEquals("", BracketedPattern.expandBrackets("[:]", ';', dbentry, database)); - } - - @Test - void emptyPatternAndValidModifierExpandsToEmptyString() { - Character separator = ';'; - assertEquals("", BracketedPattern.expandBrackets("[:lower]", separator, dbentry, database)); - } - - @Test - void bibtexkeyPatternExpandsToBibTeXKey() { - Character separator = ';'; - assertEquals("HipKro03", BracketedPattern.expandBrackets("[bibtexkey]", separator, dbentry, database)); - } - - @Test - void bibtexkeyPatternWithEmptyModifierExpandsToBibTeXKey() { - assertEquals("HipKro03", BracketedPattern.expandBrackets("[bibtexkey:]", ';', dbentry, database)); - } - - @Test - void authorPatternTreatsVonNamePrefixCorrectly() { - assertEquals("Eric von Hippel and Georg von Krogh", - BracketedPattern.expandBrackets("[author]", ';', dbentry, database)); - } - - @Test - void lowerFormatterWorksOnVonNamePrefixes() { - assertEquals("eric von hippel and georg von krogh", - BracketedPattern.expandBrackets("[author:lower]", ';', dbentry, database)); - } - - @Test - void testResolvedFieldAndFormat() { - BibEntry child = new BibEntry(); - child.setField(StandardField.CROSSREF, "HipKro03"); - database.insertEntry(child); - - Character separator = ';'; - assertEquals("Eric von Hippel and Georg von Krogh", - BracketedPattern.expandBrackets("[author]", separator, child, database)); - - assertEquals("", BracketedPattern.expandBrackets("[unknownkey]", separator, child, database)); - - assertEquals("", BracketedPattern.expandBrackets("[:]", separator, child, database)); - - assertEquals("", BracketedPattern.expandBrackets("[:lower]", separator, child, database)); - - assertEquals("eric von hippel and georg von krogh", - BracketedPattern.expandBrackets("[author:lower]", separator, child, database)); - - // the bibtexkey is not inherited - assertEquals("", BracketedPattern.expandBrackets("[bibtexkey]", separator, child, database)); - - assertEquals("", BracketedPattern.expandBrackets("[bibtexkey:]", separator, child, database)); - } - - @Test - void testResolvedParentNotInDatabase() { - BibEntry child = new BibEntry(); - child.setField(StandardField.CROSSREF, "HipKro03"); - database.removeEntry(dbentry); - database.insertEntry(child); - - assertEquals("", BracketedPattern.expandBrackets("[author]", ';', child, database)); - } - - @Test - void regularExpressionReplace() { - assertEquals("2003-JabRef Science", - BracketedPattern.expandBrackets("[year]-[journal:regex(\"Organization\",\"JabRef\")]", ';', dbentry, database)); - } -} From 7e52aff90ae38cd1e9d90673d796e53568f53140 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 6 May 2020 16:24:09 -0400 Subject: [PATCH 08/33] Refactor test for the truncate BibTex key modifier --- .../BracketedPatternTest.java | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java index 885643ae934..8be2217e0ff 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -245,45 +245,42 @@ void regularExpressionReplace() { BracketedPattern.expandBrackets("[year]-[journal:regex(\"Organization\",\"JabRef\")]", ';', dbentry, database)); } - - private static final String TITLE_STRING_THE_INTERESTING_TITLE = "The Interesting Title"; - /** * Test the [:truncate] modifier */ @Test - void applyTruncate4Modifier() { - assertEquals("The", - BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate4"), 0)); + void truncateModifierRemovesTrailingWhitespace() { + assertEquals("Open", + BracketedPattern.expandBrackets("[fulltitle:truncate5]", ';', dbentry, database)); } @Test - void applyTruncate5Modifier() { - assertEquals("The I", - BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate5"), 0)); + void truncateModifierKeepsIntenalWhitespace() { + assertEquals("Open S", + BracketedPattern.expandBrackets("[fulltitle:truncate6]", ';', dbentry, database)); } @Test - void applyShortTruncateModifier() { + void truncateModifierWorksWith0Length() { assertEquals("", - BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate0"), 0)); + BracketedPattern.expandBrackets("[fulltitle:truncate0]", ';', dbentry, database)); } @Test - void applyLongTruncateModifier() { - assertEquals(TITLE_STRING_THE_INTERESTING_TITLE, - BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate99"), 0)); + void truncateModifierWorksWith9999Length() { + assertEquals("Open Source Software and the \"Private-Collective\" Innovation Model: Issues for Organization Science", + BracketedPattern.expandBrackets("[fulltitle:truncate9999]", ';', dbentry, database)); } @Test - void applyTwoTruncateModifiers() { - assertEquals("The", - BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Arrays.asList("truncate5", "truncate4"), 0)); + void truncateModifiersWorksAppliedTwice() { + assertEquals("Open", + BracketedPattern.expandBrackets("[fulltitle:truncate6:truncate5]", ';', dbentry, database)); } @Test - void applyEmptyTruncateModifiers() { - assertEquals(TITLE_STRING_THE_INTERESTING_TITLE, - BracketedPattern.applyModifiers(TITLE_STRING_THE_INTERESTING_TITLE, Collections.singletonList("truncate"), 0)); + void truncateModifierIsIgnoredWithoutAnArgument() { + assertEquals("Open Source Software and the \"Private-Collective\" Innovation Model: Issues for Organization Science", + BracketedPattern.expandBrackets("[fulltitle:truncate]", ';', dbentry, database)); } } From f23e888ba86d2dfe3a3f14cf8710c7b4a240a26e Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 6 May 2020 16:35:27 -0400 Subject: [PATCH 09/33] Drop unused and unnecessary imports from BracketedPatternTest.java --- .../jabref/logic/bibtexkeypattern/BracketedPatternTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java index 8be2217e0ff..69df8c9b891 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -1,9 +1,5 @@ package org.jabref.logic.bibtexkeypattern; -import java.util.Arrays; -import java.util.Collections; - -import org.jabref.logic.bibtexkeypattern.BracketedPattern; import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.BibtexString; From 895f302610527cd2c5b5f22e8a628d75e5920756 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Thu, 7 May 2020 15:39:12 -0400 Subject: [PATCH 10/33] Refactor truncate modifier to be compatible with Formatters --- .../bibtexkeypattern/BracketedPattern.java | 5 -- .../jabref/logic/formatter/Formatters.java | 4 ++ .../formatter/minifier/TruncateFormatter.java | 47 +++++++++++++++++++ src/main/resources/l10n/JabRef_en.properties | 2 + 4 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 95d873e63d2..8c0d7ff3a83 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -377,11 +377,6 @@ static String applyModifiers(final String label, final List parts, final } } resultingLabel = abbreviateSB.toString(); - } else if (modifier.matches("truncate[\\d]+")) { - // Truncate by keeping the first N characters and remove trailing white spaces. - int truncateAfter = Integer.parseInt(modifier.substring(8)); - truncateAfter = Math.min(truncateAfter, resultingLabel.length()); - resultingLabel = resultingLabel.substring(0, truncateAfter).stripTrailing(); } else { Optional formatter = Formatters.getFormatterForModifier(modifier); if (formatter.isPresent()) { diff --git a/src/main/java/org/jabref/logic/formatter/Formatters.java b/src/main/java/org/jabref/logic/formatter/Formatters.java index b4ea94dad43..d9a0c91f7ae 100644 --- a/src/main/java/org/jabref/logic/formatter/Formatters.java +++ b/src/main/java/org/jabref/logic/formatter/Formatters.java @@ -29,6 +29,7 @@ import org.jabref.logic.formatter.casechanger.TitleCaseFormatter; import org.jabref.logic.formatter.casechanger.UpperCaseFormatter; import org.jabref.logic.formatter.minifier.MinifyNameListFormatter; +import org.jabref.logic.formatter.minifier.TruncateFormatter; import org.jabref.logic.layout.format.LatexToUnicodeFormatter; import org.jabref.model.cleanup.Formatter; @@ -102,6 +103,9 @@ public static Optional getFormatterForModifier(String modifier) { if (modifier.startsWith(RegexFormatter.KEY)) { String regex = modifier.substring(RegexFormatter.KEY.length()); return Optional.of(new RegexFormatter(regex)); + } else if (modifier.matches(TruncateFormatter.KEY + "\\d+")) { + int truncateAfter = Integer.parseInt(modifier.substring(TruncateFormatter.KEY.length())); + return Optional.of(new TruncateFormatter(truncateAfter)); } else { return getAll().stream().filter(f -> f.getKey().equals(modifier)).findAny(); } diff --git a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java new file mode 100644 index 00000000000..ac92353304f --- /dev/null +++ b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java @@ -0,0 +1,47 @@ +package org.jabref.logic.formatter.minifier; + +import org.jabref.logic.l10n.Localization; +import org.jabref.model.cleanup.Formatter; + +public class TruncateFormatter extends Formatter { + public static final String KEY = "truncate"; + private static Integer truncateAfter; + + /** + * The TruncateFormatter truncates a string after the given index. + * + * @param truncateIndex truncate a string after this index. + */ + public TruncateFormatter(int truncateIndex) { + truncateAfter = truncateIndex; + } + + @Override + public String getName() { + return Localization.lang("Truncate"); + } + + @Override + public String getKey() { + return KEY; + } + + /** + * Truncates a string after a given index. + */ + @Override + public String format(final String input) { + final int truncateIndex = Math.min(truncateAfter, input.length()); + return input.substring(0, truncateIndex).stripTrailing(); + } + + @Override + public String getDescription() { + return Localization.lang("Truncates a string after a given index."); + } + + @Override + public String getExampleInput() { + return "Truncate this sentence."; + } +} diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 9d5fddce4ec..6eba2c03783 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2233,3 +2233,5 @@ Computer\ software.\ The\ standard\ styles\ will\ treat\ this\ entry\ type\ as\ A\ data\ set\ or\ a\ similar\ collection\ of\ (mostly)\ raw\ data.=A data set or a similar collection of (mostly) raw data. Display\ count\ of\ items\ in\ group=Display count of items in group +Truncate=Truncate +Truncates\ a\ string\ after\ a\ given\ index.=Truncates a string after a given index. From 4e54476b1ffd41578657b902a3e6952a92939b72 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Thu, 7 May 2020 15:39:48 -0400 Subject: [PATCH 11/33] Fix type in truncate modifier test --- .../org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java index 69df8c9b891..d4e1d0aedc9 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -251,7 +251,7 @@ void truncateModifierRemovesTrailingWhitespace() { } @Test - void truncateModifierKeepsIntenalWhitespace() { + void truncateModifierKeepsInternalWhitespace() { assertEquals("Open S", BracketedPattern.expandBrackets("[fulltitle:truncate6]", ';', dbentry, database)); } From 9ace66bf52212998a3e833f12984df9de50b125c Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Thu, 7 May 2020 16:58:54 -0400 Subject: [PATCH 12/33] Add check for Null in format --- .../org/jabref/logic/formatter/minifier/TruncateFormatter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java index ac92353304f..419782d7d8c 100644 --- a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java +++ b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java @@ -1,5 +1,7 @@ package org.jabref.logic.formatter.minifier; +import java.util.Objects; + import org.jabref.logic.l10n.Localization; import org.jabref.model.cleanup.Formatter; @@ -31,6 +33,7 @@ public String getKey() { */ @Override public String format(final String input) { + Objects.requireNonNull(input); final int truncateIndex = Math.min(truncateAfter, input.length()); return input.substring(0, truncateIndex).stripTrailing(); } From cceb55d1223e5fc15c0816572b70a9ae7e02bd0a Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 8 May 2020 10:30:09 -0400 Subject: [PATCH 13/33] Refactor tests for truncate modifier --- .../BracketedPatternTest.java | 24 ------------- .../minifier/TruncateFormatterTest.java | 36 +++++++++++++++++++ 2 files changed, 36 insertions(+), 24 deletions(-) create mode 100644 src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java index d4e1d0aedc9..1dca378437b 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -244,30 +244,6 @@ void regularExpressionReplace() { /** * Test the [:truncate] modifier */ - @Test - void truncateModifierRemovesTrailingWhitespace() { - assertEquals("Open", - BracketedPattern.expandBrackets("[fulltitle:truncate5]", ';', dbentry, database)); - } - - @Test - void truncateModifierKeepsInternalWhitespace() { - assertEquals("Open S", - BracketedPattern.expandBrackets("[fulltitle:truncate6]", ';', dbentry, database)); - } - - @Test - void truncateModifierWorksWith0Length() { - assertEquals("", - BracketedPattern.expandBrackets("[fulltitle:truncate0]", ';', dbentry, database)); - } - - @Test - void truncateModifierWorksWith9999Length() { - assertEquals("Open Source Software and the \"Private-Collective\" Innovation Model: Issues for Organization Science", - BracketedPattern.expandBrackets("[fulltitle:truncate9999]", ';', dbentry, database)); - } - @Test void truncateModifiersWorksAppliedTwice() { assertEquals("Open", diff --git a/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java b/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java new file mode 100644 index 00000000000..dcf098518d9 --- /dev/null +++ b/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java @@ -0,0 +1,36 @@ +package org.jabref.logic.formatter.minifier; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Tests in addition to the general tests from {@link org.jabref.logic.formatter.FormatterTest} + */ +public class TruncateFormatterTest { + private final String TITLE = "A Title"; + + @Test + void truncateModifierWorksWith0Length() { + TruncateFormatter formatter = new TruncateFormatter(0); + assertEquals("", formatter.format(TITLE)); + } + + @Test + void truncateModifierRemovesTrailingWhitespace() { + TruncateFormatter formatter = new TruncateFormatter(2); + assertEquals("A", formatter.format(TITLE)); + } + + @Test + void truncateModifierKeepsInternalWhitespace() { + TruncateFormatter formatter = new TruncateFormatter(3); + assertEquals("A T", formatter.format(TITLE)); + } + + @Test + void truncateModifierWorksWith9999Length() { + TruncateFormatter formatter = new TruncateFormatter(9999); + assertEquals(TITLE, formatter.format(TITLE)); + } +} From e35e79d10b868996c5564c506fec88ee502d7e20 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 8 May 2020 10:31:34 -0400 Subject: [PATCH 14/33] Add truncation for long directory names --- src/main/java/org/jabref/logic/util/io/FileUtil.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/logic/util/io/FileUtil.java b/src/main/java/org/jabref/logic/util/io/FileUtil.java index 58d64fe984e..615a90dd9de 100644 --- a/src/main/java/org/jabref/logic/util/io/FileUtil.java +++ b/src/main/java/org/jabref/logic/util/io/FileUtil.java @@ -288,6 +288,9 @@ public static String createDirNameFromPattern(BibDatabase database, BibEntry ent // Removes illegal characters from filename targetName = FileNameCleaner.cleanDirectoryName(targetName); + + // Truncates long directory names + targetName = getValidFileName(targetName); return targetName; } From b48bc4681ec44c142ce371633812dd062596b482 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 8 May 2020 10:45:41 -0400 Subject: [PATCH 15/33] Fix name and documentation of createDirNameFromPattern --- src/main/java/org/jabref/logic/util/io/FileUtil.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/logic/util/io/FileUtil.java b/src/main/java/org/jabref/logic/util/io/FileUtil.java index 615a90dd9de..4d4ecfc2918 100644 --- a/src/main/java/org/jabref/logic/util/io/FileUtil.java +++ b/src/main/java/org/jabref/logic/util/io/FileUtil.java @@ -272,15 +272,15 @@ public static String createFileNameFromPattern(BibDatabase database, BibEntry en } /** - * Determines filename provided by an entry in a database + * Determines directory name provided by an entry in a database * * @param database the database, where the entry is located - * @param entry the entry to which the file should be linked to - * @param fileNamePattern the filename pattern - * @return a suggested fileName + * @param entry the entry to which the directory should be linked to + * @param directoryNamePattern the dirname pattern + * @return a suggested dirName */ - public static String createDirNameFromPattern(BibDatabase database, BibEntry entry, String fileNamePattern) { - String targetName = BracketedPattern.expandBrackets(fileNamePattern, ';', entry, database); + public static String createDirNameFromPattern(BibDatabase database, BibEntry entry, String directoryNamePattern) { + String targetName = BracketedPattern.expandBrackets(directoryNamePattern, ';', entry, database); if (targetName.isEmpty()) { targetName = entry.getCiteKeyOptional().orElse("default"); From d6f2bf9c8da72af56c0a7e6302d6d7c2c37b2636 Mon Sep 17 00:00:00 2001 From: k3KAW8Pnf7mkmdSMPHz27 <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 8 May 2020 14:48:30 -0400 Subject: [PATCH 16/33] Update src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java Co-authored-by: Christoph --- .../org/jabref/logic/formatter/minifier/TruncateFormatter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java index 419782d7d8c..17d56f6388f 100644 --- a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java +++ b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java @@ -6,7 +6,7 @@ import org.jabref.model.cleanup.Formatter; public class TruncateFormatter extends Formatter { - public static final String KEY = "truncate"; + private static final String KEY = "truncate"; private static Integer truncateAfter; /** From 2a04bf2655be123a6a5124d4c9f1a8d4c29f24ea Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 8 May 2020 16:39:57 -0400 Subject: [PATCH 17/33] Fix matching the modifier String to a TruncateFormatter --- src/main/java/org/jabref/logic/formatter/Formatters.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/formatter/Formatters.java b/src/main/java/org/jabref/logic/formatter/Formatters.java index d9a0c91f7ae..5fc437137e6 100644 --- a/src/main/java/org/jabref/logic/formatter/Formatters.java +++ b/src/main/java/org/jabref/logic/formatter/Formatters.java @@ -103,8 +103,8 @@ public static Optional getFormatterForModifier(String modifier) { if (modifier.startsWith(RegexFormatter.KEY)) { String regex = modifier.substring(RegexFormatter.KEY.length()); return Optional.of(new RegexFormatter(regex)); - } else if (modifier.matches(TruncateFormatter.KEY + "\\d+")) { - int truncateAfter = Integer.parseInt(modifier.substring(TruncateFormatter.KEY.length())); + } else if (modifier.matches("\\Atruncate\\d+\\z")) { + int truncateAfter = Integer.parseInt(modifier.substring(8)); return Optional.of(new TruncateFormatter(truncateAfter)); } else { return getAll().stream().filter(f -> f.getKey().equals(modifier)).findAny(); From 5f8cc56a1c901c9f749e5a00c43b191a7653e1fc Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 8 May 2020 16:42:13 -0400 Subject: [PATCH 18/33] Fix encapsulation and naming in TruncateFormatter --- .../logic/formatter/minifier/TruncateFormatter.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java index 419782d7d8c..1b980fbe2f7 100644 --- a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java +++ b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java @@ -6,16 +6,17 @@ import org.jabref.model.cleanup.Formatter; public class TruncateFormatter extends Formatter { - public static final String KEY = "truncate"; - private static Integer truncateAfter; + private final int TRUNCATE_AFTER; + private final String KEY; /** * The TruncateFormatter truncates a string after the given index. * * @param truncateIndex truncate a string after this index. */ - public TruncateFormatter(int truncateIndex) { - truncateAfter = truncateIndex; + public TruncateFormatter(final int truncateIndex) { + TRUNCATE_AFTER = truncateIndex; + KEY = "truncate" + TRUNCATE_AFTER; } @Override @@ -34,8 +35,8 @@ public String getKey() { @Override public String format(final String input) { Objects.requireNonNull(input); - final int truncateIndex = Math.min(truncateAfter, input.length()); - return input.substring(0, truncateIndex).stripTrailing(); + final int index = Math.min(TRUNCATE_AFTER, input.length()); + return input.substring(0, index).stripTrailing(); } @Override From 544a05dd1320f0ffbf8b162032aac472ec2a5612 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 8 May 2020 16:42:31 -0400 Subject: [PATCH 19/33] Fix JavaDoc in TruncateFormatter --- .../jabref/logic/formatter/minifier/TruncateFormatter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java index 1b980fbe2f7..25821de9588 100644 --- a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java +++ b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java @@ -10,7 +10,7 @@ public class TruncateFormatter extends Formatter { private final String KEY; /** - * The TruncateFormatter truncates a string after the given index. + * The TruncateFormatter truncates a string after the given index and removes trailing whitespaces. * * @param truncateIndex truncate a string after this index. */ @@ -30,7 +30,7 @@ public String getKey() { } /** - * Truncates a string after a given index. + * Truncates a string after the given index. */ @Override public String format(final String input) { From deeaf2b74b24198a17e68449181969b3d7ae1378 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 8 May 2020 17:40:04 -0400 Subject: [PATCH 20/33] Add changes to CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1046088013..800d2f0293b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We now show the number of items found and selected to import in the online search dialog. [#6248](https://github.com/JabRef/jabref/pull/6248) - We created a new install screen for macOS. [#5759](https://github.com/JabRef/jabref/issues/5759) - We implemented an option to download fulltext files while importing. [#6381](https://github.com/JabRef/jabref/pull/6381) +- We added a BibTex key modifier for truncating strings. [#3915](https://github.com/JabRef/jabref/issues/3915) ### Changed @@ -50,6 +51,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We fixed an issue where JabRef switched to discrete graphics under macOS [#5935](https://github.com/JabRef/jabref/issues/5935) - We fixed an issue where the Preferences entry preview will be unexpected modified leads to Value too long exception [#6198](https://github.com/JabRef/jabref/issues/6198) - We fixed an issue where custom jstyles for Open/LibreOffice would only be valid if a layout line for the entry type `default` was at the end of the layout section [#6303](https://github.com/JabRef/jabref/issues/6303) +- We fixed an issue where long directory names created from patterns could create an exception. [#3915](https://github.com/JabRef/jabref/issues/3915) ### Removed From d1677b7736e49059023ae9c8332e743e3c14ae65 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Sat, 9 May 2020 17:30:58 -0400 Subject: [PATCH 21/33] Fix createDirNameFromPattern to verify names of subfolders --- src/main/java/org/jabref/logic/util/io/FileUtil.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/util/io/FileUtil.java b/src/main/java/org/jabref/logic/util/io/FileUtil.java index 4d4ecfc2918..6d1b7d381eb 100644 --- a/src/main/java/org/jabref/logic/util/io/FileUtil.java +++ b/src/main/java/org/jabref/logic/util/io/FileUtil.java @@ -286,11 +286,13 @@ public static String createDirNameFromPattern(BibDatabase database, BibEntry ent targetName = entry.getCiteKeyOptional().orElse("default"); } - // Removes illegal characters from filename + // Removes illegal characters from directory name targetName = FileNameCleaner.cleanDirectoryName(targetName); - // Truncates long directory names - targetName = getValidFileName(targetName); + // Only use valid filenames for the directories in the path + targetName = Arrays.stream(targetName.split(Pattern.quote(File.separator))) + .map(FileUtil::getValidFileName) + .collect(Collectors.joining(File.separator)); return targetName; } From 7d1c54b5121809f45491818841edf5c1d58f5964 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Sat, 9 May 2020 17:32:11 -0400 Subject: [PATCH 22/33] Add tests for long directory names --- .../jabref/logic/util/io/FileUtilTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/org/jabref/logic/util/io/FileUtilTest.java b/src/test/java/org/jabref/logic/util/io/FileUtilTest.java index f7bec14536d..b96e916bfd0 100644 --- a/src/test/java/org/jabref/logic/util/io/FileUtilTest.java +++ b/src/test/java/org/jabref/logic/util/io/FileUtilTest.java @@ -1,5 +1,6 @@ package org.jabref.logic.util.io; +import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -380,4 +381,22 @@ public void testIsNotBibFile() throws IOException { Path bibFile = Files.createFile(rootDir.resolve("test.pdf")); assertFalse(FileUtil.isBibFile(bibFile)); } + + @Test + void createDirNameTruncatesLongDirName() { + String fileNamePattern = "[fulltitle]" + (File.separator + "[fulltitle]").repeat(2); + BibEntry entry = new BibEntry(); + entry.setField(StandardField.TITLE, "a".repeat(300)); + assertEquals("a".repeat(255) + (File.separator + "a".repeat(255)).repeat(2), + FileUtil.createDirNameFromPattern(null, entry, fileNamePattern)); + } + + @Test + void createDirNameAllowsCorrectDirName() { + String fileNamePattern = "[fulltitle]" + (File.separator + "[fulltitle]").repeat(2); + BibEntry entry = new BibEntry(); + entry.setField(StandardField.TITLE, "a".repeat(100)); + assertEquals("a".repeat(100) + (File.separator + "a".repeat(100)).repeat(2), + FileUtil.createDirNameFromPattern(null, entry, fileNamePattern)); + } } From d6678568270ba4637d90513787a4a8bf9d17fe88 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Sat, 9 May 2020 17:45:44 -0400 Subject: [PATCH 23/33] Fix truncate with negative integer --- .../jabref/logic/formatter/minifier/TruncateFormatter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java index 25821de9588..272f700e882 100644 --- a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java +++ b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java @@ -35,6 +35,10 @@ public String getKey() { @Override public String format(final String input) { Objects.requireNonNull(input); + if (TRUNCATE_AFTER < 0) { + return input; + } + final int index = Math.min(TRUNCATE_AFTER, input.length()); return input.substring(0, index).stripTrailing(); } From 93470e28a11ee9a207547161630e9a855f8ef3a5 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Sat, 9 May 2020 18:15:46 -0400 Subject: [PATCH 24/33] Add test with negative index --- .../logic/formatter/minifier/TruncateFormatterTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java b/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java index dcf098518d9..6a24340544f 100644 --- a/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java +++ b/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java @@ -33,4 +33,10 @@ void truncateModifierWorksWith9999Length() { TruncateFormatter formatter = new TruncateFormatter(9999); assertEquals(TITLE, formatter.format(TITLE)); } + + @Test + void truncateModifierIgnoreNegativeIndex() { + TruncateFormatter formatter = new TruncateFormatter(-1); + assertEquals(TITLE, formatter.format(TITLE)); + } } From 5d97d35f5b35daa2e82cd0854def248898b5a745 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Sat, 9 May 2020 18:16:42 -0400 Subject: [PATCH 25/33] Add test with invalid data --- .../formatter/minifier/TruncateFormatterTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java b/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java index 6a24340544f..fcdd2b75a82 100644 --- a/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java +++ b/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Tests in addition to the general tests from {@link org.jabref.logic.formatter.FormatterTest} @@ -39,4 +40,16 @@ void truncateModifierIgnoreNegativeIndex() { TruncateFormatter formatter = new TruncateFormatter(-1); assertEquals(TITLE, formatter.format(TITLE)); } + + @Test + void truncateModifierWorksWithEmptyString() { + TruncateFormatter formatter = new TruncateFormatter(9999); + assertEquals("", formatter.format("")); + } + + @Test + void truncateModifierThrowsExceptionNullString() { + TruncateFormatter formatter = new TruncateFormatter(9999); + assertThrows(NullPointerException.class, () -> formatter.format(null)); + } } From 47be1367dff64f2ebbb9b22dd24e9b54f57d2cba Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Sat, 9 May 2020 18:18:43 -0400 Subject: [PATCH 26/33] Refactor names of truncate tests --- .../formatter/minifier/TruncateFormatterTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java b/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java index fcdd2b75a82..e6a5f50b1f3 100644 --- a/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java +++ b/src/test/java/org/jabref/logic/formatter/minifier/TruncateFormatterTest.java @@ -12,43 +12,43 @@ public class TruncateFormatterTest { private final String TITLE = "A Title"; @Test - void truncateModifierWorksWith0Length() { + void formatWorksWith0Index() { TruncateFormatter formatter = new TruncateFormatter(0); assertEquals("", formatter.format(TITLE)); } @Test - void truncateModifierRemovesTrailingWhitespace() { + void formatRemovesTrailingWhitespace() { TruncateFormatter formatter = new TruncateFormatter(2); assertEquals("A", formatter.format(TITLE)); } @Test - void truncateModifierKeepsInternalWhitespace() { + void formatKeepsInternalWhitespace() { TruncateFormatter formatter = new TruncateFormatter(3); assertEquals("A T", formatter.format(TITLE)); } @Test - void truncateModifierWorksWith9999Length() { + void formatWorksWith9999Length() { TruncateFormatter formatter = new TruncateFormatter(9999); assertEquals(TITLE, formatter.format(TITLE)); } @Test - void truncateModifierIgnoreNegativeIndex() { + void formatIgnoresNegativeIndex() { TruncateFormatter formatter = new TruncateFormatter(-1); assertEquals(TITLE, formatter.format(TITLE)); } @Test - void truncateModifierWorksWithEmptyString() { + void formatWorksWithEmptyString() { TruncateFormatter formatter = new TruncateFormatter(9999); assertEquals("", formatter.format("")); } @Test - void truncateModifierThrowsExceptionNullString() { + void formatThrowsExceptionNullString() { TruncateFormatter formatter = new TruncateFormatter(9999); assertThrows(NullPointerException.class, () -> formatter.format(null)); } From b1af7775c884bf4db2f5c76978d9e350b6229822 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Mon, 11 May 2020 09:23:49 -0400 Subject: [PATCH 27/33] Add TruncateFormatter to general Formatter tests --- .../java/org/jabref/logic/formatter/FormatterTest.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/jabref/logic/formatter/FormatterTest.java b/src/test/java/org/jabref/logic/formatter/FormatterTest.java index 316fc9142c7..412483c5907 100644 --- a/src/test/java/org/jabref/logic/formatter/FormatterTest.java +++ b/src/test/java/org/jabref/logic/formatter/FormatterTest.java @@ -6,6 +6,7 @@ import java.util.stream.Stream; import org.jabref.logic.formatter.casechanger.ProtectTermsFormatter; +import org.jabref.logic.formatter.minifier.TruncateFormatter; import org.jabref.logic.protectedterms.ProtectedTermsLoader; import org.jabref.logic.protectedterms.ProtectedTermsPreferences; import org.jabref.model.cleanup.Formatter; @@ -111,10 +112,12 @@ public static Stream getFormatters() { Formatters.getAll().stream(), // following formatters are not contained in the list of all formatters, because // - the IdentityFormatter is not offered to the user, - // - the ProtectTermsFormatter needs more configuration + // - the ProtectTermsFormatter needs more configuration, + // - the TruncateFormatter needs setup, Stream.of( new IdentityFormatter(), - new ProtectTermsFormatter(protectedTermsLoader))); + new ProtectTermsFormatter(protectedTermsLoader), + new TruncateFormatter(0))); // @formatter:on } } From 20487a55be3adc9ae06e7a2cb94596413762215d Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Mon, 11 May 2020 09:24:38 -0400 Subject: [PATCH 28/33] Fix truncate with negative index --- .../jabref/logic/formatter/minifier/TruncateFormatter.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java index 272f700e882..200fcf3e867 100644 --- a/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java +++ b/src/main/java/org/jabref/logic/formatter/minifier/TruncateFormatter.java @@ -15,7 +15,7 @@ public class TruncateFormatter extends Formatter { * @param truncateIndex truncate a string after this index. */ public TruncateFormatter(final int truncateIndex) { - TRUNCATE_AFTER = truncateIndex; + TRUNCATE_AFTER = (truncateIndex >= 0) ? truncateIndex : Integer.MAX_VALUE; KEY = "truncate" + TRUNCATE_AFTER; } @@ -35,10 +35,6 @@ public String getKey() { @Override public String format(final String input) { Objects.requireNonNull(input); - if (TRUNCATE_AFTER < 0) { - return input; - } - final int index = Math.min(TRUNCATE_AFTER, input.length()); return input.substring(0, index).stripTrailing(); } From 1f7f2eed346ff961e9856aa185caad910671cfd0 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Mon, 11 May 2020 10:24:39 -0400 Subject: [PATCH 29/33] Drop truncation of long directory names --- .../org/jabref/logic/util/io/FileUtil.java | 4 ---- .../jabref/logic/util/io/FileUtilTest.java | 19 ------------------- 2 files changed, 23 deletions(-) diff --git a/src/main/java/org/jabref/logic/util/io/FileUtil.java b/src/main/java/org/jabref/logic/util/io/FileUtil.java index 6d1b7d381eb..eaf1e4a7bd3 100644 --- a/src/main/java/org/jabref/logic/util/io/FileUtil.java +++ b/src/main/java/org/jabref/logic/util/io/FileUtil.java @@ -289,10 +289,6 @@ public static String createDirNameFromPattern(BibDatabase database, BibEntry ent // Removes illegal characters from directory name targetName = FileNameCleaner.cleanDirectoryName(targetName); - // Only use valid filenames for the directories in the path - targetName = Arrays.stream(targetName.split(Pattern.quote(File.separator))) - .map(FileUtil::getValidFileName) - .collect(Collectors.joining(File.separator)); return targetName; } diff --git a/src/test/java/org/jabref/logic/util/io/FileUtilTest.java b/src/test/java/org/jabref/logic/util/io/FileUtilTest.java index b96e916bfd0..f7bec14536d 100644 --- a/src/test/java/org/jabref/logic/util/io/FileUtilTest.java +++ b/src/test/java/org/jabref/logic/util/io/FileUtilTest.java @@ -1,6 +1,5 @@ package org.jabref.logic.util.io; -import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -381,22 +380,4 @@ public void testIsNotBibFile() throws IOException { Path bibFile = Files.createFile(rootDir.resolve("test.pdf")); assertFalse(FileUtil.isBibFile(bibFile)); } - - @Test - void createDirNameTruncatesLongDirName() { - String fileNamePattern = "[fulltitle]" + (File.separator + "[fulltitle]").repeat(2); - BibEntry entry = new BibEntry(); - entry.setField(StandardField.TITLE, "a".repeat(300)); - assertEquals("a".repeat(255) + (File.separator + "a".repeat(255)).repeat(2), - FileUtil.createDirNameFromPattern(null, entry, fileNamePattern)); - } - - @Test - void createDirNameAllowsCorrectDirName() { - String fileNamePattern = "[fulltitle]" + (File.separator + "[fulltitle]").repeat(2); - BibEntry entry = new BibEntry(); - entry.setField(StandardField.TITLE, "a".repeat(100)); - assertEquals("a".repeat(100) + (File.separator + "a".repeat(100)).repeat(2), - FileUtil.createDirNameFromPattern(null, entry, fileNamePattern)); - } } From 59c24652658c9d59e73dad6e567c148563a0e0fa Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Mon, 11 May 2020 11:10:16 -0400 Subject: [PATCH 30/33] Fix mating truncate in Formatters.java Change to use a precompiled pattern for matching 'truncateN' --- src/main/java/org/jabref/logic/formatter/Formatters.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/formatter/Formatters.java b/src/main/java/org/jabref/logic/formatter/Formatters.java index 5fc437137e6..405c854a1ec 100644 --- a/src/main/java/org/jabref/logic/formatter/Formatters.java +++ b/src/main/java/org/jabref/logic/formatter/Formatters.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.regex.Pattern; import org.jabref.logic.formatter.bibtexfields.CleanupUrlFormatter; import org.jabref.logic.formatter.bibtexfields.ClearFormatter; @@ -34,6 +35,7 @@ import org.jabref.model.cleanup.Formatter; public class Formatters { + private static final Pattern TRUNCATE_PATTERN = Pattern.compile("\\Atruncate\\d+\\z"); private Formatters() { } @@ -103,7 +105,7 @@ public static Optional getFormatterForModifier(String modifier) { if (modifier.startsWith(RegexFormatter.KEY)) { String regex = modifier.substring(RegexFormatter.KEY.length()); return Optional.of(new RegexFormatter(regex)); - } else if (modifier.matches("\\Atruncate\\d+\\z")) { + } else if (TRUNCATE_PATTERN.matcher(modifier).matches()) { int truncateAfter = Integer.parseInt(modifier.substring(8)); return Optional.of(new TruncateFormatter(truncateAfter)); } else { From 452ad9606811cbe35b1441fe018c7937bcf6c667 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Mon, 11 May 2020 11:10:16 -0400 Subject: [PATCH 31/33] Fix matching `truncateN` in Formatters.java Change to use a precompiled pattern for matching 'truncateN' --- src/main/java/org/jabref/logic/formatter/Formatters.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/formatter/Formatters.java b/src/main/java/org/jabref/logic/formatter/Formatters.java index 5fc437137e6..405c854a1ec 100644 --- a/src/main/java/org/jabref/logic/formatter/Formatters.java +++ b/src/main/java/org/jabref/logic/formatter/Formatters.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.regex.Pattern; import org.jabref.logic.formatter.bibtexfields.CleanupUrlFormatter; import org.jabref.logic.formatter.bibtexfields.ClearFormatter; @@ -34,6 +35,7 @@ import org.jabref.model.cleanup.Formatter; public class Formatters { + private static final Pattern TRUNCATE_PATTERN = Pattern.compile("\\Atruncate\\d+\\z"); private Formatters() { } @@ -103,7 +105,7 @@ public static Optional getFormatterForModifier(String modifier) { if (modifier.startsWith(RegexFormatter.KEY)) { String regex = modifier.substring(RegexFormatter.KEY.length()); return Optional.of(new RegexFormatter(regex)); - } else if (modifier.matches("\\Atruncate\\d+\\z")) { + } else if (TRUNCATE_PATTERN.matcher(modifier).matches()) { int truncateAfter = Integer.parseInt(modifier.substring(8)); return Optional.of(new TruncateFormatter(truncateAfter)); } else { From 6a7a2119688bf57ebee2261a49ca4f688721eb0c Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 12 May 2020 09:44:36 -0400 Subject: [PATCH 32/33] Resolve conflicts --- .../jabref/logic/bibtexkeypattern/BracketedPatternTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java index dc58bbaa552..26ed8a9c3be 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -1,6 +1,5 @@ -package org.jabref.logic.util; +package org.jabref.logic.bibtexkeypattern; -import org.jabref.logic.bibtexkeypattern.BracketedPattern; import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.BibtexString; @@ -21,7 +20,7 @@ class BracketedPatternTest { private BibEntry dbentry; @BeforeEach - void setUp() throws Exception { + void setUp() { bibentry = new BibEntry(); bibentry.setField(StandardField.AUTHOR, "O. Kitsune"); bibentry.setField(StandardField.YEAR, "2017"); From 859493c96d6371d88f706d4d02f85dfa6cb7d21e Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 12 May 2020 09:55:43 -0400 Subject: [PATCH 33/33] Refactor truncate tests in BracketedPatternTest --- .../jabref/logic/bibtexkeypattern/BracketedPatternTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java index 26ed8a9c3be..5a043cf3324 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BracketedPatternTest.java @@ -257,13 +257,13 @@ void testEmptyBrackets() { * Test the [:truncate] modifier */ @Test - void truncateModifiersWorksAppliedTwice() { + void expandBracketsChainsTwoTruncateModifiers() { assertEquals("Open", BracketedPattern.expandBrackets("[fulltitle:truncate6:truncate5]", ';', dbentry, database)); } @Test - void truncateModifierIsIgnoredWithoutAnArgument() { + void expandBracketsDoesNotTruncateWithoutAnArgumentToTruncateModifier() { assertEquals("Open Source Software and the \"Private-Collective\" Innovation Model: Issues for Organization Science", BracketedPattern.expandBrackets("[fulltitle:truncate]", ';', dbentry, database)); }