package com.limegroup.gnutella.library;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.limewire.friend.api.Friend;
import org.limewire.listener.EventBroadcaster;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@Singleton
class FileCollectionManagerImpl implements FileCollectionManager {
private final SharedFileCollectionImpl defaultSharedCollection;
private final IncompleteFileCollectionImpl incompleteCollection;
private final SharedFileCollectionImplFactory sharedFileCollectionImplFactory;
private final Map<Integer, SharedFileCollectionImpl> sharedCollections =
new HashMap<Integer,SharedFileCollectionImpl>();
private final EventBroadcaster<SharedFileCollectionChangeEvent> sharedBroadcaster;
private final Provider<LibraryFileData> libraryFileData;
@Inject public FileCollectionManagerImpl(
IncompleteFileCollectionImpl incompleteFileCollectionImpl,
SharedFileCollectionImplFactory sharedFileCollectionImplFactory,
EventBroadcaster<SharedFileCollectionChangeEvent> sharedBroadcaster,
Provider<LibraryFileData> libraryFileData) {
this.libraryFileData = libraryFileData;
this.incompleteCollection = incompleteFileCollectionImpl;
this.incompleteCollection.initialize();
this.sharedFileCollectionImplFactory = sharedFileCollectionImplFactory;
this.sharedBroadcaster = sharedBroadcaster;
this.defaultSharedCollection = sharedFileCollectionImplFactory.createSharedFileCollectionImpl(LibraryFileData.DEFAULT_SHARED_COLLECTION_ID, true, Friend.P2P_FRIEND_ID);
this.defaultSharedCollection.initialize();
}
void loadStoredCollections() {
for(Integer id : libraryFileData.get().getStoredCollectionIds()) {
if(!sharedCollections.containsKey(id) && id != LibraryFileData.DEFAULT_SHARED_COLLECTION_ID) {
SharedFileCollectionImpl collection = sharedFileCollectionImplFactory.createSharedFileCollectionImpl(id, false);
collection.initialize();
synchronized(this) {
sharedCollections.put(id, collection);
}
sharedBroadcaster.broadcast(new SharedFileCollectionChangeEvent(SharedFileCollectionChangeEvent.Type.COLLECTION_ADDED, collection));
}
}
}
FileCollection getGnutellaCollection() {
return defaultSharedCollection;
}
@Override
public synchronized SharedFileCollection getCollectionById(int collectionId) {
if(collectionId == LibraryFileData.DEFAULT_SHARED_COLLECTION_ID) {
return defaultSharedCollection;
} else {
return sharedCollections.get(collectionId);
}
}
@Override
public void removeCollectionById(int collectionId) {
// Cannot remove the default collection.
if(collectionId != LibraryFileData.DEFAULT_SHARED_COLLECTION_ID) {
// if it was a valid key, remove saved references to it
SharedFileCollectionImpl removeFileList;
synchronized(this) {
removeFileList = sharedCollections.remove(collectionId);
}
if(removeFileList != null) {
removeFileList.dispose();
sharedBroadcaster.broadcast(new SharedFileCollectionChangeEvent(SharedFileCollectionChangeEvent.Type.COLLECTION_REMOVED, removeFileList));
}
}
}
private synchronized SharedFileCollectionImpl createNewCollectionImpl(String name) {
int newId = libraryFileData.get().createNewCollection(name);
SharedFileCollectionImpl collection = sharedFileCollectionImplFactory.createSharedFileCollectionImpl(newId, false);
collection.initialize();
sharedCollections.put(newId, collection);
return collection;
}
@Override
public SharedFileCollection createNewCollection(String name) {
SharedFileCollectionImpl collection = createNewCollectionImpl(name);
sharedBroadcaster.broadcast(new SharedFileCollectionChangeEvent(SharedFileCollectionChangeEvent.Type.COLLECTION_ADDED, collection));
return collection;
}
@Override
public synchronized List<SharedFileCollection> getSharedFileCollections() {
List<SharedFileCollection> collections = new ArrayList<SharedFileCollection>(sharedCollections.size() + 1);
collections.add(defaultSharedCollection);
collections.addAll(sharedCollections.values());
return collections;
}
}