/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package automenta.netention.survive.data; import automenta.netention.Detail; import automenta.netention.Mode; import automenta.netention.Pattern; import automenta.netention.Self; import automenta.netention.app.RunSelfBrowser; import automenta.netention.feed.HTTP; import automenta.netention.value.Comment; import automenta.netention.value.geo.GeoPointIs; import automenta.netention.value.real.RealIs; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.logging.Logger; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; /** * Emergency and Disaster Information Service interface * http://hisz.rsoe.hu * @author seh */ public class EDIS { public static final String EARTHQUAKE = getPattern("Earthquake"); public final static String earthquakeMagnitude = "earthquakeMagnitude"; public static final String VOLCANO_ACTIVITY = getPattern("Volcano Activity Report"); public static final String TORNADO = getPattern("Tornado"); public static final String CHEMICAL_HAZARD = getPattern("Chemical Hazard"); public static final String BIOLOGICAL_HAZARD = getPattern("Biological Hazard"); public static final String EPIDEMIC_HAZARD = getPattern("Epidemic Hazard"); public static final String NUCLEAR_EVENT = getPattern("Nuclear Event"); public static final String EXTREME_WEATHER = getPattern("Extreme Weather"); final static Logger logger = Logger.getLogger(EDIS.class.toString()); public static final String url = "http://hisz.rsoe.hu/alertmap/index2.php"; public static final String baseURL = "http://hisz.rsoe.hu/alertmap/"; public static Map<String,String> eventIcon = new HashMap(); static { } public static String getPattern(String name) { return name.replace(" ", "_"); } /** * adds Disaster patterns */ public EDIS init(Self self, Pattern disaster) { init(self, disaster, EARTHQUAKE, "media://edis/DS_UGE.seism.png"); init(self, disaster, VOLCANO_ACTIVITY, "media://edis/VOE.vulano_eruption.png"); init(self, disaster, TORNADO, "media://edis/MET_TOR.tornado.png"); init(self, disaster, BIOLOGICAL_HAZARD, "media://edis/DS_BH_BH.biohazard2.png"); init(self, disaster, CHEMICAL_HAZARD, "media://edis/DS_CA.chemical_accident2.png"); init(self, disaster, EPIDEMIC_HAZARD, "media://edis/DS_BH_EH.epidemic.png"); init(self, disaster, NUCLEAR_EVENT, "media://edis/DS_CR.nuclear_accident.png"); init(self, disaster, EXTREME_WEATHER, "media://edis/MET_WIND.severe_weather.png"); return this; } private void init(Self self, Pattern disaster, String disasterName, String iconURL) { self.addPattern(new Pattern(getPattern(disasterName), disaster.getID(), "Event").withName(disasterName).setIconURL(iconURL) ); } public EDIS update(Self self) { //var point = new GLatLng(19.421, -155.287);var marker = createMarker(point,'<div style="width:240px" align="left"><b>Volcano Activity Report<\/b><br\/><br\/><b>Volcano name:<\/b> Kilauea<br\/><b>Location:<\/b> Hawaii and Pacific Ocean, HI<br\/><b>Alert level:<\/b> Watch<br\/><b>Alert code:<\/b> Orange<br\/><b>Last report:<\/b> -<br\/><a href="read/index.php?pageid=volcano_read&number=1302-01-">Details<\/a><br\/><br\/><b><small><font color="blue">Report by USGS</font><\/div>', VOE);map.addOverlay(marker); String[] p = HTTP.getURL(url).split("\n"); for (String s : p) { s = s.trim(); s = s.replace("\\/", "/"); if (!s.contains("new GLatLng(")) continue; if (!s.contains("createMarker")) continue; int a1 = s.indexOf("("); int a2 = s.indexOf(")"); String latlng = s.substring(a1+1, a2); String text; int b1 = s.indexOf("'"); int b2 = s.indexOf("'", b1+1); String stext = s.substring(b1+1, b2); //single quoted mode String dtext = ""; try { int c1 = s.indexOf("\""); int c2 = s.indexOf("\"", b1+1); dtext = s.substring(c1+1, c2); //double quoted mode } catch (Exception e) { } if (stext.length() > dtext.length()) text = stext; else text = dtext; String name = null; String data = ""; Document doc = Jsoup.parse(text); Elements e; try { e = doc.getElementsByTag("div").first().getAllElements(); } catch (NullPointerException n) { logger.info("Invalid line: " + s); continue; } for (int i = 0; i < e.size(); i++) { Element x = e.get(i); if ((name == null) && ((x.tagName().equals("b")) || (x.tagName().equals("big"))) ) { name = x.text(); } } String ee = doc.getElementsByTag("div").html(); String date = "", loc = "", country = "", magnitude = ""; List<String> datas = new LinkedList(); for (String f : ee.split("<br />")) { f = f.trim(); if (f.length() > 0) { f = f.replace("<b>", ""); f = f.replace("</b>", ""); datas.add(f); final String datePrefix = "Date: "; final String datePrefix2 = "Event date: "; final String locPrefix = "Location: "; final String countryPrefix = "Country: "; final String magnitudePrefix = "Magnitude: "; if (f.startsWith(datePrefix)) { date = f.substring(datePrefix.length()); } else if (f.startsWith(datePrefix2)) { date = f.substring(datePrefix2.length()); } else if (f.startsWith(locPrefix)) { loc = f.substring(locPrefix.length()); } else if (f.startsWith(countryPrefix)) { country = f.substring(countryPrefix.length()); } else if (f.startsWith(magnitudePrefix)) { magnitude = f.substring(magnitudePrefix.length()); } } } date = date.replace(" :" , ""); date = date.replace(".", "-"); Date dateV; try { dateV = getDate(date); } catch (ParseException pe) { logger.info("Un-parseable date: " + text); dateV = new Date(); } // System.out.println(name + " " + latlng); // System.out.println(" " + date + " " + loc + " in " + country); // System.out.println(" " + datas); final String pattern = getPattern(name); Detail d = new Detail(name, Mode.Real, pattern); d.setWhen(dateV); d.setID(name + "." + date + "." + latlng); d.add(new Comment(ee)); //TODO set detail to page that the EDIS marker refers to if (latlng.length() > 0) { try { d.add("currentLocation", new GeoPointIs(latlng)); d.addPattern("Located"); } catch (NumberFormatException exx) { logger.severe("Invalid geolocation: " + latlng); } } else { logger.info("Missing location: " + text); } //Earthquake Data if (pattern.equals("Earthquake")) { if (magnitude.length() > 0) { double mm = Double.parseDouble(magnitude); d.add(earthquakeMagnitude, new RealIs(mm)); } } self.addDetail(d); } return this; } /** only needs to be called once, or each time EDIS changes */ public static void getIcons() { //var FDS_TC_S1 = new GIcon(baseIcon, "icon/FH1.png",null, "icon/shadow_icon.png"); String[] p = HTTP.getURL(url).split("\n"); for (String s : p) { s = s.trim(); String xp = "new GIcon(baseIcon, \""; if (s.contains(xp)) { //System.out.println(s); String pl = s.substring(s.indexOf(xp) + xp.length()); String iconURL = pl.substring(0, pl.indexOf("\"")); final String var = s.split(" ")[1]; final String iconName = iconURL.split("/")[1]; iconURL = baseURL + iconURL; System.out.println(var + " " + iconName + " " + iconURL); try { HTTP.saveURL(iconURL, "media/edis/" + var + "." + iconName); } catch (IOException ex) { ex.printStackTrace(); } } } } public final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); public Date getDate(String s) throws ParseException { return dateFormat.parse(s + " GMT"); } public static void main(String[] args) throws Exception { Self s = RunSelfBrowser.newDefaultSelf(); new EDIS().init(s, new Pattern("Disaster")).update(s); } }