package com.jbidwatcher.auction.server.ebay; /* * Copyright (c) 2000-2007, CyberFOX Software, Inc. All Rights Reserved. * * Developed by mrs (Morgan Schweers) */ import java.util.NoSuchElementException; import java.util.ListIterator; import com.jbidwatcher.util.html.JHTML; import com.jbidwatcher.util.html.AbstractURLPager; import com.jbidwatcher.util.html.URLPagerIterator; import com.jbidwatcher.util.http.CookieJar; import com.jbidwatcher.util.config.JConfig; import com.jbidwatcher.auction.LoginManager; public class EbayAuctionURLPager extends AbstractURLPager { // constants private static final String URLSTYLE_HTTP_STR = "search.dll"; private static final int URLSTYLE_HTTP = 0; private static final int URLSTYLE_EBAY = 1; private static final int ITEMS_PER_PAGE = 100; private ebayCleaner mCleaner = new ebayCleaner(); private LoginManager mLogin; private int urlStyle; private JHTML lastPage; private boolean itemCountSet; public EbayAuctionURLPager(String url, LoginManager aucServ) { setURL(url); setItemsPerPage(ITEMS_PER_PAGE); mLogin = aucServ; // set the item count getPage(1); } protected void setURL(String url) { urlString = url; if(url.indexOf("ebay.") != -1) { // Determine the type of URL // Remove paging information if exists so we can add our own when needed if (url.indexOf(URLSTYLE_HTTP_STR) != -1) { urlStyle = URLSTYLE_HTTP; removePattern("&frpp=[0-9]*"); removePattern("&skip=[0-9]*"); } else { urlStyle = URLSTYLE_EBAY; removePattern("QQfrppZ[0-9]*"); removePattern("QQfrtsZ[0-9]*"); } } } private void removePattern(String regex) { urlString = urlString.replaceAll("(?i)"+regex, ""); } private String getPageURL(int pageNumber) { if (urlString.indexOf("ebay.") == -1) return urlString; if (urlStyle == URLSTYLE_HTTP) { return urlString + "&frpp=" + getItemsPerPage() + "&skip=" + (pageNumber - 1) * getItemsPerPage(); } else if (urlStyle == URLSTYLE_EBAY) { return urlString + "QQfrppZ" + getItemsPerPage() + "QQfrtsZ" + (pageNumber - 1) * getItemsPerPage(); } else { JConfig.log().logMessage("Unknown URLSTYLE: " + urlStyle); return null; } } protected JHTML getPage(String pageURL) { if(pageURL == null) return null; CookieJar cj = mLogin.getNecessaryCookie(false); String cookies = null; if(cj != null) cookies = cj.toString(); JHTML htmlDocument = new JHTML(pageURL, cookies, mCleaner); if(htmlDocument.isLoaded()) { return htmlDocument; } else { return null; } } public JHTML getPage(int pageNumber) { if(pageNumber < 1 || (itemCountSet && pageNumber > size())) { throw new NoSuchElementException(); } // We cache the last page since the constructor itself // retrieves the first page to determine the count number. // This can be reused when an iterator is instantiated. if(pageNumber == lastPageNumber) return lastPage; lastPageNumber = pageNumber; lastPage = getPage(getPageURL(pageNumber)); if(pageNumber == 1 && !itemCountSet) { setItemCount(); } return lastPage; } private void setItemCount() { if(lastPage == null) { setItemCount(0); itemCountSet = true; } else { String count = lastPage.getContentBeforeContent("items found for"); if (count == null) { count = lastPage.getContentBeforeContent("items found in"); } try { setItemCount(Integer.parseInt(count)); } catch (NumberFormatException e) { JConfig.log().logMessage("Unable to find item count on page! URL: " + getPageURL(1)); } // We set the flag regardless an error occurred. itemCountSet = true; } } public ListIterator listIterator(int index) { return new URLPagerIterator(this, index); } }