package it.fdev.scraper; import it.fdev.unisaconnect.FragmentBus; import it.fdev.unisaconnect.MainActivity; import it.fdev.unisaconnect.model.bustrattaendpoint.Bustrattaendpoint; import it.fdev.unisaconnect.model.bustrattaendpoint.model.BusCorsa; import it.fdev.unisaconnect.model.bustrattaendpoint.model.BusFermata; import it.fdev.unisaconnect.model.bustrattaendpoint.model.BusTratta; import it.fdev.utils.Utils; import java.util.ArrayList; import java.util.List; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.json.gson.GsonFactory; public class BusScraper { // public static final String BASE_URL = "http://192.168.1.199:8888/unisaconnectbus/"; public static final String BASE_URL = "http://unisaconnectbus.appspot.com/unisaconnectbus/"; public static final String CERCA_STAZIONE_URL = BASE_URL + "cercastazione"; public static final String TRATTE_STAZIONE_URL = BASE_URL + "gettrattestazione"; public static enum loadStates { START, ANALYZING, NO_INTERNET, UNKNOWN_PROBLEM, FINISHED }; public static class AddQuoteAsyncTask extends AsyncTask<String, Void, BusTratta> { Context context; private ProgressDialog pd; public AddQuoteAsyncTask(Context context) { this.context = context; } protected void onPreExecute() { super.onPreExecute(); pd = new ProgressDialog(context); pd.setMessage("Adding the Quote..."); pd.show(); } protected BusTratta doInBackground(String... params) { BusTratta response = null; try { Bustrattaendpoint.Builder builder = new Bustrattaendpoint.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), null); Bustrattaendpoint service = builder.build(); BusTratta tratta = new BusTratta(); response = service.insertBusTratta(tratta).execute(); } catch (Exception e) { Log.d("Could not Add Quote", e.getMessage(), e); } return response; } protected void onPostExecute(BusTratta quote) { // Clear the progress dialog and the fields pd.dismiss(); // editMessage.setText(""); // editAuthorName.setText(""); // Display success message to user // Toast.makeText(getBaseContext(), "Quote added succesfully", Toast.LENGTH_SHORT).show(); } } public static class CercaStazione extends AsyncTask<Object, BusScraper.loadStates, Integer> { public boolean isRunning = false; protected MainActivity mActivity; private FragmentBus callerBusFragment; ArrayList<String> risultatiRicerca = new ArrayList<String>(); @Override protected Integer doInBackground(Object... params) { try { mActivity = (MainActivity) params[0]; String query = (String) params[1]; Log.d(Utils.TAG, "Cerco le stazioni - " + query); publishProgress(loadStates.START); Connection connection = Jsoup.connect(CERCA_STAZIONE_URL); connection.timeout(30000); connection.data("q", query); Document document = connection.post(); Log.d(Utils.TAG, "Analizzo le stazioni - " + query); Elements stazioniEl = document.getElementsByTag("stazione"); risultatiRicerca.clear(); for (Element cStazioneEl : stazioniEl) { Log.d(Utils.TAG, "----> " + cStazioneEl.text()); risultatiRicerca.add(cStazioneEl.text()); } publishProgress(loadStates.FINISHED); } catch (Exception e) { Log.w(Utils.TAG, "----> Errore!", e); e.printStackTrace(); publishProgress(loadStates.UNKNOWN_PROBLEM); return -1; } return 0; } @Override protected void onProgressUpdate(BusScraper.loadStates... values) { super.onProgressUpdate(values); switch (values[0]) { case START: break; case NO_INTERNET: case UNKNOWN_PROBLEM: if (callerBusFragment == null) { return; } callerBusFragment.showRisultatiRicerca(null); break; case FINISHED: if (callerBusFragment == null) { return; } callerBusFragment.showRisultatiRicerca(risultatiRicerca); break; default: break; } } @Override protected void onPreExecute() { super.onPreExecute(); isRunning = true; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); isRunning = false; } @Override protected void onCancelled() { super.onCancelled(); isRunning = false; } public void setCallerBusFragment(FragmentBus caller) { callerBusFragment = caller; } } public static class GetTratteStazione extends AsyncTask<Object, BusScraper.loadStates, Integer> { public boolean isRunning = false; protected MainActivity mActivity; private FragmentBus callerBusFragment; ArrayList<BusTratta> tratteRicerca = new ArrayList<BusTratta>(); @Override protected Integer doInBackground(Object... params) { try { mActivity = (MainActivity) params[0]; String stazione = (String) params[1]; Log.d(Utils.TAG, "Cerco le tratte - " + stazione); publishProgress(loadStates.START); Connection connection = Jsoup.connect(TRATTE_STAZIONE_URL); connection.timeout(30000); connection.data("q", stazione); Document document = connection.post(); Log.d(Utils.TAG, "Analizzo le tratte - " + stazione); Elements stazioniEl = document.getElementsByTag("tratta"); tratteRicerca.clear(); for (Element cTrattaEl : stazioniEl) { BusTratta cTratta = xmlToTratta(cTrattaEl); tratteRicerca.add(cTratta); } publishProgress(loadStates.FINISHED); } catch (Exception e) { Log.w(Utils.TAG, "----> Errore!", e); e.printStackTrace(); publishProgress(loadStates.UNKNOWN_PROBLEM); return -1; } return 0; } public BusTratta xmlToTratta(Element trattaXML) { String compagnia = trattaXML.getElementsByTag("compagnia").get(0).text(); String capolinea = trattaXML.getElementsByTag("capolinea").get(0).text(); List<BusCorsa> corse = new ArrayList<BusCorsa>(); Elements corseList = trattaXML.getElementsByTag("corsa"); for (Element cCorsaEl : corseList) { BusCorsa cCorsa = xmlToCorsa(cCorsaEl); corse.add(cCorsa); } List<String> stazioniVersoUni = new ArrayList<String>(); Elements stazioneVersoUniList = trattaXML.getElementsByTag("stazioneVU"); for (Element cStazioneEl : stazioneVersoUniList) { String cStazione = cStazioneEl.text(); stazioniVersoUni.add(cStazione); } List<String> stazioniDaUni = new ArrayList<String>(); Elements stazioneDaUniList = trattaXML.getElementsByTag("stazioneDU"); for (Element cStazioneEl : stazioneDaUniList) { String cStazione = cStazioneEl.text(); stazioniDaUni.add(cStazione); } BusTratta tratta = new BusTratta(); tratta.setCompagnia(compagnia); tratta.setCapolinea(capolinea); tratta.setCorse(corse); tratta.setStazioniVersoUni(stazioniVersoUni); tratta.setStazioniDaUni(stazioniDaUni); return tratta; // return new BusTratta(compagnia, capolinea, corse, stazioniVersoUni, stazioniDaUni); } public BusCorsa xmlToCorsa(Element corsaXML) { boolean versoUni = corsaXML.getElementsByTag("verso_uni").get(0).text().equalsIgnoreCase("true"); String giorni = corsaXML.getElementsByTag("giorni").get(0).text(); int oraPartenza = Integer.parseInt(corsaXML.getElementsByTag("ora").get(0).text()); List<BusFermata> fermate = new ArrayList<BusFermata>(); Elements fermateList = corsaXML.getElementsByTag("fermata"); for (Element cFermataEl : fermateList) { BusFermata cFermata = xmlToFermata(cFermataEl); fermate.add(cFermata); } BusCorsa corsa = new BusCorsa(); corsa.setVersoUni(versoUni); corsa.setGiorni(giorni); corsa.setOraPartenza(oraPartenza); corsa.setFermate(fermate); return corsa; // return new BusCorsa(versoUni, giorni, oraPartenza, fermate); } public BusFermata xmlToFermata(Element fermataXML) { String stazione = fermataXML.getElementsByTag("stazione").get(0).text(); int ora = Integer.parseInt(fermataXML.getElementsByTag("ora").get(0).text()); int posizione = Integer.parseInt(fermataXML.getElementsByTag("posizione").get(0).text()); BusFermata fermata = new BusFermata(); fermata.setStazione(stazione); fermata.setOra(ora); fermata.setPosizione(posizione); return fermata; // return new BusFermata(stazione, ora, posizione); } @Override protected void onProgressUpdate(BusScraper.loadStates... values) { super.onProgressUpdate(values); switch (values[0]) { case START: break; case NO_INTERNET: case UNKNOWN_PROBLEM: if (callerBusFragment == null) { return; } callerBusFragment.showTratteRicerca(null); break; case FINISHED: if (callerBusFragment == null) { return; } callerBusFragment.showTratteRicerca(tratteRicerca); break; default: break; } } @Override protected void onPreExecute() { super.onPreExecute(); isRunning = true; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); isRunning = false; } @Override protected void onCancelled() { super.onCancelled(); isRunning = false; } public void setCallerBusFragment(FragmentBus caller) { callerBusFragment = caller; } } }