package com.roboo.like.google.async;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.protocol.HTTP;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.content.Context;
import android.text.TextUtils;
import com.roboo.like.google.GoogleApplication;
import com.roboo.like.google.models.BusItem;
public class BusAsyncTaskLoader extends
BaseAsyncTaskLoader<LinkedList<BusItem>>
{
private static final String TAG_INPUT = "input";
private static final String ATTR_NAME = "name";
private static final String ATTR_VALUE = "value";
public static final String BASE_URL = "http://www.szjt.gov.cn/apts/";
public static final String BASE_BUS_LINE_URL = "http://www.szjt.gov.cn/apts/APTSLine.aspx";
// public static final String URL =
// "http://www.szjt.gov.cn/apts/APTSLine.aspx?__VIEWSTATE=%2FwEPDwUJNDk3MjU2MjgyD2QWAmYPZBYCAgMPZBYCAgEPZBYCAgYPDxYCHgdWaXNpYmxlaGRkZLSbkOWJhbw7r9tBdPn33bPCSlJcKXww5ounfGoyhKl3&__EVENTVALIDATION=%2FwEWAwLeub7XBwL88Oh8AqX89aoK1GKT3VlKUTd%2FxyQgZexCetMuo%2Fi%2FLRDnisAyha1YxN0%3D&ctl00%24MainContent%24SearchLine=%E6%90%9C%E7%B4%A2&ctl00%24MainContent%24LineName=";//
// 18
private Context mContext;
public String mBusNo;
public BusAsyncTaskLoader(Context context)
{
super(context);
this.mContext = context;
}
public BusAsyncTaskLoader(Context context, String busNo)
{
super(context);
this.mBusNo = busNo;
this.mContext = context;
}
public LinkedList<BusItem> loadInBackground()
{
LinkedList<BusItem> data = getBus();
mEndTime = System.currentTimeMillis();
if (mEndTime - mStartTime < THREAD_LEAST_DURATION_TIME)
{
try
{
Thread.sleep(THREAD_LEAST_DURATION_TIME);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
return data;
}
/***
* 生成查询公交的url
* @return
*/
private String genBusLineUrl()
{
StringBuffer stringBuffer = new StringBuffer(BASE_BUS_LINE_URL + "?");
try
{
Document document = Jsoup.connect(BASE_BUS_LINE_URL).get();
// System.out.println("document = " + document);
Elements elements = document.getElementsByTag(TAG_INPUT);
if (!elements.isEmpty() && elements.size() == 5)
{
for (int i = 0; i < elements.size(); i++)
{
Element element = elements.get(i);
String name = element.attr(ATTR_NAME);
String value = element.attr(ATTR_VALUE);
if (TextUtils.isEmpty(value))
{
value = mBusNo;
}
stringBuffer.append(URLEncoder.encode(name, HTTP.UTF_8));
stringBuffer.append("=");
stringBuffer.append(URLEncoder.encode(value, HTTP.UTF_8));
stringBuffer.append("&");
}
stringBuffer.deleteCharAt(stringBuffer.length() - 1);
}
// System.out.println("busLineUrl = " + stringBuffer.toString() );
}
catch (Exception e)
{
e.printStackTrace();
}
return stringBuffer.toString();
}
private LinkedList<BusItem> getBus()
{
LinkedList<BusItem> data = null;
try
{
// Document document = Jsoup.connect(URL + mBusNo).get();
String busLineUrl = genBusLineUrl();
if (BASE_BUS_LINE_URL.equals(busLineUrl))
{
System.out.println("生成要查询公交路线URL 失败");
return data;
}
Document document = Jsoup.connect(busLineUrl).get();
Element element = document.getElementById("MainContent_DATA");
if (element.getElementsByTag("tbody") != null &&!element.getElementsByTag("tbody").isEmpty())
{
element = element.getElementsByTag("tbody").get(0);
Elements elements = element.getElementsByTag("tr");
Elements tmpEleemnts = null;
String busUrl = null, busNo = null, busName = null;
if (!elements.isEmpty())
{
data = new LinkedList<BusItem>();
for (Element e : elements)
{
BusItem item = new BusItem();
tmpEleemnts = e.getElementsByTag("td");
if (!tmpEleemnts.isEmpty() && tmpEleemnts.size() == 2)
{
Elements aElemens = tmpEleemnts.get(0)
.getElementsByTag("a");
if (!aElemens.isEmpty())
{
busUrl = BASE_URL
+ aElemens.get(0).attr("href");
busNo = aElemens.get(0).text();
}
busName = tmpEleemnts.get(1).text();
if (!TextUtils.isEmpty(busName))
{
if (busName.contains("=>"))
{
busName = busName.replace("=>", " — ");
}
}
item.busName = busName;
item.busNo = busNo;
item.busUrl = busUrl;
if (!TextUtils.isEmpty(item.busNo)
&& !TextUtils.isEmpty(item.busName))
{
if (GoogleApplication.mIsExactBus)
{
if (mBusNo.equals(item.busNo))
{
data.add(item);
}
}
else
{
data.add(item);
}
}
}
}
if (data.size() == 0)
{
data = null;
}
}
}
}
catch (IOException e1)
{
e1.printStackTrace();
}
if (data != null)
{
mDebug = false;
if (mDebug)
{
for (BusItem item : data)
{
System.out.println("item = " + item);
}
}
Collections.sort(data, new BusNoComparator());
}
return data;
}
class BusNoComparator implements Comparator<BusItem>
{
public int compare(BusItem o1, BusItem o2)
{
if (o1 != null && o2 != null)
{
if (TextUtils.isDigitsOnly(o1.busNo)
&& TextUtils.isDigitsOnly(o2.busNo))
{
int busNo1 = Integer.parseInt(o1.busNo);
int busNo2 = Integer.parseInt(o2.busNo);
return busNo1 - busNo2;
}
}
return 0;
}
}
}