package com.limegroup.gnutella;
import java.util.ArrayList;
import java.util.List;
import org.limewire.core.api.Category;
import org.limewire.core.api.file.CategoryManager;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.inject.Inject;
import com.limegroup.gnutella.messages.QueryRequest;
/**
* Interacts with {@link QueryRequest} methods such as
* {@link QueryRequest#desiresAudio()}, {@link QueryRequest#desiresDocuments()},
* etc.. and translates them into {@link Category} and {@link Predicate
* Predicates}.
*/
public class QueryCategoryFilterer {
private final CategoryManager categoryManager;
@Inject public QueryCategoryFilterer(CategoryManager categoryManager) {
this.categoryManager = categoryManager;
}
/** Returns a list of categories requested, or null if all are requested. */
public List<Category> getRequestedCategories(QueryRequest query) {
if(query.desiresAll()) {
return null;
}
List<Category> categories = new ArrayList<Category>();
if (query.desiresLinuxOSXPrograms() || query.desiresWindowsPrograms()) {
categories.add(Category.PROGRAM);
}
if (query.desiresDocuments()) {
categories.add(Category.DOCUMENT);
}
if (query.desiresAudio()) {
categories.add(Category.AUDIO);
}
if (query.desiresVideo()) {
categories.add(Category.VIDEO);
}
if (query.desiresImages()) {
categories.add(Category.IMAGE);
}
if (query.desiresTorrents()) {
categories.add(Category.TORRENT);
}
return categories;
}
/** Returns a Predicate<String> to use for your query. */
public Predicate<String> getPredicateForQuery(QueryRequest query) {
if (query.desiresAll()) {
return Predicates.alwaysTrue();
}
List<Predicate<String>> predicates = new ArrayList<Predicate<String>>();
if (query.desiresLinuxOSXPrograms()) {
predicates.add(categoryManager.getOsxAndLinuxProgramsFilter());
}
if (query.desiresWindowsPrograms()) {
predicates.add(categoryManager.getWindowsProgramsFilter());
}
if (query.desiresDocuments()) {
predicates.add(categoryManager.getExtensionFilterForCategory(Category.DOCUMENT));
}
if (query.desiresAudio()) {
predicates.add(categoryManager.getExtensionFilterForCategory(Category.AUDIO));
}
if (query.desiresVideo()) {
predicates.add(categoryManager.getExtensionFilterForCategory(Category.VIDEO));
}
if (query.desiresImages()) {
predicates.add(categoryManager.getExtensionFilterForCategory(Category.IMAGE));
}
if (query.desiresTorrents()) {
predicates.add(categoryManager.getExtensionFilterForCategory(Category.TORRENT));
}
return Predicates.or(predicates);
}
}