package it.fdev.scraper; import it.fdev.unisaconnect.FragmentMensa; import it.fdev.unisaconnect.MainActivity; import it.fdev.unisaconnect.R; import it.fdev.unisaconnect.data.MenuMensa; import it.fdev.unisaconnect.data.MenuMensa.PiattoMensa; import it.fdev.utils.Utils; import java.util.ArrayList; import java.util.Locale; import org.jsoup.Connection.Response; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.os.AsyncTask; import android.util.Log; /** * Frammento che si occupa dell'accesso al menu della mensa * * @author francesco * */ public class MenuMensaScraper extends AsyncTask<MainActivity, MenuMensaScraper.loadStates, Integer> { public final String MENSA_URL = "http://ammensa-unisa.appspot.com"; public boolean isRunning = false; protected MainActivity activity; private FragmentMensa callerMenuFragment; private MenuMensa menu = null; private String errorMessage; public static enum loadStates { START, ANALYZING, NO_INTERNET, MENU_NOT_AVAILABLE, UNKNOWN_PROBLEM, FINISHED }; @Override protected Integer doInBackground(MainActivity... activities) { try { activity = activities[0]; publishProgress(loadStates.START); Response response = Jsoup.connect(MENSA_URL).timeout(30000).execute(); Document document = response.parse(); Element infoTag = document.getElementsByTag("info").first(); String status = infoTag.attr("status"); if (!status.equals("1")) { if (infoTag.children().size() == 0 && infoTag.text().length() > 0) { errorMessage = infoTag.text(); } else { errorMessage = null; } publishProgress(loadStates.MENU_NOT_AVAILABLE); return -1; } // publishProgress(loadStates.ANALYZING); String menuDate = document.getElementsByTag("date").first().text(); String menuDateMillis = document.getElementsByTag("date").first().attr("millis"); String menuUrl = document.getElementsByTag("menuUrl").first().text(); ArrayList<PiattoMensa> firstCourses = getCourses(document.select("menu > firstCourses").first()); ArrayList<PiattoMensa> secondCourses = getCourses(document.select("menu > secondCourses").first()); ArrayList<PiattoMensa> sideCourses = getCourses(document.select("menu > sideCourses").first()); ArrayList<PiattoMensa> fruitCourse = getCourses(document.select("menu > fruitCourse").first()); ArrayList<PiattoMensa> takeAwayBasket = getCourses(document.select("menu > takeAwayBasket").first()); menu = new MenuMensa(menuDate, menuDateMillis, menuUrl, firstCourses, secondCourses, sideCourses, fruitCourse, takeAwayBasket); publishProgress(loadStates.FINISHED); } catch (Exception e) { menu = null; publishProgress(loadStates.UNKNOWN_PROBLEM); e.printStackTrace(); return -1; } return 0; } @Override protected void onProgressUpdate(MenuMensaScraper.loadStates... values) { MenuMensaScraperAlternativo mensaAlternativoScraper = new MenuMensaScraperAlternativo(); mensaAlternativoScraper.setCallerMenuMensaFragment(callerMenuFragment); super.onProgressUpdate(values); switch (values[0]) { case START: activity.setLoadingText(R.string.sincronizzazione_menu); break; case MENU_NOT_AVAILABLE: if (callerMenuFragment == null) { return; } if (errorMessage != null && errorMessage.toLowerCase(Locale.ITALIAN).contains("sorpresa")) { // Nel caso in cui ammensa-unisa non abbia il menu del giorno, verifico se unisamenu invece ne ha uno Log.d(Utils.TAG, "ammensa-unisa han no menu...trying with unisamenu"); mensaAlternativoScraper.setErrorMessage(errorMessage); mensaAlternativoScraper.execute(activity); } else { if (errorMessage != null) { callerMenuFragment.mostraErrore(errorMessage); } else { callerMenuFragment.mostraMenu(null); } } break; case NO_INTERNET: case UNKNOWN_PROBLEM: if (callerMenuFragment == null) { return; } // Nel caso in cui ammensa-unisa non abbia il menu del giorno, verifico se unisamenu invece ne ha uno Log.d(Utils.TAG, "ammensa-unisa han no menu...trying with unisamenu"); mensaAlternativoScraper.execute(activity); break; case FINISHED: if (callerMenuFragment == null) { return; } callerMenuFragment.mostraMenu(menu); 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 setCallerMenuMensaFragment(FragmentMensa callerMenuFragment) { this.callerMenuFragment = callerMenuFragment; } public ArrayList<PiattoMensa> getCourses(Element courses) { ArrayList<PiattoMensa> coursesList = new ArrayList<PiattoMensa>(); // Avoid Iterators: http://stackoverflow.com/questions/10291767/is-there-anything-faster-than-jsoup-for-html-scraping Elements list = courses.getElementsByTag("course"); Element cCourse; for (int i = 0; i < list.size(); i++) { cCourse = list.get(i); String name = cCourse.getElementsByTag("name").first().text().trim(); String ingredientsIt, ingredientsEn; Elements ingredientsTags = cCourse.getElementsByTag("ingredients"); if (ingredientsTags.size() == 0) { coursesList.add(new PiattoMensa(name)); } else if (ingredientsTags.size() == 1) { ingredientsIt = ingredientsTags.first().text().trim(); coursesList.add(new PiattoMensa(name, ingredientsIt)); } else { ingredientsEn = ingredientsTags.get(0).text().trim(); ingredientsIt = ingredientsTags.get(1).text().trim(); coursesList.add(new PiattoMensa(name, ingredientsIt, ingredientsEn)); } } return coursesList; } }