package com.limegroup.gnutella; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.limewire.util.MediaType; import com.limegroup.gnutella.messages.QueryRequest; public class MediaTypeAggregator { /** Utility class for aggregating MediaTypes. * This class is not synchronized - it should never be used in a fashion * where synchronization is necessary. If that changes, add synch. */ public static class Aggregator { /** A list of MediaType objects. */ private List<MediaType> _filters = new LinkedList<MediaType>(); private Aggregator() {} /** I don't check for duplicates. */ public void addFilter(MediaType filter) { _filters.add(filter); } /** * @return an immutable list of mediatypes of aggregator. */ public List<MediaType> getMediaTypes() { return Collections.unmodifiableList(_filters); } /** @return true if the Response falls within one of the MediaTypes * this aggregates. */ public boolean allow(final String fName) { for(MediaType mt : _filters) { if(mt.matches(fName)) return true; } return false; } } /** @return a MediaType.Aggregator to use for your query. Null is a * possible return value. */ public static MediaTypeAggregator.Aggregator getAggregator(QueryRequest query) { if (query.desiresAll()) return null; MediaTypeAggregator.Aggregator retAggr = new MediaTypeAggregator.Aggregator(); if (query.desiresLinuxOSXPrograms()) retAggr.addFilter(MediaType.getOsxAndLinuxProgramMediaType()); if (query.desiresWindowsPrograms()) retAggr.addFilter(MediaType.getWindowsProgramMediaType()); if (query.desiresDocuments()) retAggr.addFilter(MediaType.getDocumentMediaType()); if (query.desiresAudio()) retAggr.addFilter(MediaType.getAudioMediaType()); if (query.desiresVideo()) retAggr.addFilter(MediaType.getVideoMediaType()); if (query.desiresImages()) retAggr.addFilter(MediaType.getImageMediaType()); return retAggr; } }