diff --git a/project/controller/CrawlerController.java b/project/controller/CrawlerController.java new file mode 100644 index 0000000..0db6242 --- /dev/null +++ b/project/controller/CrawlerController.java @@ -0,0 +1,180 @@ + +package controller; + +import model.Paper; +import repository.DataRepository; +import strategy.*; +import view.ConsoleView; +import java.io.*; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class CrawlerController { + private ConsoleView view; + private DataRepository repository; + private boolean running; + + public CrawlerController(ConsoleView view, DataRepository repository) { + this.view = view; + this.repository = repository; + this.running = true; + } + + public void start() { + view.showWelcome(); + } + + public void showMenu() { + view.showMenu(); + } + + public void showHelp() { + view.showHelp(); + } + + public void crawl(int platform) throws Exception { + if (platform == 1) crawlWeather(); + else if (platform == 2) crawlEarthquake(); + else if (platform == 3) crawlNews(); + else if (platform == 4) { crawlWeather(); crawlEarthquake(); crawlNews(); } + else view.showError("Invalid selection"); + } + + private void crawlWeather() throws Exception { + view.showMessage("Crawling weather data..."); + CrawlStrategy strategy = new ChangshaWeatherStrategy(); + List papers = strategy.crawl(); + List headers = Arrays.asList("Date", "Weather", "HighTemp", "LowTemp", "Wind"); + repository.saveToCSV(papers, strategy.getOutputFileName(), headers); + view.showMessage("Saved to " + strategy.getOutputFileName()); + } + + private void crawlEarthquake() throws Exception { + view.showMessage("Crawling earthquake data..."); + CrawlStrategy strategy = new EarthquakeStrategy(); + List papers = strategy.crawl(); + List headers = Arrays.asList("Time", "Magnitude", "Latitude", "Longitude", "Depth", "Location"); + repository.saveToCSV(papers, strategy.getOutputFileName(), headers); + view.showMessage("Saved to " + strategy.getOutputFileName()); + } + + private void crawlNews() throws Exception { + view.showMessage("Crawling news data..."); + CrawlStrategy strategy = new NewsRankStrategy(); + List papers = strategy.crawl(); + List headers = Arrays.asList("Rank", "Title", "HotIndex", "Link"); + repository.saveToCSV(papers, strategy.getOutputFileName(), headers); + view.showMessage("Saved to " + strategy.getOutputFileName()); + } + + public void listData() { + List files = repository.listDataFiles(); + view.showDataList(files); + } + + public void generateVisualizations() { + view.showMessage("Generating visualization pages..."); + try { + generateWeatherVisualization(); + generateEarthquakeVisualization(); + generateNewsVisualization(); + view.showMessage("Visualizations generated in visualization/ directory!"); + } catch (IOException e) { + view.showError("Failed: " + e.getMessage()); + } + } + + private void generateWeatherVisualization() throws IOException { + List data = repository.loadCSV("changsha_weather_2026.csv"); + File visDir = new File("visualization"); + if (!visDir.exists()) visDir.mkdirs(); + File file = new File("visualization", "weather.html"); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); + try { + writer.write("\n\n\n\nChangsha Weather 2026\n\n

Changsha Weather 2026

"); + } finally { + writer.close(); + } + } + + private void generateEarthquakeVisualization() throws IOException { + List data = repository.loadCSV("earthquake_2026.csv"); + File file = new File("visualization", "earthquake.html"); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); + try { + writer.write("\n\n\n\nEarthquake Data 2026\n\n

Earthquake Data 2026

"); + for (int i = 0; i < data.size(); i++) { + Map row = (Map) data.get(i); + writer.write(""); + } + writer.write("
TimeMagnitudeLocation
" + row.get("Time") + "" + row.get("Magnitude") + "" + row.get("Location") + "
"); + } finally { + writer.close(); + } + } + + private void generateNewsVisualization() throws IOException { + List data = repository.loadCSV("news_rank_202605.csv"); + File file = new File("visualization", "news.html"); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); + try { + writer.write("\n\n\n\nNews Rank 2026\n\n

News Rank Top 10

News Details

"); + for (int i = 0; i < data.size(); i++) { + Map row = (Map) data.get(i); + writer.write("
" + row.get("Rank") + "" + row.get("Title") + "
"); + } + writer.write("
"); + } finally { + writer.close(); + } + } + + public void exit() { + this.running = false; + view.showGoodbye(); + } + + public boolean isRunning() { + return running; + } +} +