package com.dubture.getcomposer.packages; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class AsyncPackageSearch extends AsyncDownloadClient { private int pageLimit = 3; protected List<PackageSearchListenerInterface> listeners = new ArrayList<PackageSearchListenerInterface>(); private Map<String, Integer> counters = new HashMap<String, Integer>(); private Map<String, Boolean> aborts = new HashMap<String, Boolean>(); private Log log = LogFactory.getLog(AsyncPackageSearch.class); public AsyncPackageSearch() { super(); init(); } public AsyncPackageSearch(String baseUrl) { super(baseUrl, true); init(); } private void init() { downloader.addDownloadListener(new DownloadListenerAdapater() { private String getQuery(String url) { try { return URLDecoder.decode(url.replaceFirst(".+q=([^?&]+).*", "$1"), "UTF-8"); } catch (UnsupportedEncodingException e) { log.error(e); } return null; } public void dataReceived(InputStream content, String url) { try { // parse query from url String query = getQuery(url); if (isAborted(query)) { return; } SearchResult result = PackageHelper.getSearchResult(content); int counter = getCounter(query); if (result != null && result.results != null) { for (PackageSearchListenerInterface listener : listeners) { listener.packagesFound(result.results, query, result); } } if (result != null && result.next != null && result.next.length() > 0 && counter < pageLimit) { downloader.setUrl(result.next); downloader.download(); counters.put(query, counter + 1); } } catch (Exception e) { for (PackageSearchListenerInterface listener : listeners) { listener.errorOccured(e); } } } public void aborted(String url) { aborts.put(getQuery(url), true); for (PackageSearchListenerInterface listener : listeners) { listener.aborted(url); } } }); } public void addPackageSearchListener(PackageSearchListenerInterface listener) { if (!listeners.contains(listener)) { listeners.add(listener); } } public void removePackageSearchListener(PackageSearchListenerInterface listener) { listeners.remove(listener); } private int getCounter(String query) { if (!counters.containsKey(query)) { counters.put(query, 1); } return counters.get(query); } private boolean isAborted(String query) { if (!aborts.containsKey(query)) { aborts.put(query, false); } return aborts.get(query); } public int search(String query) { // reset counter + abort state counters.put(query, 1); aborts.put(query, false); downloader.setUrl(createUrl(query)); return downloader.download(); } /** * @return the pageLimit */ public int getPageLimit() { return pageLimit; } /** * @param pageLimit the pageLimit to set */ public void setPageLimit(int pageLimit) { this.pageLimit = pageLimit; } }