package org.jabref.logic.util; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Collection; import java.util.Optional; import org.jabref.model.FieldChange; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.FieldName; public class UpdateField { private UpdateField() { } /** * Updating a field will result in the entry being reformatted on save * * @param be BibEntry * @param field Field name * @param newValue New field value */ public static Optional<FieldChange> updateField(BibEntry be, String field, String newValue) { return updateField(be, field, newValue, false); } /** * Updating a non-displayable field does not result in the entry being reformatted on save * * @param be BibEntry * @param field Field name * @param newValue New field value */ public static Optional<FieldChange> updateNonDisplayableField(BibEntry be, String field, String newValue) { boolean changed = be.hasChanged(); Optional<FieldChange> fieldChange = updateField(be, field, newValue, false); be.setChanged(changed); return fieldChange; } /** * Undoable change of field value * * @param be BibEntry * @param field Field name * @param newValue New field value * @param nullFieldIfValueIsTheSame If true the field value is removed when the current value is equals to newValue */ public static Optional<FieldChange> updateField(BibEntry be, String field, String newValue, Boolean nullFieldIfValueIsTheSame) { String writtenValue = null; String oldValue = null; if (be.hasField(field)) { oldValue = be.getField(field).get(); if ((newValue == null) || (oldValue.equals(newValue) && nullFieldIfValueIsTheSame)) { // If the new field value is null or the old and the new value are the same and flag is set // Clear the field be.clearField(field); } else if (!oldValue.equals(newValue)) { // Update writtenValue = newValue; be.setField(field, newValue); } else { // Values are the same, do nothing return Optional.empty(); } } else { // old field value not set if (newValue == null) { // Do nothing return Optional.empty(); } else { // Set new value writtenValue = newValue; be.setField(field, newValue); } } return Optional.of(new FieldChange(be, field, oldValue, writtenValue)); } /** * Sets empty or non-existing owner fields of a bibtex entry to a specified default value. Timestamp field is also * set. Preferences are checked to see if these options are enabled. * * @param entry The entry to set fields for. * @param overwriteOwner Indicates whether owner should be set if it is already set. * @param overwriteTimestamp Indicates whether timestamp should be set if it is already set. */ public static void setAutomaticFields(BibEntry entry, boolean overwriteOwner, boolean overwriteTimestamp, UpdateFieldPreferences prefs) { String defaultOwner = prefs.getDefaultOwner(); String timestamp = DateTimeFormatter.ofPattern(prefs.getTimeStampFormat()).format(LocalDateTime.now()); String timeStampField = prefs.getTimeStampField(); boolean setOwner = prefs.isUseOwner() && (overwriteOwner || (!entry.hasField(FieldName.OWNER))); boolean setTimeStamp = prefs.isUseTimeStamp() && (overwriteTimestamp || (!entry.hasField(timeStampField))); setAutomaticFields(entry, setOwner, defaultOwner, setTimeStamp, timeStampField, timestamp); } public static void setAutomaticFields(BibEntry entry, UpdateFieldPreferences prefs) { UpdateField.setAutomaticFields(entry, prefs.isOverwriteOwner(), prefs.isOverwriteTimeStamp(), prefs); } private static void setAutomaticFields(BibEntry entry, boolean setOwner, String owner, boolean setTimeStamp, String timeStampField, String timeStamp) { // Set owner field if this option is enabled: if (setOwner) { // Set owner field to default value entry.setField(FieldName.OWNER, owner); } if (setTimeStamp) { entry.setField(timeStampField, timeStamp); } } /** * Sets empty or non-existing owner fields of bibtex entries inside a List to a specified default value. Timestamp * field is also set. Preferences are checked to see if these options are enabled. * * @param bibs List of bibtex entries */ public static void setAutomaticFields(Collection<BibEntry> bibs, boolean overwriteOwner, boolean overwriteTimestamp, UpdateFieldPreferences prefs) { boolean globalSetOwner = prefs.isUseOwner(); boolean globalSetTimeStamp = prefs.isUseTimeStamp(); // Do not need to do anything if all options are disabled if (!(globalSetOwner || globalSetTimeStamp)) { return; } String timeStampField = prefs.getTimeStampField(); String defaultOwner = prefs.getDefaultOwner(); String timestamp = DateTimeFormatter.ofPattern(prefs.getTimeStampFormat()).format(LocalDateTime.now()); // Iterate through all entries for (BibEntry curEntry : bibs) { boolean setOwner = globalSetOwner && (overwriteOwner || (!curEntry.hasField(FieldName.OWNER))); boolean setTimeStamp = globalSetTimeStamp && (overwriteTimestamp || (!curEntry.hasField(timeStampField))); setAutomaticFields(curEntry, setOwner, defaultOwner, setTimeStamp, timeStampField, timestamp); } } public static void setAutomaticFields(Collection<BibEntry> bibs, UpdateFieldPreferences prefs) { UpdateField.setAutomaticFields(bibs, prefs.isOverwriteOwner(), prefs.isOverwriteTimeStamp(), prefs); } }