package com.flaremicro.visualforecast.datamart; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import com.flaremicro.util.Util; import com.flaremicro.visualforecast.PropertyManager; import com.flaremicro.visualforecast.api.ForecastProvider; import com.flaremicro.visualforecast.forecast.ForecastDetails; public class CanadaDatamartProvider extends ForecastProvider { boolean ready = false; PropertyManager propertyManager; ForecastProcessor forecastProcessor; ArrayList towns = new ArrayList(); @Override public void init() { propertyManager = super.getOwnPropertyManager(); String byCode = propertyManager.getString("towns-by-code", "").toLowerCase(); String byNameAndProvince = propertyManager.getString("towns-by-name-and-province", "").toLowerCase(); if(byCode.isEmpty() && byNameAndProvince.isEmpty()) { ready = true; return; } BufferedReader bufferedReader = null; try { ArrayList byCodesArray = new ArrayList(Arrays.asList(byCode.split(","))); ArrayList byNameAndProvincesArray = new ArrayList(Arrays.asList(byNameAndProvince.split(";"))); HashSet byCodes = new HashSet(byCodesArray); HashSet byNameAndProvinces = new HashSet(byNameAndProvincesArray); URL url = new URL("https://dd.weather.gc.ca/citypage_weather/docs/site_list_towns_en.csv"); bufferedReader = new BufferedReader(new InputStreamReader(url.openStream())); String line; int skip = 2; while ((line = bufferedReader.readLine()) != null) { if (skip > 0) { skip--; continue; } String[] data = line.trim().split(","); if (byCodes.contains(data[0].toLowerCase()) || byNameAndProvinces.contains(data[1].toLowerCase() + "," + data[2].toLowerCase())) { int priority = Integer.MAX_VALUE; if(byCodes.contains(data[0].toLowerCase())) { priority = byCodesArray.indexOf(data[0]); } else if(byNameAndProvinces.contains(data[1].toLowerCase() + "," + data[2].toLowerCase())) { priority = byNameAndProvincesArray.indexOf(data[1].toLowerCase() + "," + data[2].toLowerCase()); } String code = data[0].trim(); String town = data[1].trim(); String province = data[2].trim(); String supportedDisplaysString = propertyManager.getStringNoSet("displays-enabled.code."+code, ""); if(supportedDisplaysString.trim().length() <= 0) supportedDisplaysString = propertyManager.getString("displays-enabled.town."+town.toLowerCase().replaceAll("\\s", "_")+"."+province.toLowerCase().replace("\\s", "_"), ""); float latitude = Float.parseFloat(data[3].trim().substring(0, data[3].length()-1)); float longitude = Float.parseFloat(data[4].trim().substring(0, data[4].length()-1)); TownInfo townInfo = new TownInfo(code, town, province, latitude, longitude, priority); if(supportedDisplaysString.trim().length() > 0) { String[] displays = supportedDisplaysString.split(","); for(int i = 0; i < displays.length; i++) { displays[i] = displays[i].trim(); } townInfo.setSupportedDisplays(displays); } towns.add(townInfo); } } } catch (IOException e) { e.printStackTrace(); ready = true; } finally { Util.cleanClose(bufferedReader); } Collections.sort(towns); forecastProcessor = new ForecastProcessor(towns.toArray(new TownInfo[0]), this); forecastProcessor.processForecasts(); this.getRenderPanel().notifyForecastProviderUpdate(); forecastProcessor.begin(); this.notifyForecastProviderUpdate(); ready = true; } @Override public ForecastDetails getForecast() { return forecastProcessor.getMostRecentForecast(); } @Override public boolean isForecastReady() { return ready; } @Override public void deinit() { forecastProcessor.end(); propertyManager.store(); } }