package org.jabref.logic.cleanup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.jabref.logic.formatter.bibtexfields.ClearFormatter;
import org.jabref.model.FieldChange;
import org.jabref.model.cleanup.CleanupJob;
import org.jabref.model.cleanup.FieldFormatterCleanup;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.FieldName;
import org.jabref.model.entry.identifier.DOI;
/**
* Formats the DOI (e.g. removes http part) and also moves DOIs from note, url or ee field to the doi field.
*/
public class DoiCleanup implements CleanupJob {
/**
* Fields to check for DOIs.
*/
private static final List<String> FIELDS = Arrays.asList(FieldName.NOTE, FieldName.URL, "ee");
@Override
public List<FieldChange> cleanup(BibEntry entry) {
List<FieldChange> changes = new ArrayList<>();
// First check if the Doi Field is empty
if (entry.hasField(FieldName.DOI)) {
String doiFieldValue = entry.getField(FieldName.DOI).orElse(null);
Optional<DOI> doi = DOI.parse(doiFieldValue);
if (doi.isPresent()) {
String newValue = doi.get().getDOI();
if (!doiFieldValue.equals(newValue)) {
entry.setField(FieldName.DOI, newValue);
FieldChange change = new FieldChange(entry, FieldName.DOI, doiFieldValue, newValue);
changes.add(change);
}
// Doi field seems to contain Doi -> cleanup note, url, ee field
for (String field : FIELDS) {
entry.getField(field).flatMap(DOI::parse)
.ifPresent(unused -> removeFieldValue(entry, field, changes));
}
}
} else {
// As the Doi field is empty we now check if note, url, or ee field contains a Doi
for (String field : FIELDS) {
Optional<DOI> doi = entry.getField(field).flatMap(DOI::parse);
if (doi.isPresent()) {
// update Doi
String oldValue = entry.getField(FieldName.DOI).orElse(null);
String newValue = doi.get().getDOI();
entry.setField(FieldName.DOI, newValue);
FieldChange change = new FieldChange(entry, FieldName.DOI, oldValue, newValue);
changes.add(change);
removeFieldValue(entry, field, changes);
}
}
}
return changes;
}
private void removeFieldValue(BibEntry entry, String field, List<FieldChange> changes) {
CleanupJob eraser = new FieldFormatterCleanup(field, new ClearFormatter());
changes.addAll(eraser.cleanup(entry));
}
}