package it.fdev.scraper;
import it.fdev.unisaconnect.FragmentNews;
import it.fdev.unisaconnect.MainActivity;
import it.fdev.unisaconnect.R;
import it.fdev.utils.CardsAdapter;
import it.fdev.utils.CardsAdapter.CardItem;
import it.fdev.utils.Utils;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import android.os.AsyncTask;
import android.util.Log;
/**
* Frammento che si occupa dell'accesso al menu della mensa
*
* @author francesco
*
*/
public class NewsScraper extends AsyncTask<MainActivity, NewsScraper.loadStates, Integer> {
public boolean isRunning = false;
protected MainActivity activity;
private FragmentNews callerFragment;
private String urlToFetch = null;
private ArrayList<CardsAdapter.CardItem> itemsList = null;
public static enum loadStates {
START, ANALYZING, NO_INTERNET, NO_URL_DEFINED, UNKNOWN_PROBLEM, FINISHED
};
public NewsScraper(String url) {
this.urlToFetch = url;
}
@Override
protected Integer doInBackground(MainActivity... activities) {
if(urlToFetch == null) {
publishProgress(loadStates.NO_URL_DEFINED);
return -1;
}
try {
activity = activities[0];
publishProgress(loadStates.START);
URL url = new URL(urlToFetch);
URLConnection conn = url.openConnection();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(conn.getInputStream());
NodeList nodes = doc.getElementsByTagName("item");
itemsList = new ArrayList<CardsAdapter.CardItem>();
Log.d(Utils.TAG, "there are cards #" + nodes.getLength());
for (int i = 0; i < nodes.getLength(); i++) {
try {
Element element = (Element) nodes.item(i);
String title = element.getElementsByTagName("title").item(0).getTextContent().trim();
String link = element.getElementsByTagName("link").item(0).getTextContent().trim();
String description = element.getElementsByTagName("description").item(0).getTextContent().trim();
String formattedDate;
try {
String dateString = element.getElementsByTagName("published").item(0).getTextContent().trim();
// http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
SimpleDateFormat inputDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ", Locale.ITALY);
SimpleDateFormat outputDateFormat = new SimpleDateFormat("dd/MM", Locale.ITALY);
Date date = inputDateFormat.parse(dateString);
formattedDate = outputDateFormat.format(date);
} catch(Exception e) {
formattedDate = "";
}
CardItem cCard = new CardItem(title, link, description, formattedDate, false);
itemsList.add(cCard);
} catch (Exception e) {
Log.w(Utils.TAG, e);
continue;
}
}
publishProgress(loadStates.FINISHED);
}
catch (Exception e) {
itemsList = null;
Log.e(Utils.TAG, "Problem parsing the xml feed", e);
publishProgress(loadStates.UNKNOWN_PROBLEM);
e.printStackTrace();
return -1;
}
return 0;
}
@Override
protected void onProgressUpdate(NewsScraper.loadStates... values) {
super.onProgressUpdate(values);
switch (values[0]) {
case START:
activity.setLoadingText(R.string.sync_news);
break;
case NO_URL_DEFINED:
case NO_INTERNET:
case UNKNOWN_PROBLEM:
if (callerFragment != null) {
callerFragment.showCards(new ArrayList<CardsAdapter.CardItem>());
}
Utils.dismissAlert();
break;
case FINISHED:
if (callerFragment != null) {
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(FragmentNews callerFragment) {
this.callerFragment = callerFragment;
}
}