diff --git a/CHANGELOG.md b/CHANGELOG.md index d351d53c217..cdd097ee56d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv - We changed the duplicate handling in the Import entries dialog. Potential duplicate entries are marked with an icon and importing will now trigger the merge dialog [#10914](https://github.com/JabRef/jabref/pull/10914) - We made the command "Push to TexShop" more robust to allow cite commands with a character before the first slash. [forum#2699](https://discourse.jabref.org/t/push-to-texshop-mac/2699/17?u=siedlerchr) - We only show the notification "Saving library..." if the library contains more than 2000 entries. [#9803](https://github.com/JabRef/jabref/issues/9803) +- JabRef now keeps previous log files upon start. [#11023](https://github.com/JabRef/jabref/pull/11023) - We enhanced the dialog for adding new fields in the content selector with a selection box containing a list of standard fields. [#10912](https://github.com/JabRef/jabref/pull/10912) - We store the citation relations in an LRU cache to avoid bloating the memory and out-of-memory exceptions. [#10958](https://github.com/JabRef/jabref/issues/10958) - Keywords filed are now displayed as tags. [#10910](https://github.com/JabRef/jabref/pull/10910) diff --git a/docs/teaching.md b/docs/teaching.md index 93e5fb79e25..f5c4b567097 100644 --- a/docs/teaching.md +++ b/docs/teaching.md @@ -83,8 +83,6 @@ Course: BSc Computer Science Individual Project * Summary: Students experience the procedure of finding and fixing small and medium issues in an open source project. * Successfully run in 2022/2023 -Do you have additions/suggestions for improvement? - #### Northern Arizona University (NAU), USA Course [CS499 - Open Source Software Development](https://github.com/igorsteinmacher/CS499-OSS) @@ -129,7 +127,7 @@ Course "Programming and Software Development" as part of the [BSc Software Engin Course [DD2480 Software Engineering Fundamentals](https://www.kth.se/student/kurser/kurs/DD2480?l=en) * Summary: Groups of students from three to five persons experienced the whole software engineering process within a week: From the requirements' specification to the final pull request. -* Successfully run in 2020 +* Successfully run in 2020, 2024, and other years. ### Portuguese diff --git a/rewrite.yml b/rewrite.yml index 41738ae1eca..fd8ccb02f1b 100644 --- a/rewrite.yml +++ b/rewrite.yml @@ -103,8 +103,6 @@ recipeList: - org.openrewrite.java.migrate.lang.StringFormatted - org.openrewrite.java.migrate.util.SequencedCollection - - org.openrewrite.java.recipes.UseJavaParserBuilderInJavaTemplate - - org.openrewrite.java.RemoveObjectsIsNull - org.openrewrite.java.ShortenFullyQualifiedTypeReferences diff --git a/src/main/java/org/jabref/Launcher.java b/src/main/java/org/jabref/Launcher.java index ba015659d03..8f1ea3229c7 100644 --- a/src/main/java/org/jabref/Launcher.java +++ b/src/main/java/org/jabref/Launcher.java @@ -11,7 +11,6 @@ import java.util.List; import java.util.Map; -import org.jabref.architecture.AllowedToUseStandardStreams; import org.jabref.cli.ArgumentProcessor; import org.jabref.cli.JabRefCLI; import org.jabref.gui.Globals; @@ -19,7 +18,6 @@ import org.jabref.logic.UiCommand; import org.jabref.logic.journals.JournalAbbreviationLoader; import org.jabref.logic.journals.predatory.PredatoryJournalListLoader; -import org.jabref.logic.l10n.Localization; import org.jabref.logic.net.ProxyAuthenticator; import org.jabref.logic.net.ProxyPreferences; import org.jabref.logic.net.ProxyRegisterer; @@ -48,7 +46,6 @@ * - Handle the command line arguments * - Start the JavaFX application (if not in cli mode) */ -@AllowedToUseStandardStreams("Direct output to the user") public class Launcher { private static Logger LOGGER; private static boolean isDebugEnabled; @@ -140,11 +137,14 @@ private static void addLogToDisk() { // The "Shared File Writer" is explained at // https://tinylog.org/v2/configuration/#shared-file-writer Map configuration = Map.of( - "writerFile", "shared file", - "writerFile.level", isDebugEnabled ? "debug" : "info", "level", isDebugEnabled ? "debug" : "info", - "writerFile.file", directory.resolve("log.txt").toString(), - "writerFile.charset", "UTF-8"); + "writerFile", "rolling file", + "writerFile.level", isDebugEnabled ? "debug" : "info", + // We need to manually join the path, because ".resolve" does not work on Windows, because ":" is not allowed in file names on Windows + "writerFile.file", directory + File.separator + "log_{date:yyyy-MM-dd_HH-mm-ss}.txt", + "writerFile.charset", "UTF-8", + "writerFile.policies", "startup", + "writerFile.backups", "30"); configuration.forEach(Configuration::set); initializeLogger(); @@ -169,9 +169,8 @@ private static boolean handleMultipleAppInstances(String[] args, RemotePreferenc LOGGER.debug("Passing arguments passed on to running JabRef..."); if (remoteClient.sendCommandLineArguments(args)) { // So we assume it's all taken care of, and quit. - LOGGER.debug("Arguments passed on to running JabRef instance."); - // Used for script-use output etc. to the user - System.out.println(Localization.lang("Arguments passed on to running JabRef instance. Shutting down.")); + // Output to both to the log and the screen. Therefore, we do not have an additional System.out.println. + LOGGER.info("Arguments passed on to running JabRef instance. Shutting down."); return false; } else { LOGGER.warn("Could not communicate with other running JabRef instance."); diff --git a/src/main/java/org/jabref/gui/entryeditor/OptionalFields2Tab.java b/src/main/java/org/jabref/gui/entryeditor/DetailOptionalFieldsTab.java similarity index 57% rename from src/main/java/org/jabref/gui/entryeditor/OptionalFields2Tab.java rename to src/main/java/org/jabref/gui/entryeditor/DetailOptionalFieldsTab.java index c63c145cfba..e884d5b297d 100644 --- a/src/main/java/org/jabref/gui/entryeditor/OptionalFields2Tab.java +++ b/src/main/java/org/jabref/gui/entryeditor/DetailOptionalFieldsTab.java @@ -14,21 +14,21 @@ import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.preferences.PreferencesService; -public class OptionalFields2Tab extends OptionalFieldsTabBase { +public class DetailOptionalFieldsTab extends OptionalFieldsTabBase { public static final String NAME = "Optional fields 2"; - public OptionalFields2Tab(BibDatabaseContext databaseContext, - SuggestionProviders suggestionProviders, - UndoManager undoManager, - DialogService dialogService, - PreferencesService preferences, - StateManager stateManager, - ThemeManager themeManager, - IndexingTaskManager indexingTaskManager, - BibEntryTypesManager entryTypesManager, - TaskExecutor taskExecutor, - JournalAbbreviationRepository journalAbbreviationRepository) { + public DetailOptionalFieldsTab(BibDatabaseContext databaseContext, + SuggestionProviders suggestionProviders, + UndoManager undoManager, + DialogService dialogService, + PreferencesService preferences, + StateManager stateManager, + ThemeManager themeManager, + IndexingTaskManager indexingTaskManager, + BibEntryTypesManager entryTypesManager, + TaskExecutor taskExecutor, + JournalAbbreviationRepository journalAbbreviationRepository) { super( Localization.lang("Optional fields 2"), false, diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java index 436f62cd303..e31448fbb1e 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java @@ -249,45 +249,45 @@ private void navigateToNextEntry() { private List createTabs() { entryEditorTabs.add(new PreviewTab(databaseContext, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), taskExecutor)); - // Required, optional, deprecated, and "other" fields + // Required, optional (important+detail), deprecated, and "other" fields entryEditorTabs.add(new RequiredFieldsTab(databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), bibEntryTypesManager, taskExecutor, journalAbbreviationRepository)); - entryEditorTabs.add(new OptionalFieldsTab(databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), bibEntryTypesManager, taskExecutor, journalAbbreviationRepository)); - entryEditorTabs.add(new OptionalFields2Tab(databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), bibEntryTypesManager, taskExecutor, journalAbbreviationRepository)); + entryEditorTabs.add(new ImportantOptionalFieldsTab(databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), bibEntryTypesManager, taskExecutor, journalAbbreviationRepository)); + entryEditorTabs.add(new DetailOptionalFieldsTab(databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), bibEntryTypesManager, taskExecutor, journalAbbreviationRepository)); entryEditorTabs.add(new DeprecatedFieldsTab(databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), bibEntryTypesManager, taskExecutor, journalAbbreviationRepository)); entryEditorTabs.add(new OtherFieldsTab(databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), bibEntryTypesManager, taskExecutor, journalAbbreviationRepository)); // Comment Tab: Tab for general and user-specific comments entryEditorTabs.add(new CommentsTab(preferencesService, databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), taskExecutor, journalAbbreviationRepository)); - // General fields from preferences - // First, remove all tabs that are already handled above or below; except for the source tab (which has different titles for BibTeX and BibLaTeX mode) + // The preferences allow to configure tabs to show (e.g.,"General", "Abstract") + // These should be shown. Already hard-coded ones should be removed. Map> entryEditorTabList = new HashMap<>(entryEditorPreferences.getEntryEditorTabs()); entryEditorTabList.remove(PreviewTab.NAME); entryEditorTabList.remove(RequiredFieldsTab.NAME); - entryEditorTabList.remove(OptionalFieldsTab.NAME); - entryEditorTabList.remove(OptionalFields2Tab.NAME); + entryEditorTabList.remove(ImportantOptionalFieldsTab.NAME); + entryEditorTabList.remove(DetailOptionalFieldsTab.NAME); entryEditorTabList.remove(DeprecatedFieldsTab.NAME); + entryEditorTabList.remove(OtherFieldsTab.NAME); entryEditorTabList.remove(CommentsTab.NAME); entryEditorTabList.remove(MathSciNetTab.NAME); entryEditorTabList.remove(FileAnnotationTab.NAME); + entryEditorTabList.remove(SciteTab.NAME); + // CitationRelationsTab entryEditorTabList.remove(RelatedArticlesTab.NAME); + // SourceTab -- not listed, because it has different names for BibTeX and biblatex mode entryEditorTabList.remove(LatexCitationsTab.NAME); entryEditorTabList.remove(FulltextSearchResultsTab.NAME); - entryEditorTabList.remove(SciteTab.NAME); - entryEditorTabList.remove("Comments"); - // Then show the remaining configured + for (Map.Entry> tab : entryEditorTabList.entrySet()) { entryEditorTabs.add(new UserDefinedFieldsTab(tab.getKey(), tab.getValue(), databaseContext, libraryTab.getSuggestionProviders(), undoManager, dialogService, preferencesService, stateManager, themeManager, libraryTab.getIndexingTaskManager(), taskExecutor, journalAbbreviationRepository)); } - // "Special" tabs entryEditorTabs.add(new MathSciNetTab()); entryEditorTabs.add(new FileAnnotationTab(libraryTab.getAnnotationCache())); entryEditorTabs.add(new SciteTab(preferencesService, taskExecutor, dialogService)); entryEditorTabs.add(new CitationRelationsTab(entryEditorPreferences, dialogService, databaseContext, undoManager, stateManager, fileMonitor, preferencesService, libraryTab, taskExecutor)); entryEditorTabs.add(new RelatedArticlesTab(entryEditorPreferences, preferencesService, dialogService, taskExecutor)); - sourceTab = new SourceTab( databaseContext, undoManager, @@ -299,9 +299,7 @@ private List createTabs() { bibEntryTypesManager, keyBindingRepository); entryEditorTabs.add(sourceTab); - entryEditorTabs.add(new LatexCitationsTab(databaseContext, preferencesService, taskExecutor, dialogService)); - entryEditorTabs.add(new FulltextSearchResultsTab(stateManager, preferencesService, dialogService, taskExecutor)); return entryEditorTabs; diff --git a/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTab.java b/src/main/java/org/jabref/gui/entryeditor/ImportantOptionalFieldsTab.java similarity index 56% rename from src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTab.java rename to src/main/java/org/jabref/gui/entryeditor/ImportantOptionalFieldsTab.java index ad522d2411f..5258477d3f4 100644 --- a/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/ImportantOptionalFieldsTab.java @@ -14,21 +14,21 @@ import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.preferences.PreferencesService; -public class OptionalFieldsTab extends OptionalFieldsTabBase { +public class ImportantOptionalFieldsTab extends OptionalFieldsTabBase { public static final String NAME = "Optional fields"; - public OptionalFieldsTab(BibDatabaseContext databaseContext, - SuggestionProviders suggestionProviders, - UndoManager undoManager, - DialogService dialogService, - PreferencesService preferences, - StateManager stateManager, - ThemeManager themeManager, - IndexingTaskManager indexingTaskManager, - BibEntryTypesManager entryTypesManager, - TaskExecutor taskExecutor, - JournalAbbreviationRepository journalAbbreviationRepository) { + public ImportantOptionalFieldsTab(BibDatabaseContext databaseContext, + SuggestionProviders suggestionProviders, + UndoManager undoManager, + DialogService dialogService, + PreferencesService preferences, + StateManager stateManager, + ThemeManager themeManager, + IndexingTaskManager indexingTaskManager, + BibEntryTypesManager entryTypesManager, + TaskExecutor taskExecutor, + JournalAbbreviationRepository journalAbbreviationRepository) { super( Localization.lang("Optional fields"), true, diff --git a/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTabBase.java b/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTabBase.java index 5f61a0279ab..5a95c3ddb8b 100644 --- a/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTabBase.java +++ b/src/main/java/org/jabref/gui/entryeditor/OptionalFieldsTabBase.java @@ -27,10 +27,10 @@ public class OptionalFieldsTabBase extends FieldsEditorTab { private final BibEntryTypesManager entryTypesManager; - private final boolean isPrimaryOptionalFields; + private final boolean isImportantOptionalFields; public OptionalFieldsTabBase(String title, - boolean isPrimaryOptionalFields, + boolean isImportantOptionalFields, BibDatabaseContext databaseContext, SuggestionProviders suggestionProviders, UndoManager undoManager, @@ -54,7 +54,7 @@ public OptionalFieldsTabBase(String title, journalAbbreviationRepository, indexingTaskManager); this.entryTypesManager = entryTypesManager; - this.isPrimaryOptionalFields = isPrimaryOptionalFields; + this.isImportantOptionalFields = isImportantOptionalFields; setText(title); setTooltip(new Tooltip(Localization.lang("Show optional fields"))); setGraphic(IconTheme.JabRefIcons.OPTIONAL.getGraphicNode()); @@ -65,10 +65,10 @@ protected SequencedSet determineFieldsToShow(BibEntry entry) { BibDatabaseMode mode = databaseContext.getMode(); Optional entryType = entryTypesManager.enrich(entry.getType(), mode); if (entryType.isPresent()) { - if (isPrimaryOptionalFields) { - return entryType.get().getPrimaryOptionalFields(); + if (isImportantOptionalFields) { + return entryType.get().getImportantOptionalFields(); } else { - return entryType.get().getSecondaryOptionalNotDeprecatedFields(mode); + return entryType.get().getDetailOptionalNotDeprecatedFields(mode); } } else { // Entry type unknown -> treat all fields as required (thus no optional fields) diff --git a/src/main/java/org/jabref/model/entry/BibEntryType.java b/src/main/java/org/jabref/model/entry/BibEntryType.java index b804d8255e7..164029fa799 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryType.java +++ b/src/main/java/org/jabref/model/entry/BibEntryType.java @@ -22,8 +22,8 @@ public class BibEntryType implements Comparable { private final EntryType type; + private final SequencedSet allFields; private final SequencedSet requiredFields; - private final SequencedSet fields; /** * Provides an enriched EntryType with information about defined standards as mandatory fields etc. @@ -31,12 +31,12 @@ public class BibEntryType implements Comparable { * A builder is available at {@link BibEntryTypeBuilder} * * @param type The EntryType this BibEntryType is wrapped around. - * @param fields A BibFields list of all fields, including the required fields + * @param allFields A BibFields list of all fields, including the required fields * @param requiredFields A OrFields list of just the required fields */ - public BibEntryType(EntryType type, Collection fields, Collection requiredFields) { + public BibEntryType(EntryType type, Collection allFields, Collection requiredFields) { this.type = Objects.requireNonNull(type); - this.fields = new LinkedHashSet<>(fields); + this.allFields = new LinkedHashSet<>(allFields); this.requiredFields = new LinkedHashSet<>(requiredFields); } @@ -70,21 +70,21 @@ public SequencedSet getRequiredFields() { * Returns all defined fields. */ public SequencedSet getAllBibFields() { - return Collections.unmodifiableSequencedSet(fields); + return Collections.unmodifiableSequencedSet(allFields); } public Set getAllFields() { - return fields.stream().map(BibField::field).collect(Collectors.toCollection(LinkedHashSet::new)); + return allFields.stream().map(BibField::field).collect(Collectors.toCollection(LinkedHashSet::new)); } - public SequencedSet getPrimaryOptionalFields() { + public SequencedSet getImportantOptionalFields() { return getOptionalFields().stream() .filter(field -> field.priority() == FieldPriority.IMPORTANT) .map(BibField::field) .collect(Collectors.toCollection(LinkedHashSet::new)); } - public SequencedSet getSecondaryOptionalFields() { + public SequencedSet getDetailOptionalFields() { return getOptionalFields().stream() .filter(field -> field.priority() == FieldPriority.DETAIL) .map(BibField::field) @@ -108,8 +108,8 @@ public Set getDeprecatedFields(BibDatabaseMode mode) { return deprecatedFields; } - public SequencedSet getSecondaryOptionalNotDeprecatedFields(BibDatabaseMode mode) { - SequencedSet optionalFieldsNotPrimaryOrDeprecated = new LinkedHashSet<>(getSecondaryOptionalFields()); + public SequencedSet getDetailOptionalNotDeprecatedFields(BibDatabaseMode mode) { + SequencedSet optionalFieldsNotPrimaryOrDeprecated = new LinkedHashSet<>(getDetailOptionalFields()); optionalFieldsNotPrimaryOrDeprecated.removeAll(getDeprecatedFields(mode)); return optionalFieldsNotPrimaryOrDeprecated; } @@ -139,12 +139,12 @@ public boolean equals(Object o) { BibEntryType that = (BibEntryType) o; return type.equals(that.type) && Objects.equals(requiredFields, that.requiredFields) && - Objects.equals(fields, that.fields); + Objects.equals(allFields, that.allFields); } @Override public int hashCode() { - return Objects.hash(type, requiredFields, fields); + return Objects.hash(type, requiredFields, allFields); } /** @@ -159,7 +159,7 @@ public int hashCode() { public String toString() { return "BibEntryType{" + "type=" + type + - ", allFields=" + fields + + ", allFields=" + allFields + ", requiredFields=" + requiredFields + '}'; } diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java index 91656a6c50d..b1ef5643348 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypeBuilder.java @@ -1,7 +1,10 @@ package org.jabref.model.entry; import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.List; import java.util.SequencedCollection; import java.util.SequencedSet; import java.util.Set; @@ -20,8 +23,11 @@ public class BibEntryTypeBuilder { private EntryType type = StandardEntryType.Misc; - private SequencedSet fields = new LinkedHashSet<>(); + private SequencedSet requiredFields = new LinkedHashSet<>(); + private SequencedSet optionalFields = new LinkedHashSet<>(); + + private Set seenFields = new HashSet<>(); public BibEntryTypeBuilder withType(EntryType type) { this.type = type; @@ -29,8 +35,13 @@ public BibEntryTypeBuilder withType(EntryType type) { } public BibEntryTypeBuilder withImportantFields(SequencedSet newFields) { - this.fields = Streams.concat(fields.stream(), newFields.stream().map(field -> new BibField(field, FieldPriority.IMPORTANT))) - .collect(Collectors.toCollection(LinkedHashSet::new)); + List containedFields = containedInSeenFields(newFields); + if (!containedFields.isEmpty()) { + throw new IllegalArgumentException("Fields " + containedFields + " already added"); + } + this.seenFields.addAll(newFields); + this.optionalFields = Streams.concat(optionalFields.stream(), newFields.stream().map(field -> new BibField(field, FieldPriority.IMPORTANT))) + .collect(Collectors.toCollection(LinkedHashSet::new)); return this; } @@ -39,8 +50,13 @@ public BibEntryTypeBuilder withImportantFields(Field... newFields) { } public BibEntryTypeBuilder withDetailFields(SequencedCollection newFields) { - this.fields = Streams.concat(fields.stream(), newFields.stream().map(field -> new BibField(field, FieldPriority.DETAIL))) - .collect(Collectors.toCollection(LinkedHashSet::new)); + List containedFields = containedInSeenFields(newFields); + if (!containedFields.isEmpty()) { + throw new IllegalArgumentException("Fields " + containedFields + " already added"); + } + this.seenFields.addAll(newFields); + this.optionalFields = Streams.concat(optionalFields.stream(), newFields.stream().map(field -> new BibField(field, FieldPriority.DETAIL))) + .collect(Collectors.toCollection(LinkedHashSet::new)); return this; } @@ -49,33 +65,38 @@ public BibEntryTypeBuilder withDetailFields(Field... fields) { } public BibEntryTypeBuilder withRequiredFields(SequencedSet requiredFields) { - this.requiredFields = requiredFields; + return addRequiredFields(requiredFields); + } + + public BibEntryTypeBuilder addRequiredFields(SequencedSet requiredFields) { + Set fieldsToAdd = requiredFields.stream().map(OrFields::getFields).flatMap(Set::stream).collect(Collectors.toSet()); + List containedFields = containedInSeenFields(fieldsToAdd); + if (!containedFields.isEmpty()) { + throw new IllegalArgumentException("Fields " + containedFields + " already added"); + } + this.seenFields.addAll(fieldsToAdd); + this.requiredFields.addAll(requiredFields); return this; } public BibEntryTypeBuilder addRequiredFields(OrFields... requiredFields) { - this.requiredFields.addAll(Arrays.asList(requiredFields)); - return this; + return addRequiredFields(Arrays.asList(requiredFields).stream().collect(Collectors.toCollection(LinkedHashSet::new))); } public BibEntryTypeBuilder addRequiredFields(Field... requiredFields) { - this.requiredFields.addAll(Arrays.stream(requiredFields).map(OrFields::new).toList()); - return this; + return addRequiredFields(Arrays.stream(requiredFields).map(OrFields::new).collect(Collectors.toCollection(LinkedHashSet::new))); } public BibEntryTypeBuilder withRequiredFields(Field... requiredFields) { - this.requiredFields = Arrays.stream(requiredFields).map(OrFields::new).collect(Collectors.toCollection(LinkedHashSet::new)); - return this; + return addRequiredFields(requiredFields); } public BibEntryTypeBuilder withRequiredFields(OrFields first, Field... requiredFields) { - this.requiredFields = Stream.concat(Stream.of(first), Arrays.stream(requiredFields).map(OrFields::new)).collect(Collectors.toCollection(LinkedHashSet::new)); - return this; + return addRequiredFields(Stream.concat(Stream.of(first), Arrays.stream(requiredFields).map(OrFields::new)).collect(Collectors.toCollection(LinkedHashSet::new))); } public BibEntryTypeBuilder withRequiredFields(SequencedSet first, Field... requiredFields) { - this.requiredFields = Stream.concat(first.stream(), Arrays.stream(requiredFields).map(OrFields::new)).collect(Collectors.toCollection(LinkedHashSet::new)); - return this; + return addRequiredFields(Stream.concat(first.stream(), Arrays.stream(requiredFields).map(OrFields::new)).collect(Collectors.toCollection(LinkedHashSet::new))); } public BibEntryType build() { @@ -84,7 +105,11 @@ public BibEntryType build() { .map(OrFields::getFields) .flatMap(Set::stream) .map(field -> new BibField(field, FieldPriority.IMPORTANT)); - SequencedSet allFields = Stream.concat(fields.stream(), requiredAsImportant).collect(Collectors.toCollection(LinkedHashSet::new)); + SequencedSet allFields = Stream.concat(optionalFields.stream(), requiredAsImportant).collect(Collectors.toCollection(LinkedHashSet::new)); return new BibEntryType(type, allFields, requiredFields); } + + private List containedInSeenFields(Collection fields) { + return fields.stream().filter(seenFields::contains).toList(); + } } diff --git a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java index eb25ad23972..71a077acf01 100644 --- a/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java +++ b/src/main/java/org/jabref/model/entry/BibEntryTypesManager.java @@ -18,7 +18,12 @@ import org.jabref.model.entry.types.EntryTypeFactory; import org.jabref.model.entry.types.IEEETranEntryTypeDefinitions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class BibEntryTypesManager { + private static final Logger LOGGER = LoggerFactory.getLogger(BibEntryTypesManager.class); + private final InternalEntryTypes BIBTEX_ENTRYTYPES = new InternalEntryTypes( Stream.concat(BibtexEntryTypeDefinitions.ALL.stream(), IEEETranEntryTypeDefinitions.ALL.stream()) .collect(Collectors.toList())); @@ -132,6 +137,7 @@ private Optional enrich(EntryType type) { .filter(typeEquals(type)) .findFirst(); if (enrichedType.isPresent()) { + LOGGER.debug("Using customized entry type for {}", type.getName()); return enrichedType; } else { return standardTypes.stream() 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 199151eeaf0..7c44b53af28 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldPriority.java +++ b/src/main/java/org/jabref/model/entry/field/FieldPriority.java @@ -3,10 +3,10 @@ import java.util.Locale; /** - * Determines whether the field is in the Optional1 or Optional2 tab + * Determines whether the field is in the {@link org.jabref.gui.entryeditor.ImportantOptionalFieldsTab} or {@link org.jabref.gui.entryeditor.DetailOptionalFieldsTab} tab * - * See {@link org.jabref.model.entry.BibEntryType#getPrimaryOptionalFields()} - * and {@link org.jabref.model.entry.BibEntryType#getSecondaryOptionalFields()}. + * See {@link org.jabref.model.entry.BibEntryType#getImportantOptionalFields()} + * and {@link org.jabref.model.entry.BibEntryType#getDetailOptionalFields()}. */ public enum FieldPriority { IMPORTANT, diff --git a/src/main/java/org/jabref/model/entry/field/OrFields.java b/src/main/java/org/jabref/model/entry/field/OrFields.java index f0b456916d2..a8de739eb7d 100644 --- a/src/main/java/org/jabref/model/entry/field/OrFields.java +++ b/src/main/java/org/jabref/model/entry/field/OrFields.java @@ -10,6 +10,12 @@ /** * Represents a choice between two (or more) fields or any combination of them. *

+ * The idea of OrFields originates from BibLaTeX, where the manual lists following + *
+ * Required fields: author, title, journaltitle, year/date + *
+ * The class OrFields is used to model "year/date" in this case. + *

* Example is that a BibEntry requires either an author or an editor, but both can be present. */ public class OrFields implements Comparable { diff --git a/src/main/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitions.java b/src/main/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitions.java index 87db17e110d..40c79b8b31d 100644 --- a/src/main/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitions.java +++ b/src/main/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitions.java @@ -10,322 +10,297 @@ /** * This class defines entry types for biblatex support. - * - * @see biblatex documentation + * It is based on the biblatex documentation + *

+ * The definitions for BibTeX are done at {@link BibtexEntryTypeDefinitions} */ public class BiblatexEntryTypeDefinitions { private static final BibEntryType ARTICLE = new BibEntryTypeBuilder() .withType(StandardEntryType.Article) + .withRequiredFields( + StandardField.AUTHOR, StandardField.TITLE, StandardField.JOURNALTITLE, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.EDITOR, StandardField.SERIES, StandardField.VOLUME, StandardField.NUMBER, StandardField.EID, StandardField.ISSUE, StandardField.PAGES, StandardField.NOTE, StandardField.ISSN, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) .withDetailFields( - StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.SUBTITLE, - StandardField.TITLEADDON, StandardField.EDITOR, StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, + StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR, + StandardField.TITLEADDON, StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.JOURNALSUBTITLE, StandardField.ISSUETITLE, StandardField.ISSUESUBTITLE, StandardField.LANGUAGE, - StandardField.ORIGLANGUAGE, StandardField.SERIES, StandardField.VOLUME, StandardField.NUMBER, StandardField.EID, - StandardField.ISSUE, StandardField.PAGES, StandardField.VERSION, StandardField.NOTE, - StandardField.ISSN, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields( - StandardField.AUTHOR, StandardField.TITLE, StandardField.JOURNALTITLE, StandardField.DATE) + StandardField.ORIGLANGUAGE, StandardField.VERSION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType BOOK = new BibEntryTypeBuilder() .withType(StandardEntryType.Book) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.DATE) .withImportantFields(StandardField.EDITOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.VOLUME, StandardField.EDITION, StandardField.PUBLISHER, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.EDITOR, StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, + .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.INTRODUCTION, - StandardField.FOREWORD, StandardField.AFTERWORD, StandardField.SUBTITLE, StandardField.TITLEADDON, - StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.LANGUAGE, - StandardField.ORIGLANGUAGE, StandardField.VOLUME, StandardField.PART, StandardField.EDITION, StandardField.VOLUMES, - StandardField.SERIES, StandardField.NUMBER, StandardField.NOTE, StandardField.PUBLISHER, StandardField.LOCATION, - StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.ADDENDUM, - StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, - StandardField.URL, StandardField.URLDATE) + StandardField.FOREWORD, StandardField.AFTERWORD, + StandardField.LANGUAGE, + StandardField.ORIGLANGUAGE, StandardField.PART, StandardField.VOLUMES, + StandardField.SERIES, StandardField.NUMBER, StandardField.NOTE, StandardField.LOCATION, + StandardField.ADDENDUM, + StandardField.PUBSTATE) .build(); private static final BibEntryType MVBOOK = new BibEntryTypeBuilder() .withType(StandardEntryType.MvBook) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.DATE) .withImportantFields(StandardField.EDITOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.EDITION, StandardField.PUBLISHER, StandardField.ISBN, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.EDITOR, StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, + .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.INTRODUCTION, - StandardField.FOREWORD, StandardField.AFTERWORD, StandardField.SUBTITLE, StandardField.TITLEADDON, - StandardField.LANGUAGE, StandardField.ORIGLANGUAGE, StandardField.EDITION, StandardField.VOLUMES, StandardField.SERIES, - StandardField.NUMBER, StandardField.NOTE, StandardField.PUBLISHER, StandardField.LOCATION, StandardField.ISBN, - StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + StandardField.FOREWORD, StandardField.AFTERWORD, + StandardField.LANGUAGE, StandardField.ORIGLANGUAGE, StandardField.VOLUMES, StandardField.SERIES, + StandardField.NUMBER, StandardField.NOTE, StandardField.LOCATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType INBOOK = new BibEntryTypeBuilder() .withType(StandardEntryType.InBook) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.BOOKTITLE, StandardField.DATE) .withImportantFields( StandardField.BOOKAUTHOR, StandardField.EDITOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.BOOKSUBTITLE, StandardField.BOOKTITLEADDON, StandardField.VOLUME, StandardField.EDITION, StandardField.PUBLISHER, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.BOOKTITLE, StandardField.DATE) - .withDetailFields(StandardField.BOOKAUTHOR, StandardField.EDITOR, StandardField.EDITORA, StandardField.EDITORB, + .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR, - StandardField.INTRODUCTION, StandardField.FOREWORD, StandardField.AFTERWORD, StandardField.SUBTITLE, - StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, - StandardField.BOOKSUBTITLE, StandardField.BOOKTITLEADDON, StandardField.LANGUAGE, StandardField.ORIGLANGUAGE, - StandardField.VOLUME, StandardField.PART, StandardField.EDITION, StandardField.VOLUMES, StandardField.SERIES, - StandardField.NUMBER, StandardField.NOTE, StandardField.PUBLISHER, StandardField.LOCATION, StandardField.ISBN, - StandardField.CHAPTER, StandardField.PAGES, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, - StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + StandardField.INTRODUCTION, StandardField.FOREWORD, StandardField.AFTERWORD, + StandardField.LANGUAGE, StandardField.ORIGLANGUAGE, + StandardField.PART, StandardField.VOLUMES, StandardField.SERIES, + StandardField.NUMBER, StandardField.NOTE, StandardField.LOCATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType BOOKINBOOK = new BibEntryTypeBuilder() .withType(StandardEntryType.BookInBook) - .withImportantFields(INBOOK.getPrimaryOptionalFields()) - .withDetailFields(INBOOK.getSecondaryOptionalFields()) .withRequiredFields(INBOOK.getRequiredFields()) + .withImportantFields(INBOOK.getImportantOptionalFields()) + .withDetailFields(INBOOK.getDetailOptionalFields()) .build(); private static final BibEntryType SUPPBOOK = new BibEntryTypeBuilder() .withType(StandardEntryType.SuppBook) - .withImportantFields(INBOOK.getPrimaryOptionalFields()) - .withDetailFields(INBOOK.getSecondaryOptionalFields()) + .withImportantFields(INBOOK.getImportantOptionalFields()) + .withDetailFields(INBOOK.getDetailOptionalFields()) .withRequiredFields(INBOOK.getRequiredFields()) .build(); private static final BibEntryType BOOKLET = new BibEntryTypeBuilder() .withType(StandardEntryType.Booklet) + .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) .withImportantFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.HOWPUBLISHED, StandardField.CHAPTER, StandardField.PAGES, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.HOWPUBLISHED, - StandardField.TYPE, StandardField.NOTE, StandardField.LOCATION, StandardField.CHAPTER, StandardField.PAGES, - StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, + StandardField.TYPE, StandardField.NOTE, StandardField.LOCATION, + StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType COLLECTION = new BibEntryTypeBuilder() .withType(StandardEntryType.Collection) + .withRequiredFields(StandardField.EDITOR, StandardField.TITLE, StandardField.DATE) .withImportantFields( StandardField.TRANSLATOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.VOLUME, StandardField.EDITION, StandardField.PUBLISHER, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.EDITOR, StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.TRANSLATOR, + .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.INTRODUCTION, StandardField.FOREWORD, - StandardField.AFTERWORD, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, - StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.LANGUAGE, StandardField.ORIGLANGUAGE, - StandardField.VOLUME, StandardField.PART, StandardField.EDITION, StandardField.VOLUMES, StandardField.SERIES, - StandardField.NUMBER, StandardField.NOTE, StandardField.PUBLISHER, StandardField.LOCATION, StandardField.ISBN, - StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, - StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, - StandardField.URLDATE) + StandardField.AFTERWORD, + StandardField.LANGUAGE, StandardField.ORIGLANGUAGE, + StandardField.PART, StandardField.VOLUMES, StandardField.SERIES, + StandardField.NUMBER, StandardField.NOTE, StandardField.LOCATION, + StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType MVCOLLECTION = new BibEntryTypeBuilder() .withType(StandardEntryType.MvCollection) + .withRequiredFields(StandardField.EDITOR, StandardField.TITLE, StandardField.DATE) .withImportantFields(StandardField.TRANSLATOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.EDITION, StandardField.PUBLISHER, StandardField.ISBN, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.EDITOR, StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.TRANSLATOR, + .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.INTRODUCTION, StandardField.FOREWORD, - StandardField.AFTERWORD, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, - StandardField.ORIGLANGUAGE, StandardField.EDITION, StandardField.VOLUMES, StandardField.SERIES, StandardField.NUMBER, - StandardField.NOTE, StandardField.PUBLISHER, StandardField.LOCATION, StandardField.ISBN, StandardField.PAGETOTAL, - StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, - StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + StandardField.AFTERWORD, StandardField.LANGUAGE, + StandardField.ORIGLANGUAGE, StandardField.VOLUMES, StandardField.SERIES, StandardField.NUMBER, + StandardField.NOTE, StandardField.LOCATION, StandardField.PAGETOTAL, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType INCOLLECTION = new BibEntryTypeBuilder() .withType(StandardEntryType.InCollection) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.BOOKTITLE, StandardField.DATE) .withImportantFields(StandardField.TRANSLATOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.BOOKSUBTITLE, StandardField.BOOKTITLEADDON, StandardField.VOLUME, StandardField.EDITION, StandardField.PUBLISHER, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.BOOKTITLE, StandardField.DATE) .withDetailFields(StandardField.EDITOR, StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, - StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.INTRODUCTION, - StandardField.FOREWORD, StandardField.AFTERWORD, StandardField.SUBTITLE, StandardField.TITLEADDON, - StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.BOOKSUBTITLE, - StandardField.BOOKTITLEADDON, StandardField.LANGUAGE, StandardField.ORIGLANGUAGE, StandardField.VOLUME, - StandardField.PART, StandardField.EDITION, StandardField.VOLUMES, StandardField.SERIES, StandardField.NUMBER, - StandardField.NOTE, StandardField.PUBLISHER, StandardField.LOCATION, StandardField.ISBN, StandardField.CHAPTER, - StandardField.PAGES, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.INTRODUCTION, + StandardField.FOREWORD, StandardField.AFTERWORD, + StandardField.LANGUAGE, StandardField.ORIGLANGUAGE, + StandardField.PART, StandardField.VOLUMES, StandardField.SERIES, StandardField.NUMBER, + StandardField.NOTE, StandardField.LOCATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType SUPPCOLLECTION = new BibEntryTypeBuilder() .withType(StandardEntryType.SuppCollection) - .withImportantFields(INCOLLECTION.getPrimaryOptionalFields()) - .withDetailFields(INCOLLECTION.getSecondaryOptionalFields()) .withRequiredFields(INCOLLECTION.getRequiredFields()) + .withImportantFields(INCOLLECTION.getImportantOptionalFields()) + .withDetailFields(INCOLLECTION.getDetailOptionalFields()) .build(); private static final BibEntryType MANUAL = new BibEntryTypeBuilder() .withType(StandardEntryType.Manual) + .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) .withImportantFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.EDITION, StandardField.PUBLISHER, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.EDITION, + .withDetailFields(StandardField.LANGUAGE, StandardField.TYPE, StandardField.SERIES, StandardField.NUMBER, StandardField.VERSION, StandardField.NOTE, - StandardField.ORGANIZATION, StandardField.PUBLISHER, StandardField.LOCATION, StandardField.ISBN, StandardField.CHAPTER, - StandardField.PAGES, StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, - StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + StandardField.ORGANIZATION, StandardField.LOCATION, + StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType MISC = new BibEntryTypeBuilder() .withType(StandardEntryType.Misc) + .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.HOWPUBLISHED, StandardField.LOCATION, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.HOWPUBLISHED, - StandardField.TYPE, StandardField.VERSION, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.LOCATION, - StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, + StandardField.TYPE, StandardField.VERSION, StandardField.NOTE, StandardField.ORGANIZATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType ONLINE = new BibEntryTypeBuilder() .withType(StandardEntryType.Online) + .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE, StandardField.URL) .withImportantFields( StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.URLDATE) - .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE, StandardField.URL) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.VERSION, - StandardField.NOTE, StandardField.ORGANIZATION, StandardField.ADDENDUM, StandardField.PUBSTATE, - StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, StandardField.VERSION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType PATENT = new BibEntryTypeBuilder() .withType(IEEETranEntryType.Patent) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.NUMBER, StandardField.DATE) .withImportantFields(StandardField.HOLDER, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.NUMBER, StandardField.DATE) - .withDetailFields(StandardField.HOLDER, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.TYPE, + .withDetailFields(StandardField.TYPE, StandardField.VERSION, StandardField.LOCATION, StandardField.NOTE, StandardField.ADDENDUM, - StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, - StandardField.URL, StandardField.URLDATE) + StandardField.PUBSTATE) .build(); private static final BibEntryType PERIODICAL = new BibEntryTypeBuilder() .withType(IEEETranEntryType.Periodical) + .withRequiredFields(StandardField.EDITOR, StandardField.TITLE, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.ISSUETITLE, StandardField.ISSUESUBTITLE, StandardField.ISSN, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.EDITOR, StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, StandardField.SUBTITLE, - StandardField.ISSUETITLE, StandardField.ISSUESUBTITLE, StandardField.LANGUAGE, StandardField.SERIES, + .withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC, + StandardField.LANGUAGE, StandardField.SERIES, StandardField.VOLUME, StandardField.NUMBER, StandardField.ISSUE, StandardField.NOTE, - StandardField.ISSN, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType SUPPPERIODICAL = new BibEntryTypeBuilder() .withType(StandardEntryType.SuppPeriodical) - .withImportantFields(ARTICLE.getPrimaryOptionalFields()) - .withDetailFields(ARTICLE.getSecondaryOptionalFields()) .withRequiredFields(ARTICLE.getRequiredFields()) + .withImportantFields(ARTICLE.getImportantOptionalFields()) + .withDetailFields(ARTICLE.getDetailOptionalFields()) .build(); private static final BibEntryType PROCEEDINGS = new BibEntryTypeBuilder() .withType(StandardEntryType.Proceedings) + .withRequiredFields(StandardField.TITLE, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.EVENTTITLE, StandardField.VOLUME, StandardField.PUBLISHER, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.EDITOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, - StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.EVENTTITLE, StandardField.EVENTTITLEADDON, - StandardField.EVENTDATE, StandardField.VENUE, StandardField.LANGUAGE, StandardField.VOLUME, StandardField.PART, + .withDetailFields(StandardField.EDITOR, StandardField.EVENTTITLEADDON, + StandardField.EVENTDATE, StandardField.VENUE, StandardField.LANGUAGE, StandardField.PART, StandardField.VOLUMES, StandardField.SERIES, StandardField.NUMBER, StandardField.NOTE, StandardField.ORGANIZATION, - StandardField.PUBLISHER, StandardField.LOCATION, StandardField.ISBN, - StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, - StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, - StandardField.URLDATE) + StandardField.LOCATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType MVPROCEEDINGS = new BibEntryTypeBuilder() .withType(StandardEntryType.MvProceedings) + .withRequiredFields(StandardField.TITLE, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.EVENTTITLE, StandardField.VOLUME, StandardField.PUBLISHER, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.EDITOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.EVENTTITLE, + .withDetailFields(StandardField.EDITOR, StandardField.EVENTTITLEADDON, StandardField.EVENTDATE, StandardField.VENUE, StandardField.LANGUAGE, StandardField.VOLUMES, StandardField.SERIES, StandardField.NUMBER, StandardField.NOTE, StandardField.ORGANIZATION, - StandardField.PUBLISHER, StandardField.LOCATION, StandardField.ISBN, StandardField.PAGETOTAL, - StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, - StandardField.EPRINTTYPE, StandardField.URL, - StandardField.URLDATE) + StandardField.LOCATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType INPROCEEDINGS = new BibEntryTypeBuilder() .withType(StandardEntryType.InProceedings) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.BOOKTITLE, StandardField.DATE) .withImportantFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.BOOKSUBTITLE, StandardField.BOOKTITLEADDON, StandardField.EVENTTITLE, StandardField.VOLUME, StandardField.PUBLISHER, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.BOOKTITLE, StandardField.DATE) - .withDetailFields(StandardField.EDITOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, - StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.BOOKSUBTITLE, StandardField.BOOKTITLEADDON, - StandardField.EVENTTITLE, StandardField.EVENTTITLEADDON, StandardField.EVENTDATE, StandardField.VENUE, - StandardField.LANGUAGE, StandardField.VOLUME, StandardField.PART, StandardField.VOLUMES, StandardField.SERIES, - StandardField.NUMBER, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.PUBLISHER, StandardField.LOCATION, - StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.ADDENDUM, - StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, - StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.EDITOR, + StandardField.EVENTTITLEADDON, StandardField.EVENTDATE, StandardField.VENUE, + StandardField.LANGUAGE, StandardField.PART, StandardField.VOLUMES, StandardField.SERIES, + StandardField.NUMBER, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.LOCATION, + StandardField.ADDENDUM, + StandardField.PUBSTATE) .build(); private static final BibEntryType REFERENCE = new BibEntryTypeBuilder() .withType(StandardEntryType.Reference) - .withImportantFields(COLLECTION.getPrimaryOptionalFields()) - .withDetailFields(COLLECTION.getSecondaryOptionalFields()) .withRequiredFields(COLLECTION.getRequiredFields()) + .withImportantFields(COLLECTION.getImportantOptionalFields()) + .withDetailFields(COLLECTION.getDetailOptionalFields()) .build(); private static final BibEntryType MVREFERENCE = new BibEntryTypeBuilder() .withType(StandardEntryType.MvReference) - .withImportantFields(MVCOLLECTION.getPrimaryOptionalFields()) - .withDetailFields(MVCOLLECTION.getSecondaryOptionalFields()) .withRequiredFields(MVCOLLECTION.getRequiredFields()) + .withImportantFields(MVCOLLECTION.getImportantOptionalFields()) + .withDetailFields(MVCOLLECTION.getDetailOptionalFields()) .build(); private static final BibEntryType INREFERENCE = new BibEntryTypeBuilder() .withType(StandardEntryType.InReference) - .withImportantFields(INCOLLECTION.getPrimaryOptionalFields()) - .withDetailFields(INCOLLECTION.getSecondaryOptionalFields()) .withRequiredFields(INCOLLECTION.getRequiredFields()) + .withImportantFields(INCOLLECTION.getImportantOptionalFields()) + .withDetailFields(INCOLLECTION.getDetailOptionalFields()) .build(); private static final BibEntryType REPORT = new BibEntryTypeBuilder() .withType(StandardEntryType.Report) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.TYPE, StandardField.INSTITUTION, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.NUMBER, StandardField.ISRN, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.TYPE, StandardField.INSTITUTION, StandardField.DATE) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.NUMBER, - StandardField.VERSION, StandardField.NOTE, StandardField.LOCATION, StandardField.ISRN, - StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, - StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, - StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, + StandardField.VERSION, StandardField.NOTE, StandardField.LOCATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType SET = new BibEntryTypeBuilder() @@ -335,107 +310,101 @@ public class BiblatexEntryTypeDefinitions { private static final BibEntryType THESIS = new BibEntryTypeBuilder() .withType(StandardEntryType.Thesis) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.TYPE, StandardField.INSTITUTION, StandardField.DATE) .withImportantFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.TYPE, StandardField.INSTITUTION, StandardField.DATE) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.NOTE, - StandardField.LOCATION, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, - StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, StandardField.NOTE, + StandardField.LOCATION, StandardField.ISBN, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType UNPUBLISHED = new BibEntryTypeBuilder() .withType(StandardEntryType.Unpublished) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.DATE) .withImportantFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.HOWPUBLISHED, StandardField.PUBSTATE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.HOWPUBLISHED, - StandardField.NOTE, StandardField.LOCATION, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.EVENTTITLE, - StandardField.EVENTDATE, StandardField.VENUE, StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, + StandardField.NOTE, StandardField.LOCATION, StandardField.ADDENDUM, StandardField.EVENTTITLE, + StandardField.EVENTDATE, StandardField.VENUE) .build(); private static final BibEntryType CONFERENCE = new BibEntryTypeBuilder() .withType(StandardEntryType.Conference) - .withImportantFields(INPROCEEDINGS.getPrimaryOptionalFields()) - .withDetailFields(INPROCEEDINGS.getSecondaryOptionalFields()) .withRequiredFields(INPROCEEDINGS.getRequiredFields()) + .withImportantFields(INPROCEEDINGS.getImportantOptionalFields()) + .withDetailFields(INPROCEEDINGS.getDetailOptionalFields()) .build(); private static final BibEntryType ELECTRONIC = new BibEntryTypeBuilder() .withType(IEEETranEntryType.Electronic) - .withImportantFields(ONLINE.getPrimaryOptionalFields()) - .withDetailFields(ONLINE.getSecondaryOptionalFields()) .withRequiredFields(ONLINE.getRequiredFields()) + .withImportantFields(ONLINE.getImportantOptionalFields()) + .withDetailFields(ONLINE.getDetailOptionalFields()) .build(); private static final BibEntryType MASTERSTHESIS = new BibEntryTypeBuilder() .withType(StandardEntryType.MastersThesis) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.INSTITUTION, StandardField.DATE) .withImportantFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.TYPE, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.INSTITUTION, StandardField.DATE) - .withDetailFields(StandardField.TYPE, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.NOTE, - StandardField.LOCATION, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, - StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, StandardField.NOTE, + StandardField.LOCATION, StandardField.ISBN, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType PHDTHESIS = new BibEntryTypeBuilder() .withType(StandardEntryType.PhdThesis) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.INSTITUTION, StandardField.DATE) .withImportantFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.TYPE, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.INSTITUTION, StandardField.DATE) - .withDetailFields(StandardField.TYPE, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.NOTE, - StandardField.LOCATION, StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, - StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, StandardField.NOTE, + StandardField.LOCATION, StandardField.ISBN, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType TECHREPORT = new BibEntryTypeBuilder() .withType(StandardEntryType.TechReport) + .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.INSTITUTION, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.TYPE, StandardField.NUMBER, StandardField.ISRN, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.INSTITUTION, StandardField.DATE) - .withDetailFields(StandardField.TYPE, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, - StandardField.NUMBER, StandardField.VERSION, StandardField.NOTE, StandardField.LOCATION, - StandardField.ISRN, StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.ADDENDUM, - StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, - StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, + StandardField.VERSION, StandardField.NOTE, StandardField.LOCATION, + StandardField.ADDENDUM, + StandardField.PUBSTATE) .build(); private static final BibEntryType WWW = new BibEntryTypeBuilder() .withType(StandardEntryType.WWW) - .withImportantFields(ONLINE.getPrimaryOptionalFields()) - .withDetailFields(ONLINE.getSecondaryOptionalFields()) .withRequiredFields(ONLINE.getRequiredFields()) + .withImportantFields(ONLINE.getImportantOptionalFields()) + .withDetailFields(ONLINE.getDetailOptionalFields()) .build(); private static final BibEntryType SOFTWARE = new BibEntryTypeBuilder() .withType(StandardEntryType.Software) + .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.HOWPUBLISHED, StandardField.LOCATION, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.HOWPUBLISHED, - StandardField.TYPE, StandardField.VERSION, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.LOCATION, - StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, + StandardField.TYPE, StandardField.VERSION, StandardField.NOTE, StandardField.ORGANIZATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); private static final BibEntryType DATASET = new BibEntryTypeBuilder() .withType(StandardEntryType.Dataset) + .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) .withImportantFields( StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.HOWPUBLISHED, StandardField.LOCATION, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) - .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE) - .withDetailFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.LANGUAGE, StandardField.EDITION, StandardField.HOWPUBLISHED, - StandardField.TYPE, StandardField.VERSION, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.LOCATION, - StandardField.ADDENDUM, StandardField.PUBSTATE, StandardField.DOI, StandardField.EPRINT, - StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE) + .withDetailFields(StandardField.LANGUAGE, StandardField.EDITION, + StandardField.TYPE, StandardField.VERSION, StandardField.NOTE, StandardField.ORGANIZATION, + StandardField.ADDENDUM, StandardField.PUBSTATE) .build(); public static final List ALL = Arrays.asList(ARTICLE, BOOK, MVBOOK, INBOOK, BOOKINBOOK, SUPPBOOK, diff --git a/src/main/java/org/jabref/model/entry/types/BiblatexSoftwareEntryTypeDefinitions.java b/src/main/java/org/jabref/model/entry/types/BiblatexSoftwareEntryTypeDefinitions.java index 6a2e7f0851e..ff5e3e6599f 100644 --- a/src/main/java/org/jabref/model/entry/types/BiblatexSoftwareEntryTypeDefinitions.java +++ b/src/main/java/org/jabref/model/entry/types/BiblatexSoftwareEntryTypeDefinitions.java @@ -12,42 +12,38 @@ public class BiblatexSoftwareEntryTypeDefinitions { private static final BibEntryType SOFTWARE = new BibEntryTypeBuilder() .withType(StandardEntryType.Software) + .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.URL, StandardField.VERSION, StandardField.YEAR) .withImportantFields(StandardField.DATE, StandardField.DOI, StandardField.EPRINTTYPE, StandardField.EPRINTCLASS, StandardField.EPRINT, - StandardField.EDITOR, StandardField.FILE, BiblatexSoftwareField.HALID, BiblatexSoftwareField.HALVERSION, StandardField.INSTITUTION, BiblatexSoftwareField.INTRODUCEDIN, + StandardField.FILE, BiblatexSoftwareField.HALID, BiblatexSoftwareField.HALVERSION, StandardField.INSTITUTION, BiblatexSoftwareField.INTRODUCEDIN, BiblatexSoftwareField.LICENSE, StandardField.MONTH, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.PUBLISHER, StandardField.RELATED, - BiblatexSoftwareField.RELATEDSTRING, BiblatexSoftwareField.REPOSITORY, BiblatexSoftwareField.SWHID, StandardField.URLDATE, StandardField.VERSION) - .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.URL, StandardField.VERSION, StandardField.YEAR) + BiblatexSoftwareField.RELATEDSTRING, BiblatexSoftwareField.REPOSITORY, BiblatexSoftwareField.SWHID, StandardField.URLDATE) .build(); private static final BibEntryType SOFTWAREVERSION = new BibEntryTypeBuilder() .withType(BiblatexSoftwareEntryType.SoftwareVersion) - .withImportantFields(StandardField.DATE, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, BiblatexSoftwareField.HALID, BiblatexSoftwareField.HALVERSION, - StandardField.INSTITUTION, BiblatexSoftwareField.INTRODUCEDIN, BiblatexSoftwareField.LICENSE, StandardField.MONTH, StandardField.NOTE, StandardField.ORGANIZATION, - StandardField.PUBLISHER, StandardField.RELATED, BiblatexSoftwareField.RELATEDTYPE, BiblatexSoftwareField.RELATEDSTRING, - BiblatexSoftwareField.REPOSITORY, BiblatexSoftwareField.SWHID, StandardField.SUBTITLE, StandardField.URLDATE) .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.URL, StandardField.YEAR, StandardField.VERSION) - .withDetailFields(StandardField.DATE, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, BiblatexSoftwareField.HALID, BiblatexSoftwareField.HALVERSION, + .withImportantFields(StandardField.DATE, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, BiblatexSoftwareField.HALID, BiblatexSoftwareField.HALVERSION, StandardField.INSTITUTION, BiblatexSoftwareField.INTRODUCEDIN, BiblatexSoftwareField.LICENSE, StandardField.MONTH, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.PUBLISHER, StandardField.RELATED, BiblatexSoftwareField.RELATEDTYPE, BiblatexSoftwareField.RELATEDSTRING, BiblatexSoftwareField.REPOSITORY, BiblatexSoftwareField.SWHID, StandardField.SUBTITLE, StandardField.URLDATE) - .withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.URL, StandardField.YEAR) .build(); + private static final BibEntryType SOFTWAREMODULE = new BibEntryTypeBuilder() .withType(BiblatexSoftwareEntryType.SoftwareModule) + .withRequiredFields(StandardField.AUTHOR, StandardField.SUBTITLE, StandardField.URL, StandardField.YEAR) .withImportantFields(StandardField.DATE, StandardField.DOI, StandardField.EPRINTTYPE, StandardField.EPRINTCLASS, StandardField.EPRINT, StandardField.EDITOR, StandardField.FILE, BiblatexSoftwareField.HALID, BiblatexSoftwareField.HALVERSION, StandardField.INSTITUTION, BiblatexSoftwareField.INTRODUCEDIN, BiblatexSoftwareField.LICENSE, StandardField.MONTH, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.PUBLISHER, StandardField.RELATED, BiblatexSoftwareField.RELATEDSTRING, BiblatexSoftwareField.REPOSITORY, BiblatexSoftwareField.SWHID, StandardField.URLDATE, StandardField.VERSION) - .withRequiredFields(StandardField.AUTHOR, StandardField.SUBTITLE, StandardField.URL, StandardField.YEAR) .build(); private static final BibEntryType CODEFRAGMENT = new BibEntryTypeBuilder() .withType(BiblatexSoftwareEntryType.CodeFragment) + .withRequiredFields(StandardField.URL) .withImportantFields(StandardField.DATE, StandardField.DOI, StandardField.EPRINTTYPE, StandardField.EPRINTCLASS, StandardField.EPRINT, StandardField.EDITOR, StandardField.FILE, BiblatexSoftwareField.HALID, BiblatexSoftwareField.HALVERSION, StandardField.INSTITUTION, BiblatexSoftwareField.INTRODUCEDIN, BiblatexSoftwareField.LICENSE, StandardField.MONTH, StandardField.NOTE, StandardField.ORGANIZATION, StandardField.PUBLISHER, StandardField.RELATED, BiblatexSoftwareField.RELATEDSTRING, BiblatexSoftwareField.REPOSITORY, BiblatexSoftwareField.SWHID, StandardField.URLDATE, StandardField.VERSION) - .withRequiredFields(StandardField.URL) .build(); public static final List ALL = Arrays.asList(SOFTWAREVERSION, SOFTWARE, SOFTWAREMODULE, CODEFRAGMENT); diff --git a/src/main/java/org/jabref/model/entry/types/BibtexEntryTypeDefinitions.java b/src/main/java/org/jabref/model/entry/types/BibtexEntryTypeDefinitions.java index d2109ebc8d4..885235958f8 100644 --- a/src/main/java/org/jabref/model/entry/types/BibtexEntryTypeDefinitions.java +++ b/src/main/java/org/jabref/model/entry/types/BibtexEntryTypeDefinitions.java @@ -10,6 +10,9 @@ /** * This class represents all supported BibTeX entry types. + * It is based on the information of BibTeXing, a manual + * by the original BibTeX author. Also enriched by new fields not existing back then (e.g., ISSN). + *

* The BibLaTeX entry types are defined at {@link BiblatexEntryTypeDefinitions}. */ public class BibtexEntryTypeDefinitions { 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 ae879fabafb..0f30ca5e6bf 100644 --- a/src/main/java/org/jabref/model/entry/types/EntryTypeFactory.java +++ b/src/main/java/org/jabref/model/entry/types/EntryTypeFactory.java @@ -28,7 +28,7 @@ public static boolean nameAndFieldsAreEqual(BibEntryType type1, BibEntryType typ return Objects.equals(type1.getType(), type2.getType()) && Objects.equals(type1.getRequiredFields(), type2.getRequiredFields()) && Objects.equals(type1.getOptionalFields(), type2.getOptionalFields()) - && Objects.equals(type1.getSecondaryOptionalFields(), type2.getSecondaryOptionalFields()); + && Objects.equals(type1.getDetailOptionalFields(), type2.getDetailOptionalFields()); } } diff --git a/src/main/java/org/jabref/model/entry/types/IEEETranEntryTypeDefinitions.java b/src/main/java/org/jabref/model/entry/types/IEEETranEntryTypeDefinitions.java index 600c9f67bdb..790dea24746 100644 --- a/src/main/java/org/jabref/model/entry/types/IEEETranEntryTypeDefinitions.java +++ b/src/main/java/org/jabref/model/entry/types/IEEETranEntryTypeDefinitions.java @@ -62,7 +62,7 @@ public class IEEETranEntryTypeDefinitions { .withType(IEEETranEntryType.Patent) .withRequiredFields(new OrFields(StandardField.YEAR, StandardField.YEARFILED), StandardField.NATIONALITY, StandardField.NUMBER) .withImportantFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.LANGUAGE, StandardField.ASSIGNEE, StandardField.ADDRESS, - StandardField.TYPE, StandardField.NUMBER, StandardField.DAY, StandardField.DAYFILED, StandardField.MONTH, + StandardField.TYPE, StandardField.DAY, StandardField.DAYFILED, StandardField.MONTH, StandardField.MONTHFILED, StandardField.NOTE, StandardField.URL) .build(); diff --git a/src/main/resources/csl-locales b/src/main/resources/csl-locales index f6f859c2123..7b5a477f2d9 160000 --- a/src/main/resources/csl-locales +++ b/src/main/resources/csl-locales @@ -1 +1 @@ -Subproject commit f6f859c2123087ac51c574cd1ed3a64204ae73c7 +Subproject commit 7b5a477f2d9a8882b52bcecdc50f08d4422cc822 diff --git a/src/main/resources/csl-styles b/src/main/resources/csl-styles index 1bb9097598f..713bf5738ac 160000 --- a/src/main/resources/csl-styles +++ b/src/main/resources/csl-styles @@ -1 +1 @@ -Subproject commit 1bb9097598f2d85d3e5997702bddc2d73ecfb584 +Subproject commit 713bf5738ac0b13c502e364cded9445c48d18193 diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 9b6b0a31c45..e6c1342058c 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -77,8 +77,6 @@ Application\ to\ push\ entries\ to=Application to push entries to Apply=Apply -Arguments\ passed\ on\ to\ running\ JabRef\ instance.\ Shutting\ down.=Arguments passed on to running JabRef instance. Shutting down. - Assign\ the\ original\ group's\ entries\ to\ this\ group?=Assign the original group's entries to this group? Assigned\ %0\ entries\ to\ group\ "%1".=Assigned %0 entries to group "%1". diff --git a/src/test/java/org/jabref/logic/formatter/bibtexfields/RemoveBracesFormatterTest.java b/src/test/java/org/jabref/logic/formatter/bibtexfields/RemoveBracesFormatterTest.java index 45a418094bc..37eff160e67 100644 --- a/src/test/java/org/jabref/logic/formatter/bibtexfields/RemoveBracesFormatterTest.java +++ b/src/test/java/org/jabref/logic/formatter/bibtexfields/RemoveBracesFormatterTest.java @@ -1,7 +1,8 @@ package org.jabref.logic.formatter.bibtexfields; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -10,67 +11,25 @@ */ public class RemoveBracesFormatterTest { - private RemoveBracesFormatter formatter; - - @BeforeEach - public void setUp() { - formatter = new RemoveBracesFormatter(); - } - - @Test - public void formatRemovesSingleEnclosingBraces() { - assertEquals("test", formatter.format("{test}")); - } - - @Test - public void formatKeepsUnmatchedBracesAtBeginning() { - assertEquals("{test", formatter.format("{test")); - } - - @Test - public void formatKeepsUnmatchedBracesAtEnd() { - assertEquals("test}", formatter.format("test}")); - } - - @Test - public void formatKeepsShortString() { - assertEquals("t", formatter.format("t")); - } - - @Test - public void formatRemovesBracesOnly() { - assertEquals("", formatter.format("{}")); - } - - @Test - public void formatKeepsEmptyString() { - assertEquals("", formatter.format("")); - } - - @Test - public void formatRemovesDoubleEnclosingBraces() { - assertEquals("test", formatter.format("{{test}}")); - } - - @Test - public void formatRemovesTripleEnclosingBraces() { - assertEquals("test", formatter.format("{{{test}}}")); - } - - @Test - public void formatKeepsNonMatchingBraces() { - assertEquals("{A} and {B}", formatter.format("{A} and {B}")); - } - - @Test - public void formatRemovesOnlyMatchingBraces() { - assertEquals("{A} and {B}", formatter.format("{{A} and {B}}")); - } - - @Test - public void formatDoesNotRemoveBracesInBrokenString() { - // We opt here for a conservative approach although one could argue that "A} and {B}" is also a valid return - assertEquals("{A} and {B}}", formatter.format("{A} and {B}}")); + private final RemoveBracesFormatter formatter = new RemoveBracesFormatter(); + + @ParameterizedTest + @CsvSource({ + "test, {test}", // formatRemovesSingleEnclosingBraces + "{test, {test", // formatKeepsUnmatchedBracesAtBeginning + "test}, test}", // formatKeepsUnmatchedBracesAtEnd + "t, t", // formatKeepsShortString + "'', {}", // formatRemovesBracesOnly + "test, {{test}}", // formatKeepsEmptyString + "test, {{{test}}}", // formatRemovesDoubleEnclosingBraces + "{A} and {B}, {A} and {B}", // formatRemovesTripleEnclosingBraces + "{A} and {B}, {{A} and {B}}", // formatKeepsNonMatchingBraces + "{A} and {B}}, {A} and {B}}", // formatRemovesOnlyMatchingBraces + "Vall{\\'e}e Poussin, {Vall{\\'e}e Poussin}", // formatDoesNotRemoveBracesInBrokenString + "Vall{\\'e}e Poussin, Vall{\\'e}e Poussin" + }) + public void format(String expected, String input) { + assertEquals(expected, formatter.format(input)); } @Test diff --git a/src/test/java/org/jabref/model/entry/BibEntryTypeBuilderTest.java b/src/test/java/org/jabref/model/entry/BibEntryTypeBuilderTest.java new file mode 100644 index 00000000000..44794f55412 --- /dev/null +++ b/src/test/java/org/jabref/model/entry/BibEntryTypeBuilderTest.java @@ -0,0 +1,41 @@ +package org.jabref.model.entry; + +import java.util.LinkedHashSet; +import java.util.List; + +import org.jabref.model.entry.field.StandardField; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class BibEntryTypeBuilderTest { + + @Test + void fieldAlreadySeenSameCategory() { + assertThrows(IllegalArgumentException.class, () -> + new BibEntryTypeBuilder() + .withImportantFields(StandardField.AUTHOR) + .withImportantFields(StandardField.AUTHOR) + .build()); + } + + @Test + void detailOptionalWorks() { + BibEntryType bibEntryType = new BibEntryTypeBuilder() + .withImportantFields(StandardField.AUTHOR) + .withDetailFields(StandardField.NOTE) + .build(); + assertEquals(new LinkedHashSet<>(List.of(StandardField.NOTE)), bibEntryType.getDetailOptionalFields()); + } + + @Test + void fieldAlreadySeenDifferentCategories() { + assertThrows(IllegalArgumentException.class, () -> + new BibEntryTypeBuilder() + .withRequiredFields(StandardField.AUTHOR) + .withImportantFields(StandardField.AUTHOR) + .build()); + } +} diff --git a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java index c47f9abde47..e227b226393 100644 --- a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java +++ b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java @@ -188,4 +188,10 @@ void modifyingArticleWithParsingKeepsListOrder(BibDatabaseMode mode) { assertEquals(overwrittenStandardType.getOptionalFields(), type.get().getOptionalFields()); } + + @Test + void translatorDetailOptionalAtArticle() { + BibEntryType entryType = entryTypesManager.enrich(StandardEntryType.Article, BibDatabaseMode.BIBLATEX).get(); + assertTrue(entryType.getDetailOptionalFields().contains(StandardField.TRANSLATOR)); + } } diff --git a/src/test/java/org/jabref/model/entry/types/BiblatexAPAEntryTypeDefinitionsTest.java b/src/test/java/org/jabref/model/entry/types/BiblatexAPAEntryTypeDefinitionsTest.java new file mode 100644 index 00000000000..3ca45fbaa3f --- /dev/null +++ b/src/test/java/org/jabref/model/entry/types/BiblatexAPAEntryTypeDefinitionsTest.java @@ -0,0 +1,13 @@ +package org.jabref.model.entry.types; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class BiblatexAPAEntryTypeDefinitionsTest { + + @Test + void all() { + assertNotNull(BiblatexAPAEntryTypeDefinitions.ALL); + } +} diff --git a/src/test/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitionsTest.java b/src/test/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitionsTest.java new file mode 100644 index 00000000000..a2511daa940 --- /dev/null +++ b/src/test/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitionsTest.java @@ -0,0 +1,13 @@ +package org.jabref.model.entry.types; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class BiblatexEntryTypeDefinitionsTest { + + @Test + void all() { + assertNotNull(BiblatexEntryTypeDefinitions.ALL); + } +} diff --git a/src/test/java/org/jabref/model/entry/types/BiblatexSoftwareEntryTypeDefinitionsTest.java b/src/test/java/org/jabref/model/entry/types/BiblatexSoftwareEntryTypeDefinitionsTest.java new file mode 100644 index 00000000000..cb8f1789101 --- /dev/null +++ b/src/test/java/org/jabref/model/entry/types/BiblatexSoftwareEntryTypeDefinitionsTest.java @@ -0,0 +1,12 @@ +package org.jabref.model.entry.types; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class BiblatexSoftwareEntryTypeDefinitionsTest { + @Test + void all() { + assertNotNull(BiblatexSoftwareEntryTypeDefinitions.ALL); + } +} diff --git a/src/test/java/org/jabref/model/entry/types/BibtexEntryTypeDefinitionsTest.java b/src/test/java/org/jabref/model/entry/types/BibtexEntryTypeDefinitionsTest.java new file mode 100644 index 00000000000..05aef2a503f --- /dev/null +++ b/src/test/java/org/jabref/model/entry/types/BibtexEntryTypeDefinitionsTest.java @@ -0,0 +1,26 @@ +package org.jabref.model.entry.types; + +import org.jabref.model.entry.BibEntryType; +import org.jabref.model.entry.field.StandardField; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class BibtexEntryTypeDefinitionsTest { + + @Test + void all() { + assertNotNull(BibtexEntryTypeDefinitions.ALL); + } + + @Test + void languageContained() { + BibEntryType articleEntryType = BiblatexEntryTypeDefinitions.ALL.stream() + .filter(type -> type.getType().equals(StandardEntryType.Article)) + .findFirst() + .get(); + assertTrue(articleEntryType.getDetailOptionalFields().contains(StandardField.LANGUAGE)); + } +} diff --git a/src/test/java/org/jabref/model/entry/types/IEEETranEntryTypeDefinitionsTest.java b/src/test/java/org/jabref/model/entry/types/IEEETranEntryTypeDefinitionsTest.java new file mode 100644 index 00000000000..2bb58af26b7 --- /dev/null +++ b/src/test/java/org/jabref/model/entry/types/IEEETranEntryTypeDefinitionsTest.java @@ -0,0 +1,12 @@ +package org.jabref.model.entry.types; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class IEEETranEntryTypeDefinitionsTest { + @Test + void all() { + assertNotNull(IEEETranEntryTypeDefinitions.ALL); + } +} diff --git a/src/test/java/org/jabref/model/entry/types/SystematicLiteratureReviewStudyEntryTypeDefinitionsTest.java b/src/test/java/org/jabref/model/entry/types/SystematicLiteratureReviewStudyEntryTypeDefinitionsTest.java new file mode 100644 index 00000000000..553b5125ad9 --- /dev/null +++ b/src/test/java/org/jabref/model/entry/types/SystematicLiteratureReviewStudyEntryTypeDefinitionsTest.java @@ -0,0 +1,12 @@ +package org.jabref.model.entry.types; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class SystematicLiteratureReviewStudyEntryTypeDefinitionsTest { + @Test + void all() { + assertNotNull(SystematicLiteratureReviewStudyEntryTypeDefinitions.ALL); + } +}