getAllFields() {
/**
* These are the fields JabRef always displays as default {@link org.jabref.preferences.JabRefPreferences#setLanguageDependentDefaultValues()}
- *
+ *
* A user can change them. The change is currently stored in the preferences only and not explicitly exposed as
* separate preferences object
*/
diff --git a/src/main/java/org/jabref/model/entry/field/FieldPriority.java b/src/main/java/org/jabref/model/entry/field/FieldPriority.java
index 1c0e1cef4da..199151eeaf0 100644
--- a/src/main/java/org/jabref/model/entry/field/FieldPriority.java
+++ b/src/main/java/org/jabref/model/entry/field/FieldPriority.java
@@ -1,6 +1,19 @@
package org.jabref.model.entry.field;
+import java.util.Locale;
+
+/**
+ * Determines whether the field is in the Optional1 or Optional2 tab
+ *
+ * See {@link org.jabref.model.entry.BibEntryType#getPrimaryOptionalFields()}
+ * and {@link org.jabref.model.entry.BibEntryType#getSecondaryOptionalFields()}.
+ */
public enum FieldPriority {
IMPORTANT,
- DETAIL
+ DETAIL;
+
+ @Override
+ public String toString() {
+ return this.name().toLowerCase(Locale.ROOT);
+ }
}
diff --git a/src/main/java/org/jabref/model/entry/field/UnknownField.java b/src/main/java/org/jabref/model/entry/field/UnknownField.java
index 2d9bca32eaf..a18779d3dc8 100644
--- a/src/main/java/org/jabref/model/entry/field/UnknownField.java
+++ b/src/main/java/org/jabref/model/entry/field/UnknownField.java
@@ -5,20 +5,37 @@
import java.util.Objects;
import java.util.Set;
+import org.jabref.model.strings.StringUtil;
+
public class UnknownField implements Field {
private String name;
private final Set properties;
+ private final String displayName;
public UnknownField(String name) {
+ this(name, StringUtil.capitalizeFirst(name));
+ }
+
+ public UnknownField(String name, String displayName) {
this.name = name;
+ this.displayName = displayName;
this.properties = EnumSet.noneOf(FieldProperty.class);
}
public UnknownField(String name, FieldProperty first, FieldProperty... rest) {
+ this(name, StringUtil.capitalizeFirst(name), first, rest);
+ }
+
+ public UnknownField(String name, String displayName, FieldProperty first, FieldProperty... rest) {
this.name = name;
+ this.displayName = displayName;
this.properties = EnumSet.of(first, rest);
}
+ public static UnknownField fromDisplayName(String displayName) {
+ return new UnknownField(displayName.toLowerCase(Locale.ROOT), displayName);
+ }
+
@Override
public Set getProperties() {
return properties;
@@ -33,6 +50,11 @@ public void setName(String name) {
this.name = name;
}
+ @Override
+ public String getDisplayName() {
+ return displayName;
+ }
+
@Override
public boolean isStandardField() {
return false;
diff --git a/src/main/java/org/jabref/model/entry/types/EntryType.java b/src/main/java/org/jabref/model/entry/types/EntryType.java
index 90d0264c00d..1a40be9a9ae 100644
--- a/src/main/java/org/jabref/model/entry/types/EntryType.java
+++ b/src/main/java/org/jabref/model/entry/types/EntryType.java
@@ -4,10 +4,11 @@ public interface EntryType {
/**
* Returns the tag name of the entry type.
- *
- * @return tag name of the entry type.
*/
String getName();
+ /**
+ * Returns the name presented in the UI
+ */
String getDisplayName();
}
diff --git a/src/main/java/org/jabref/model/entry/types/EntryTypeFactory.java b/src/main/java/org/jabref/model/entry/types/EntryTypeFactory.java
index 6b40a56c4f4..ae879fabafb 100644
--- a/src/main/java/org/jabref/model/entry/types/EntryTypeFactory.java
+++ b/src/main/java/org/jabref/model/entry/types/EntryTypeFactory.java
@@ -14,14 +14,12 @@ private EntryTypeFactory() {
}
/**
- * Checks whether two EntryTypeFactory are equal or not based on the equality of the type names and on the equality of
- * the required and optional field lists
+ * Checks whether two EntryTypeFactory are equal
+ * based on the equality of the type names and on the equality of the required and optional field lists
*
- * @param type1 the first EntryType to compare
- * @param type2 the secend EntryType to compare
* @return returns true if the two compared entry types have the same name and equal required and optional fields
*/
- public static boolean isEqualNameAndFieldBased(BibEntryType type1, BibEntryType type2) {
+ public static boolean nameAndFieldsAreEqual(BibEntryType type1, BibEntryType type2) {
if ((type1 == null) && (type2 == null)) {
return true;
} else if ((type1 == null) || (type2 == null)) {
diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties
index 1e8c1e0924d..95a0836e7db 100644
--- a/src/main/resources/l10n/JabRef_en.properties
+++ b/src/main/resources/l10n/JabRef_en.properties
@@ -1795,6 +1795,7 @@ DOI\ %0\ is\ invalid=DOI %0 is invalid
Select\ all\ customized\ types\ to\ be\ stored\ in\ local\ preferences\:=Select all customized types to be stored in local preferences\:
Different\ customization,\ current\ settings\ will\ be\ overwritten=Different customization, current settings will be overwritten
+%0\ (from\ file)\n%1\ (current\ setting)=%0 (from file)\n%1 (current setting)
Entry\ type\ %0\ is\ only\ defined\ for\ Biblatex\ but\ not\ for\ BibTeX=Entry type %0 is only defined for Biblatex but not for BibTeX
diff --git a/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java b/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java
index 9836c823ddd..dd765793e33 100644
--- a/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java
+++ b/src/test/java/org/jabref/logic/exporter/BibtexDatabaseWriterTest.java
@@ -395,7 +395,7 @@ void writeCustomizedTypesInAlphabeticalOrder() throws Exception {
database.insertEntry(entry);
bibtexContext.setMode(BibDatabaseMode.BIBTEX);
- databaseWriter.savePartOfDatabase(bibtexContext, Arrays.asList(entry, otherEntry));
+ databaseWriter.savePartOfDatabase(bibtexContext, List.of(entry, otherEntry));
assertEquals(
"@Customizedtype{," + OS.NEWLINE + "}" + OS.NEWLINE + OS.NEWLINE
@@ -801,24 +801,22 @@ void writeEntriesSorted() throws Exception {
new SaveOrder.SortCriterion(StandardField.ABSTRACT, false)));
metaData.setSaveOrderConfig(saveOrder);
- BibEntry firstEntry = new BibEntry();
- firstEntry.setType(StandardEntryType.Article);
- firstEntry.setField(StandardField.AUTHOR, "A");
- firstEntry.setField(StandardField.YEAR, "2010");
+ BibEntry firstEntry = new BibEntry(StandardEntryType.Article)
+ .withField(StandardField.AUTHOR, "A")
+ .withField(StandardField.YEAR, "2010")
+ .withChanged(true);
- BibEntry secondEntry = new BibEntry();
- secondEntry.setType(StandardEntryType.Article);
- secondEntry.setField(StandardField.AUTHOR, "A");
- secondEntry.setField(StandardField.YEAR, "2000");
+ BibEntry secondEntry = new BibEntry(StandardEntryType.Article)
+ .withField(StandardField.AUTHOR, "A")
+ .withField(StandardField.YEAR, "2000")
+ .withChanged(true);
- BibEntry thirdEntry = new BibEntry();
- thirdEntry.setType(StandardEntryType.Article);
- thirdEntry.setField(StandardField.AUTHOR, "B");
- thirdEntry.setField(StandardField.YEAR, "2000");
+ BibEntry thirdEntry = new BibEntry(StandardEntryType.Article)
+ .withField(StandardField.AUTHOR, "B")
+ .withField(StandardField.YEAR, "2000")
+ .withChanged(true);
- database.insertEntry(secondEntry);
- database.insertEntry(thirdEntry);
- database.insertEntry(firstEntry);
+ database.insertEntries(secondEntry, thirdEntry, firstEntry);
databaseWriter.savePartOfDatabase(bibtexContext, database.getEntries());
diff --git a/src/test/java/org/jabref/logic/exporter/MetaDataSerializerTest.java b/src/test/java/org/jabref/logic/exporter/MetaDataSerializerTest.java
index f648627acbd..ebff3f7815e 100644
--- a/src/test/java/org/jabref/logic/exporter/MetaDataSerializerTest.java
+++ b/src/test/java/org/jabref/logic/exporter/MetaDataSerializerTest.java
@@ -1,11 +1,11 @@
package org.jabref.logic.exporter;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.TreeMap;
+import java.util.stream.Stream;
import org.jabref.logic.citationkeypattern.GlobalCitationKeyPattern;
import org.jabref.logic.cleanup.FieldFormatterCleanup;
@@ -14,10 +14,12 @@
import org.jabref.logic.importer.util.MetaDataParser;
import org.jabref.logic.util.OS;
import org.jabref.model.entry.BibEntryType;
+import org.jabref.model.entry.BibEntryTypeBuilder;
import org.jabref.model.entry.field.BibField;
import org.jabref.model.entry.field.FieldPriority;
import org.jabref.model.entry.field.OrFields;
import org.jabref.model.entry.field.StandardField;
+import org.jabref.model.entry.field.UnknownField;
import org.jabref.model.entry.types.EntryType;
import org.jabref.model.entry.types.UnknownEntryType;
import org.jabref.model.metadata.ContentSelector;
@@ -25,6 +27,9 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -65,11 +70,11 @@ public void serializeSingleSaveAction() {
@Test
public void serializeSingleContentSelectors() {
- List values = new ArrayList<>(4);
- values.add("approved");
- values.add("captured");
- values.add("received");
- values.add("status");
+ List values = List.of(
+ "approved",
+ "captured",
+ "received",
+ "status");
metaData.addContentSelector(new ContentSelector(StandardField.PUBSTATE, values));
@@ -96,4 +101,43 @@ void testParsingEmptyOptionalFieldsFieldsReturnsEmptyCollections() {
Optional type = MetaDataParser.parseCustomEntryType(serialized);
assertEquals(Collections.emptySet(), type.get().getOptionalFields());
}
+
+ /**
+ * Code clone of {@link org.jabref.logic.importer.util.MetaDataParserTest#parseCustomizedEntryType()}
+ */
+ public static Stream serializeCustomizedEntryType() {
+ return Stream.of(
+ Arguments.of(
+ new BibEntryTypeBuilder()
+ .withType(new UnknownEntryType("test"))
+ .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE),
+ "jabref-entrytype: test: req[author;title] opt[]"
+ ),
+ Arguments.of(
+ new BibEntryTypeBuilder()
+ .withType(new UnknownEntryType("test"))
+ .withRequiredFields(StandardField.AUTHOR)
+ .withImportantFields(StandardField.TITLE),
+ "jabref-entrytype: test: req[author] opt[title]"
+ ),
+ Arguments.of(
+ new BibEntryTypeBuilder()
+ .withType(new UnknownEntryType("test"))
+ .withRequiredFields(UnknownField.fromDisplayName("Test1"), UnknownField.fromDisplayName("Test2")),
+ "jabref-entrytype: test: req[Test1;Test2] opt[]"
+ ),
+ Arguments.of(
+ new BibEntryTypeBuilder()
+ .withType(new UnknownEntryType("test"))
+ .withRequiredFields(UnknownField.fromDisplayName("tEST"), UnknownField.fromDisplayName("tEsT2")),
+ "jabref-entrytype: test: req[tEST;tEsT2] opt[]"
+ )
+ );
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ void serializeCustomizedEntryType(BibEntryTypeBuilder bibEntryTypeBuilder, String expected) {
+ assertEquals(expected, MetaDataSerializer.serializeCustomEntryTypes(bibEntryTypeBuilder.build()));
+ }
}
diff --git a/src/test/java/org/jabref/logic/importer/util/MetaDataParserTest.java b/src/test/java/org/jabref/logic/importer/util/MetaDataParserTest.java
index 12e584e49c8..251b3d10279 100644
--- a/src/test/java/org/jabref/logic/importer/util/MetaDataParserTest.java
+++ b/src/test/java/org/jabref/logic/importer/util/MetaDataParserTest.java
@@ -1,11 +1,21 @@
package org.jabref.logic.importer.util;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.jabref.logic.exporter.MetaDataSerializerTest;
+import org.jabref.model.entry.BibEntryTypeBuilder;
+import org.jabref.model.entry.field.UnknownField;
+import org.jabref.model.entry.types.UnknownEntryType;
+
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.CsvSource;
+import org.junit.jupiter.params.provider.MethodSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
-class MetaDataParserTest {
+public class MetaDataParserTest {
@ParameterizedTest
@CsvSource({
@@ -20,4 +30,30 @@ class MetaDataParserTest {
void parseDirectory(String expected, String input) {
assertEquals(expected, MetaDataParser.parseDirectory(input));
}
+
+ /**
+ * In case of any change, copy the content to {@link MetaDataSerializerTest#serializeCustomizedEntryType()}
+ */
+ public static Stream parseCustomizedEntryType() {
+ return Stream.of(
+ Arguments.of(
+ new BibEntryTypeBuilder()
+ .withType(new UnknownEntryType("test"))
+ .withRequiredFields(UnknownField.fromDisplayName("Test1"), UnknownField.fromDisplayName("Test2")),
+ "jabref-entrytype: test: req[Test1;Test2] opt[]"
+ ),
+ Arguments.of(
+ new BibEntryTypeBuilder()
+ .withType(new UnknownEntryType("test"))
+ .withRequiredFields(UnknownField.fromDisplayName("tEST"), UnknownField.fromDisplayName("tEsT2")),
+ "jabref-entrytype: test: req[tEST;tEsT2] opt[]"
+ )
+ );
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ void parseCustomizedEntryType(BibEntryTypeBuilder expected, String source) {
+ assertEquals(Optional.of(expected.build()), MetaDataParser.parseCustomEntryType(source));
+ }
}
diff --git a/src/test/java/org/jabref/model/entry/field/FieldFactoryTest.java b/src/test/java/org/jabref/model/entry/field/FieldFactoryTest.java
index 33aa2e18555..f218e3f82d7 100644
--- a/src/test/java/org/jabref/model/entry/field/FieldFactoryTest.java
+++ b/src/test/java/org/jabref/model/entry/field/FieldFactoryTest.java
@@ -15,24 +15,27 @@
class FieldFactoryTest {
@Test
void testOrFieldsTwoTerms() {
- assertEquals("aaa/bbb", FieldFactory.serializeOrFields(new UnknownField("aaa"), new UnknownField("bbb")));
+ assertEquals("Aaa/Bbb", FieldFactory.serializeOrFields(new UnknownField("aaa"), new UnknownField("bbb")));
}
@Test
void testOrFieldsThreeTerms() {
- assertEquals("aaa/bbb/ccc", FieldFactory.serializeOrFields(new UnknownField("aaa"), new UnknownField("bbb"), new UnknownField("ccc")));
+ assertEquals("Aaa/Bbb/Ccc", FieldFactory.serializeOrFields(new UnknownField("aaa"), new UnknownField("bbb"), new UnknownField("ccc")));
}
- private static Stream commentFields() {
+ private static Stream fieldsWithoutFieldProperties() {
return Stream.of(
+ // comment fields
Arguments.of(new UserSpecificCommentField("user1"), "comment-user1"),
- Arguments.of(new UserSpecificCommentField("other-user-id"), "comment-other-user-id")
+ Arguments.of(new UserSpecificCommentField("other-user-id"), "comment-other-user-id"),
+ // unknown field
+ Arguments.of(new UnknownField("cased", "cAsEd"), "cAsEd")
);
}
@ParameterizedTest
@MethodSource
- void commentFields(Field expected, String name) {
+ void fieldsWithoutFieldProperties(Field expected, String name) {
assertEquals(expected, FieldFactory.parseField(name));
}
diff --git a/src/test/java/org/jabref/model/entry/field/UnknownFieldTest.java b/src/test/java/org/jabref/model/entry/field/UnknownFieldTest.java
index 63afeef3e41..1b6ca0212c0 100644
--- a/src/test/java/org/jabref/model/entry/field/UnknownFieldTest.java
+++ b/src/test/java/org/jabref/model/entry/field/UnknownFieldTest.java
@@ -14,4 +14,10 @@ void fieldsConsideredEqualIfSameName() {
void fieldsConsideredEqualINameDifferByCapitalization() {
assertEquals(new UnknownField("tiTle"), new UnknownField("Title"));
}
+
+ @Test
+ void displayNameConstructor() {
+ UnknownField cAsED = UnknownField.fromDisplayName("cAsEd");
+ assertEquals(new UnknownField("cased", "cAsEd"), cAsED);
+ }
}