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 java.util.ArrayList; 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; /** * Frammento che si occupa dell'accesso al menu della mensa * * @author francesco * */ public class MenuMensaScraperAlternativo extends AsyncTask<MainActivity, MenuMensaScraperAlternativo.loadStates, Integer> { public final String MENSA_URL = "http://www.unisamenu.it/"; public boolean isRunning = false; protected MainActivity activity; private FragmentMensa callerMenuFragment; private MenuMensa menu = null; private String errorMessage = null; 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(); // publishProgress(loadStates.ANALYZING); String menuDate = document.getElementById("date").text(); String menuUrl = ""; ArrayList<PiattoMensa> firstCourses = getCourses(document.getElementsByClass("primo").first()); ArrayList<PiattoMensa> secondCourses = getCourses(document.getElementsByClass("secondo").first()); ArrayList<PiattoMensa> sideCourses = getCourses(document.getElementsByClass("contorno").first()); ArrayList<PiattoMensa> fruitCourse = getCourses(document.getElementsByClass("altro").first()); ArrayList<PiattoMensa> takeAwayBasket = new ArrayList<MenuMensa.PiattoMensa>(); menu = new MenuMensa(menuDate, null, 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(MenuMensaScraperAlternativo.loadStates... values) { super.onProgressUpdate(values); switch (values[0]) { case START: activity.setLoadingText(R.string.sincronizzazione_menu); break; case MENU_NOT_AVAILABLE: case NO_INTERNET: case UNKNOWN_PROBLEM: if (callerMenuFragment == null) { return; } if (errorMessage != null) { callerMenuFragment.mostraErrore(errorMessage); } else { callerMenuFragment.mostraMenu(null); } 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 void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } 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.getElementsByClass("course"); Element cCourse; for (int i=0; i<list.size(); i++) { cCourse = list.get(i); String name = cCourse.getElementsByClass("name").first().text(); String ingredientsIt, ingredientsEn; Elements ingredientsTags = cCourse.getElementsByClass("description"); if (ingredientsTags.size() == 0) { coursesList.add(new PiattoMensa(name)); } else if (ingredientsTags.size() == 1) { ingredientsIt = ingredientsTags.first().text(); coursesList.add(new PiattoMensa(name, ingredientsIt)); } else { ingredientsEn = ingredientsTags.get(0).text(); ingredientsIt = ingredientsTags.get(1).text(); coursesList.add(new PiattoMensa(name, ingredientsIt, ingredientsEn)); } } return coursesList; } }