package it.fdev.scraper;
import it.fdev.unisaconnect.FragmentNews;
import it.fdev.unisaconnect.MainActivity;
import it.fdev.utils.CardsAdapter;
import it.fdev.utils.CardsAdapter.CardItem;
import it.fdev.utils.Utils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
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.support.v4.app.Fragment;
import android.text.Html;
import android.util.Log;
/**
* Frammento che si occupa dell'accesso al menu della mensa
*
* @author francesco
*
*/
public class RssScraper extends AsyncTask<MainActivity, RssScraper.loadStates, Integer> {
public boolean isRunning = false;
private Fragment callerFragment;
private String url = null;
private ArrayList<CardsAdapter.CardItem> itemsList = null;
private int maxItemsToFetch = Integer.MAX_VALUE;
private int maxTextLength = Integer.MAX_VALUE;
public static enum loadStates {
START, ANALYZING, NO_INTERNET, NO_URL_DEFINED, UNKNOWN_PROBLEM, FINISHED
};
public RssScraper(String url) {
this.url = url;
}
// Rss 2.0 format: http://cyber.law.harvard.edu/rss/rss.html
@Override
protected Integer doInBackground(MainActivity... activities) {
if(url == null) {
publishProgress(loadStates.NO_URL_DEFINED);
return -1;
}
try {
publishProgress(loadStates.START);
Response response = Jsoup.connect(url).ignoreContentType(true).timeout(30000).execute();
Document document = response.parse();
Elements items = document.getElementsByTag("item");
itemsList = new ArrayList<CardsAdapter.CardItem>();
Log.d(Utils.TAG, "there are cards #" + items.size());
for(Element cItem : items) {
if (itemsList.size() >= maxItemsToFetch) {
break;
}
try {
String title = cItem.getElementsByTag("title").first().text().trim();
String link = cItem.getElementsByTag("link").first().toString().trim(); //Link not working. Why?
String description = cItem.getElementsByTag("description").first().text().trim();
String contentHtml = cItem.getElementsByTag("content:encoded").first().text().trim();
// String content = Jsoup.parse(contentHtml).text();
String content = Html.fromHtml(contentHtml).toString().trim();
String pubDate = cItem.getElementsByTag("pubDate").first().text();
String cdataStart = "^\\Q<![CDATA[\\E"; //"^" + Pattern.quote("<![CDATA[");
String cdataEnd = "\\Q]]>\\E$"; //Pattern.quote("]]>") + "$";
title = title.replaceAll(cdataStart, "").replaceAll(cdataEnd, "").trim();
description = description.replaceAll(cdataStart, "").replaceAll(cdataEnd, "").trim();
content = content.replaceAll(cdataStart, "").replaceAll(cdataEnd, "").trim();
if (description.length() > content.length()) {
content = description;
}
if (content.length() > maxTextLength) {
content = content.substring(0, maxTextLength).trim();
}
DateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH);
Date date = formatter.parse(pubDate);
String dateString = new SimpleDateFormat("dd/MM/yyyy", Locale.US).format(date);
CardItem cCard = new CardItem(title, link, content, dateString);
itemsList.add(cCard);
} catch (Exception e) {
continue;
}
}
publishProgress(loadStates.FINISHED);
} catch (Exception e) {
itemsList = null;
Log.e(Utils.TAG, "Problem parsing RSS", e);
publishProgress(loadStates.UNKNOWN_PROBLEM);
e.printStackTrace();
return -1;
}
return 0;
}
@Override
protected void onProgressUpdate(RssScraper.loadStates... values) {
super.onProgressUpdate(values);
switch (values[0]) {
case NO_INTERNET:
case UNKNOWN_PROBLEM:
Log.d(Utils.TAG, "Problem");
if (callerFragment != null) {
// callerFragment.mostraMenu(null);
}
Utils.dismissAlert();
break;
case FINISHED:
Log.d(Utils.TAG, "Finished");
if (callerFragment != null) {
((FragmentNews) callerFragment).showCards(itemsList);
}
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 setCallerFragment(Fragment callerFragment) {
this.callerFragment = callerFragment;
}
public void setMaxItems(int maxItemsToFetch) {
this.maxItemsToFetch = maxItemsToFetch;
}
public void setMaxTextLength(int maxTextLength) {
this.maxTextLength = maxTextLength;
}
}