package org.limewire.collection.glazedlists;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import ca.odell.glazedlists.CollectionList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.FilterList;
import ca.odell.glazedlists.FreezableList;
import ca.odell.glazedlists.FunctionList;
import ca.odell.glazedlists.GroupingList;
import ca.odell.glazedlists.ObservableElementList;
import ca.odell.glazedlists.PopularityList;
import ca.odell.glazedlists.RangeList;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.ThresholdList;
import ca.odell.glazedlists.TransactionList;
import ca.odell.glazedlists.UniqueList;
import ca.odell.glazedlists.CollectionList.Model;
import ca.odell.glazedlists.FunctionList.Function;
import ca.odell.glazedlists.ObservableElementList.Connector;
import ca.odell.glazedlists.ThresholdList.Evaluator;
import ca.odell.glazedlists.impl.ReadOnlyList;
import ca.odell.glazedlists.impl.SubEventList;
import ca.odell.glazedlists.impl.ThreadSafeList;
import ca.odell.glazedlists.impl.swing.SwingThreadProxyEventList;
import ca.odell.glazedlists.io.CachingList;
import ca.odell.glazedlists.matchers.Matcher;
import ca.odell.glazedlists.matchers.MatcherEditor;
import ca.odell.glazedlists.util.concurrent.Lock;
/**
* A factory for creating all kinds of GlazedLists.
* This is necessary when creating any list with a source,
* in a multi-threaded environment.
*/
public class GlazedListsFactory {
/** Returns a snapshot copy of the list. */
public static <E> List<E> copyList(EventList<? extends E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new ArrayList<E>(source);
} finally {
lock.unlock();
}
}
public static CachingList cachingList(EventList source, int maxSize) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new CachingList(source, maxSize);
} finally {
lock.unlock();
}
}
public static <S, E> CollectionList<S, E> collectionList(EventList<S> source, Model<S, E> model) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new CollectionList<S, E>(source, model);
} finally {
lock.unlock();
}
}
public static <E> FilterList<E> filterList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new FilterList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> FilterList<E> filterList(EventList<E> source, Matcher<? super E> matcher) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new FilterList<E>(source, matcher);
} finally {
lock.unlock();
}
}
public static <E> FilterList<E> filterList(EventList<E> source, MatcherEditor<? super E> matcherEditor) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new FilterList<E>(source, matcherEditor);
} finally {
lock.unlock();
}
}
public static <E> FreezableList<E> freezableList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new FreezableList<E>(source);
} finally {
lock.unlock();
}
}
public static <E, S> FunctionList<S, E> functionList(EventList<S> source, Function<S,E> forward) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new FunctionList<S, E>(source, forward);
} finally {
lock.unlock();
}
}
public static <E, S> FunctionList<S, E> functionList(EventList<S> source, Function<S,E> forward, Function<E,S> reverse) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new FunctionList<S, E>(source, forward, reverse);
} finally {
lock.unlock();
}
}
public static <E, S> SimpleFunctionList<S, E> simpleFunctionList(EventList<S> source, Function<S,E> forward) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new SimpleFunctionList<S, E>(source, forward);
} finally {
lock.unlock();
}
}
public static <E> GroupingList<E> groupingList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new GroupingList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> GroupingList<E> groupingList(EventList<E> source, Comparator<E> comparator) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new GroupingList<E>(source, comparator);
} finally {
lock.unlock();
}
}
public static <E> ObservableElementList<E> observableElementList(EventList<E> source, Connector<E> elementConnector) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new ObservableElementList<E>(source, elementConnector);
} finally {
lock.unlock();
}
}
public static <E> PopularityList<E> popularityList(EventList<E> source, Comparator<E> uniqueComparator) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new PopularityList<E>(source, uniqueComparator);
} finally {
lock.unlock();
}
}
public static <E> PopularityList<E> popularityList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new PopularityList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> RangeList<E> rangeList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new RangeList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> ThresholdList<E> thresholdList(EventList<E> source, String propertyName) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new ThresholdList<E>(source, propertyName);
} finally {
lock.unlock();
}
}
public static <E> ThresholdList<E> thresholdList(EventList<E> source, Evaluator<E> evaluator) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new ThresholdList<E>(source, evaluator);
} finally {
lock.unlock();
}
}
public static <E> ReadOnlyList<E> readOnlyList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new ReadOnlyList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> SortedList<E> sortedList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new SortedList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> SortedList<E> sortedList(EventList<E> source, Comparator<? super E> comparator) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new SortedList<E>(source, comparator);
} finally {
lock.unlock();
}
}
public static <E> SubEventList<E> subEventList(EventList<E> source, int startIndex, int endIndex, boolean automaticallyRemove) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new SubEventList<E>(source, startIndex, endIndex, automaticallyRemove);
} finally {
lock.unlock();
}
}
public static <E> SwingThreadProxyEventList<E> swingThreadProxyEventList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new SwingThreadProxyEventList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> ThreadSafeList<E> threadSafeList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new ThreadSafeList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> UniqueList<E> uniqueList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new UniqueList<E>(source);
} finally {
lock.unlock();
}
}
public static <E> UniqueList<E> uniqueList(EventList<E> source, Comparator<E> comparator) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new UniqueList<E>(source, comparator);
} finally {
lock.unlock();
}
}
public static <E> TransactionList<E> transactionList(EventList<E> source) {
Lock lock = source.getReadWriteLock().readLock();
lock.lock();
try {
return new TransactionList<E>(source);
} finally {
lock.unlock();
}
}
}