package com.cse10.gui.task.crawl; import com.cse10.crawler.crawlControler.BasicCrawlController; import com.cse10.database.DatabaseHandler; import org.apache.log4j.Logger; import javax.swing.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Observable; import java.util.Observer; import java.util.concurrent.TimeUnit; /** * Created by TharinduWijewardane on 2015-01-18. */ public abstract class CrawlTask extends SwingWorker<Void, Void> implements Observer { protected Logger logger = Logger.getLogger(this.getClass()); protected boolean done = false; protected Date startDate; protected Date endDate; protected int numberOfDates; protected int dateCount; protected BasicCrawlController crawlController; public CrawlTask() { setDateFromDB(); numberOfDates = getDateDiff(startDate, endDate) + 1; } public CrawlTask(Date startDate, Date endDate) { this.startDate = startDate; this.endDate = endDate; numberOfDates = getDateDiff(startDate, endDate) + 1; } private void setDateFromDB() { startDate = DatabaseHandler.getLatestDate(getArticleClassType()); if (startDate == null) { // if not set by DB SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { startDate = sdf.parse("2014-01-01"); } catch (ParseException e) { startDate = new Date(); // set today if fails e.printStackTrace(); } } endDate = new Date(); // set today //todo remove following // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // try { // endDate = sdf.parse("2012-01-11"); // } catch (ParseException e) { // endDate = new Date(); // set today if fails // e.printStackTrace(); // } } protected abstract Class getArticleClassType(); // tobe implemented in subclasses accordingly private int getDateDiff(Date date1, Date date2) { long diffInMillies = date2.getTime() - date1.getTime(); return (int) TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS); } public void stopCrawling() { if (crawlController != null) { crawlController.stopCrawl(); } } protected abstract Class getCrawlerClassType(); // tobe implemented in subclasses accordingly protected abstract BasicCrawlController getCrawlController(); // tobe implemented in subclasses accordingly /* * Main task. Executed in background thread. */ @Override public Void doInBackground() { if (!done) { logger.info("in background"); //Initialize progress property. setProgress(1); crawlController = getCrawlController(); crawlController.setStartDate(startDate); crawlController.setEndDate(endDate); crawlController.addObserver(this); try { crawlController.crawl(getCrawlerClassType()); } catch (Exception e) { e.printStackTrace(); } crawlController.deleteObserver(this); } return null; } /* * Executed in event dispatching thread */ @Override public void done() { logger.info("done"); done = true; } @Override public void update(Observable o, Object arg) { int progress = 100 * ++dateCount / numberOfDates; setProgress(Math.min(progress, 100)); logger.info("CRAWLING " + arg.toString() + " of " + o.getClass() + " COMPLETED"); } }