package org.jabref.gui.maintable; import org.jabref.model.database.event.EntryAddedEvent; import org.jabref.model.database.event.EntryRemovedEvent; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.event.EntryChangedEvent; import ca.odell.glazedlists.EventList; import com.google.common.eventbus.Subscribe; public class ListSynchronizer { private final EventList<BibEntry> list; public ListSynchronizer(EventList<BibEntry> list) { this.list = list; } @Subscribe public void listen(EntryAddedEvent entryAddedEvent) { lock(); try { list.add(entryAddedEvent.getBibEntry()); } finally { unlock(); } } @Subscribe public void listen(EntryRemovedEvent entryRemovedEvent) { lock(); try { list.remove(entryRemovedEvent.getBibEntry()); } finally { unlock(); } } @Subscribe public void listen(EntryChangedEvent entryChangedEvent) { lock(); try { // cannot use list#indexOf b/c it won't distinguish between duplicates for (int i = 0; i < list.size(); i++) { if (list.get(i) == entryChangedEvent.getBibEntry()) { list.set(i, entryChangedEvent.getBibEntry()); break; } } } finally { unlock(); } } private void lock() { list.getReadWriteLock().writeLock().lock(); } private void unlock() { list.getReadWriteLock().writeLock().unlock(); } }