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\n| Time | Magnitude | Location |
|---|---|---|
| " + row.get("Time") + " | " + row.get("Magnitude") + " | " + row.get("Location") + " |