package com.limegroup.gnutella.downloader; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.limegroup.gnutella.settings.DownloadSettings; /** A class to determine which SelectionStrategy should be used for a given file. */ public class SelectionStrategyFactory { private static final Log LOG = LogFactory.getLog(SelectionStrategyFactory.class); /** @param extension a String representation of a file extension, * without the leading period. * @param fileSize the size (in bytes) of the file to be downloaded. * @return the proper SelectionStrategy to use, based on the input params. */ public static SelectionStrategy getStrategyFor(String extension, long fileSize) { // Check if the extension matches known previewable extennsions if (extension != null && extension.length() > 0) { // Put the extension in canonical form extension = extension.toLowerCase(); String[] previewableExtensions = DownloadSettings.PREVIEWABLE_EXTENSIONS.getValue(); // Loop over all previewable extensions for (int i = previewableExtensions.length-1; i >= 0; i--) { // If the extension is previewable, return a strategy // favorable for previewing if (previewableExtensions[i].toLowerCase().equals(extension)) { if (LOG.isDebugEnabled()) { LOG.debug("Extension ("+extension+") is previewable."); } return new BiasedRandomDownloadStrategy(fileSize); } } } // By default, return a strategy that favors overall network health // over previews. if (LOG.isDebugEnabled()) { LOG.debug("Extension ("+extension+") is not previewable."); } return new RandomDownloadStrategy(fileSize); } }