From 6caff6bdf6612c7e6b3dbab979857289736f1d39 Mon Sep 17 00:00:00 2001 From: Richard Peter Date: Fri, 10 May 2013 11:57:37 -0500 Subject: [PATCH] Issue #1951: Integrate warning_ugczone into parent tables and add active table indexes. Change-Id: Ie3e8b595cf67c6d30047d74e689b2cf9bcd31bea Former-commit-id: 31a84fb91f29b461fa5b51ff48ae10c85e0de100 [formerly c63a4882e7213ccbea2369de37eeb7cae2f80e7c] [formerly 99391cfe12004c05f1261229d6577b43f975c8ac] [formerly 31a84fb91f29b461fa5b51ff48ae10c85e0de100 [formerly c63a4882e7213ccbea2369de37eeb7cae2f80e7c] [formerly 99391cfe12004c05f1261229d6577b43f975c8ac] [formerly d4135dba625f5f372156adc2b148ede1d31125b0 [formerly 99391cfe12004c05f1261229d6577b43f975c8ac [formerly 883a51484d03900852ed84820aa559e088c97335]]]] Former-commit-id: d4135dba625f5f372156adc2b148ede1d31125b0 Former-commit-id: 2813a8fc4700f7006b6a80cd1881b990d0d43bcb [formerly 43a90c062c0ef666ab91db4d4b06e491a693aaf0] [formerly adfd41ab237c568aeecc21759b668b8afa0b7822 [formerly a02955e40c9490b97cd18eb496ce8befafaac620]] Former-commit-id: a8522f4158313026efd8946f1eccafa6f78a6ff3 [formerly 81ece036ac764afe5ab7729b15fb441e7fa51b79] Former-commit-id: fe2e8943070fd21d9506a82ca1b9e652fa8f7a60 --- .../viz/warngen/template/TemplateRunner.java | 148 ++++++++++-------- .../viz/warngen/util/CurrentWarnings.java | 81 ++++------ .../raytheon/viz/warngen/util/FipsUtil.java | 57 ++----- .../viz/warnings/rsc/CWASPSResource.java | 48 +++++- .../viz/warnings/rsc/WatchesResource.java | 58 ++++--- deltaScripts/13.4.1/alterWarningTables.sql | 53 +++++++ deltaScripts/13.4.1/parseUgcZones.py | 37 +++++ deltaScripts/13.4.1/updateWarningTables.sh | 75 +++++++++ .../WarningDecoder.py | 2 +- .../common/activetable/ActiveTableRecord.java | 15 +- .../OperationalActiveTableRecord.java | 10 +- .../PracticeActiveTableRecord.java | 10 +- ...f.common.serialization.ISerializableObject | 2 +- .../warning/AbstractWarningRecord.java | 127 ++++++--------- .../warning/PracticeWarningRecord.java | 35 ++--- .../uf/common/dataplugin/warning/UGCZone.java | 137 ---------------- .../dataplugin/warning/WarningRecord.java | 34 ++-- 17 files changed, 461 insertions(+), 468 deletions(-) create mode 100644 deltaScripts/13.4.1/alterWarningTables.sql create mode 100644 deltaScripts/13.4.1/parseUgcZones.py create mode 100644 deltaScripts/13.4.1/updateWarningTables.sh delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/UGCZone.java diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java index d76eb9d54e..0062794e5d 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java @@ -150,7 +150,7 @@ import com.vividsolutions.jts.io.WKTReader; * Feb 15, 2013 1607 jsanchez Added two variables corEventTime and corCreateTime. * Feb 15, 2013 15820 Qinglu Lin Added createOfficeTimezoneMap() and added logic so that localtimezone * and secondtimezone can get correct values when warning area covers two time zones. - * + * May 10, 2013 1951 rjpeter Updated ugcZones references * * * @author njensen @@ -239,7 +239,7 @@ public class TemplateRunner { WKTReader wkt = new WKTReader(); DataTime[] datatimes = warngenLayer.getDescriptor().getFramesInfo() .getFrameTimes(); - Date eventTime = datatimes != null && datatimes.length > 0 ? datatimes[datatimes.length - 1] + Date eventTime = (datatimes != null) && (datatimes.length > 0) ? datatimes[datatimes.length - 1] .getRefTimeAsCalendar().getTime() : startTime; Date simulatedTime = SimulatedTime.getSystemTime().getTime(); WarngenConfiguration config = warngenLayer.getConfiguration(); @@ -319,7 +319,7 @@ public class TemplateRunner { Map intersectSize = new HashMap(); String[] oneLetterTZ; double minSize = 1.0E-3d; - if (areas != null && areas.length > 0) { + if ((areas != null) && (areas.length > 0)) { Set timeZones = new HashSet(); for (AffectedAreas area : areas) { if (area.getTimezone() != null) { @@ -347,9 +347,11 @@ public class TemplateRunner { n2 = 0; size = 0.0d; totalSize = 0.0d; - if (timezoneGeom != null && warningArea != null) { - if (intersectSize.get(oneLetterTZ[i]) != null) + if ((timezoneGeom != null) + && (warningArea != null)) { + if (intersectSize.get(oneLetterTZ[i]) != null) { continue; + } poly1 = new Polygon[warningArea .getNumGeometries()]; n1 = warningArea.getNumGeometries(); @@ -369,19 +371,22 @@ public class TemplateRunner { for (Polygon p2 : poly2) { size = p1.intersection(p2) .getArea(); - if (size > 0.0) + if (size > 0.0) { totalSize += size; + } } - if (totalSize > minSize) + if (totalSize > minSize) { break; // save time when the size of // poly1 or poly2 is large + } } intersectSize .put(oneLetterTZ[i], totalSize); - } else + } else { throw new VizException( "Either timezoneGeom or/and warningArea is null. " + "Timezone cannot be determined."); + } System.out .println("Time to do size computation = " + (System.currentTimeMillis() - t0)); @@ -393,17 +398,18 @@ public class TemplateRunner { // area is very small, // use the timezone of larger intersection size. if (timeZones.size() == 0) { - if (intersectSize.size() > 1) + if (intersectSize.size() > 1) { if (intersectSize.get(oneLetterTZ[0]) > intersectSize .get(oneLetterTZ[1])) { timeZones.add(oneLetterTZ[0]); } else { timeZones.add(oneLetterTZ[1]); } - else + } else { throw new VizException( "The size of intersectSize is less than 1, " + "timezone cannot be determined."); + } } } } else { @@ -414,16 +420,17 @@ public class TemplateRunner { Map officeCityTimezone = createOfficeTimezoneMap(); String cityTimezone = null; - if (officeCityTimezone != null) + if (officeCityTimezone != null) { cityTimezone = officeCityTimezone.get(warngenLayer .getLocalizedSite()); + } Iterator iterator = timeZones.iterator(); - if (timeZones.size() > 1 && cityTimezone != null) { + if ((timeZones.size() > 1) && (cityTimezone != null)) { String timezone; while (iterator.hasNext()) { timezone = iterator.next(); if (timezone.equals(cityTimezone) - && context.get("localtimezone") == null) { + && (context.get("localtimezone") == null)) { context.put("localtimezone", timezone); } else if (context.get("secondtimezone") == null) { context.put("secondtimezone", timezone); @@ -441,7 +448,7 @@ public class TemplateRunner { } // CAN and EXP products follow different rules as followups - if (!(selectedAction == WarningAction.CAN || selectedAction == WarningAction.EXP)) { + if (!((selectedAction == WarningAction.CAN) || (selectedAction == WarningAction.EXP))) { wx = new Wx(config, stormTrackState, warngenLayer.getStormLocations(stormTrackState), startTime.getTime(), DateUtil.roundDateTo15(endTime) @@ -463,10 +470,11 @@ public class TemplateRunner { context.put("duration", duration); context.put("event", eventTime); - if (selectedAction == WarningAction.COR) + if (selectedAction == WarningAction.COR) { context.put("TMLtime", eventTime); - else + } else { context.put("TMLtime", simulatedTime); + } context.put("ugcline", FipsUtil.getUgcLine(areas, wx.getEndTime(), 15)); context.put("areaPoly", GisUtil.convertCoords(warngenLayer @@ -550,7 +558,7 @@ public class TemplateRunner { canOrExpCal.add(Calendar.MILLISECOND, 1); context.put( "ugcline", - FipsUtil.getUgcLine(oldWarn.getUgczones(), + FipsUtil.getUgcLine(oldWarn.getUgcZones(), canOrExpCal.getTime(), 0)); String oldGeom = oldWarn.getGeometry().toString(); context.put("areaPoly", GisUtil.convertCoords(wkt.read(oldGeom) @@ -605,7 +613,7 @@ public class TemplateRunner { context.put("includedWatches", config.getIncludedWatches()); // Additional Information for Followup Products - if (etn != null && etn.length() > 0) { + if ((etn != null) && (etn.length() > 0)) { AbstractWarningRecord oldWarn = null; // COR product - What are we correcting? @@ -618,7 +626,7 @@ public class TemplateRunner { CurrentWarnings cw = CurrentWarnings.getInstance(threeLetterSiteId); - if (selectedAction == WarningAction.COR && !allowsNewProduct) { + if ((selectedAction == WarningAction.COR) && !allowsNewProduct) { oldWarn = cw.getFollowUpByTracking(etn, phenSig, new WarningAction[] { WarningAction.CON, WarningAction.COR }); @@ -627,8 +635,8 @@ public class TemplateRunner { } // Hydro product - if (oldWarn.getFloodSeverity() != null - && oldWarn.getFloodSeverity().length() >= 1) { + if ((oldWarn.getFloodSeverity() != null) + && (oldWarn.getFloodSeverity().length() >= 1)) { context.put("floodseverity", oldWarn.getFloodSeverity()); context.put("floodic", oldWarn.getImmediateCause()); } @@ -651,8 +659,9 @@ public class TemplateRunner { context.put("now", new Date(wwaMNDTime)); // original warning's 'now' time used in MND header context.put("corCreateTime", new Date(wwaMNDTime)); - } else + } else { context.put("now", simulatedTime); + } context.put("event", oldWarn.getIssueTime().getTime()); // original warning's 'event' time, which should match the storm // track @@ -721,8 +730,9 @@ public class TemplateRunner { } } } - if (untilIndex < 0 || atIndex < 0 || elipsisIndex < 0) + if ((untilIndex < 0) || (atIndex < 0) || (elipsisIndex < 0)) { throw new VizException("Cannot find * AT line."); + } } Calendar cal = oldWarn.getEndTime(); @@ -779,18 +789,18 @@ public class TemplateRunner { oldWarn.getGeometry(), removedAreas, threeLetterSiteId); for (int i = 0; i < cancelareas.length; i++) { - for (int j = 0; j < areas.length; j++) { - if (cancelareas[i] != null + for (AffectedAreas area : areas) { + if ((cancelareas[i] != null) && cancelareas[i].getFips().equals( - areas[j].getFips())) { + area.getFips())) { cancelareas[i] = null; } } } ArrayList al = new ArrayList(); - for (int i = 0; i < cancelareas.length; i++) { - if (cancelareas[i] != null) { - al.add(cancelareas[i]); + for (AffectedAreas cancelarea : cancelareas) { + if (cancelarea != null) { + al.add(cancelarea); } } context.put("cancel" @@ -970,7 +980,7 @@ public class TemplateRunner { WatchUtil rval = null; String[] includedWatches = config.getIncludedWatches(); - if (includedWatches != null && includedWatches.length > 0) { + if ((includedWatches != null) && (includedWatches.length > 0)) { String phensigList = null; for (String includedWatch : includedWatches) { if (includedWatch.equalsIgnoreCase("torWatches")) { @@ -1110,7 +1120,7 @@ public class TemplateRunner { } GeospatialData[] geoData = warngenLayer.getGeodataFeatures( asc.getAreaSource(), warngenLayer.getLocalizedSite()); - if (geoData == null || geoData.length == 0) { + if ((geoData == null) || (geoData.length == 0)) { statusHandler.handle(Priority.ERROR, "Cannot process watches: cannot get geospatial data"); return rval; @@ -1143,8 +1153,9 @@ public class TemplateRunner { } // TODO: Building geometry just to perform this test is probably // inefficient with the post-DR-15430 logic... - if (!ar.getGeometry().isEmpty()) + if (!ar.getGeometry().isEmpty()) { work.valid = true; + } /* * TODO: Currently adding all zones to the list even if they are not @@ -1159,10 +1170,12 @@ public class TemplateRunner { * If none of the areas in the watch were neer our warning polygon, * do not included it. */ - if (!work.valid) + if (!work.valid) { continue; - if (determineAffectedPortions(work.ugcZone, asc, geoData, work.waw)) + } + if (determineAffectedPortions(work.ugcZone, asc, geoData, work.waw)) { rval.addWaw(work.waw); + } } return rval; @@ -1190,8 +1203,8 @@ public class TemplateRunner { Entry e = null; // Either zero or more than one sates/counties would be wrong - if (parsed.size() != 1 - || (e = parsed.entrySet().iterator().next()).getValue().length != 1) { + if ((parsed.size() != 1) + || ((e = parsed.entrySet().iterator().next()).getValue().length != 1)) { statusHandler.handle(Priority.ERROR, "Invalid ugczone in active table entry: " + ugc); continue; @@ -1206,16 +1219,18 @@ public class TemplateRunner { "Error generating included watches.", exc); return false; } - if (feArea == NOT_IN_CWA) + if (feArea == NOT_IN_CWA) { continue; + } Set feAreas = map.get(stateAbbrev); if (feAreas == null) { feAreas = new HashSet(); map.put(stateAbbrev, feAreas); } - if (feArea != null) + if (feArea != null) { feAreas.add(feArea); + } } ArrayList portions = new ArrayList(map.size()); @@ -1265,48 +1280,55 @@ public class TemplateRunner { if ("pa".equals(part)) { pa = 1; continue; - } else if ("nn".equals(part)) + } else if ("nn".equals(part)) { nnn = nn = 1; - else if ("ss".equals(part)) + } else if ("ss".equals(part)) { sss = ss = 1; - else if ("ee".equals(part)) + } else if ("ee".equals(part)) { eee = ee = 1; - else if ("ww".equals(part)) + } else if ("ww".equals(part)) { www = ww = 1; - else if ("nw".equals(part)) + } else if ("nw".equals(part)) { nnn = www = nw = 1; - else if ("nc".equals(part)) + } else if ("nc".equals(part)) { nnn = nc = 1; - else if ("ne".equals(part)) + } else if ("ne".equals(part)) { nnn = eee = ne = 1; - else if ("wc".equals(part)) + } else if ("wc".equals(part)) { www = wc = 1; - else if ("cc".equals(part)) { + } else if ("cc".equals(part)) { cc = 1; continue; - } else if ("ec".equals(part)) + } else if ("ec".equals(part)) { eee = ec = 1; - else if ("sw".equals(part)) + } else if ("sw".equals(part)) { sss = www = sw = 1; - else if ("sc".equals(part)) + } else if ("sc".equals(part)) { sss = sc = 1; - else if ("se".equals(part)) + } else if ("se".equals(part)) { sss = eee = se = 1; + } partAbrev = part; } // decide how to describe these subareas. - if (ne > 0 && nw > 0) + if ((ne > 0) && (nw > 0)) { nn = 1; - if (se > 0 && sw > 0) + } + if ((se > 0) && (sw > 0)) { ss = 1; - if (se > 0 && ne > 0) + } + if ((se > 0) && (ne > 0)) { ee = 1; - if (sw > 0 && nw > 0) + } + if ((sw > 0) && (nw > 0)) { ww = 1; - if (nnn > 0 && sss > 0 && eee > 0 && www > 0) + } + if ((nnn > 0) && (sss > 0) && (eee > 0) && (www > 0)) { return abrev; - if (nn > 0 && ss > 0 || ee > 0 && ww > 0) + } + if (((nn > 0) && (ss > 0)) || ((ee > 0) && (ww > 0))) { return abrev; + } if (nnn + sss + eee + www == 3) { if (www == 0) { abrev = "e"; @@ -1319,11 +1341,11 @@ public class TemplateRunner { } return abrev; } - if (nnn == sss && eee == www || cc == m) { + if (((nnn == sss) && (eee == www)) || (cc == m)) { abrev = "c"; return abrev; } - if (pa != 0 && cc == 0) { + if ((pa != 0) && (cc == 0)) { abrev = "pa"; if (--m <= 0) { return abrev; @@ -1346,8 +1368,9 @@ public class TemplateRunner { private static String getStateName(String key, AreaSourceConfiguration asc, GeospatialData[] geoData) { for (GeospatialData g : geoData) { - if (key.equals((String) g.attributes.get("STATE"))) + if (key.equals(g.attributes.get("STATE"))) { return (String) g.parent.attributes.get("NAME"); + } } return null; } @@ -1367,10 +1390,11 @@ public class TemplateRunner { private static String getFeArea(String stateAbbrev, String ugc, AreaSourceConfiguration asc, GeospatialData[] geoData) { for (GeospatialData g : geoData) { - if (stateAbbrev.equals((String) g.attributes.get("STATE")) + if (stateAbbrev.equals(g.attributes.get("STATE")) && ((String) g.attributes.get(asc.getFipsField())) - .endsWith(ugc)) + .endsWith(ugc)) { return (String) g.attributes.get(asc.getFeAreaField()); + } } // TODO: Is this the correct way to determine if the county is in the diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java index 89a0fe84fe..c32f72125c 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java @@ -33,7 +33,6 @@ import java.util.Set; import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord; import com.raytheon.uf.common.dataplugin.warning.PracticeWarningRecord; -import com.raytheon.uf.common.dataplugin.warning.UGCZone; import com.raytheon.uf.common.dataplugin.warning.WarningRecord; import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction; import com.raytheon.uf.common.dataplugin.warning.util.AnnotationUtil; @@ -69,7 +68,7 @@ import com.vividsolutions.jts.geom.Geometry; * Feb 12, 2013 1500 mschenke Refactored to not request full records and only request full * record when actually retrieving for use * Apr 22, 2013 jsanchez Set the issue time for follow up warnings. - * + * May 10, 2013 1951 rjpeter Updated ugcZones references * * * @author mschenke @@ -104,17 +103,21 @@ public class CurrentWarnings { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } WarningKey other = (WarningKey) obj; - if (etn.equals(other.etn) == false) + if (etn.equals(other.etn) == false) { return false; - else if (phensig.equals(other.phensig) == false) + } else if (phensig.equals(other.phensig) == false) { return false; + } return true; } @@ -180,11 +183,11 @@ public class CurrentWarnings { return warnings; } - private String officeId; + private final String officeId; - private Map recordsMap = new HashMap(); + private final Map recordsMap = new HashMap(); - private Map> warningMap = new HashMap>() { + private final Map> warningMap = new HashMap>() { private static final long serialVersionUID = 1L; @@ -231,7 +234,7 @@ public class CurrentWarnings { for (WarningKey key : keys) { AbstractWarningRecord tmp = getNewestByTracking(key.etn, key.phensig); - if (tmp != null && rval.contains(tmp) == false) { + if ((tmp != null) && (rval.contains(tmp) == false)) { rval.add(tmp); } } @@ -263,11 +266,12 @@ public class CurrentWarnings { end.add(Calendar.MINUTE, 10); TimeRange t = new TimeRange(warning.getStartTime().getTime(), end.getTime()); - if ((action == WarningAction.NEW || action == WarningAction.CON || action == WarningAction.EXT) + if (((action == WarningAction.NEW) + || (action == WarningAction.CON) || (action == WarningAction.EXT)) && t.contains(current.getTime())) { rval.add(warning); - } else if (action == WarningAction.CAN - || action == WarningAction.EXP) { + } else if ((action == WarningAction.CAN) + || (action == WarningAction.EXP)) { rval.clear(); return rval; } @@ -316,7 +320,7 @@ public class CurrentWarnings { // rval.setAct("CON"); rval.setGeometry(warning.getGeometry()); rval.setCountyheader(warning.getCountyheader()); - rval.setUgczones(warning.getUgczones()); + rval.setUgcZones(warning.getUgcZones()); rval.setLoc(warning.getLoc()); rval.setRawmessage(warning.getRawmessage()); rval.setIssueTime(warning.getInsertTime()); @@ -325,37 +329,20 @@ public class CurrentWarnings { } // If warning was canceled (CAN) or has expired (EXP), check if - // county - // headers match. If so, rval = null. Otherwise check to see if - // rval - // has - // any UGCZones that the warning does. If there are matching - // UGCZones, - // set rval to null + // county headers match. If so, rval = null. Otherwise check to + // see if rval has any UGCZones that the warning does not have. + // If there + // are no new UGCZones, set rval to null. for (AbstractWarningRecord warning : warnings) { WarningAction action = getAction(warning.getAct()); - if (action == WarningAction.CAN - || action == WarningAction.EXP) { - if (rval != null - && warning.getCountyheader().equals( - rval.getCountyheader())) { + if ((action == WarningAction.CAN) + || (action == WarningAction.EXP)) { + if ((rval != null) + && (warning.getCountyheader().equals( + rval.getCountyheader()) || !warning + .getUgcZones().containsAll( + rval.getUgcZones()))) { rval = null; - } else if (rval != null) { - boolean rv = true; - for (UGCZone a : rval.getUgczones()) { - boolean rv2 = false; - for (UGCZone b : warning.getUgczones()) { - if (a.toString().equals(b.toString())) { - rv2 = true; - } - } - if (rv2 == false) { - rv = false; - } - } - if (rv == true) { - rval = null; - } } } } @@ -429,7 +416,7 @@ public class CurrentWarnings { for (AbstractWarningRecord warning : warnings) { WarningAction action = getAction(warning.getAct()); if (t.contains(warning.getIssueTime().getTime()) - && action == WarningAction.CAN) { + && (action == WarningAction.CAN)) { cancelProd = warning; } if (action == WarningAction.NEW) { @@ -442,13 +429,13 @@ public class CurrentWarnings { // for (AbstractWarningRecord rec : conProds) { - if (FipsUtil.containsSameCountiesOrZones(rec.getUgczones(), - cancelProd.getUgczones())) { + if (FipsUtil.containsSameCountiesOrZones(rec.getUgcZones(), + cancelProd.getUgcZones())) { conMatchesCan = true; } } - if (cancelProd.getUgczones().size() == newProd.getUgczones() + if (cancelProd.getUgcZones().size() == newProd.getUgcZones() .size()) { // Change nothing rval = cancelProd; diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/FipsUtil.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/FipsUtil.java index d3b13b4248..e89f43bcb6 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/FipsUtil.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/FipsUtil.java @@ -32,9 +32,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.raytheon.uf.common.dataplugin.warning.UGCZone; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; import com.raytheon.viz.warngen.gis.AffectedAreas; import com.raytheon.viz.warngen.gis.AffectedAreasComparator; import com.raytheon.viz.warnings.DateUtil; @@ -50,8 +47,8 @@ import com.raytheon.viz.warnings.DateUtil; * May 6, 2008 bwoodle Initial creation * Dec 28 2012 DR15599 mgamazaychikov Updated method getListCounties to fix the problem * with generated list of counties. - * Apr 25,2013 1877 jsanchez Sorted the UGC line for cancellations. - * + * Apr 25, 2013 1877 jsanchez Sorted the UGC line for cancellations. + * May 10, 2013 1951 rjpeter Updated ugcZones references * * * @author bwoodle @@ -59,9 +56,6 @@ import com.raytheon.viz.warnings.DateUtil; */ public class FipsUtil { - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(FipsUtil.class); - private static final Map fipsToState; private static String[][] abbrlist = new String[][] { { "02", "AK" }, @@ -126,7 +120,7 @@ public class FipsUtil { for (AffectedAreas area : sortedAreas) { String ugc = getUgc(area); - if (ugc != null && countiesOrZones.contains(ugc) == false) { + if ((ugc != null) && (countiesOrZones.contains(ugc) == false)) { countiesOrZones.add(ugc); } } @@ -159,15 +153,14 @@ public class FipsUtil { * @param endtime * @return */ - public static String getUgcLine(Set ugcs, Date endtime, - int interval) { + public static String getUgcLine(Set ugcs, Date endtime, int interval) { StringBuffer rval = new StringBuffer(); ArrayList countiesOrZones = new ArrayList(); DateUtil du = new DateUtil(); - for (UGCZone ugc : ugcs) { - if (countiesOrZones.contains(ugc.toString()) == false) { - countiesOrZones.add(ugc.toString()); + for (String ugc : ugcs) { + if (countiesOrZones.contains(ugc) == false) { + countiesOrZones.add(ugc); } } @@ -425,33 +418,15 @@ public class FipsUtil { return fipsToState.get(statefips); } - public static boolean containsSameCountiesOrZones(Set a, - Set b) { - boolean rval = true; - - // Check one way... - for (UGCZone z1 : a) { - boolean containsThisItem = false; - for (UGCZone z2 : b) { - if (z1.toString().equals(z2.toString())) { - containsThisItem = true; - } - } - if (!containsThisItem) { - rval = false; - } - } - - // Check the other way... - for (UGCZone z2 : a) { - boolean containsThisItem = false; - for (UGCZone z1 : b) { - if (z1.toString().equals(z2.toString())) { - containsThisItem = true; - } - } - if (!containsThisItem) { - rval = false; + public static boolean containsSameCountiesOrZones(Set a, + Set b) { + boolean rval = a.size() == b.size(); + if (rval) { + // Check one way... + rval = a.containsAll(b); + if (rval) { + // Check the other way... + rval = b.containsAll(a); } } diff --git a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/CWASPSResource.java b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/CWASPSResource.java index 0695c340b4..70c93c3987 100644 --- a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/CWASPSResource.java +++ b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/CWASPSResource.java @@ -1,3 +1,22 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ package com.raytheon.viz.warnings.rsc; import java.text.SimpleDateFormat; @@ -27,7 +46,21 @@ import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKBReader; import com.vividsolutions.jts.io.WKTReader; - +/** + * CWASPSResource + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * May 10, 2013 1951       rjpeter     Initial history entry, updated ugcZones references
+ * 
+ * + * @author rjpeter + * @version 1.0 + */ public class CWASPSResource extends WatchesResource { private static final transient IUFStatusHandler statusHandler = UFStatus @@ -57,9 +90,9 @@ public class CWASPSResource extends WatchesResource { String zoneList = ""; List queries = new ArrayList(); - for (String ugc : record.getUgcsString()) { + for (String ugc : record.getUgcZones()) { - if (ugc.charAt(2) == 'Z' + if ((ugc.charAt(2) == 'Z') && marinezones.contains(ugc.substring(0, 2))) { if (marinezoneList.length() > 0) { marinezoneList += ","; @@ -97,8 +130,8 @@ public class CWASPSResource extends WatchesResource { try { List result = DirectDbQuery.executeQuery(sql, "maps", QueryLanguage.SQL); - if (result != null && result.size() > 0 - && result.get(0)[0] != null) { + if ((result != null) && (result.size() > 0) + && (result.get(0)[0] != null)) { for (Object[] obj : result) { if (obj[0] != null) { WKBReader wkbReader = new WKBReader(); @@ -153,14 +186,15 @@ public class CWASPSResource extends WatchesResource { // if the shape was in the shadedShape map then create a shaded // shape isShaded = true; - } else if (entry.wireframeShape == null && record.getGeometry() == null) { + } else if ((entry.wireframeShape == null) + && (record.getGeometry() == null)) { // if it is not in the wireframeShape map and the geometry is null // then create a shaded shape isShaded = true; } if (isShaded) { - if (record.getUgczones().size() > 0) { + if (!record.getUgcZones().isEmpty()) { // if the geometry is null get a geometry based on the county // list if (record.getGeometry() == null) { diff --git a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java index ad0d7e2767..9580cfa9e6 100644 --- a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java +++ b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java @@ -15,7 +15,6 @@ import java.util.TimerTask; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord; -import com.raytheon.uf.common.dataplugin.warning.UGCZone; import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; @@ -47,9 +46,9 @@ import com.vividsolutions.jts.geom.GeometryFactory; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Sep 27, 2012 1149 jsanchez Refactored methods from AbstractWarningsResource into this class. + * Sep 27, 2012 1149 jsanchez Refactored methods from AbstractWarningsResource into this class. * May 06, 2013 1930 bsteffen Check for null in WatchesResource. - * + * May 10, 2013 1951 rjpeter Updated ugcZones references * * * @author jsanchez @@ -158,9 +157,9 @@ public class WatchesResource extends AbstractWWAResource { } } } else if (type == ChangeType.CAPABILITY) { - if (color != null - && color.equals(getCapability((ColorableCapability.class)) - .getColor()) == false) { + if ((color != null) + && (color.equals(getCapability((ColorableCapability.class)) + .getColor()) == false)) { color = getCapability((ColorableCapability.class)).getColor(); for (String dataUri : entryMap.keySet()) { @@ -185,9 +184,9 @@ public class WatchesResource extends AbstractWWAResource { AbstractWarningRecord record) throws VizException { Geometry geo; - if (record.getUgczones().size() > 0) { + if (!record.getUgcZones().isEmpty()) { setGeometry(record); - if (record.getGeometry() != null && record.getPhen() != null) { + if ((record.getGeometry() != null) && (record.getPhen() != null)) { IShadedShape ss = target.createShadedShape(false, descriptor.getGridGeometry(), false); geo = (Geometry) record.getGeometry().clone(); @@ -219,11 +218,11 @@ public class WatchesResource extends AbstractWWAResource { WarningAction watchact = WarningAction.valueOf(watchrec .getAct()); - int watchSize = watchrec.getUgczones().size(); + int watchSize = watchrec.getUgcZones().size(); if (watchact != WarningAction.NEW) { AbstractWarningRecord createShape = null; - if (watchact == null || watchact.toString() == null) { + if ((watchact == null) || (watchact.toString() == null)) { createShape = watchrec; } for (String entryKey : entryMap.keySet()) { @@ -233,27 +232,27 @@ public class WatchesResource extends AbstractWWAResource { // checks for any possible null pointer exceptions in // the following block of code, since there is the // possibility of null values - if (rec.getPhensig() != null - && watchrec.getPhensig() != null - && rec.getOfficeid() != null - && watchrec.getOfficeid() != null - && rec.getUgczones() != null - && rec.getStartTime() != null - && watchrec.getStartTime() != null) { + if ((rec.getPhensig() != null) + && (watchrec.getPhensig() != null) + && (rec.getOfficeid() != null) + && (watchrec.getOfficeid() != null) + && (rec.getUgcZones() != null) + && (rec.getStartTime() != null) + && (watchrec.getStartTime() != null)) { if (rec.getPhensig().equals(watchrec.getPhensig()) && rec.getOfficeid().equals( watchrec.getOfficeid()) && rec.getEtn().equals(watchrec.getEtn())) { - int recSize = rec.getUgczones().size(); + int recSize = rec.getUgcZones().size(); if (!entry.partialCancel) { - if (watchact == WarningAction.EXP - || watchact == WarningAction.CAN) { + if ((watchact == WarningAction.EXP) + || (watchact == WarningAction.CAN)) { entry.partialCancel = true; entry.record .setEndTime((Calendar) watchrec .getStartTime().clone()); - } else if (watchact == WarningAction.CON - && recSize > watchSize + } else if ((watchact == WarningAction.CON) + && (recSize > watchSize) && watchrec.getStartTime().after( rec.getStartTime())) { entry.partialCancel = true; @@ -270,7 +269,7 @@ public class WatchesResource extends AbstractWWAResource { if (createShape != null) { WarningEntry entry = entryMap.get(createShape .getDataURI()); - if (entry != null && entry.shadedShape != null) { + if ((entry != null) && (entry.shadedShape != null)) { entry.shadedShape.dispose(); } initShape(target, createShape); @@ -289,7 +288,7 @@ public class WatchesResource extends AbstractWWAResource { List marinezone = new ArrayList(); List geometries = new ArrayList(); - for (String ugc : record.getUgcsString()) { + for (String ugc : record.getUgcZones()) { Geometry geom = null; WeakReference geomRef = geometryMap.get(ugc); if (geomRef != null) { @@ -383,10 +382,9 @@ public class WatchesResource extends AbstractWWAResource { AbstractWarningRecord watch = watches.get(key); if (watch == null) { watch = watchrec; - } else if (watchrec.getUgczones() != null) { - Set ugcZones = watch.getUgczones(); - ugcZones.addAll(watchrec.getUgczones()); - watch.setUgczones(ugcZones); + } else if (watchrec.getUgcZones() != null) { + Set ugcZones = watch.getUgcZones(); + ugcZones.addAll(watchrec.getUgcZones()); } watches.put(key, watch); } @@ -410,7 +408,7 @@ public class WatchesResource extends AbstractWWAResource { long now = SimulatedTime.getSystemTime().getTime().getTime(); long endTime = rec.getEndTime().getTimeInMillis(); synchronized (expTaskSet) { - if (endTime > now && !expTaskSet.contains(new Long(endTime))) { + if ((endTime > now) && !expTaskSet.contains(new Long(endTime))) { WarningExpirationTask task = new WarningExpirationTask(this); timer.schedule(task, rec.getEndTime().getTime()); expTaskSet.add(new Long(endTime)); @@ -429,7 +427,7 @@ public class WatchesResource extends AbstractWWAResource { Long time = new Long(triggerTime); // remove the instance of the trigger time from the map synchronized (expTaskSet) { - if (expTaskSet != null && expTaskSet.contains(time)) { + if ((expTaskSet != null) && expTaskSet.contains(time)) { expTaskSet.remove(time); } } diff --git a/deltaScripts/13.4.1/alterWarningTables.sql b/deltaScripts/13.4.1/alterWarningTables.sql new file mode 100644 index 0000000000..f09a7f4da9 --- /dev/null +++ b/deltaScripts/13.4.1/alterWarningTables.sql @@ -0,0 +1,53 @@ +-- called by updateWarningTables.sh to alter the warning and practicewarning tables +-- and to create indexes and sequences for the activetable tables +DROP SEQUENCE IF EXISTS practice_activetableseq; +DROP SEQUENCE IF EXISTS activetableseq; +DROP INDEX IF EXISTS activetable_officeid_phensig_idx; +DROP INDEX IF EXISTS practice_activetable_officeid_phensig_idx +DROP INDEX IF EXISTS practicewarning_office_phensig_index +DROP INDEX IF EXISTS warning_office_phensig_index +ALTER TABLE warning DROP COLUMN IF EXISTS ugczones; +ALTER TABLE practicewarning DROP COLUMN IF EXISTS ugczones; + +CREATE INDEX activetable_officeid_phensig_idx + ON activetable + USING btree + (officeid COLLATE pg_catalog."default", phensig COLLATE pg_catalog."default"); + +CREATE INDEX practice_activetable_officeid_phensig_idx + ON practice_activetable + USING btree + (officeid COLLATE pg_catalog."default", phensig COLLATE pg_catalog."default"); + +CREATE SEQUENCE activetableseq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + START 1 + CACHE 1; +ALTER TABLE activetableseq + OWNER TO awips; + +CREATE SEQUENCE practice_activetableseq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + START 1 + CACHE 1; +ALTER TABLE practice_activetableseq + OWNER TO awips; + +CREATE INDEX practicewarning_office_phensig_index + ON practicewarning + USING btree + (officeid COLLATE pg_catalog."default", phensig COLLATE pg_catalog."default"); + +CREATE INDEX warning_office_phensig_index + ON warning + USING btree + (officeid COLLATE pg_catalog."default", phensig COLLATE pg_catalog."default"); + + +ALTER TABLE warning ADD COLUMN ugczones text; +ALTER TABLE practicewarning ADD COLUMN ugczones text; + diff --git a/deltaScripts/13.4.1/parseUgcZones.py b/deltaScripts/13.4.1/parseUgcZones.py new file mode 100644 index 0000000000..ff3792f0f8 --- /dev/null +++ b/deltaScripts/13.4.1/parseUgcZones.py @@ -0,0 +1,37 @@ +# Called by updateWarningTables.sh to parse the ugc zones in table updates +import sys +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import ParmID +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import DatabaseID + +table = sys.argv[1] +fileName = sys.argv[2] +f = open(fileName, 'r') +ugcZonesUpdateFile = open(table + 'UgcZonesUpdates.sql', 'w') + +prevParentId = None +parentId = None +ugcZones = None + +for line in f: + # break line by columns + columns=line.split('|') + + if len(columns) > 1: + parentId=columns[0].strip() + ugcZone=columns[1].strip() + + if parentId == prevParentId: + ugcZones.append(ugcZone) + else: + if ugcZones is not None: + zoneStr = ", ".join(ugcZones) + ugcZonesUpdateFile.write("UPDATE " + table + " SET ugczones = '" + zoneStr + "' WHERE id = " + prevParentId + ";\n") + ugcZones = [ugcZone] + prevParentId = parentId + +if ugcZones is not None: + zoneStr = ", ".join(ugcZones) + ugcZonesUpdateFile.write("UPDATE " + table + " SET ugczones = '" + zoneStr + "' WHERE id = " + prevParentId + ";\n") + +f.close() +ugcZonesUpdateFile.close() diff --git a/deltaScripts/13.4.1/updateWarningTables.sh b/deltaScripts/13.4.1/updateWarningTables.sh new file mode 100644 index 0000000000..7a3a48091c --- /dev/null +++ b/deltaScripts/13.4.1/updateWarningTables.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# Main script for updating warning database structure + +PSQL="/awips2/psql/bin/psql" +PYTHON="/awips2/python/bin/python" + +SQL_SCRIPT="alterWarningTables.sql" + +# ensure that the sql script is present +if [ ! -f ${SQL_SCRIPT} ]; then + echo "ERROR: the required sql script - ${SQL_SCRIPT} was not found." + echo "FATAL: the update has failed!" + exit 1 +fi + + +echo "Adding ugczones column to warning tables" +${PSQL} -U awips -d metadata -f ${SQL_SCRIPT} +if [ $? -ne 0 ]; then + echo "FATAL: the update has failed!" + exit 1 +fi + +TABLES="practicewarning warning" +for table in $TABLES +do + echo + echo "Querying for $table ugc zones" + RETRIEVE_UGC_ZONES_SQL="SELECT parentwarning, zone FROM warning_ugczone where parentwarning in (select id from $table) order by parentwarning, key" + _ugc_zone_txt="${table}UgcZones.txt" + + ${PSQL} -U awips -d metadata -c "${RETRIEVE_UGC_ZONES_SQL}" -t -o ${_ugc_zone_txt} + if [ $? -ne 0 ]; then + echo "ERROR: Failed to retrieve the ugc zones for $table table." + echo "FATAL: The update has failed." + exit 1 + fi + + echo + echo "Parsing ugc zones for insertion into $table table" + PYTHON_PARSE_SCRIPT="parseUgcZones.py" + if [ ! -f ${PYTHON_PARSE_SCRIPT} ]; then + echo "ERROR: the required python script - ${PYTHON_PARSE_SCRIPT} was not found." + echo "FATAL: the update has failed!" + exit 1 + fi + + ${PYTHON} ${PYTHON_PARSE_SCRIPT} ${table} ${_ugc_zone_txt} + if [ $? -ne 0 ]; then + echo "ERROR: Failed to parse ugc zones." + echo "FATAL: The update has failed." + exit 1 + fi + + echo + echo "Adding ugc zones to $table table" + # ${table}UgcZonesUpdates.sql generated from parseParmIds.py + ${PSQL} -U awips -d metadata -q -f ${table}UgcZonesUpdates.sql + if [ $? -ne 0 ]; then + echo "ERROR: Failed to add ugc zones." + echo "FATAL: The update has failed." + exit 1 + fi +done + +#remove warning_ugczone +echo +echo "Dropping warning_ugczone table" +DROP_TABLE_SQL="DROP TABLE warning_ugczone" + +${PSQL} -U awips -d metadata -c "${DROP_TABLE_SQL}" + +echo +echo "Running full vacuum for warning" +${PSQL} -U awips -d metadata -c "VACUUM FULL VERBOSE ANALYZE warning" diff --git a/edexOsgi/com.raytheon.edex.plugin.warning/WarningDecoder.py b/edexOsgi/com.raytheon.edex.plugin.warning/WarningDecoder.py index 9703c467c8..c3a023b584 100644 --- a/edexOsgi/com.raytheon.edex.plugin.warning/WarningDecoder.py +++ b/edexOsgi/com.raytheon.edex.plugin.warning/WarningDecoder.py @@ -798,7 +798,7 @@ usage: VTECDecoder -f productfilename -d -a activeTableName template['pil'] = self._remapPil(template['phen'], template['sig'], self._productPil) - template['ugcs'] = ugcs + template['ugcZoneList'] = ", ".join(ugcs) state = ugcstring[0:2] if REGIONS.has_key(state): template['region'] = REGIONS[state] diff --git a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/ActiveTableRecord.java b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/ActiveTableRecord.java index 3328c3d31c..eb68d705d3 100644 --- a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/ActiveTableRecord.java +++ b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/ActiveTableRecord.java @@ -24,12 +24,12 @@ import java.util.Calendar; import java.util.List; import javax.persistence.Column; -import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.MappedSuperclass; import javax.persistence.Transient; import org.hibernate.annotations.Type; @@ -51,22 +51,23 @@ import com.vividsolutions.jts.geom.Geometry; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 24, 2009 njensen Initial creation - * Feb 26, 2013 1447 dgilling Implement equals(). - * + * Feb 26, 2013 1447 dgilling Implement equals(). + * May 10, 2013 1951 rjpeter Added own id sequence tagging * * * @author njensen * @version 1.0 */ - -@Entity +@MappedSuperclass @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @DynamicSerialize public abstract class ActiveTableRecord extends PersistableDataObject { protected static final long serialVersionUID = 1L; - @GeneratedValue(strategy = GenerationType.AUTO) + protected static final String ID_GEN = "idgen"; + + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_GEN) @Id protected int id; @@ -1079,7 +1080,7 @@ public abstract class ActiveTableRecord extends PersistableDataObject { atr.setWmoid(wr.getWmoid()); atr.setXxxid(wr.getXxxid()); - for (String ugc : wr.getUgcsString()) { + for (String ugc : wr.getUgcZones()) { ActiveTableRecord ugcRecord = (ActiveTableRecord) atr.clone(); ugcRecord.setUgcZone(ugc); list.add(ugcRecord); diff --git a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/OperationalActiveTableRecord.java b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/OperationalActiveTableRecord.java index b157bf8c3f..44a7efcff6 100644 --- a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/OperationalActiveTableRecord.java +++ b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/OperationalActiveTableRecord.java @@ -20,12 +20,15 @@ package com.raytheon.uf.common.activetable; import javax.persistence.Entity; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; +import org.hibernate.annotations.Index; + import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** - * TODO Add Description + * Operational Active Table, separated so that practice and operational data go to separate tables. * *
  * 
@@ -33,7 +36,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Feb 10, 2010            njensen     Initial creation
- * 
+ * May 10, 2013 1951       rjpeter     Added own id sequence tagging and new index.
  * 
* * @author njensen @@ -41,8 +44,11 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; */ @Entity +@SequenceGenerator(initialValue = 1, name = ActiveTableRecord.ID_GEN, sequenceName = "activetableseq") @Table(name = "activetable") @DynamicSerialize +@org.hibernate.annotations.Table(appliesTo = "activetable", indexes = { @Index(name = "activetable_officeid_phensig_idx", columnNames = { + "officeid", "phensig" }) }) public class OperationalActiveTableRecord extends ActiveTableRecord implements Cloneable { diff --git a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/PracticeActiveTableRecord.java b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/PracticeActiveTableRecord.java index 67a4792e22..fc419204be 100644 --- a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/PracticeActiveTableRecord.java +++ b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/PracticeActiveTableRecord.java @@ -20,12 +20,15 @@ package com.raytheon.uf.common.activetable; import javax.persistence.Entity; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; +import org.hibernate.annotations.Index; + import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** - * TODO Add Description + * Practice Active Table, separated so that practice and operational data go to separate tables. * *
  * 
@@ -33,7 +36,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Feb 10, 2010            njensen     Initial creation
- * 
+ * May 10, 2013 1951       rjpeter     Added own id sequence tagging and new index.
  * 
* * @author njensen @@ -41,8 +44,11 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; */ @Entity +@SequenceGenerator(initialValue = 1, name = ActiveTableRecord.ID_GEN, sequenceName = "practice_activetableseq") @Table(name = "practice_activetable") @DynamicSerialize +@org.hibernate.annotations.Table(appliesTo = "practice_activetable", indexes = { @Index(name = "practice_activetable_officeid_phensig_idx", columnNames = { + "officeid", "phensig" }) }) public class PracticeActiveTableRecord extends ActiveTableRecord implements Cloneable { diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject index d8b9b376f6..04a1422726 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -1,4 +1,4 @@ -com.raytheon.uf.common.dataplugin.warning.UGCZone +com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord com.raytheon.uf.common.dataplugin.warning.WarningRecord com.raytheon.uf.common.dataplugin.warning.PracticeWarningRecord com.raytheon.uf.common.dataplugin.warning.config.WarngenConfiguration diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/AbstractWarningRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/AbstractWarningRecord.java index 76ec98bf6c..495421f5fd 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/AbstractWarningRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/AbstractWarningRecord.java @@ -20,39 +20,29 @@ package com.raytheon.uf.common.dataplugin.warning; +import java.util.Arrays; import java.util.Calendar; -import java.util.HashSet; -import java.util.List; +import java.util.LinkedHashSet; import java.util.Set; +import java.util.regex.Pattern; -import javax.persistence.CascadeType; import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; -import javax.persistence.OneToMany; +import javax.persistence.MappedSuperclass; import javax.persistence.SequenceGenerator; import javax.persistence.Transient; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import org.hibernate.annotations.Index; import org.hibernate.annotations.Type; import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; -import com.raytheon.uf.common.serialization.adapters.GeometryAdapter; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.vividsolutions.jts.geom.Geometry; /** - * * Warning Record * *
@@ -61,202 +51,171 @@ import com.vividsolutions.jts.geom.Geometry;
  * ------------ ----------  ----------- --------------------------
  * 03/12/2007   1003        bwoodle     initial creation
  * 04/12/2013   1857        bgonzale    Added SequenceGenerator annotation.
- * 
+ * 05/02/2013   1949        rjpeter     Moved ugcZones to be a column inside table.
  * 
* * @author bwoodle * @version 1 */ -@Entity +@MappedSuperclass @SequenceGenerator(name = PluginDataObject.ID_GEN) @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public abstract class AbstractWarningRecord extends PluginDataObject { + private static final Pattern ugcSplitter = Pattern.compile(", "); private static final long serialVersionUID = 1L; @DataURI(position = 1) @Column(length = 32) - @XmlAttribute @DynamicSerializeElement private String wmoid; @DataURI(position = 2) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String pil; @DataURI(position = 3) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String xxxid; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String countyheader; - @XmlElement + @Column(name = "ugczones", columnDefinition = "text") @DynamicSerializeElement - @OneToMany(cascade = CascadeType.ALL, mappedBy = "parentWarning", fetch = FetchType.EAGER) - protected Set ugczones = new HashSet(); + protected String ugcZoneList; + + @Transient + protected Set ugcZones; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String vtecstr; @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String productClass; @DataURI(position = 4) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String act; @Column(length = 8) - @XmlAttribute @DynamicSerializeElement - @Index(name = "query_index", columnNames = { "officeid", "phensig" }) private String officeid; @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String phen; @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String sig; @DataURI(position = 5) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String etn; /** vtec start time */ - @XmlAttribute @DynamicSerializeElement + @Column private Calendar startTime; @Column - @XmlAttribute @DynamicSerializeElement private Calendar endTime; @Column - @XmlAttribute @DynamicSerializeElement private Calendar issueTime; @Column - @XmlAttribute @DynamicSerializeElement private Calendar purgeTime; @Column(length = 8) - @XmlAttribute @DynamicSerializeElement private boolean ufn; @Column(name = "geometry", columnDefinition = "geometry") @Type(type = "com.raytheon.edex.db.objects.hibernate.GeometryType") - @XmlJavaTypeAdapter(value = GeometryAdapter.class) @DynamicSerializeElement private Geometry geometry; @Transient - @XmlAttribute @DynamicSerializeElement private String forecaster = ""; @Column - @XmlAttribute @DynamicSerializeElement private Integer motdir; @Column - @XmlAttribute @DynamicSerializeElement private Integer motspd; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String loc; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String rawmessage; @DataURI(position = 6) @Column - @XmlAttribute @DynamicSerializeElement private int seg; @DataURI(position = 7) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String phensig; @Transient - @XmlAttribute @DynamicSerializeElement private String region; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String overviewText; /** segment text */ @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String segText; @Column(length = 8) - @XmlAttribute @DynamicSerializeElement private String locationID; @Column(length = 2) - @XmlAttribute @DynamicSerializeElement private String floodSeverity; - @XmlAttribute + @Column @DynamicSerializeElement private String immediateCause; @Column(length = 2) - @XmlAttribute @DynamicSerializeElement private String floodRecordStatus; @Column - @XmlAttribute @DynamicSerializeElement private Calendar floodBegin; @Column - @XmlAttribute @DynamicSerializeElement private Calendar floodCrest; @Column - @XmlAttribute @DynamicSerializeElement private Calendar floodEnd; @@ -280,7 +239,6 @@ public abstract class AbstractWarningRecord extends PluginDataObject { this.setForecaster(old.getForecaster()); this.setGeometry(old.getGeometry()); this.setGeometry(old.getGeometry()); - this.setIdentifier(old.getIdentifier()); this.setInsertTime(old.getInsertTime()); this.setIssueTime(old.getIssueTime()); this.setLoc(old.getLoc()); @@ -315,7 +273,6 @@ public abstract class AbstractWarningRecord extends PluginDataObject { */ public AbstractWarningRecord(String uri) { super(uri); - identifier = java.util.UUID.randomUUID().toString(); } @Override @@ -553,21 +510,6 @@ public abstract class AbstractWarningRecord extends PluginDataObject { this.purgeTime = purgeTime; } - /** - * @return the ugczones - */ - public Set getUgczones() { - return ugczones; - } - - /** - * @param ugczones - * the ugczones to set - */ - public void setUgczones(Set ugczones) { - this.ugczones = ugczones; - } - /** * @return the region */ @@ -688,8 +630,6 @@ public abstract class AbstractWarningRecord extends PluginDataObject { this.floodEnd = floodEnd; } - public abstract void setUgcs(List list); - /** * @return the ufn */ @@ -735,13 +675,40 @@ public abstract class AbstractWarningRecord extends PluginDataObject { this.segText = segText; } - public String[] getUgcsString() { - String[] s = new String[ugczones.size()]; - UGCZone[] ugcs = ugczones.toArray(new UGCZone[ugczones.size()]); - for (int i = 0; i < ugcs.length; i++) { - s[i] = ugcs[i].getZone(); + public void setUgcZones(Set list) { + ugcZones = new LinkedHashSet(list); + StringBuilder builder = new StringBuilder(ugcZones.size() * 8); + boolean addComma = false; + for (String ugc : list) { + if (addComma) { + builder.append(", "); + } else { + addComma = true; + } + builder.append(ugc); } - return s; + ugcZoneList = builder.toString(); } + public Set getUgcZones() { + if (ugcZones == null) { + ugcZones = new LinkedHashSet(); + + if ((ugcZoneList != null) && (ugcZoneList.length() > 0)) { + String[] zones = ugcSplitter.split(ugcZoneList); + ugcZones.addAll(Arrays.asList(zones)); + } + } + + return ugcZones; + } + + public String getUgcZoneList() { + return ugcZoneList; + } + + public void setUgcZoneList(String ugcZoneList) { + this.ugcZoneList = ugcZoneList; + this.ugcZones = null; + } } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java index a9e1ca59d9..ffe748a7ed 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java @@ -20,15 +20,10 @@ package com.raytheon.uf.common.dataplugin.warning; -import java.util.List; - import javax.persistence.Entity; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; import org.hibernate.annotations.Index; @@ -43,9 +38,10 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 10/04/2011 10049 bgonzale initial creation - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * 10/04/2011 10049 bgonzale initial creation + * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime + * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * May 02, 2013 1949 rjpeter Removed ugcZones. * * * @@ -59,14 +55,11 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Both refTime and forecastTime are included in the refTimeIndex since * forecastTime is unlikely to be used. */ -@org.hibernate.annotations.Table( - appliesTo = "practicewarning", - indexes = { - @Index(name = "practicewarning_refTimeIndex", columnNames = { "refTime", "forecastTime" } ) - } -) -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) +@org.hibernate.annotations.Table(appliesTo = "practicewarning", indexes = { + @Index(name = "practicewarning_refTimeIndex", columnNames = { + "refTime", "forecastTime" }), + @Index(name = "practicewarning_office_phensig_index", columnNames = { + "officeid", "phensig" }) }) @DynamicSerialize public class PracticeWarningRecord extends AbstractWarningRecord { @@ -99,15 +92,5 @@ public class PracticeWarningRecord extends AbstractWarningRecord { */ public PracticeWarningRecord(String uri) { super(uri); - identifier = java.util.UUID.randomUUID().toString(); } - - @Override - public void setUgcs(List list) { - ugczones.clear(); - for (String s : list) { - ugczones.add(new UGCZone(s, this)); - } - } - } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/UGCZone.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/UGCZone.java deleted file mode 100644 index 632ddbf1bd..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/UGCZone.java +++ /dev/null @@ -1,137 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.uf.common.dataplugin.warning; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; - -import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -/** - * UGC Zones are part of Warning Records. This class will be utilized by the - * Warning Decoder. - * - *
- * SOFTWARE HISTORY
- * Date			Ticket#		Engineer	Description
- * ------------	----------	-----------	--------------------------
- * Jun 12, 2008				bwoodle	Initial creation
- * 
- * 
- * - * @author bwoodle - * @version 1.0 - */ -@Entity -@Table(name = "warning_ugczone") -@XmlAccessorType(XmlAccessType.NONE) -@DynamicSerialize -public class UGCZone extends PersistableDataObject implements - ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue - @XmlAttribute - @DynamicSerializeElement - private Integer key; - - @Column(length = 8) - @XmlAttribute - @DynamicSerializeElement - private String zone; - - @ManyToOne - @JoinColumn(name = "parentWarning", nullable = false) - private AbstractWarningRecord parentWarning; - - public UGCZone() { - } - - public UGCZone(String zone) { - this.zone = zone; - } - - public UGCZone(String zone, AbstractWarningRecord warning) { - this.zone = zone; - parentWarning = warning; - } - - public String toString() { - return zone; - } - - /** - * @return the key - */ - public Integer getKey() { - return key; - } - - /** - * @param key - * the key to set - */ - public void setKey(Integer key) { - this.key = key; - } - - /** - * @return the zone - */ - public String getZone() { - return zone; - } - - /** - * @param zone - * the zone to set - */ - public void setZone(String zone) { - this.zone = zone; - } - - /** - * @return the parentWarning - */ - public AbstractWarningRecord getParentWarning() { - return parentWarning; - } - - /** - * @param parentWarning - * the parentWarning to set - */ - public void setParentWarning(AbstractWarningRecord parentWarning) { - this.parentWarning = parentWarning; - } -} diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java index 6f2acadde3..c26b9c102c 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java @@ -21,16 +21,12 @@ package com.raytheon.uf.common.dataplugin.warning; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.persistence.Entity; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; import org.hibernate.annotations.Index; @@ -46,30 +42,26 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 03/12/2007 1003 bwoodle initial creation - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. - * + * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime + * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * May 02, 2013 1949 rjpeter Removed ugcZones. * * * @author bwoodle * @version 1 */ @Entity -@XmlAccessorType(XmlAccessType.NONE) @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "warningseq") @Table(name = "warning", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) /* * Both refTime and forecastTime are included in the refTimeIndex since * forecastTime is unlikely to be used. */ -@org.hibernate.annotations.Table( - appliesTo = "warning", - indexes = { - @Index(name = "warning_refTimeIndex", columnNames = { "refTime", "forecastTime" } ) - } -) - -@XmlRootElement +@org.hibernate.annotations.Table(appliesTo = "warning", indexes = { + @Index(name = "warning_refTimeIndex", columnNames = { "refTime", + "forecastTime" }), + @Index(name = "warning_office_phensig_index", columnNames = { + "officeid", "phensig" }) }) @DynamicSerialize public class WarningRecord extends AbstractWarningRecord { @@ -102,7 +94,7 @@ public class WarningRecord extends AbstractWarningRecord { private static Map unknownMap = new HashMap(); - private String text; + private final String text; private WarningAction(String text) { this.text = text; @@ -163,12 +155,4 @@ public class WarningRecord extends AbstractWarningRecord { public WarningRecord(String uri) { super(uri); } - - public void setUgcs(List list) { - ugczones.clear(); - for (String s : list) { - ugczones.add(new UGCZone(s, this)); - } - } - }