package org.jabref.logic.citationstyle; import java.util.HashMap; import java.util.Map; import java.util.Objects; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.event.EntryRemovedEvent; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.event.EntryChangedEvent; import com.google.common.eventbus.Subscribe; /** * Caches the generated Citations for quicker access * {@link CitationStyleGenerator} generates the citaiton with JavaScript which may take some time */ public class CitationStyleCache { private CitationStyle citationStyle = CitationStyle.getDefault(); private Map<BibEntry, String> citationStylesCache = new HashMap<>(); public CitationStyleCache(BibDatabaseContext bibDatabaseContext) { this(bibDatabaseContext, CitationStyle.getDefault()); } public CitationStyleCache(BibDatabaseContext bibDatabaseContext, CitationStyle citationStyle) { this.setCitationStyle(citationStyle); bibDatabaseContext.getDatabase().registerListener(new BibDatabaseEntryListener()); } /** * returns the citation for the given BibEntry and the set CitationStyle */ public String getCitationFor(BibEntry entry) { String citation = citationStylesCache.get(entry); if (citation == null) { citation = CitationStyleGenerator.generateCitation(entry, this.citationStyle.getSource(), CitationStyleOutputFormat.HTML); citationStylesCache.put(entry, citation); } return citation; } public void setCitationStyle(CitationStyle citationStyle) { Objects.requireNonNull(citationStyle); if (!this.citationStyle.equals(citationStyle)) { this.citationStyle = citationStyle; this.citationStylesCache.clear(); } } public CitationStyle getCitationStyle() { return citationStyle; } private class BibDatabaseEntryListener { /** * removes the outdated citation of the changed entry */ @Subscribe public void listen(EntryChangedEvent entryChangedEvent) { citationStylesCache.remove(entryChangedEvent.getBibEntry()); } /** * removes the citation of the removed entry as it's not needed anymore */ @Subscribe public void listen(EntryRemovedEvent entryRemovedEvent) { citationStylesCache.remove(entryRemovedEvent.getBibEntry()); } } }