package com.limegroup.gnutella.library;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.limewire.inject.EagerSingleton;
import org.limewire.lifecycle.Service;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.name.Named;
/**
* The list of all known files. This creates and maintains a list of
* directories and FileDescs. It also creates a set of FileLists which
* may contain subsets of all FileDescs. Files can be added to just the
* FileManager or loaded into both the FileManager and a specified FileList
* once the FileDesc has been created. <p>
*
* This class is thread-safe.
*/
@EagerSingleton
class FileManagerImpl implements FileManager, Service {
private final LibraryImpl library;
private Saver saver;
/**
* Whether the FileManager has been shutdown.
*/
private volatile boolean shutdown;
/** The background executor. */
private final ScheduledExecutorService backgroundExecutor;
private final Provider<LibraryFileData> fileData;
private final Provider<LibraryConverter> libraryConverter;
private final FileCollectionManagerImpl fileCollectionManagerImpl;
/**
* Creates a new <tt>FileManager</tt> instance.
*/
@Inject
public FileManagerImpl(LibraryImpl managedFileList,
@Named("backgroundExecutor") ScheduledExecutorService backgroundExecutor,
Provider<LibraryFileData> libraryFileData,
Provider<LibraryConverter> libraryConverter,
FileCollectionManagerImpl collectionManager) {
this.backgroundExecutor = backgroundExecutor;
this.library = managedFileList;
this.fileData = libraryFileData;
this.fileCollectionManagerImpl = collectionManager;
this.libraryConverter = libraryConverter;
}
@Override
public String getServiceName() {
return org.limewire.i18n.I18nMarker.marktr("Shared Files");
}
@Override
public void initialize() {
library.initialize();
}
@Inject
void register(org.limewire.lifecycle.ServiceRegistry registry) {
registry.register(this);
}
@Override
public void start() {
LibraryConverter converter = libraryConverter.get();
if(converter.isOutOfDate()) {
library.fireLoading();
converter.convert(fileData.get());
}
fileCollectionManagerImpl.loadStoredCollections();
library.loadManagedFiles();
synchronized (this) {
if (saver == null) {
this.saver = new Saver();
backgroundExecutor.scheduleWithFixedDelay(saver, 1, 1, TimeUnit.MINUTES);
}
}
}
@Override
public void stop() {
library.save();
shutdown = true;
}
private class Saver implements Runnable {
public void run() {
if (!shutdown && library.isLoadFinished()) {
library.save();
}
}
}
}