/** * */ package com.googlecode.flickr2twitter.impl.ebay; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.TimeZone; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import com.googlecode.flickr2twitter.org.apache.commons.lang3.StringUtils; /** * @author hochen * */ public class FindItemsDAO { // private String sellerId = "eforcity"; private static final String APP_ID_SANDBOX= "eBayb1609-29f8-4684-aadb-6ba5a05a182"; private static final String APP_ID_PROD = "eBay929a8-96bf-4ad8-a71c-94de77a7c9e"; String EBAY_SANDBOX_SERVICE_SERVER = "svcs.sandbox.ebay.com"; String EBAY_SANDBOX_SERVICE_PATH = "/services/search/FindingService/v1"; String EBAY_SERVICE_SERVER = "svcs.ebay.com"; String EBAY_SERVICE_PATH = "/services/search/FindingService/v1"; public List<EbayItem> findItemsByKeywordsFromSandbox( String keywords, String minPrice, String maxPrice, int entriesPerPage) throws IOException, SAXException { return findItemsByKeywords(true, null, keywords, minPrice, maxPrice, entriesPerPage); } public List<EbayItem> findItemsByKeywordsFromProduction( String keywords, String minPrice, String maxPrice, int entriesPerPage) throws IOException, SAXException { return findItemsByKeywords(false, null, keywords, minPrice, maxPrice, entriesPerPage); } public URL buildSearchItemsUrl( boolean isSandbox, String keywords, String minPrice, String maxPrice, int entriesPerPage) throws MalformedURLException { Map<String, String> parameters = generateSearchParameters(isSandbox, keywords, null, minPrice, maxPrice, entriesPerPage); URL url = null; if (isSandbox) { url = URLHelper.buildUrl( false, EBAY_SANDBOX_SERVICE_SERVER, 80, EBAY_SANDBOX_SERVICE_PATH, parameters); } else { url = URLHelper.buildUrl( false, EBAY_SERVICE_SERVER, 80, EBAY_SERVICE_PATH, parameters); } return url; } public String urlEncode(String keywords) { try { String encoding = System.getProperty("file.encoding"); if (StringUtils.isNotBlank(encoding)) { keywords = URLEncoder.encode(keywords, encoding); } } catch (Exception e) { //ignore e.printStackTrace(); } return keywords; } private Map<String, String> generateSearchParameters( boolean isSandbox, String keywords, String sellerId, String minPrice, String maxPrice, int entriesPerPage) { Map<String, String> parameters = new LinkedHashMap<String, String>(); if (isSandbox) { parameters.put(urlEncode("SECURITY-APPNAME"), APP_ID_SANDBOX); } else { parameters.put(urlEncode("SECURITY-APPNAME"), APP_ID_PROD); } parameters.put(urlEncode("OPERATION-NAME"), "findItemsByKeywords"); parameters.put(urlEncode("SERVICE-VERSION"), "1.9.0"); parameters.put(urlEncode("RESPONSE-DATA-FORMAT"), "XML"); parameters.put(urlEncode("REST-PAYLOAD"), ""); parameters.put("paginationInput.entriesPerPage", String.valueOf(entriesPerPage)); parameters.put("keywords", urlEncode(keywords)); int i=0; if (sellerId != null) { parameters.put(urlEncode("itemFilter["+i +"].name"), "Seller"); parameters.put(urlEncode("itemFilter["+i +"].value"), urlEncode(sellerId)); i++; } Double minPrice2 = null; try { if (minPrice != null) { minPrice2 = new Double(minPrice); } } catch (NumberFormatException nfe) { } Double maxPrice2 = null; try { if (maxPrice != null) { maxPrice2 = new Double(maxPrice); } } catch (NumberFormatException nfe) { } if (minPrice2 != null) { parameters.put(urlEncode("itemFilter["+i +"].name"), "MinPrice"); parameters.put(urlEncode("itemFilter["+i +"].value"), urlEncode(String.valueOf(minPrice2))); i++; } if (maxPrice2 != null) { parameters.put(urlEncode("itemFilter["+ i +"].name"), "MaxPrice"); parameters.put(urlEncode("itemFilter["+ i +"].value"), urlEncode(String.valueOf(maxPrice2))); i++; } parameters.put("sortOrder", "StartTimeNewest"); parameters.put("descriptionSearch", "true"); return parameters; } public List<EbayItem> findItemsByKeywords( boolean isSandbox, String sellerId, String keywords, String minPrice, String maxPrice, int entriesPerPage) throws IOException, SAXException { URL url = buildSearchItemsUrl(isSandbox, keywords, minPrice, maxPrice, entriesPerPage); System.out.println(url); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); InputStream in = null; Document document = null; try { in = conn.getInputStream(); DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); document = builder.parse(in); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } } if (document == null) { return null; } NodeList nodeList = document.getElementsByTagName("item"); List<EbayItem> lstItem = new ArrayList<EbayItem>(); if (nodeList != null) { for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); NodeList itemRootNode = node.getChildNodes(); EbayItem item = new EbayItem(sellerId); lstItem.add(item); generateItem(itemRootNode, item); } } return lstItem; } private void generateItem(NodeList itemNode, EbayItem item) { if (itemNode == null || item == null) { return; } for (int k = 0; k < itemNode.getLength(); k++) { Node firstLevelNode = itemNode.item(k); if (itemNode != null) { String nodeName = firstLevelNode.getNodeName(); String nodeValue = getNodeValue(firstLevelNode); if (nodeName != null) { if ("itemId".equals(nodeName) && nodeValue != null) { try { item.setItemId(Long.parseLong(nodeValue)); } catch (NumberFormatException nfe) { } } else if ("title".equals(nodeName)) { item.setTitle(nodeValue); } else if ("viewItemURL".equals(nodeName)) { item.setViewItemURL(nodeValue); } else if ("galleryURL".equals(nodeName)) { item.setGalleryURL(nodeValue); } else if ("listingInfo".equals(nodeName)) { generateItem(firstLevelNode.getChildNodes(), item); } else if ("startTime".equals(nodeName)) { item.setStartTime(toDate(nodeValue)); } else if ("endTime".equals(nodeName)) { item.setEndTime(toDate(nodeValue)); } else if ("convertedBuyItNowPrice".equals(nodeName) && nodeValue != null) { try { item.setBuyItNowPrice(Double.parseDouble(nodeValue)); } catch (NumberFormatException nfe) { } } else if ("sellingStatus".equals(nodeName)) { generateItem(firstLevelNode.getChildNodes(), item); } else if ("convertedCurrentPrice".equals(nodeName) && nodeValue != null) { try { item.setCurrentPrice(Double.parseDouble(nodeValue)); } catch (NumberFormatException nfe) { } } } } } } private Date toDate(String strDate) { if (strDate == null) { return null; } try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); return sdf.parse(strDate); } catch (Exception e) { e.printStackTrace(); } return null; } private String getNodeValue(Node node) { if (node == null || node.getFirstChild() == null) { return null; } return node.getFirstChild().getNodeValue(); } public static void main(String args[]) throws Exception { FindItemsDAO ItemDAO = new FindItemsDAO(); //System.out.println(ItemDAO.findItemsByKeywords(false,"eforcity","iphone", 10)); System.out.println(ItemDAO.findItemsByKeywords(false,null,"nikon d80", "100.00111", "", 10)); } }