package com.cse10.gui;
import com.cse10.article.*;
import com.cse10.database.DatabaseConstants;
import com.cse10.database.DatabaseHandler;
import com.cse10.entities.CrimeEntityGroup;
import com.cse10.entities.CrimePerson;
import com.cse10.entities.LocationDistrictMapper;
import com.cse10.gui.task.analyze.AnalyzeTask;
import com.cse10.gui.task.analyze.PredictTask;
import com.cse10.gui.task.analyze.UploadDataTask;
import com.cse10.gui.task.classify.CeylonTodayClassifyTask;
import com.cse10.gui.task.classify.DailyMirrorClassifyTask;
import com.cse10.gui.task.classify.NewsFirstClassifyTask;
import com.cse10.gui.task.classify.TheIslandClassifyTask;
import com.cse10.gui.task.crawl.CeylonTodayCrawlTask;
import com.cse10.gui.task.crawl.DailyMirrorCrawlTask;
import com.cse10.gui.task.crawl.NewsFirstCrawlTask;
import com.cse10.gui.task.crawl.TheIslandCrawlTask;
import com.cse10.gui.task.duplicateDetect.DuplicateDetectorTask;
import com.cse10.gui.task.extract.ExtractorTask;
import com.cse10.util.TableCleaner;
import com.toedter.calendar.JDateChooser;
import de.javasoft.plaf.synthetica.SyntheticaBlackStarLookAndFeel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by TharinduWijewardane on 2015-01-08.
*/
public class NewsStatsGUI {
private static JFrame frame;
private JPanel panelMain;
private JTabbedPane tabbedPane1;
private JScrollPane scrollPaneCrawler;
private JPanel panelCrawler;
private JPanel panelCrawlPapers;
private JPanel panelCrawlControl;
private JPanel panelCrawlProgress;
private JCheckBox ceylonTodayCrawlerCheckBox;
private JCheckBox dailyMirrorCrawlerCheckBox;
private JCheckBox newsFirstCrawlerCheckBox;
private JCheckBox theIslandCrawlerCheckBox;
private JButton startCrawlingButton;
private JProgressBar ceylonTodayCrawlProgressBar;
private JProgressBar dailyMirrorCrawlProgressBar;
private JProgressBar newsFirstCrawlProgressBar;
private JProgressBar theIslandCrawlProgressBar;
private JProgressBar overallCrawlProgressBar;
private JPanel panelStatusBar;
private JLabel statusLabel;
private JScrollPane scrollPaneClassifier;
private JPanel panelClassifier;
private JButton stopCrawlingButton;
private JPanel panelClassifierProgress;
private JPanel panelClassifierControl;
private JPanel panelClassifierPapers;
private JPanel panelCrawlResults;
private ChartPanel chartPanelCrawler;
private JPanel panelClassifierModel;
private JCheckBox ceylonTodayClassifierCheckBox;
private JCheckBox dailyMirrorClassifierCheckBox;
private JCheckBox newsFirstClassifierCheckBox;
private JCheckBox theIslandClassifierCheckBox;
private JButton startClassifyingButton;
private JButton stopClassifyingButton;
private JPanel panelClassifierResults;
private JProgressBar ceylonTodayClassifyProgressBar;
private JProgressBar dailyMirrorClassifyProgressBar;
private JProgressBar newsFirstClassifyProgressBar;
private JProgressBar theIslandClassifyProgressBar;
private JProgressBar overallClassifyProgressBar;
private ChartPanel chartPanelClassifier;
private JLabel ceylonTodayCrawlerStartDateLabel;
private JLabel dailyMirrorCrawlerStartDateLabel;
private JLabel newsFirstCrawlerStartDateLabel;
private JLabel theIslandCrawlerStartDateLabel;
private JDateChooser ceylonTodayCrawlerEndDateChooser;
private JDateChooser dailyMirrorCrawlerEndDateChooser;
private JDateChooser newsFirstCrawlerEndDateChooser;
private JDateChooser theIslandCrawlerEndDateChooser;
private JDateChooser ceylonTodayClassifierEndDateChooser;
private JDateChooser dailyMirrorClassifierEndDateChooser;
private JDateChooser newsFirstClassifierEndDateChooser;
private JDateChooser theIslandClassifierEndDateChooser;
private JLabel ceylonTodayClassifierStartDateLabel;
private JLabel dailyMirrorClassifierStartDateLabel;
private JLabel newsFirstClassifierStartDateLabel;
private JLabel theIslandClassifierStartDateLabel;
private JScrollPane scrollPaneExtractor;
private JPanel panelExtractor;
private JButton extractorButton;
private JProgressBar extractorProgressBar;
private ChartPanel chartPanelExtractorPie;
private JScrollPane scrollPaneDuplicateDetector;
private JPanel panelDuplicateDetector;
private JButton duplicateDetectionButton;
private JProgressBar duplicateDetectorProgressBar;
private ChartPanel chartPanelDuplicateDetector;
private JScrollPane scrollPaneAnalyzer;
private JPanel panelAnalyzer;
private JButton analyzeButton;
private JProgressBar analyzerProgressBar;
private JButton predictButton;
private JButton uploadDataButton;
private JProgressBar predictorProgressBar;
private JProgressBar uploaderProgressBar;
private ChartPanel chartPanelExtractorLine;
private JScrollPane scrollPaneUtil;
private JPanel panelUtil;
private JLabel databaseLabel;
private JButton undoClassificationButton;
private JButton undoEntityExtractionButton;
private JButton undoDuplicateDetectionButton;
private ChartPanel chartPanelTables;
private UIComponents uiComponentsAll;
private UIComponents uiComponentsActive;
private int ceylonTodayCrawlProgress;
private int dailyMirrorCrawlProgress;
private int newsFirstCrawlProgress;
private int theIslandCrawlProgress;
private int ceylonTodayClassifyProgress;
private int dailyMirrorClassifyProgress;
private int newsFirstClassifyProgress;
private int theIslandClassifyProgress;
private Date ctClassifyStartDate;
private Date dmClassifyStartDate;
private Date nfClassifyStartDate;
private Date tiClassifyStartDate;
private Date ceylonTodayCrawlStartDate;
private Date dailyMirrorCrawlStartDate;
private Date newsFirstCrawlStartDate;
private Date theIslandCrawlStartDate;
private CeylonTodayCrawlTask ceylonTodayCrawlTask;
private DailyMirrorCrawlTask dailyMirrorCrawlTask;
private NewsFirstCrawlTask newsFirstCrawlTask;
private TheIslandCrawlTask theIslandCrawlTask;
private CeylonTodayClassifyTask ceylonTodayClassifyTask;
private DailyMirrorClassifyTask dailyMirrorClassifyTask;
private NewsFirstClassifyTask newsFirstClassifyTask;
private TheIslandClassifyTask theIslandClassifyTask;
private ExtractorTask extractorTask;
private DuplicateDetectorTask duplicateDetectorTask;
private boolean extractButtonState = true;
private boolean duplicateDetectButtonState = true;
private boolean analyzeButtonState = true;
private boolean predictButtonState = true;
private boolean uploadDataButtonState = true;
private AnalyzeTask analyzeTask;
private PredictTask predictTask;
private UploadDataTask uploadDataTask;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
NewsStatsGUI.init();
}
});
}
public NewsStatsGUI() {
initComponentLists(); // initialize list containing UI components
enableCrawlerUI();
enableClassifierUI();
enableExtractorUI();
enableDuplicateDetectorUI();
setUpUtilUi();
startCrawlingButton.addActionListener(new ActionListener() { //when crawler button is clicked
@Override
public void actionPerformed(ActionEvent e) {
if (!(ceylonTodayCrawlerCheckBox.isSelected() || dailyMirrorCrawlerCheckBox.isSelected() || newsFirstCrawlerCheckBox.isSelected() || theIslandCrawlerCheckBox.isSelected())) {
return; // no paper is selected
}
statusLabel.setText("Crawling...");
disableCrawlerUI();
uiComponentsActive.setNewCrawlerUI();
if (ceylonTodayCrawlerCheckBox.isSelected()) {
ceylonTodayCrawlTask = new CeylonTodayCrawlTask(ceylonTodayCrawlStartDate, ceylonTodayCrawlerEndDateChooser.getDate());
ceylonTodayCrawlTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
ceylonTodayCrawlProgress = progress;
ceylonTodayCrawlProgressBar.setValue(progress);
ceylonTodayCrawlProgressBar.setStringPainted(true);
setOverallCrawlProgress();
}
}
});
uiComponentsActive.addCheckBoxes(UIComponents.CRAWLER, ceylonTodayCrawlerCheckBox);
uiComponentsActive.addProgressBars(UIComponents.CRAWLER, ceylonTodayCrawlProgressBar);
ceylonTodayCrawlTask.execute();
}
if (dailyMirrorCrawlerCheckBox.isSelected()) {
dailyMirrorCrawlTask = new DailyMirrorCrawlTask(dailyMirrorCrawlStartDate, dailyMirrorCrawlerEndDateChooser.getDate());
dailyMirrorCrawlTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
dailyMirrorCrawlProgress = progress;
dailyMirrorCrawlProgressBar.setValue(progress);
dailyMirrorCrawlProgressBar.setStringPainted(true);
setOverallCrawlProgress();
}
}
});
uiComponentsActive.addCheckBoxes(UIComponents.CRAWLER, dailyMirrorCrawlerCheckBox);
uiComponentsActive.addProgressBars(UIComponents.CRAWLER, dailyMirrorCrawlProgressBar);
dailyMirrorCrawlTask.execute();
}
if (newsFirstCrawlerCheckBox.isSelected()) {
newsFirstCrawlTask = new NewsFirstCrawlTask(newsFirstCrawlStartDate, newsFirstCrawlerEndDateChooser.getDate());
newsFirstCrawlTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
newsFirstCrawlProgress = progress;
newsFirstCrawlProgressBar.setValue(progress);
newsFirstCrawlProgressBar.setStringPainted(true);
setOverallCrawlProgress();
}
}
});
uiComponentsActive.addCheckBoxes(UIComponents.CRAWLER, newsFirstCrawlerCheckBox);
uiComponentsActive.addProgressBars(UIComponents.CRAWLER, newsFirstCrawlProgressBar);
newsFirstCrawlTask.execute();
}
if (theIslandCrawlerCheckBox.isSelected()) {
theIslandCrawlTask = new TheIslandCrawlTask(theIslandCrawlStartDate, theIslandCrawlerEndDateChooser.getDate());
theIslandCrawlTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
theIslandCrawlProgress = progress;
theIslandCrawlProgressBar.setValue(progress);
theIslandCrawlProgressBar.setStringPainted(true);
setOverallCrawlProgress();
}
}
});
uiComponentsActive.addCheckBoxes(UIComponents.CRAWLER, theIslandCrawlerCheckBox);
uiComponentsActive.addProgressBars(UIComponents.CRAWLER, theIslandCrawlProgressBar);
theIslandCrawlTask.execute();
}
}
});
stopCrawlingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (ceylonTodayCrawlTask != null) {
ceylonTodayCrawlTask.stopCrawling();
ceylonTodayCrawlTask.cancel(true);
}
if (dailyMirrorCrawlTask != null) {
dailyMirrorCrawlTask.stopCrawling();
dailyMirrorCrawlTask.cancel(true);
}
if (newsFirstCrawlTask != null) {
newsFirstCrawlTask.stopCrawling();
newsFirstCrawlTask.cancel(true);
}
if (theIslandCrawlTask != null) {
theIslandCrawlTask.stopCrawling();
theIslandCrawlTask.cancel(true);
}
statusLabel.setText("Ready");
// enableCrawlerUI();
resetCrawlProgressBars();
refreshUI();
}
});
startClassifyingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!(ceylonTodayClassifierCheckBox.isSelected() || dailyMirrorClassifierCheckBox.isSelected() || newsFirstClassifierCheckBox.isSelected() || theIslandClassifierCheckBox.isSelected())) {
return; // no paper is selected
}
statusLabel.setText("Classifying...");
disableClassifierUI();
uiComponentsActive.setNewClassifierUI();
if (ceylonTodayClassifierCheckBox.isSelected()) {
ceylonTodayClassifyTask = new CeylonTodayClassifyTask(ctClassifyStartDate, ceylonTodayClassifierEndDateChooser.getDate());
ceylonTodayClassifyTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
ceylonTodayClassifyProgress = progress;
ceylonTodayClassifyProgressBar.setValue(progress);
ceylonTodayClassifyProgressBar.setStringPainted(true);
setOverallClassifyProgress();
}
}
});
uiComponentsActive.addCheckBoxes(UIComponents.CLASSIFIER, ceylonTodayCrawlerCheckBox);
uiComponentsActive.addProgressBars(UIComponents.CLASSIFIER, ceylonTodayCrawlProgressBar);
ceylonTodayClassifyTask.execute();
}
if (dailyMirrorClassifierCheckBox.isSelected()) {
dailyMirrorClassifyTask = new DailyMirrorClassifyTask(dmClassifyStartDate, dailyMirrorClassifierEndDateChooser.getDate());
dailyMirrorClassifyTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
dailyMirrorClassifyProgress = progress;
dailyMirrorClassifyProgressBar.setValue(progress);
dailyMirrorClassifyProgressBar.setStringPainted(true);
setOverallClassifyProgress();
}
}
});
uiComponentsActive.addCheckBoxes(UIComponents.CLASSIFIER, dailyMirrorCrawlerCheckBox);
uiComponentsActive.addProgressBars(UIComponents.CLASSIFIER, dailyMirrorCrawlProgressBar);
dailyMirrorClassifyTask.execute();
}
if (newsFirstClassifierCheckBox.isSelected()) {
newsFirstClassifyTask = new NewsFirstClassifyTask(nfClassifyStartDate, newsFirstClassifierEndDateChooser.getDate());
newsFirstClassifyTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
newsFirstClassifyProgress = progress;
newsFirstClassifyProgressBar.setValue(progress);
newsFirstClassifyProgressBar.setStringPainted(true);
setOverallClassifyProgress();
}
}
});
uiComponentsActive.addCheckBoxes(UIComponents.CLASSIFIER, newsFirstCrawlerCheckBox);
uiComponentsActive.addProgressBars(UIComponents.CLASSIFIER, newsFirstCrawlProgressBar);
newsFirstClassifyTask.execute();
}
if (theIslandClassifierCheckBox.isSelected()) {
theIslandClassifyTask = new TheIslandClassifyTask(tiClassifyStartDate, theIslandClassifierEndDateChooser.getDate());
theIslandClassifyTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
theIslandClassifyProgress = progress;
theIslandClassifyProgressBar.setValue(progress);
theIslandClassifyProgressBar.setStringPainted(true);
setOverallClassifyProgress();
}
}
});
uiComponentsActive.addCheckBoxes(UIComponents.CLASSIFIER, theIslandCrawlerCheckBox);
uiComponentsActive.addProgressBars(UIComponents.CLASSIFIER, theIslandCrawlProgressBar);
theIslandClassifyTask.execute();
}
}
});
stopClassifyingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (ceylonTodayClassifyTask != null) {
ceylonTodayClassifyTask.stopClassification();
ceylonTodayClassifyTask.cancel(true);
}
if (dailyMirrorClassifyTask != null) {
dailyMirrorClassifyTask.stopClassification();
dailyMirrorClassifyTask.cancel(true);
}
if (newsFirstClassifyTask != null) {
newsFirstClassifyTask.stopClassification();
newsFirstClassifyTask.cancel(true);
}
if (theIslandClassifyTask != null) {
theIslandClassifyTask.stopClassification();
theIslandClassifyTask.cancel(true);
}
statusLabel.setText("Ready");
// enableClassifierUI();
resetClassifyProgressBars();
refreshUI();
}
});
extractorButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (extractButtonState) {
extractButtonState = false;
disableExtractorUI();
extractorTask = new ExtractorTask();
extractorTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
extractorProgressBar.setValue(progress);
extractorProgressBar.setStringPainted(true);
if (progress == 100) {
extractButtonState = true;
enableExtractorUI();
drawExtractorChart();
refreshUI();
InfoDialog infoDialog = new InfoDialog();
infoDialog.init(frame, "Entity Extraction Completed Successfully!");
}
}
}
});
extractorTask.execute();
} else {
extractButtonState = true;
enableExtractorUI();
drawExtractorChart();
refreshUI();
if (extractorTask != null) {
extractorTask.stopExtract();
extractorTask.cancel(true);
}
}
}
});
duplicateDetectionButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (duplicateDetectButtonState) {
duplicateDetectButtonState = false;
disableDuplicateDetectorUI();
duplicateDetectorTask = new DuplicateDetectorTask();
duplicateDetectorTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
duplicateDetectorProgressBar.setValue(progress);
duplicateDetectorProgressBar.setStringPainted(true);
if (progress == 100) {
duplicateDetectButtonState = true;
enableDuplicateDetectorUI();
drawDuplicateDetectorChart();
refreshUI();
InfoDialog infoDialog = new InfoDialog();
infoDialog.init(frame, "Duplicate Detection Completed Successfully!");
}
}
}
});
duplicateDetectorTask.execute();
} else {
duplicateDetectButtonState = true;
enableDuplicateDetectorUI();
drawDuplicateDetectorChart();
refreshUI();
if (duplicateDetectorTask != null) {
duplicateDetectorTask.stop();
duplicateDetectorTask.cancel(true);
}
}
}
});
analyzeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (analyzeButtonState) {
analyzeButtonState = false;
analyzeButton.setText("cancel");
analyzeTask = new AnalyzeTask();
analyzeTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
analyzerProgressBar.setValue(progress);
analyzerProgressBar.setStringPainted(true);
if (progress == 100) {
statusLabel.setText("Ready");
InfoDialog infoDialog = new InfoDialog();
infoDialog.init(frame, "Analyze Completed Successfully!");
analyzeButton.setText("Analyze");
analyzerProgressBar.setValue(0);
}
}
}
});
analyzeTask.execute();
} else {
analyzeButtonState = true;
analyzeButton.setText("Analyze");
analyzerProgressBar.setValue(0);
if (analyzeTask != null) {
analyzeTask.stop();
analyzeTask.cancel(true);
}
}
}
});
predictButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (predictButtonState) {
predictButtonState = false;
predictButton.setText("cancel");
predictTask = new PredictTask();
predictTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
predictorProgressBar.setValue(progress);
predictorProgressBar.setStringPainted(true);
if (progress == 100) {
statusLabel.setText("Ready");
InfoDialog infoDialog = new InfoDialog();
infoDialog.init(frame, "Prediction Completed Successfully!");
predictButton.setText("Predict");
predictorProgressBar.setValue(0);
}
}
}
});
predictTask.execute();
} else {
predictButtonState = true;
predictButton.setText("Predict");
predictorProgressBar.setValue(0);
if (predictTask != null) {
predictTask.stop();
predictTask.cancel(true);
}
}
}
});
uploadDataButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (uploadDataButtonState) {
uploadDataButtonState = false;
uploadDataButton.setText("cancel");
uploadDataTask = new UploadDataTask();
uploadDataTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
uploaderProgressBar.setValue(progress);
uploaderProgressBar.setStringPainted(true);
if (progress == 100) {
statusLabel.setText("Ready");
InfoDialog infoDialog = new InfoDialog();
infoDialog.init(frame, "Upload Completed Successfully!");
uploadDataButton.setText("Upload Data");
uploaderProgressBar.setValue(0);
}
}
}
});
uploadDataTask.execute();
} else {
uploadDataButtonState = true;
uploadDataButton.setText("Upload Data");
uploaderProgressBar.setValue(0);
if (uploadDataTask != null) {
uploadDataTask.stop();
uploadDataTask.cancel(true);
}
}
}
});
undoClassificationButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TableCleaner.undoClassifications(true);
refreshUI();
}
});
}
});
undoEntityExtractionButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("clicked");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.println("invoking");
TableCleaner.undoEntityExtraction();
refreshUI();
}
});
}
});
undoDuplicateDetectionButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TableCleaner.undoDuplicateDetection();
refreshUI();
}
});
}
});
}
public static void init() {
try {
UIManager.setLookAndFeel(new SyntheticaBlackStarLookAndFeel());
} catch (Exception e) {
e.printStackTrace();
}
frame = new JFrame("NewsStats");
frame.setContentPane(new NewsStatsGUI().panelMain);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack(); // packs the window according to components inside. this is not removed because its required to correct layouts
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setBounds(0, 0, screenSize.width * 2 / 3, screenSize.height * 2 / 3);
frame.setVisible(true);
}
private void createUIComponents() {
// place custom component creation code here
panelClassifierModel = new JPanel();
/* crawler chart */
drawCrawlerChart();
/* classifier chart */
drawClassifierChart();
/* extractor chart */
drawExtractorChart();
/* duplicate detector chart */
drawDuplicateDetectorChart();
/* tables chart in Util tab */
drawTablesChart();
}
/**
* lists of UI components. for extendability
*/
private void initComponentLists() {
uiComponentsAll = new UIComponents();
uiComponentsActive = new UIComponents();
//uiComponentsAll.addCheckBoxes(UIComponents.CRAWLER, ceylonTodayCrawlerCheckBox, dailyMirrorCrawlerCheckBox, newsFirstCrawlerCheckBox, theIslandCrawlerCheckBox);
//uiComponentsAll.addCheckBoxes(UIComponents.CLASSIFIER, ceylonTodayClassifierCheckBox, dailyMirrorClassifierCheckBox, newsFirstClassifierCheckBox, theIslandClassifierCheckBox);
}
/* CRAWLER TAB */
private void setOverallCrawlProgress() {
int numOfSelectedPapers = uiComponentsActive.getCheckBoxes(UIComponents.CRAWLER).size();
int overallProgress = (ceylonTodayCrawlProgress + dailyMirrorCrawlProgress + newsFirstCrawlProgress + theIslandCrawlProgress) / numOfSelectedPapers;
overallCrawlProgressBar.setValue(overallProgress);
overallCrawlProgressBar.setStringPainted(true);
if (overallProgress == 100) {
// enableCrawlerUI();
resetCrawlProgressBars();
drawCrawlerChart();
refreshUI();
statusLabel.setText("Ready");
InfoDialog infoDialog = new InfoDialog();
infoDialog.init(frame, "Crawling Completed Successfully!");
}
}
private void drawCrawlerChart() {
int ctArticles = DatabaseHandler.getRowCount(CeylonTodayArticle.class);
int dmArticles = DatabaseHandler.getRowCount(DailyMirrorArticle.class);
int nfArticles = DatabaseHandler.getRowCount(NewsFirstArticle.class);
int tiArticles = DatabaseHandler.getRowCount(TheIslandArticle.class);
// row keys...
final String series1 = "Ceylon Today";
final String series2 = "Daily Mirror";
final String series3 = "News First";
final String series4 = "The Island";
// column keys...
final String category1 = "";
// create the dataset...
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(ctArticles, series1, category1);
dataset.addValue(dmArticles, series2, category1);
dataset.addValue(nfArticles, series3, category1);
dataset.addValue(tiArticles, series4, category1);
// create the chart...
final JFreeChart chart = ChartFactory.createBarChart(
"Crawled Articles", // chart title
"Type", // domain axis label
"Count", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips?
false // URLs?
);
if (chartPanelCrawler == null) {
chartPanelCrawler = new ChartPanel(chart);
} else {
chartPanelCrawler.setChart(chart);
}
chartPanelCrawler.setVisible(true);
}
private void disableCrawlerUI() {
ceylonTodayCrawlerCheckBox.setEnabled(false);
dailyMirrorCrawlerCheckBox.setEnabled(false);
newsFirstCrawlerCheckBox.setEnabled(false);
theIslandCrawlerCheckBox.setEnabled(false);
startCrawlingButton.setEnabled(false);
stopCrawlingButton.setEnabled(true);
}
private void enableCrawlerUI() {
ceylonTodayCrawlerCheckBox.setEnabled(true);
dailyMirrorCrawlerCheckBox.setEnabled(true);
newsFirstCrawlerCheckBox.setEnabled(true);
theIslandCrawlerCheckBox.setEnabled(true);
startCrawlingButton.setEnabled(true);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
ceylonTodayCrawlStartDate = DatabaseHandler.getLatestDate(CeylonTodayArticle.class);
} catch (NullPointerException e) {
try {
ceylonTodayCrawlStartDate = sdf.parse("2014-01-01"); // if table is empty start crawling from this date
} catch (ParseException e1) {
e1.printStackTrace();
}
}
try {
dailyMirrorCrawlStartDate = DatabaseHandler.getLatestDate(DailyMirrorArticle.class);
} catch (NullPointerException e) {
try {
dailyMirrorCrawlStartDate = sdf.parse("2014-01-01"); // if table is empty start crawling from this date
} catch (ParseException e1) {
e1.printStackTrace();
}
}
try {
newsFirstCrawlStartDate = DatabaseHandler.getLatestDate(NewsFirstArticle.class);
} catch (NullPointerException e) {
try {
newsFirstCrawlStartDate = sdf.parse("2014-01-01"); // if table is empty start crawling from this date
} catch (ParseException e1) {
e1.printStackTrace();
}
}
try {
theIslandCrawlStartDate = DatabaseHandler.getLatestDate(TheIslandArticle.class);
} catch (NullPointerException e) {
try {
theIslandCrawlStartDate = sdf.parse("2014-01-01"); // if table is empty start crawling from this date
} catch (ParseException e1) {
e1.printStackTrace();
}
}
ceylonTodayCrawlerStartDateLabel.setText(sdf.format(ceylonTodayCrawlStartDate));
dailyMirrorCrawlerStartDateLabel.setText(sdf.format(dailyMirrorCrawlStartDate));
newsFirstCrawlerStartDateLabel.setText(sdf.format(newsFirstCrawlStartDate));
theIslandCrawlerStartDateLabel.setText(sdf.format(theIslandCrawlStartDate));
ceylonTodayCrawlerEndDateChooser.setDate(new Date());
dailyMirrorCrawlerEndDateChooser.setDate(new Date());
newsFirstCrawlerEndDateChooser.setDate(new Date());
theIslandCrawlerEndDateChooser.setDate(new Date());
stopCrawlingButton.setEnabled(false);
}
private void resetCrawlProgressBars() {
ceylonTodayCrawlProgress = 0;
dailyMirrorCrawlProgress = 0;
newsFirstCrawlProgress = 0;
theIslandCrawlProgress = 0;
ceylonTodayCrawlProgressBar.setValue(0);
dailyMirrorCrawlProgressBar.setValue(0);
newsFirstCrawlProgressBar.setValue(0);
theIslandCrawlProgressBar.setValue(0);
overallCrawlProgressBar.setValue(0);
DatabaseHandler.closeDatabase(); //to close hibernate and let jvm stop
}
/* CLASSIFIER TAB */
private void setOverallClassifyProgress() {
int numOfSelectedPapers = uiComponentsActive.getCheckBoxes(UIComponents.CLASSIFIER).size();
int overallProgress = (ceylonTodayClassifyProgress + dailyMirrorClassifyProgress + newsFirstClassifyProgress + theIslandClassifyProgress) / numOfSelectedPapers;
overallClassifyProgressBar.setValue(overallProgress);
overallClassifyProgressBar.setStringPainted(true);
if (overallProgress == 100) {
// enableClassifierUI();
resetClassifyProgressBars();
drawClassifierChart();
refreshUI();
statusLabel.setText("Ready");
InfoDialog infoDialog = new InfoDialog();
infoDialog.init(frame, "Classifying Completed Successfully!");
}
}
private void drawClassifierChart() {
int ctArticlesCrime = DatabaseHandler.getRowCount(CeylonTodayArticle.class, "label", "crime");
int ctArticlesNonCrime = DatabaseHandler.getRowCount(CeylonTodayArticle.class, "label", "other");
int dmArticlesCrime = DatabaseHandler.getRowCount(DailyMirrorArticle.class, "label", "crime");
int dmArticlesNonCrime = DatabaseHandler.getRowCount(DailyMirrorArticle.class, "label", "other");
int nfArticlesCrime = DatabaseHandler.getRowCount(NewsFirstArticle.class, "label", "crime");
int nfArticlesNonCrime = DatabaseHandler.getRowCount(NewsFirstArticle.class, "label", "other");
int tiArticlesCrime = DatabaseHandler.getRowCount(TheIslandArticle.class, "label", "crime");
int tiArticlesNonCrime = DatabaseHandler.getRowCount(TheIslandArticle.class, "label", "other");
int crime = ctArticlesCrime + dmArticlesCrime + nfArticlesCrime + tiArticlesCrime;
int nonCrime = ctArticlesNonCrime + dmArticlesNonCrime + nfArticlesNonCrime + tiArticlesNonCrime;
// row keys...
final String series1 = "Crime";
final String series2 = "Non Crime";
// column keys...
final String category1 = "";
// create the dataset...
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(crime, series1, category1);
dataset.addValue(nonCrime, series2, category1);
// create the chart...
final JFreeChart chart = ChartFactory.createBarChart(
"Classified Articles", // chart title
"Type", // domain axis label
"Count", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips?
false // URLs?
);
if (chartPanelClassifier == null) {
chartPanelClassifier = new ChartPanel(chart);
} else {
chartPanelClassifier.setChart(chart);
}
chartPanelClassifier.setVisible(true);
}
private void disableClassifierUI() {
ceylonTodayClassifierCheckBox.setEnabled(false);
dailyMirrorClassifierCheckBox.setEnabled(false);
newsFirstClassifierCheckBox.setEnabled(false);
theIslandClassifierCheckBox.setEnabled(false);
startClassifyingButton.setEnabled(false);
stopClassifyingButton.setEnabled(true);
}
private void enableClassifierUI() {
ceylonTodayClassifierCheckBox.setEnabled(true);
dailyMirrorClassifierCheckBox.setEnabled(true);
newsFirstClassifierCheckBox.setEnabled(true);
theIslandClassifierCheckBox.setEnabled(true);
startClassifyingButton.setEnabled(true);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
ctClassifyStartDate = DatabaseHandler.getEarliestDateWithNullLabel(CeylonTodayArticle.class);
ceylonTodayClassifierStartDateLabel.setText(sdf.format(ctClassifyStartDate));
ceylonTodayClassifierEndDateChooser.setDate(DatabaseHandler.getLatestDateWithNullLabel(CeylonTodayArticle.class));
} catch (NullPointerException e) {
ceylonTodayClassifierCheckBox.setSelected(false);
ceylonTodayClassifierCheckBox.setEnabled(false);
}
try {
dmClassifyStartDate = DatabaseHandler.getEarliestDateWithNullLabel(DailyMirrorArticle.class);
dailyMirrorClassifierStartDateLabel.setText(sdf.format(dmClassifyStartDate));
dailyMirrorClassifierEndDateChooser.setDate(DatabaseHandler.getLatestDateWithNullLabel(DailyMirrorArticle.class));
} catch (NullPointerException e) {
dailyMirrorClassifierCheckBox.setSelected(false);
dailyMirrorClassifierCheckBox.setEnabled(false);
}
try {
nfClassifyStartDate = DatabaseHandler.getEarliestDateWithNullLabel(NewsFirstArticle.class);
newsFirstClassifierStartDateLabel.setText(sdf.format(nfClassifyStartDate));
newsFirstClassifierEndDateChooser.setDate(DatabaseHandler.getLatestDateWithNullLabel(NewsFirstArticle.class));
} catch (NullPointerException e) {
newsFirstClassifierCheckBox.setSelected(false);
newsFirstClassifierCheckBox.setEnabled(false);
}
try {
tiClassifyStartDate = DatabaseHandler.getEarliestDateWithNullLabel(TheIslandArticle.class);
theIslandClassifierStartDateLabel.setText(sdf.format(tiClassifyStartDate));
theIslandClassifierEndDateChooser.setDate(DatabaseHandler.getLatestDateWithNullLabel(TheIslandArticle.class));
} catch (NullPointerException e) {
theIslandClassifierCheckBox.setSelected(false);
theIslandClassifierCheckBox.setEnabled(false);
}
stopClassifyingButton.setEnabled(false);
}
private void resetClassifyProgressBars() {
ceylonTodayClassifyProgress = 0;
dailyMirrorClassifyProgress = 0;
newsFirstClassifyProgress = 0;
theIslandClassifyProgress = 0;
ceylonTodayClassifyProgressBar.setValue(0);
dailyMirrorClassifyProgressBar.setValue(0);
newsFirstClassifyProgressBar.setValue(0);
theIslandClassifyProgressBar.setValue(0);
overallClassifyProgressBar.setValue(0);
DatabaseHandler.closeDatabase(); //to close hibernate and let jvm stop
}
/* EXTRACTOR TAB */
private void disableExtractorUI() {
extractorButton.setText("Stop Operation");
statusLabel.setText("Extracting...");
}
private void enableExtractorUI() {
extractorButton.setText("Start");
extractorProgressBar.setValue(0);
statusLabel.setText("Ready");
}
private void drawExtractorChart() {
int locationCount = DatabaseHandler.getDistinctValueCount(LocationDistrictMapper.class, "location");
int policeCount = DatabaseHandler.getDistinctValueCount(CrimeEntityGroup.class, "police");
int courtCount = DatabaseHandler.getDistinctValueCount(CrimeEntityGroup.class, "court");
int criminalCount = DatabaseHandler.getDistinctValueCount(CrimePerson.class, "name");
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Locations", locationCount);
dataset.setValue("Police Stations", policeCount);
dataset.setValue("Courts", courtCount);
dataset.setValue("Criminals/Suspects", criminalCount);
final JFreeChart chart = ChartFactory.createPieChart(
"Extracted Entities", // chart title
dataset, // data
true, // include legend
true, // tool tips
false // generate URLs
);
if (chartPanelExtractorPie == null) {
chartPanelExtractorPie = new ChartPanel(chart);
} else {
chartPanelExtractorPie.setChart(chart);
}
chartPanelExtractorPie.setVisible(true);
/* CHART TWO */
// row keys...
final String[] series = new String[11];
series[0] = "Violent Crimes";
series[1] = "Theft";
series[2] = "Abduction";
series[3] = "Terrorism";
series[4] = "Sex Crime";
series[5] = "Clash";
series[6] = "Illegal Trading";
series[7] = "Treasure Hunting";
series[8] = "Drug Offenses";
series[9] = "Unsuitable Consumer Goods";
series[10] = "Other";
// column keys...
final String category1 = "";
// create the dataset...
final DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();
// data
int num = 0;
for (int i = 0; i < series.length; i++) {
num = DatabaseHandler.getRowCount(CrimeEntityGroup.class, "crimeType", series[i]);
dataset2.addValue(num, series[i], category1);
}
// create the chart...
final JFreeChart chart2 = ChartFactory.createBarChart(
"Crime Types", // chart title
"Type", // domain axis label
"Count", // range axis label
dataset2, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips?
false // URLs?
);
if (chartPanelExtractorLine == null) {
chartPanelExtractorLine = new ChartPanel(chart2);
} else {
chartPanelExtractorLine.setChart(chart2);
}
chartPanelExtractorLine.setVisible(true);
}
/* DUPLICATE DETECTOR TAB */
private void disableDuplicateDetectorUI() {
duplicateDetectionButton.setText("Stop Operation");
statusLabel.setText("Detecting...");
}
private void enableDuplicateDetectorUI() {
duplicateDetectionButton.setText("Start");
duplicateDetectorProgressBar.setValue(0);
statusLabel.setText("Ready");
}
private void drawDuplicateDetectorChart() {
int originalCount = DatabaseHandler.getRowCount(CrimeEntityGroup.class, "label", "unique");
int duplicateCount = DatabaseHandler.getRowCount(CrimeEntityGroup.class, "label", "duplicate");
// row keys...
final String series1 = "Original";
final String series2 = "Duplicates";
// column keys...
final String category1 = "";
// create the dataset...
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(originalCount, series1, category1);
dataset.addValue(duplicateCount, series2, category1);
// create the chart...
final JFreeChart chart = ChartFactory.createBarChart(
"Detected Duplicates", // chart title
"Type", // domain axis label
"Count", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips?
false // URLs?
);
if (chartPanelDuplicateDetector == null) {
chartPanelDuplicateDetector = new ChartPanel(chart);
} else {
chartPanelDuplicateDetector.setChart(chart);
}
chartPanelDuplicateDetector.setVisible(true);
}
/* UTIL TAB */
private void setUpUtilUi() {
String dbUrl = DatabaseConstants.DB_URL;
databaseLabel.setText(dbUrl);
//allowing to delete entries only in test and demo databases
if (dbUrl.contains("test") || dbUrl.contains("demo")) {
undoClassificationButton.setEnabled(true);
undoEntityExtractionButton.setEnabled(true);
undoDuplicateDetectionButton.setEnabled(true);
} else {
undoClassificationButton.setEnabled(false);
undoEntityExtractionButton.setEnabled(false);
undoDuplicateDetectionButton.setEnabled(false);
}
}
private void drawTablesChart() {
// row keys...
String[] series = new String[9];
series[0] = "Crawled Ceylon Today";
series[1] = "Crawled Daily Mirror";
series[2] = "Crawled News First";
series[3] = "Crawled The Island";
// series[4] = "Training Articles";
series[5] = "Classified Crime Articles";
series[6] = "Crime Persons";
series[7] = "Crime Entity Groups";
series[8] = "Crime Locations";
// column keys...
final String category1 = "";
// create the dataset...
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// data
int[] counts = new int[series.length];
counts[0] = DatabaseHandler.getRowCount(CeylonTodayArticle.class);
counts[1] = DatabaseHandler.getRowCount(DailyMirrorArticle.class);
counts[2] = DatabaseHandler.getRowCount(NewsFirstArticle.class);
counts[3] = DatabaseHandler.getRowCount(TheIslandArticle.class);
// counts[4] = DatabaseHandler.getRowCount(TrainingArticle.class);
counts[5] = DatabaseHandler.getRowCount(CrimeArticle.class);
counts[6] = DatabaseHandler.getRowCount(CrimePerson.class);
counts[7] = DatabaseHandler.getRowCount(CrimeEntityGroup.class);
counts[8] = DatabaseHandler.getRowCount(LocationDistrictMapper.class);
for (int i = 0; i < series.length; i++) {
if (i == 4) {
continue; // skipping training articles for now
}
dataset.addValue(counts[i], series[i], category1);
}
// create the chart...
final JFreeChart chart = ChartFactory.createBarChart(
"Tables", // chart title
"Type", // domain axis label
"Count", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips?
false // URLs?
);
if (chartPanelTables == null) {
chartPanelTables = new ChartPanel(chart);
} else {
chartPanelTables.setChart(chart);
}
chartPanelTables.setVisible(true);
}
private void refreshUI() {
enableCrawlerUI();
drawCrawlerChart();
enableClassifierUI();
drawClassifierChart();
enableExtractorUI();
drawExtractorChart();
enableDuplicateDetectorUI();
drawDuplicateDetectorChart();
drawTablesChart();
}
}