package com.gemokodero.zk.core;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
import android.os.Handler;
import android.os.Message;
import com.gemokodero.zk.utils.ResultsAdapter;
import com.gemokodero.zk.utils.Utils;
public class Search {
private ArrayList<Result> mAllResults;
private ResultsAdapter mAdapter;
private String mTerm;
private String mLocation;
private Handler mHandler;
private int resultsCountHelper = 1;
private static String mRequestUrl = "";
public Search() {
}
public Search(Handler handler, ArrayList<Result> allResults, ResultsAdapter resAdapter) {
mAdapter = resAdapter;
mAllResults = allResults;
mHandler = handler;
}
public void setTerm(String term) {
mTerm = term.toLowerCase();
}
public void setSearchLocation(String location) {
mLocation = location;
}
public int getResultsCount() {
String requestUrl = mRequestUrl;
try {
requestUrl += URLEncoder.encode(mTerm, "UTF-8") +"/" + URLEncoder.encode(mLocation, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
TagNode rootNode = getRootNode(requestUrl);
int resultsCount = 1;
Object[] len = evaluateXPath(Utils.XPATH_RESULT_COUNT, rootNode);
Object[] noRes = evaluateXPath(Utils.XPATH_NO_RESULTS, rootNode);
if(noRes.length > 0) {
resultsCount = 0;
}
if(len.length > 0) {
String str = ((StringBuffer) len[0]).toString();
String[] tempContent = str.split(" ");
resultsCount = Integer.parseInt(tempContent[3]);
}
return resultsCount;
}
private Runnable resultAdded = new Runnable() {
public void run() {
resultsCountHelper++;
if(resultsCountHelper >= 1) {
final Message m = mHandler.obtainMessage();
m.what = 666;
mHandler.sendMessage(m);
resultsCountHelper = 0;
}
mAdapter.notifyDataSetChanged();
}
};
public void exec(int page) {
String requestUrl = mRequestUrl;
try {
requestUrl += URLEncoder.encode(mTerm, "UTF-8") +"/" + URLEncoder.encode(mLocation, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
exec(requestUrl + "/" + Integer.toString(page));
}
public void exec(String requestUrl) {
TagNode rootNode = getRootNode(requestUrl);
int resLenght = evaluateXPath(Utils.XPATH_RESULTS_NUM, rootNode).length;
if (resLenght > 0) {
for(int res = 1; res <= resLenght; res++) {
if(Thread.currentThread().isInterrupted()) {
return;
}
Result result = new Result();
Object[] nameNodes = evaluateXPath(String.format(Utils.XPATH_RESULTS_NAME, Integer.toString(res)), rootNode);
Object[] infoNodes = evaluateXPath(String.format(Utils.XPATH_RESULTS_ALL, Integer.toString(res)), rootNode);
Object[] metaNodes = evaluateXPath(String.format(Utils.XPATH_RESULTS_METAINFO, Integer.toString(res)), rootNode);
String websiteNode = null;
if(metaNodes.length > 0) {
websiteNode = (String) metaNodes[0];
}
String name = ((TagNode) nameNodes[0]).getText().toString();
String address = ((TagNode) infoNodes[0]).getText().toString();
String location = ((TagNode) infoNodes[1]).getText().toString();
String phone = ((TagNode) infoNodes[2]).getText().toString();
address = address.substring(8, address.length());
location = location.substring(7, location.length());
phone = phone.substring(9, phone.length()).replaceAll("\\D", "");
result.setName(name);
result.setAddress(address);
result.setLocation(location);
result.setPhoneNumber(phone);
result.setWebsite(websiteNode);
mAllResults.add(result);
mHandler.post(resultAdded);
}
} else {
// Utils.goHome(mContext);
}
}
private Object[] evaluateXPath(String xpath, TagNode rootNode) {
Object[] nodes = null;
try {
nodes = rootNode.evaluateXPath(xpath);
} catch (XPatherException e) {
e.printStackTrace();
}
return nodes;
}
private TagNode getRootNode(String requestUrl) {
TagNode rootNode = null;
HtmlCleaner mainCleaner = new HtmlCleaner();
CleanerProperties cProps = mainCleaner.getProperties();
cProps.setAllowHtmlInsideAttributes(false);
cProps.setAllowMultiWordAttributes(false);
cProps.setRecognizeUnicodeChars(true);
cProps.setOmitComments(true);
cProps.setOmitUnknownTags(true);
URL url = null;
try {
url = new URL(requestUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
}
URLConnection urlConn = null;
try {
urlConn = url.openConnection();
urlConn.setRequestProperty(
"User-Agent", "Mozilla 5.0 (Windows; U; "
+ "Windows NT 5.1; en-US; rv:1.8.0.11) ");
} catch (IOException e) {
e.printStackTrace();
}
try {
rootNode = mainCleaner.clean(new InputStreamReader(urlConn.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
return rootNode;
}
}