package glaze.soup.sync; import glaze.soup.Mode; import glaze.util.ResponseUtil; import java.io.IOException; import java.io.Serializable; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.ResponseHandler; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public abstract class SoupHandler<T> implements ResponseHandler<T>, Serializable { private static final long serialVersionUID = -590561025854232430L; public static SoupHandler<Document> instance(Mode mode) { return new SoupHandler<Document>(mode) { private static final long serialVersionUID = -268684803417627991L; @Override protected Document onDocument(Document doc) { return doc; } }; } private String baseUri; private Mode mode; public SoupHandler() { this("", Mode.HTML); } public SoupHandler(Mode mode) { this("", mode); } public SoupHandler(String baseUri) { this(baseUri, Mode.HTML); } public SoupHandler(String baseUri, Mode mode) { this.baseUri = baseUri; this.mode = mode; } @Override public T handleResponse(HttpResponse response) throws ClientProtocolException, IOException { HttpEntity entity = response.getEntity(); String charset = ResponseUtil.resolveEncoding(response); Document doc = Jsoup.parse(entity.getContent(), charset, baseUri, mode.getParser()); return onDocument(doc); } abstract protected T onDocument(Document doc); }