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; } }