package org.limewire.core.impl.library; import java.awt.EventQueue; import java.util.Comparator; import org.limewire.collection.glazedlists.GlazedListsFactory; import org.limewire.core.api.library.FileList; import org.limewire.core.api.library.LocalFileItem; import ca.odell.glazedlists.CompositeList; import ca.odell.glazedlists.EventList; import ca.odell.glazedlists.TransformedList; import ca.odell.glazedlists.event.ListEventPublisher; import ca.odell.glazedlists.util.concurrent.ReadWriteLock; /** * Allows creation of a composite sharing the same ListEventPublisher and * ReadWriteLock. Provides methods for creating member lists and adding and * removing them to the internal composite list. */ class CombinedShareList implements FileList<LocalFileItem> { private final CompositeList<LocalFileItem> compositeList; private final EventList<LocalFileItem> threadSafeUniqueList; private volatile TransformedList<LocalFileItem, LocalFileItem> swingList; /** * Creates a read-only composite list using the given listeEventPublisher * and readWriteLock. The list does not contain duplicates. Uniqueness in * the list of maintained by the file path of the LocalFileItem. */ public CombinedShareList(ListEventPublisher listEventPublisher, ReadWriteLock readWriteLock) { compositeList = new CompositeList<LocalFileItem>(listEventPublisher, readWriteLock); threadSafeUniqueList = GlazedListsFactory.uniqueList(GlazedListsFactory .threadSafeList(GlazedListsFactory.readOnlyList(compositeList)), new Comparator<LocalFileItem>() { @Override public int compare(LocalFileItem o1, LocalFileItem o2) { return o1.getFile().getPath().compareTo(o2.getFile().getPath()); } }); } /** * @see ca.odell.glazedlists.CompositeList#removeMemberList(EventList) */ public void removeMemberList(EventList<LocalFileItem> eventList) { compositeList.getReadWriteLock().writeLock().lock(); try { compositeList.removeMemberList(eventList); } finally { compositeList.getReadWriteLock().writeLock().unlock(); } } /** * @see ca.odell.glazedlists.CompositeList#createMemberList() */ public EventList<LocalFileItem> createMemberList() { return compositeList.createMemberList(); } /** * @see ca.odell.glazedlists.CompositeList#addMemberList(EventList) */ public void addMemberList(EventList<LocalFileItem> eventList) { compositeList.getReadWriteLock().writeLock().lock(); try { compositeList.addMemberList(eventList); } finally { compositeList.getReadWriteLock().writeLock().unlock(); } } @Override public EventList<LocalFileItem> getModel() { return threadSafeUniqueList; } @Override public EventList<LocalFileItem> getSwingModel() { assert EventQueue.isDispatchThread(); if (swingList == null) { swingList = GlazedListsFactory.swingThreadProxyEventList(threadSafeUniqueList); } return swingList; } @Override public int size() { return threadSafeUniqueList.size(); } }