package org.jabref.logic.journals; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.SortedSet; import java.util.TreeSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * A repository for all journal abbreviations, including add and find methods. */ public class JournalAbbreviationRepository { private static final Log LOGGER = LogFactory.getLog(JournalAbbreviationRepository.class); private final Map<String, Abbreviation> fullNameLowerCase2Abbreviation = new HashMap<>(); private final Map<String, Abbreviation> isoLowerCase2Abbreviation = new HashMap<>(); private final Map<String, Abbreviation> medlineLowerCase2Abbreviation = new HashMap<>(); private final SortedSet<Abbreviation> abbreviations = new TreeSet<>(); public JournalAbbreviationRepository(Abbreviation... abbreviations) { for (Abbreviation abbreviation : abbreviations) { addEntry(abbreviation); } } public int size() { return abbreviations.size(); } public boolean isKnownName(String journalName) { String nameKey = Objects.requireNonNull(journalName).trim().toLowerCase(Locale.ENGLISH); return (fullNameLowerCase2Abbreviation.containsKey(nameKey)) || (isoLowerCase2Abbreviation.containsKey(nameKey)) || (medlineLowerCase2Abbreviation.containsKey(nameKey)); } public boolean isAbbreviatedName(String journalName) { String nameKey = Objects.requireNonNull(journalName).trim().toLowerCase(Locale.ENGLISH); return (isoLowerCase2Abbreviation.containsKey(nameKey)) || (medlineLowerCase2Abbreviation.containsKey(nameKey)); } /** * Attempts to get the abbreviated name of the journal given. May contain dots. * * @param journalName The journal name to abbreviate. * @return The abbreviated name */ public Optional<Abbreviation> getAbbreviation(String journalName) { String nameKey = Objects.requireNonNull(journalName).toLowerCase(Locale.ENGLISH).trim(); if (fullNameLowerCase2Abbreviation.containsKey(nameKey)) { return Optional.of(fullNameLowerCase2Abbreviation.get(nameKey)); } else if (isoLowerCase2Abbreviation.containsKey(nameKey)) { return Optional.of(isoLowerCase2Abbreviation.get(nameKey)); } else if (medlineLowerCase2Abbreviation.containsKey(nameKey)) { return Optional.of(medlineLowerCase2Abbreviation.get(nameKey)); } else { return Optional.empty(); } } public void addEntry(Abbreviation abbreviation) { Objects.requireNonNull(abbreviation); if (isKnownName(abbreviation.getName())) { Abbreviation previous = getAbbreviation(abbreviation.getName()).get(); abbreviations.remove(previous); LOGGER.info("Duplicate journal abbreviation - old one will be overwritten by new one\nOLD: " + previous + "\nNEW: " + abbreviation); } abbreviations.add(abbreviation); fullNameLowerCase2Abbreviation.put(abbreviation.getName().toLowerCase(Locale.ENGLISH), abbreviation); isoLowerCase2Abbreviation.put(abbreviation.getIsoAbbreviation().toLowerCase(Locale.ENGLISH), abbreviation); medlineLowerCase2Abbreviation.put(abbreviation.getMedlineAbbreviation().toLowerCase(Locale.ENGLISH), abbreviation); } public void addEntries(List<Abbreviation> abbreviationsToAdd) { abbreviationsToAdd.forEach(this::addEntry); } public SortedSet<Abbreviation> getAbbreviations() { return Collections.unmodifiableSortedSet(abbreviations); } public Optional<String> getNextAbbreviation(String text) { Optional<Abbreviation> abbreviation = getAbbreviation(text); if (!abbreviation.isPresent()) { return Optional.empty(); } Abbreviation abbr = abbreviation.get(); return Optional.of(abbr.getNext(text)); } public Optional<String> getMedlineAbbreviation(String text) { Optional<Abbreviation> abbreviation = getAbbreviation(text); if (!abbreviation.isPresent()) { return Optional.empty(); } Abbreviation abbr = abbreviation.get(); return Optional.of(abbr.getMedlineAbbreviation()); } public Optional<String> getIsoAbbreviation(String text) { Optional<Abbreviation> abbreviation = getAbbreviation(text); if (!abbreviation.isPresent()) { return Optional.empty(); } Abbreviation abbr = abbreviation.get(); return Optional.of(abbr.getIsoAbbreviation()); } }