package com.limegroup.gnutella.library;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.limewire.core.api.Category;
import org.limewire.core.api.file.CategoryManager;
import org.limewire.core.settings.LibrarySettings;
import org.limewire.setting.StringArraySetting;
import org.limewire.util.FileUtils;
import com.google.inject.Inject;
/**
* Converts from old-style library settings (shared files)
* to new-style library settings (managed files)
*/
@SuppressWarnings("deprecation")
class LibraryConverter {
private final CategoryManager categoryManager;
@Inject public LibraryConverter(CategoryManager categoryManager) {
this.categoryManager = categoryManager;
}
boolean isOutOfDate() {
return LibrarySettings.VERSION.get() == LibrarySettings.LibraryVersion.FOUR_X.name();
}
void convert(final LibraryFileData newData) {
newData.revertToDefault();
List<File> sharedFolders = new ArrayList<File>();
List<File> excludedFolders = new ArrayList<File>();
List<File> excludedFiles = new ArrayList<File>();
List<String> extensions = new ArrayList<String>();
OldLibraryData oldData = new OldLibraryData(); // load if necessary
for(File folder : OldLibrarySettings.DIRECTORIES_TO_SHARE.get()) {
if(!LibraryUtils.isSensitiveDirectory(folder) || oldData.SENSITIVE_DIRECTORIES_VALIDATED.contains(folder)) {
folder = FileUtils.canonicalize(folder);
sharedFolders.add(folder);
}
}
excludedFolders.addAll(oldData.DIRECTORIES_NOT_TO_SHARE);
for(File file : oldData.SPECIAL_FILES_TO_SHARE) {
file = FileUtils.canonicalize(file);
if(addManagedFile(newData, file)) {
newData.setFileInCollection(file, LibraryFileData.DEFAULT_SHARED_COLLECTION_ID, true);
}
}
for(File file : oldData.FILES_NOT_TO_SHARE) {
file = FileUtils.canonicalize(file);
excludedFiles.add(file);
}
// Set the new managed extensions.
extensions.addAll(Arrays.asList(OldLibrarySettings.getDefaultExtensions()));
extensions.removeAll(Arrays.asList(StringArraySetting.decode(OldLibrarySettings.EXTENSIONS_LIST_UNSHARED.get())));
extensions.addAll(Arrays.asList(StringArraySetting.decode(OldLibrarySettings.EXTENSIONS_LIST_CUSTOM.get())));
// newData.setManagedExtensions(extensions);
Set<File> convertedDirectories = new HashSet<File>();
// Here's the bulk of the conversion -- loop through, recursively, previously
// shared directories & mark all potential files as shareable.
convertSharedDirectories(sharedFolders, excludedFolders, excludedFiles, extensions, convertedDirectories, newData);
for(File file : oldData.SPECIAL_STORE_FILES) {
file = FileUtils.canonicalize(file);
addManagedFile(newData, file);
}
//add save directory contents to library
LibraryConverterHelper helper = new LibraryConverterHelper(new LibraryConverterHelper.FileAdder() {
@Override
public void addFile(File file) {
addManagedFile(newData, file);
}
}, categoryManager);
helper.convertSaveDirectories(excludedFolders, excludedFiles, convertedDirectories);
LibrarySettings.VERSION.set(LibrarySettings.LibraryVersion.FIVE_0_0.name());
oldData.revertToDefault();
OldLibrarySettings.DIRECTORIES_TO_SHARE.revertToDefault();
OldLibrarySettings.DISABLE_SENSITIVE.revertToDefault();
OldLibrarySettings.EXTENSIONS_LIST_CUSTOM.revertToDefault();
OldLibrarySettings.EXTENSIONS_LIST_UNSHARED.revertToDefault();
OldLibrarySettings.EXTENSIONS_TO_SHARE.revertToDefault();
}
/**
* Checks to make sure that the file is not a document before adding file to managed file list.
* Returns true if the files was not a document, false otherwise.
*/
private boolean addManagedFile(LibraryFileData newData, File file) {
Category category = categoryManager.getCategoryForFile(file);
if(category != Category.DOCUMENT && category != Category.PROGRAM) {
newData.addManagedFile(file);
return true;
}
return false;
}
private void convertSharedDirectories(List<File> sharedFolders, List<File> excludedFolders,
List<File> excludedFiles, List<String> extensions, Set<File> convertedDirectories, final LibraryFileData data) {
LibraryConverterHelper helper = new LibraryConverterHelper(new LibraryConverterHelper.FileAdder() {
@Override
public void addFile(File file) {
if(addManagedFile(data, file)) {
data.setFileInCollection(file, LibraryFileData.DEFAULT_SHARED_COLLECTION_ID, true);
}
}
}, categoryManager);
for (File directory : sharedFolders) {
helper.convertDirectory(directory, extensions, excludedFolders, excludedFiles, convertedDirectories, true);
}
}
}