package com.rosaloves.bitlyj; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.rosaloves.bitlyj.Bitly.Provider; import com.rosaloves.bitlyj.data.Pair; import com.rosaloves.bitlyj.utils.Dom; /** * Utility class to support the DSL. Exposes method instances via static * functions their with corresponding names. * * $Id$ * * @author clewis Jul 18, 2010 * */ final class Methods { public static BitlyMethod<UrlInfo> info(String value) { return new MethodBase<UrlInfo>("info", getUrlMethodArgs(value)) { public UrlInfo apply(Provider provider, Document document) { return parseInfo(provider, document.getElementsByTagName("info").item(0)); } }; } public static BitlyMethod<Set<UrlInfo>> info(String ... values) { return new MethodBase<Set<UrlInfo>>("info", getUrlMethodArgs(values)) { public Set<UrlInfo> apply(Provider provider, Document document) { HashSet<UrlInfo> inf = new HashSet<UrlInfo>(); NodeList infos = document.getElementsByTagName("info"); for(int i = 0; i < infos.getLength(); i ++) { inf.add(parseInfo(provider, infos.item(i))); } return inf; } }; } public static BitlyMethod<Url> expand(String values) { return new MethodBase<Url>("expand", getUrlMethodArgs(values)) { public Url apply(Provider provider, Document document) { return parseUrl(provider, document.getElementsByTagName("entry").item(0)); } }; } public static BitlyMethod<Set<Url>> expand(String ... values) { return new MethodBase<Set<Url>>("expand", getUrlMethodArgs(values)) { public Set<Url> apply(Provider provider, Document document) { HashSet<Url> inf = new HashSet<Url>(); NodeList infos = document.getElementsByTagName("entry"); for(int i = 0; i < infos.getLength(); i ++) { inf.add(parseUrl(provider, infos.item(i))); } return inf; } }; } public static BitlyMethod<ShortenedUrl> shorten(final String longUrl) { return new MethodBase<ShortenedUrl>("shorten", Pair.p("longUrl", longUrl)) { public ShortenedUrl apply(Provider provider, Document document) { NodeList infos = document.getElementsByTagName("data"); return parseShortenedUrl(provider, infos.item(0)); } }; } public static BitlyMethod<UrlClicks> clicks(String string) { return new MethodBase<UrlClicks>("clicks", Pair.p(hashOrUrl(string), string)) { public UrlClicks apply(Provider provider, Document document) { return parseClicks(provider, document.getElementsByTagName("clicks").item(0)); } }; } public static BitlyMethod<Set<UrlClicks>> clicks(String ... string) { return new MethodBase<Set<UrlClicks>>("clicks", getUrlMethodArgs(string)) { public Set<UrlClicks> apply(Provider provider, Document document) { HashSet<UrlClicks> clicks = new HashSet<UrlClicks>(); NodeList nl = document.getElementsByTagName("clicks"); for(int i = 0; i < nl.getLength(); i ++) { clicks.add(parseClicks(provider, nl.item(i))); } return clicks; } }; } /* Package-private parsing aids. */ //TODO this is a util - move it static Collection<Pair<String, String>> getUrlMethodArgs(String... value) { List<Pair<String, String>> pairs = new ArrayList<Pair<String,String>>(); for(String p : value) { pairs.add(Pair.p(hashOrUrl(p), p)); } return pairs; } static String hashOrUrl(String p) { return p.startsWith("http://") ? "shortUrl" : "hash"; } static UrlClicks parseClicks(Provider provider, Node item) { NodeList nl = item.getChildNodes(); long user = 0, global = 0; for(int i = 0; i < nl.getLength(); i++) { String name = nl.item(i).getNodeName(); String value = Dom.getTextContent(nl.item(i)); if("user_clicks".equals(name)) { user = Long.parseLong(value); } else if("global_clicks".equals(name)) { global = Long.parseLong(value); } } return new UrlClicks(Methods.parseUrl(provider, item), user, global); } static ShortenedUrl parseShortenedUrl(Provider provider, Node nl) { String gHash = "", uHash = "", sUrl = "", lUrl = "", isNew = ""; NodeList il = nl.getChildNodes(); for(int i = 0; i < il.getLength(); i ++) { Node n = il.item(i); String name = n.getNodeName(); String value = Dom.getTextContent(n).trim(); if("new_hash".equals(name)) { isNew = value; } else if("url".equals(name)) { sUrl = value; } else if("long_url".equals(name)) { lUrl = value; } else if("global_hash".equals(name)) { gHash = value; } else if("hash".equals(name)) { uHash = value; } } return new ShortenedUrl(provider.getUrl(), gHash, uHash, sUrl, lUrl, isNew.equals("1")); } static Url parseUrl(Provider provider, Node nl) { String gHash = "", uHash = "", sUrl = "", lUrl = ""; NodeList il = nl.getChildNodes(); for(int i = 0; i < il.getLength(); i ++) { Node n = il.item(i); String name = n.getNodeName(); String value = Dom.getTextContent(n); if("short_url".equals(name)) { sUrl = value; } else if("long_url".equals(name)) { lUrl = value; } else if("global_hash".equals(name)) { gHash = value; } else if("user_hash".equals(name)) { uHash = value; } else if("hash".equals(name)) { uHash = value; } } return new Url(provider.getUrl(), gHash, uHash, sUrl, lUrl); } static UrlInfo parseInfo(Provider provider, Node nl) { NodeList il = nl.getChildNodes(); String title = "", createdBy = ""; for(int i = 0; i < il.getLength(); i ++) { Node n = il.item(i); String name = n.getNodeName(); String value = Dom.getTextContent(n); if("created_by".equals(name)) { createdBy = value; } else if("title".equals(name)) { title = value; } } return new UrlInfo(parseUrl(provider, nl), createdBy, title); } }