package com.limegroup.gnutella.library;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import org.limewire.concurrent.ExecutorsHelper;
import org.limewire.concurrent.ListeningExecutorService;
import org.limewire.core.api.library.FileProcessingEvent;
import org.limewire.inject.AbstractModule;
import org.limewire.listener.EventBroadcaster;
import org.limewire.listener.EventListenerList;
import org.limewire.listener.EventMulticaster;
import org.limewire.listener.EventMulticasterImpl;
import org.limewire.listener.ListenerSupport;
import org.limewire.listener.SourcedEventMulticaster;
import org.limewire.listener.SourcedEventMulticasterImpl;
import org.limewire.listener.SourcedListenerSupport;
import org.limewire.listener.EventListenerList.EventListenerListContext;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
import com.google.inject.assistedinject.FactoryProvider;
public class LimeWireLibraryModule extends AbstractModule {
@Override
protected void configure() {
bind(LocalFileDetailsFactory.class).to(LocalFileDetailsFactoryImpl.class);
bind(SharedFilesKeywordIndex.class).to(SharedFilesKeywordIndexImpl.class);
bind(CreationTimeCache.class);
bind(FileViewManager.class).to(FileViewManagerImpl.class);
bind(FileCollectionManager.class).to(FileCollectionManagerImpl.class);
bind(FileManager.class).to(FileManagerImpl.class);
bind(Library.class).to(LibraryImpl.class);
bind(IncompleteFileCollection.class).to(IncompleteFileCollectionImpl.class);
bind(FileView.class).annotatedWith(IncompleteFiles.class).to(IncompleteFileCollection.class);
bind(SharedFileCollectionImplFactory.class).toProvider(
FactoryProvider.newFactory(SharedFileCollectionImplFactory.class, SharedFileCollectionImpl.class));
EventListenerListContext context = new EventListenerListContext();
SourcedEventMulticaster<FileViewChangeEvent, FileView> allFileCollectionMulticaster =
new SourcedEventMulticasterImpl<FileViewChangeEvent, FileView>(context);
bind(new TypeLiteral<SourcedEventMulticaster<FileViewChangeEvent, FileView>>(){}).toInstance(allFileCollectionMulticaster);
bind(new TypeLiteral<ListenerSupport<FileViewChangeEvent>>(){}).toInstance(allFileCollectionMulticaster);
EventMulticaster<SharedFileCollectionChangeEvent> sharedAllFileCollectionMulticaster =
new EventMulticasterImpl<SharedFileCollectionChangeEvent>(context);
bind(new TypeLiteral<EventBroadcaster<SharedFileCollectionChangeEvent>>(){}).toInstance(sharedAllFileCollectionMulticaster);
bind(new TypeLiteral<ListenerSupport<SharedFileCollectionChangeEvent>>(){}).toInstance(sharedAllFileCollectionMulticaster);
EventMulticaster<LibraryStatusEvent> managedListMulticaster =
new EventMulticasterImpl<LibraryStatusEvent>();
bind(new TypeLiteral<EventBroadcaster<LibraryStatusEvent>>(){}).toInstance(managedListMulticaster);
bind(new TypeLiteral<ListenerSupport<LibraryStatusEvent>>(){}).toInstance(managedListMulticaster);
bind(new TypeLiteral<EventMulticaster<LibraryStatusEvent>>(){}).toInstance(managedListMulticaster);
SourcedEventMulticaster<FileDescChangeEvent, FileDesc> fileDescMulticaster =
new SourcedEventMulticasterImpl<FileDescChangeEvent, FileDesc>();
bind(new TypeLiteral<EventBroadcaster<FileDescChangeEvent>>(){}).toInstance(fileDescMulticaster);
bind(new TypeLiteral<SourcedListenerSupport<FileDescChangeEvent, FileDesc>>(){}).toInstance(fileDescMulticaster);
bind(new TypeLiteral<ListenerSupport<FileDescChangeEvent>>(){}).toInstance(fileDescMulticaster);
bind(new TypeLiteral<SourcedEventMulticaster<FileDescChangeEvent, FileDesc>>(){}).toInstance(fileDescMulticaster);
bind(FileDescFactory.class).to(FileDescFactoryImpl.class);
ListeningExecutorService diskE = ExecutorsHelper.newProcessingQueue("Library Disk I/O Thread");
bind(ListeningExecutorService.class).annotatedWith(DiskIo.class).toInstance(diskE);
bind(ExecutorService.class).annotatedWith(DiskIo.class).toInstance(diskE);
bind(Executor.class).annotatedWith(DiskIo.class).toInstance(diskE);
EventListenerList<FileProcessingEvent> processingList = new EventListenerList<FileProcessingEvent>();
bind(new TypeLiteral<EventListenerList<FileProcessingEvent>>(){}).toInstance(processingList);
bind(new TypeLiteral<EventBroadcaster<FileProcessingEvent>>(){}).toInstance(processingList);
}
@Provides LibraryFileData lfd(LibraryImpl library) {
return library.getLibraryData();
}
@Provides @GnutellaFiles FileCollection gnetFileCollection(FileCollectionManagerImpl manager) {
return manager.getGnutellaCollection();
}
@Provides @GnutellaFiles FileView gnetFileView(FileViewManagerImpl manager) {
return manager.getGnutellaFileView();
}
@Provides @SharedFiles FileView allSharedView(FileViewManagerImpl manager) {
return manager.getAllSharedFilesView();
}
}