package it.fdev.scraper;
import it.fdev.unisaconnect.FragmentPresenze;
import it.fdev.unisaconnect.MainActivity;
import it.fdev.unisaconnect.MainActivity.BootableFragmentsEnum;
import it.fdev.unisaconnect.R;
import it.fdev.unisaconnect.data.Presenze;
import it.fdev.unisaconnect.data.Presenze.RiepilogoPresenzeEsame;
import it.fdev.unisaconnect.data.SharedPrefDataManager;
import it.fdev.utils.Utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;
import org.jsoup.select.Elements;
import android.os.AsyncTask;
import android.util.Log;
/**
* Frammento che si occupa dell'accesso alle presenze
*
* @author francesco
*
*/
public class PresenzeScraper extends AsyncTask<MainActivity, PresenzeScraper.loadStates, Integer> {
public boolean isRunning = false;
private final String START_URL = "http://www.presenzestudenti.unisa.it/studente";
private final String AUTH_URL = "https://sso.unisa.it/idp/Authn/UserPassword";
private final String BASE_URL = "http://www.presenzestudenti.unisa.it";
private final String INDEX_URL = BASE_URL + "/index_st.php";
private final String LOGIN_URL = BASE_URL + "/informazioni_st.php";
private final String RIEPILOGO_URL = BASE_URL + "/cartellino_studente.php"; // Pagina con il form per scegliere l'esame
private final String DOM_STUDENTE_URL = BASE_URL + "/domXML_studente.php"; // Lista esami
private final String CARTELLINO_URL = BASE_URL + "/ris_cartellino_studente.php"; // Dettagli esame
private final int REQUEST_TIMEOUT = 30000;
private final int SLEEP_TIME_REQUESTS = 500;
protected MainActivity activity;
private SharedPrefDataManager mDataManager;
private FragmentPresenze callerPresenzeFragment;
private Presenze presenze = null;
public static enum loadStates {
START, SYNCING, NO_INTERNET, NO_DATA, PRESENZE_NOT_AVAILABLE, UNKNOWN_PROBLEM, FINISHED
};
@Override
protected Integer doInBackground(MainActivity... activities) {
try {
activity = activities[0];
publishProgress(loadStates.START);
mDataManager = new SharedPrefDataManager(activity);
if (!mDataManager.loginDataExists()) {
publishProgress(loadStates.NO_DATA);
return -1;
}
String user = mDataManager.getUser() + "@studenti.unisa.it";
String pass = mDataManager.getPass();
Map<String, String> cookies;
Response res;
Document document;
// Set initial cookies
res = Jsoup.connect(START_URL)
.method(Method.GET)
.timeout(REQUEST_TIMEOUT)
.execute();
cookies = res.cookies();
Thread.sleep(SLEEP_TIME_REQUESTS);
// Login
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(AUTH_URL);
String cookiesString = "";
for (Entry<String,String> cCookie : cookies.entrySet()) {
cookiesString += cCookie.getKey() + "=" + cCookie.getValue() + "; ";
}
httppost.setHeader("Cookie", cookiesString);
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
nameValuePairs.add(new BasicNameValuePair("j_username", user));
nameValuePairs.add(new BasicNameValuePair("j_password", pass));
nameValuePairs.add(new BasicNameValuePair("profilo", "s"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
try {
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
String html = EntityUtils.toString(response.getEntity());
document = Jsoup.parse(html, BASE_URL);
System.out.println(document);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
publishProgress(loadStates.UNKNOWN_PROBLEM);
return -1;
}
Thread.sleep(SLEEP_TIME_REQUESTS);
// Check wrong user/pwd
// Elements datiErrati = document.getElementById("container2").getElementsContainingText("I dati di accesso sono errati");
Element datiErrati = document.getElementById("error");
if (datiErrati != null) {
publishProgress(loadStates.NO_DATA);
return -1;
}
publishProgress(loadStates.SYNCING);
res = Jsoup.connect(RIEPILOGO_URL)
.cookies(cookies)
.method(Method.GET)
.timeout(REQUEST_TIMEOUT)
.execute();
Thread.sleep(SLEEP_TIME_REQUESTS);
// Get esami
res = Jsoup.connect(DOM_STUDENTE_URL)
.cookies(cookies)
.method(Method.GET)
.timeout(REQUEST_TIMEOUT)
.execute();
Thread.sleep(SLEEP_TIME_REQUESTS);
document = Jsoup.parse(res.body(), "", Parser.xmlParser());
ArrayList<Presenze.Esame> listaEsami = new ArrayList<Presenze.Esame>();
Elements timbraturaList = document.getElementsByTag("TIMBRATURA");
if (timbraturaList.size() <= 0) {
publishProgress(loadStates.PRESENZE_NOT_AVAILABLE);
return -1;
}
Element timbratura, codCorso;
for (int i=0; i<timbraturaList.size(); i++) {
ArrayList<RiepilogoPresenzeEsame> listaAttivita = new ArrayList<Presenze.RiepilogoPresenzeEsame>();
timbratura = timbraturaList.get(i);
String id = timbratura.attr("id");
String aa_off = timbratura.attr("aa_off");
codCorso = timbratura.getElementsByTag("CODCORSO").get(0);
String desccorso = codCorso.attr("desccorso");
String cod = codCorso.text();
Log.d(Utils.TAG, "id: " + id + " aa_off:" + aa_off + " desccorso:" + desccorso + " cod:" + cod);
Document dettagliEsameDocument = Jsoup.connect(CARTELLINO_URL)
.data("anno", aa_off)
.data("select_aa_off", "7")
.data("corso", cod)
.data("descr_corso", desccorso)
.data("select_codcorso" , "2")
.cookies(cookies)
.method(Method.GET)
.timeout(REQUEST_TIMEOUT)
.post();
Thread.sleep(500);
Elements tables = dettagliEsameDocument.getElementsByTag("table");
// Element detailsTable = tables.get(0).getElementsByTag("tbody").get(0);
Element summaryTable = tables.get(1).getElementsByTag("tbody").get(0);
Elements cRowColumns;
Elements rowList;
// rowList = detailsTable.getElementsByTag("tr");
// for (int j=0; j< rowList.size(); j++) {
// cRowColumns = rowList.get(j).getElementsByTag("td");
// String giorno = cRowColumns.get(0).text();
// String timbrature = cRowColumns.get(1).text();
// String attivita = cRowColumns.get(2).text();
// String ore = cRowColumns.get(3).text();
// String aula = cRowColumns.get(4).text();
// listaPresenze.add(new DettagliPresenza(giorno, timbrature, attivita, ore, aula));
// Log.d(Utils.TAG, "giorno:" + giorno + " timbrature:" + timbrature + " attivita:" + attivita + " ore:" + ore + " aula:" + aula);
// }
rowList = summaryTable.getElementsByTag("tr");
for (int j=0; j< rowList.size(); j++) {
cRowColumns = rowList.get(j).getElementsByTag("td");
String attivita = cRowColumns.get(0).text();
String totaleOreStudente = cRowColumns.get(1).text();
String totaleOreDocente = cRowColumns.get(2).text();
String frequenza = cRowColumns.get(3).text();
listaAttivita.add(new RiepilogoPresenzeEsame(attivita, totaleOreStudente, totaleOreDocente, frequenza));
Log.d(Utils.TAG, "attivita:" + attivita + " totaleOreStudente:" + totaleOreStudente + " totaleOreDocente:" + totaleOreDocente + " frequenza:" + frequenza);
}
Presenze.Esame esame = new Presenze.Esame(desccorso, aa_off, listaAttivita);
listaEsami.add(esame);
}
presenze = new Presenze(listaEsami);
publishProgress(loadStates.FINISHED);
} catch (Exception e) {
presenze = null;
publishProgress(loadStates.UNKNOWN_PROBLEM);
e.printStackTrace();
return -1;
}
return 0;
}
@Override
protected void onProgressUpdate(PresenzeScraper.loadStates... values) {
super.onProgressUpdate(values);
switch (values[0]) {
case START:
activity.setLoadingText(R.string.autenticazione_esse3);
break;
case SYNCING:
activity.setLoadingText(R.string.sincronizzazione_esse3);
break;
case PRESENZE_NOT_AVAILABLE:
case NO_INTERNET:
case UNKNOWN_PROBLEM:
if (callerPresenzeFragment != null) {
callerPresenzeFragment.mostraPresenze(null);
}
Utils.dismissAlert();
break;
case NO_DATA:
Utils.createAlert(activity, activity.getString(R.string.dati_errati), BootableFragmentsEnum.ACCOUNT, false);
break;
case FINISHED:
activity.setLoadingText(R.string.completamento_esse3);
if (callerPresenzeFragment != null) {
callerPresenzeFragment.mostraPresenze(presenze);
}
Utils.dismissAlert();
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 setCallerPresenzeFragment(FragmentPresenze callerMenuFragment) {
this.callerPresenzeFragment = callerMenuFragment;
}
}