package org.jabref.logic.integrity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import org.jabref.logic.integrity.IntegrityCheck.Checker;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.database.BibDatabase;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.FieldProperty;
import org.jabref.model.entry.InternalBibtexFields;
public class EntryLinkChecker implements Checker {
private final BibDatabase database;
public EntryLinkChecker(BibDatabase database) {
this.database = Objects.requireNonNull(database);
}
@Override
public List<IntegrityMessage> check(BibEntry entry) {
List<IntegrityMessage> result = new ArrayList<>();
for (Entry<String,String> field : entry.getFieldMap().entrySet()) {
Set<FieldProperty> properties = InternalBibtexFields.getFieldProperties(field.getKey());
if (properties.contains(FieldProperty.SINGLE_ENTRY_LINK)) {
if (!database.getEntryByKey(field.getValue()).isPresent()) {
result.add(new IntegrityMessage(Localization.lang("Referenced BibTeX key does not exist"), entry,
field.getKey()));
}
} else if (properties.contains(FieldProperty.MULTIPLE_ENTRY_LINK)) {
List<String> keys = new ArrayList<>(Arrays.asList(field.getValue().split(",")));
for (String key : keys) {
if (!database.getEntryByKey(key).isPresent()) {
result.add(new IntegrityMessage(
Localization.lang("Referenced BibTeX key does not exist") + ": " + key, entry,
field.getKey()));
}
}
}
}
return result;
}
}