Merge branch 'omaha_13.4.1' (13.4.1-9) into development

Conflicts:
	cave/com.raytheon.uf.viz.common.core.feature/feature.xml
	cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java
	edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java
	edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java
	rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0
	rpms/legal/FOSS_licenses/werkzeug/LICENSE.txt

Change-Id: Icc296cedd6d190d1743727c228e540036f9b6d8c

Former-commit-id: d37ba352e2 [formerly 648a1b25ae] [formerly a33ddbd1a6] [formerly d37ba352e2 [formerly 648a1b25ae] [formerly a33ddbd1a6] [formerly a9869f07ba [formerly a33ddbd1a6 [formerly d8543a8dc09565c12c3aebc21466ed43108a9c85]]]]
Former-commit-id: a9869f07ba
Former-commit-id: f186912fe1 [formerly aff520d61b] [formerly fc1253a3eff64276ef10f0a5d0b23f403a4cff70 [formerly c47eb36e43]]
Former-commit-id: 597cb507dad744955c6d4c7e9004386c40c57fbc [formerly 969fa704e5]
Former-commit-id: fb910196c0
This commit is contained in:
Richard Peter 2013-05-17 10:33:18 -05:00
commit 4a410e92b9
55 changed files with 1491 additions and 1189 deletions

View file

@ -110,8 +110,7 @@
id="com.raytheon.uf.common.dataplugin.radar"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.uf.edex.decodertools"

View file

@ -59,8 +59,7 @@
id="com.raytheon.uf.common.dataplugin.grid"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.uf.common.dataplugin.grib"

View file

@ -51,8 +51,7 @@
id="com.raytheon.uf.common.dataplugin.ffmp"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.uf.viz.monitor.ffmp"

View file

@ -52,8 +52,7 @@
id="com.raytheon.uf.common.datadelivery.request"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.uf.common.datadelivery.event"
@ -66,8 +65,7 @@
id="com.raytheon.uf.common.registry.ebxml"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.uf.common.registry.event"
@ -80,8 +78,7 @@
id="com.raytheon.uf.common.useradmin"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.uf.viz.useradmin"
@ -101,7 +98,6 @@
id="com.raytheon.uf.common.datadelivery.service"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
</feature>

View file

@ -34,8 +34,7 @@
id="com.raytheon.uf.common.dataplugin.gfe"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.viz.ghg"

View file

@ -103,6 +103,7 @@ import com.raytheon.viz.gfe.core.parm.vcparm.VCModuleJobPool;
* 03/20/2013 #1774 randerso Code cleanup
* 04/11/2013 16028 ryu Fixed setParmsRemoveISCDeps() to not remove
* modified parms.
* 05/02/2013 #1969 randerso Cleaned up and optimized processing of DBInvChangedNotification
*
* </pre>
*
@ -824,8 +825,10 @@ public abstract class AbstractParmManager implements IParmManager {
List<ParmID> depParms = dependentParms(removeList.get(i), true);
for (ParmID pid : depParms) {
int index = pivdIndex(toBeLoaded, pid);
if ((index != -1) && (!toBeLoaded.get(index).isVisible())
&& (!getParm(toBeLoaded.get(index).getParmID()).isModified())) {
if ((index != -1)
&& (!toBeLoaded.get(index).isVisible())
&& (!getParm(toBeLoaded.get(index).getParmID())
.isModified())) {
removeList.add(toBeLoaded.get(index).getParmID());
toBeLoaded.remove(index);
}
@ -1863,29 +1866,31 @@ public abstract class AbstractParmManager implements IParmManager {
*/
public void updatedDatabaseList(List<DatabaseID> deletions,
List<DatabaseID> additions) {
// create list of additions we didn't already have
List<DatabaseID> newAdditions = new ArrayList<DatabaseID>(additions);
newAdditions.removeAll(availableDatabases);
availableDatabases.addAll(additions);
availableDatabases.removeAll(deletions);
List<ParmID> toDelete = new ArrayList<ParmID>();
for (DatabaseID dbId : deletions) {
for (Parm parm : getAllParms()) {
if (parm.getParmID().getDbId().equals(dbId)) {
toDelete.add(parm.getParmID());
}
ParmID pid = parm.getParmID();
if (deletions.contains(pid.getDbId())) {
toDelete.add(pid);
}
}
// now unload the parms, which handles the deletions and updates
setParms(new ArrayList<ParmIDVis>(), toDelete);
setParms(new ArrayList<ParmIDVis>(0), toDelete);
if (additions.size() > 0) {
for (DatabaseID model : additions) {
for (DatabaseID model : newAdditions) {
updateModel(model);
fireNewModelAvailable(model);
}
}
}
/*
* (non-Javadoc)

View file

@ -42,6 +42,7 @@ import com.raytheon.uf.common.dataplugin.gfe.reference.ReferenceID;
import com.raytheon.uf.common.dataplugin.gfe.request.AbstractGfeRequest;
import com.raytheon.uf.common.dataplugin.gfe.request.ClearPracticeVTECTableRequest;
import com.raytheon.uf.common.dataplugin.gfe.request.CommitGridsRequest;
import com.raytheon.uf.common.dataplugin.gfe.request.CreateNewDbRequest;
import com.raytheon.uf.common.dataplugin.gfe.request.GetActiveTableRequest;
import com.raytheon.uf.common.dataplugin.gfe.request.GetClientsRequest;
import com.raytheon.uf.common.dataplugin.gfe.request.GetDbInventoryRequest;
@ -110,6 +111,8 @@ import com.raytheon.viz.gfe.core.parm.Parm;
* 06/11/09 #1947 rjpeter Fixed null pointers.
* 07/09/09 #2590 njensen Site ID from preferences and sent on all requests.
* 09/22/09 #3058 rjpeter Removed GFE Edex dependency.
* 05/02/13 #1969 randerso Added createNewDb method
*
* </pre>
*
* @author bphillip
@ -750,4 +753,10 @@ public class IFPClient {
return makeRequest(request);
}
public ServerResponse<?> createNewDb(DatabaseID dbId)
throws GFEServerException {
CreateNewDbRequest request = new CreateNewDbRequest(dbId);
return makeRequest(request);
}
}

View file

@ -73,6 +73,9 @@ import com.raytheon.viz.gfe.types.MutableInteger;
* a Parm.
* 06/25/12 #766 dgilling Fix NullPointerException from VCModules
* when running in practice mode.
* 05/02/13 #1969 randerso Added code to explicitly create the mutable database
* if it doesn't exist. Used to just happen by accident
* when getParmList was called.
* </pre>
*
* @author bphillip
@ -83,8 +86,6 @@ public class ParmManager extends AbstractParmManager {
.getHandler(ParmManager.class);
@SuppressWarnings("unused")
private final Set<ParmID> availableParmIDs;
private final GridLocation gloc;
private List<DatabaseID> availableServerDatabases;
@ -107,9 +108,6 @@ public class ParmManager extends AbstractParmManager {
// Get the composite grid location
this.gloc = dataManager.getClient().getDBGridLocation();
List<ParmID> ids = dataManager.getClient().getParmList(mutableDb);
this.availableParmIDs = new HashSet<ParmID>(ids);
this.systemTimeRange = recalcSystemTimeRange();
this.parmIDCacheServer = new HashMap<DatabaseID, List<ParmID>>();
this.parmIDCacheVParm = new HashMap<DatabaseID, List<ParmID>>();
@ -912,29 +910,43 @@ public class ParmManager extends AbstractParmManager {
}
Collections.sort(this.availableServerDatabases);
DatabaseID mutableDbId = getMutableDatabase();
if (mutableDbId.isValid()) {
boolean containsMutable = availableServerDatabases
.contains(getMutableDatabase());
if (getMutableDatabase().isValid() && containsMutable) {
.contains(mutableDbId);
if (!containsMutable) {
ServerResponse<?> sr = this.dataManager.getClient()
.createNewDb(mutableDbId);
containsMutable = sr.isOkay();
}
if (containsMutable) {
// order of isc databases is important, since ISCDataAccess will
// look for the first match. That's why we don't use availableDbs()
// look for the first match. That's why we don't use
// availableDbs()
// and simplify the three loops into one.
for (DatabaseID dbid : availableVCParmDatabases) {
if (dbid.getModelName().equals("ISC") && !iscDbs.contains(dbid)) {
if (dbid.getModelName().equals("ISC")
&& !iscDbs.contains(dbid)) {
iscDbs.add(dbid);
}
}
for (DatabaseID dbid : availableVParmDatabases) {
if (dbid.getModelName().equals("ISC") && !iscDbs.contains(dbid)) {
if (dbid.getModelName().equals("ISC")
&& !iscDbs.contains(dbid)) {
iscDbs.add(dbid);
}
}
for (DatabaseID dbid : availableServerDatabases) {
if (dbid.getModelName().equals("ISC") && !iscDbs.contains(dbid)) {
if (dbid.getModelName().equals("ISC")
&& !iscDbs.contains(dbid)) {
iscDbs.add(dbid);
}
}
}
}
}
/**
* Determines the set of virtual calculated databases, from the definitions.

View file

@ -69,8 +69,7 @@
id="com.raytheon.uf.common.hydro"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.viz.mpe"

View file

@ -34,7 +34,6 @@
id="com.raytheon.uf.common.dataplugin.satellite"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
</feature>

View file

@ -2,7 +2,6 @@ package com.raytheon.viz.warngen.config;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@ -11,8 +10,6 @@ import java.util.Set;
import javax.measure.converter.UnitConverter;
import org.geotools.referencing.GeodeticCalculator;
import com.raytheon.uf.common.dataplugin.warning.config.PathcastConfiguration;
import com.raytheon.uf.common.dataplugin.warning.config.PointSourceConfiguration;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
@ -23,7 +20,6 @@ import com.raytheon.viz.warngen.gis.ClosestPoint;
import com.raytheon.viz.warngen.gis.GisUtil;
import com.raytheon.viz.warngen.gis.GisUtil.Direction;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.prep.PreparedGeometry;
import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
@ -42,6 +38,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
* Mar 25, 2013 1810 jsanchez Allowed other values to be accepted as a true value for useDirs.
* Mar 25, 2013 1605 jsanchez Set ClosestPoint's prepGeom.
* Apr 24, 2013 1944 jsanchez Updated calculateLocationPortion visibility to public.
* May 2, 2013 1963 jsanchez Referenced calculatePortion from GisUtil.
*
* </pre>
*
@ -180,8 +177,8 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
PreparedGeometry prepGeom = PreparedGeometryFactory.prepare(geom);
if (prepGeom.intersects(searchArea) && !prepGeom.within(searchArea)) {
Geometry intersection = searchArea.intersection(geom);
partOfArea = GisUtil.asStringList(calculateLocationPortion(
geom, null, intersection, gc));
partOfArea = GisUtil.asStringList(GisUtil.calculatePortion(
geom, intersection, false, false));
if (attributes.get(suppressedDirectionsField) != null) {
String suppressedDirections = String.valueOf(
@ -216,91 +213,6 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
return null;
}
/**
* Helper class to store cardinal ranges
*
* @author jsanchez
*
*/
private static class CardinalRange {
public EnumSet<Direction> directions;
public double lowRange;
public double highRange;
public CardinalRange(EnumSet<Direction> directions, double lowRange,
double highRange) {
this.directions = directions;
this.lowRange = lowRange;
this.highRange = highRange;
}
}
private static CardinalRange[] ranges = new CardinalRange[] {
new CardinalRange(EnumSet.of(Direction.NORTH), 0, 22.5),
new CardinalRange(EnumSet.of(Direction.NORTH, Direction.EAST),
22.5, 67.5),
new CardinalRange(EnumSet.of(Direction.EAST), 67.5, 112.5),
new CardinalRange(EnumSet.of(Direction.SOUTH, Direction.EAST),
112.5, 157.5),
new CardinalRange(EnumSet.of(Direction.SOUTH), 157.5, 202.5),
new CardinalRange(EnumSet.of(Direction.SOUTH, Direction.WEST),
202.5, 247.5),
new CardinalRange(EnumSet.of(Direction.WEST), 247.5, 292.5),
new CardinalRange(EnumSet.of(Direction.NORTH, Direction.WEST),
292.5, 337.5),
new CardinalRange(EnumSet.of(Direction.NORTH), 337.5, 360) };
/**
* Calculates the cardinal directions of a location.
*
* @param geom
* @param point
* @param intersection
* @param gc
* @return
*/
public static EnumSet<Direction> calculateLocationPortion(Geometry geom,
Coordinate point, Geometry intersection, GeodeticCalculator gc) {
EnumSet<Direction> directions = EnumSet.noneOf(Direction.class);
Coordinate geomCentroid = null;
if (point != null) {
geomCentroid = point;
} else {
geomCentroid = geom.convexHull().getCentroid().getCoordinate();
}
Coordinate intersectCentroid = intersection.convexHull().getCentroid()
.getCoordinate();
gc.setStartingGeographicPoint(geomCentroid.x, geomCentroid.y);
gc.setDestinationGeographicPoint(intersectCentroid.x,
intersectCentroid.y);
Envelope envelope = geom.getEnvelopeInternal();
double centerThresholdX = envelope.getWidth() * 0.10;
double centerThresholdY = envelope.getHeight() * 0.10;
double distanceX = Math.abs(intersectCentroid.x - geomCentroid.x);
double distanceY = Math.abs(intersectCentroid.y - geomCentroid.y);
if (distanceX > centerThresholdX || distanceY > centerThresholdY) {
// Convert azimuth from -180/180 to 0/360
double degrees = gc.getAzimuth();
if (degrees < 0) {
degrees += 360;
}
for (CardinalRange range : ranges) {
if (degrees > range.lowRange && degrees <= range.highRange) {
directions = range.directions;
break;
}
}
}
return directions;
}
/**
* Returns a Coordinate based on the lat,lon values in the attributes.
*

View file

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.lang.Validate;
import org.geotools.referencing.GeodeticCalculator;
import com.raytheon.uf.common.dataplugin.warning.config.AreaSourceConfiguration;
import com.raytheon.uf.common.dataplugin.warning.config.AreaSourceConfiguration.AreaType;
@ -73,7 +72,8 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometry;
* May 4, 2012 #14887 Qinglu lin Changed 0.25 to 0.60 for DEFAULT_PORTION_TOLERANCE;
* added code to pass a Envelope calculatePortion().
* Nov 9, 2012 DR 15430 D. Friedman Extracted method converFeAreaToPartList.
*
* Apr 29, 2013 1955 jsanchez Ignored comparing the geometry's user data when finding intersected areas.
* May 2, 2013 1963 jsanchez Updated method to determine partOfArea.
* </pre>
*
* @author chammack
@ -174,7 +174,6 @@ public class Area {
List<String> uniqueFips = new ArrayList<String>();
List<AffectedAreas> areas = new ArrayList<AffectedAreas>();
GeodeticCalculator gc = new GeodeticCalculator();
for (GeospatialData regionFeature : countyMap.values()) {
Geometry regionGeom = regionFeature.geometry;
PreparedGeometry preparedRegionGeom = regionFeature.prepGeom;
@ -220,9 +219,9 @@ public class Area {
double tolerCheck = regionGeom.getArea()
* DEFAULT_PORTION_TOLERANCE;
if (areaIntersection < tolerCheck) {
area.partOfArea = GisUtil.asStringList(GisUtil
.calculatePortion(regionGeom, intersection, gc,
area.suppress));
area.partOfArea = GisUtil
.asStringList(GisUtil.calculatePortion(regionGeom,
intersection, true, true));
}
// Search the parent region
@ -284,13 +283,17 @@ public class Area {
throws VizException {
Map<String, Object> areasMap = new HashMap<String, Object>();
String hatchedAreaSource = config.getHatchedAreaSource()
.getAreaSource();
for (AreaSourceConfiguration asc : config.getAreaSources()) {
if (asc.getType() == AreaType.INTERSECT) {
List<Geometry> geoms = new ArrayList<Geometry>();
for (GeospatialData f : warngenLayer.getGeodataFeatures(
asc.getAreaSource(), localizedSite)) {
boolean ignoreUserData = asc.getAreaSource().equals(
hatchedAreaSource) == false;
Geometry intersect = GeometryUtil.intersection(warnArea,
f.prepGeom);
f.prepGeom, ignoreUserData);
if (intersect.isEmpty() == false) {
geoms.add(intersect);
}

View file

@ -29,16 +29,8 @@ import java.util.List;
import org.geotools.referencing.GeodeticCalculator;
import com.raytheon.uf.common.dataplugin.warning.util.GeometryUtil;
import com.raytheon.viz.warngen.suppress.SuppressMap;
import com.vividsolutions.jts.algorithm.CGAlgorithms;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.Polygon;
/**
*
@ -58,6 +50,7 @@ import com.vividsolutions.jts.geom.Polygon;
* Feb 29, 2012 #13596 Qinglu Lin Added restoreAlaskaLon().
* May 9, 2012 #14887 Qinglu Lin Change 0.1 to 0.16875f for PORTION_OF_CENTER;
* 0.10 to 0.0625 for EXTREME_DELTA; Added/modified code.
* May 1, 2013 1963 jsanchez Refactored calculatePortion to match A1.
* </pre>
*
* @author chammack
@ -65,216 +58,198 @@ import com.vividsolutions.jts.geom.Polygon;
*/
public class GisUtil {
private static final float PORTION_OF_CENTER = 0.16875f;
private static final float DIRECTION_DELTA = 15;
private static final float EXTREME_DELTA = 0.0625f;
private static final double CONTAINS_PERCENTAGE = 0.1;
// When both xDirection and yDirection are Direction.CENTRAL, for a
// rectangle
// polygon, MIN1 is the maximum value of either distanceX or distanceY
// for EnumSet.of(xDirection,yDirection) to be returned.
private static final float MIN1 = 0.01f;
// When both xDirection and yDirection are Direction.CENTRAL, for a right
// triangle
// polygon, MIN2 is the maximum value of both distanceX and distanceY
// for EnumSet.of(xDirection,yDirection) to be returned.
private static final float MIN2 = 0.045f;
// When yDirection is NORTH or SOUTH, in order to add CENTRAL to retval,
// required
// minimum ratio of width of intersection envelope to that of county
// envelope;
// when xDirection is EAST or WEST, in order to add CENTRAL to retval,
// required
// minimum ratio of height of intersection envelope to that of county
// envelope;
private static final float RATIO = 0.5f;
public static final ThreadLocal<GeodeticCalculator> gc = new ThreadLocal<GeodeticCalculator>() {
@Override
protected GeodeticCalculator initialValue() {
GeodeticCalculator gc = new GeodeticCalculator();
return gc;
}
};
public static enum Direction {
CENTRAL, NORTH, SOUTH, EAST, WEST, EXTREME
};
public static boolean contains(Geometry filter, Geometry geom) {
if (filter != null) {
if (filter.contains(geom)) {
return true;
/**
* Ported getAreaDesc from A1 code method GeoEntityLookupTable.getAreaDesc
*
* @param parentGeom
* - the parent geometry such as the impacted county/zone
* @param warnedArea
* - the intersection geometry of the hatched warned geometry and
* the parent geometry
* @param useCentral
* - boolean flag to allow CENTRAL portion to be included.
* @param useExtreme
* - boolean flag to allow EXTREME portion to be included.
* @return
*/
public static EnumSet<Direction> calculatePortion(Geometry parentGeom,
Geometry warnedArea, boolean useCentral, boolean useExtreme) {
EnumSet<Direction> portions = EnumSet.noneOf(Direction.class);
ImpactedQuadrants iQuad = ImpactedQuadrants.findImpactedQuadrants(
parentGeom, warnedArea, useCentral);
// Test for case where we cannot do portions or if the warnedArea covers
// the parentGeom
if (parentGeom == null || warnedArea == null
|| parentGeom.equals(warnedArea)) {
return EnumSet.noneOf(Direction.class);
}
double containsPercent = geom.buffer(0.00001).difference(filter)
.getArea()
/ geom.getArea();
if (containsPercent < CONTAINS_PERCENTAGE) {
return true;
// Test for central by not being near adjacent borders.
if (iQuad.centralGeom != null && iQuad.centralGeom.contains(warnedArea)) {
portions.add(Direction.CENTRAL);
return portions;
}
// Possible case of a stripe across the middle
if (iQuad.q == 0) {
// Only one direction encoded
; // <-- Ported A1 code
} else if ((iQuad.q == 2 && iQuad.nw == iQuad.se)
|| (iQuad.q == 2 && iQuad.ne == iQuad.sw)
|| (iQuad.qq == 2 && iQuad.nn == iQuad.ss)
|| (iQuad.qq == 2 && iQuad.ee == iQuad.ww)) {
if (iQuad.nnx == iQuad.ssx && iQuad.wwx == iQuad.eex) {
portions.add(Direction.CENTRAL);
return portions;
}
return getPointDesc(iQuad, useExtreme);
}
// Another possible case of a stripe across the middle.
if (iQuad.q == 4 && iQuad.centralGeom != null
&& iQuad.centralGeom.intersects(warnedArea)) {
portions.add(Direction.CENTRAL);
return portions;
}
// All quadrants in use.
if (iQuad.q == 4 && iQuad.qq == 4) {
return EnumSet.noneOf(Direction.class);
}
// Only one typical quadrant in use.
if (iQuad.q == 1) {
return getPointDesc(iQuad, useExtreme);
}
// No more than two quadrants of any kind in us, or all quadrants.
if (iQuad.q < 3 && iQuad.qq < 3) {
if (iQuad.nnx != iQuad.ssx
&& iQuad.wwx != iQuad.eex
|| (iQuad.centralGeom != null && iQuad.centralGeom
.intersects(warnedArea))) {
return getPointDesc(iQuad, useExtreme);
}
}
return false;
}
public static Geometry intersect(Geometry shadedArea, Geometry filter) {
GeometryFactory gf = new GeometryFactory();
Geometry rval = shadedArea;
if (filter instanceof GeometryCollection) {
GeometryCollection gc = (GeometryCollection) filter;
List<Geometry> unionGeometries = new ArrayList<Geometry>();
for (int k = 0; k < gc.getNumGeometries(); k++) {
Geometry g = gc.getGeometryN(k);
if (g.intersects(rval)) {
Geometry subIntersection = GisUtil.intersect(g, rval);
unionGeometries.add(subIntersection);
// Three typical quadrants in use.
if (iQuad.q == 3 && iQuad.q != 3) {
if (iQuad.ne != 1 && (iQuad.ssw || iQuad.wsw)) {
portions.add(Direction.SOUTH);
portions.add(Direction.WEST);
} else if (iQuad.se != 1 && (iQuad.nnw || iQuad.wnw)) {
portions.add(Direction.NORTH);
portions.add(Direction.WEST);
} else if (iQuad.nw != 1 && (iQuad.sse || iQuad.ese)) {
portions.add(Direction.SOUTH);
portions.add(Direction.EAST);
} else if (iQuad.sw != 1 && (iQuad.nne || iQuad.ene)) {
portions.add(Direction.NORTH);
portions.add(Direction.EAST);
}
}
rval = gf.createGeometryCollection(unionGeometries
.toArray(new Geometry[unionGeometries.size()]));
rval = rval.buffer(0);
} else {
rval = rval.intersection(filter).buffer(0);
}
return rval;
}
public static EnumSet<Direction> calculatePortion(Geometry geom,
Geometry geom2, GeodeticCalculator gc) {
return calculatePortion(geom, geom2, gc, SuppressMap.NONE);
}
public static EnumSet<Direction> calculatePortion(Geometry geom,
Geometry intersection, GeodeticCalculator gc, String suppressType) {
Direction xDirection = null;
Direction yDirection = null;
Coordinate point = intersection.getCentroid().getCoordinate();
Envelope env = intersection.getEnvelopeInternal();
Coordinate centroid = geom.getCentroid().getCoordinate();
Envelope envelope = geom.getEnvelopeInternal();
double approximateWidth = envelope.getWidth();
double approximateHeight = envelope.getHeight();
double distanceX = Math.abs(centroid.x - point.x);
double distanceY = Math.abs(centroid.y - point.y);
double centerThresholdX = approximateWidth * PORTION_OF_CENTER;
double centerThresholdY = approximateHeight * PORTION_OF_CENTER;
double extremaThresholdX = approximateWidth * EXTREME_DELTA;
double extremaThresholdY = approximateHeight * EXTREME_DELTA;
if (distanceX < centerThresholdX) {
xDirection = Direction.CENTRAL;
if (distanceY < centerThresholdY)
yDirection = Direction.CENTRAL;
}
if (xDirection != null && yDirection != null) {
// Both xDirection equals Direction.CENTRAL and yDirection equals
// Direction.CENTRAL
// calculated above is not always correct for returning
// EnumSet.of(xDirection,yDirection).
// The following 'if statement' filters out some cases.
if (distanceX < MIN1 || distanceY < MIN1
|| (distanceX < MIN2 && distanceY < MIN2))
return EnumSet.of(xDirection, yDirection);
}
xDirection = null;
yDirection = null;
gc.setStartingGeographicPoint(centroid.x, centroid.y);
gc.setDestinationGeographicPoint(point.x, point.y);
double azimuth = gc.getAzimuth();
if (xDirection == null) {
if (azimuth < (180 - DIRECTION_DELTA) && azimuth > DIRECTION_DELTA)
xDirection = Direction.EAST;
else if (azimuth < 0 - DIRECTION_DELTA)
xDirection = Direction.WEST;
}
if (yDirection == null) {
if (azimuth < (90 - DIRECTION_DELTA)
&& azimuth > (-90 + DIRECTION_DELTA))
yDirection = Direction.NORTH;
else if (azimuth > (90 + DIRECTION_DELTA)
|| azimuth < (-90 - DIRECTION_DELTA))
yDirection = Direction.SOUTH;
}
List<Geometry> geoms = new ArrayList<Geometry>(geom.getNumGeometries());
GeometryUtil.buildGeometryList(geoms, geom);
boolean isExtreme = false;
for (Geometry g : geoms) {
if (g instanceof Polygon) {
LineString lineString = ((Polygon) g).getExteriorRing();
if (isExtreme(lineString.getCoordinates(), point,
(extremaThresholdX + extremaThresholdY) / 2.0)) {
isExtreme = true;
break;
}
}
}
EnumSet<Direction> retVal = EnumSet.noneOf(Direction.class);
if (xDirection != null && !suppressType.equals(SuppressMap.EAST_WEST)
&& !suppressType.equals(SuppressMap.ALL))
retVal.add(xDirection);
if (yDirection != null && !suppressType.equals(SuppressMap.NORTH_SOUTH)
&& !suppressType.equals(SuppressMap.ALL))
retVal.add(yDirection);
if (xDirection != null
&& (xDirection.equals(Direction.WEST) || xDirection
.equals(Direction.EAST))) {
if (env.getHeight() < RATIO * approximateHeight) {
retVal.add(Direction.CENTRAL);
// Three diagonal quadrants in use.
if (iQuad.qq == 3 && portions.isEmpty()) {
if (iQuad.nn == 0) {
portions.add(Direction.SOUTH);
} else if (iQuad.ss == 0) {
portions.add(Direction.NORTH);
} else if (iQuad.ww == 0) {
portions.add(Direction.EAST);
} else if (iQuad.ee == 0) {
portions.add(Direction.WEST);
}
}
if (yDirection != null
&& (yDirection.equals(Direction.NORTH) || yDirection
.equals(Direction.SOUTH))) {
if (env.getWidth() < RATIO * approximateWidth) {
retVal.add(Direction.CENTRAL);
// add extreme for three quadrant case.
if (!portions.isEmpty()) {
if (useExtreme && iQuad.xxx > 0) {
portions.add(Direction.EXTREME);
return portions;
}
}
if ((retVal.contains(Direction.NORTH) && retVal
.contains(Direction.WEST))
|| (retVal.contains(Direction.NORTH) && retVal
.contains(Direction.EAST))
|| (retVal.contains(Direction.SOUTH) && retVal
.contains(Direction.WEST))
|| (retVal.contains(Direction.SOUTH) && retVal
.contains(Direction.EAST))) {
if (retVal.contains(Direction.CENTRAL))
retVal.remove(Direction.CENTRAL);
// All of either type of quadrant in use.
if (iQuad.q == 4 && iQuad.qq == 4) {
return EnumSet.noneOf(Direction.class);
}
if (isExtreme && !suppressType.equals(SuppressMap.ALL))
retVal.add(Direction.EXTREME);
return retVal;
// Case of a pure simple direction.
if (iQuad.ss == 1 && iQuad.nn == 1 || iQuad.q == 0) {
if (iQuad.nn == 0 && iQuad.ww == 1) {
portions.add(Direction.WEST);
}
if (iQuad.ww == 0 && iQuad.ee == 1) {
portions.add(Direction.EAST);
}
} else if (iQuad.ee == 1 && iQuad.ww == 1 || iQuad.q == 0) {
if (iQuad.nn == 0 && iQuad.ss == 1) {
portions.add(Direction.SOUTH);
}
if (iQuad.ss == 0 && iQuad.nn == 1) {
portions.add(Direction.NORTH);
}
}
private static boolean isExtreme(Coordinate[] coords, Coordinate c,
double threshold) {
for (int i = 1; i < coords.length; i++) {
double distance = CGAlgorithms.distancePointLine(c, coords[i - 1],
coords[i]);
if (distance < threshold)
return true;
// add extreme for simple direction case.
if (portions.isEmpty() == false) {
if (useExtreme && iQuad.xxx > 0) {
portions.add(Direction.EXTREME);
}
return portions;
}
return false;
// Catch with the point descriptor one last time
return getPointDesc(iQuad, useExtreme);
}
/**
* Determines the portion of an area based on the ImpactedQuadrants object
*
* @param iQuad
* - ImpactedQuadrants object
* @param useExtrme
* - boolean flag to allow EXTREME portion to be included.
* @return
*/
private static EnumSet<Direction> getPointDesc(ImpactedQuadrants iQuad,
boolean useExtrme) {
EnumSet<Direction> portions = EnumSet.noneOf(Direction.class);
if (iQuad.nnw || iQuad.nne) {
portions.add(Direction.NORTH);
} else if (iQuad.ssw || iQuad.sse) {
portions.add(Direction.SOUTH);
}
if (iQuad.ene || iQuad.ese) {
portions.add(Direction.EAST);
} else if (iQuad.wnw || iQuad.wsw) {
portions.add(Direction.WEST);
}
if (iQuad.cc) {
portions.add(Direction.CENTRAL);
}
if (!portions.isEmpty() && useExtrme && iQuad.xxx > 0) {
portions.add(Direction.EXTREME);
}
return portions;
}
public static List<String> asStringList(EnumSet<Direction> set) {
@ -352,4 +327,60 @@ public class GisUtil {
return coord;
}
/**
* Calculates the cardinal directions of a location.
*
* @param locationGeom
* @param reference
* @param gc
* @return
*/
public static EnumSet<Direction> calculateLocationPortion(
Geometry locationGeom, Geometry reference, boolean useExtreme) {
for (int i = 0; i < locationGeom.getNumGeometries(); i++) {
Geometry geom = locationGeom.getGeometryN(i);
if (geom.intersects(reference)) {
Coordinate geomCentroid = geom.getEnvelope().getCentroid()
.getCoordinate();
Coordinate refCentroid = reference.getCentroid()
.getCoordinate();
EnumSet<Direction> portions = EnumSet.noneOf(Direction.class);
gc.get().setStartingGeographicPoint(geomCentroid.x,
geomCentroid.y);
gc.get().setDestinationGeographicPoint(refCentroid.x,
refCentroid.y);
double azimuth = gc.get().getAzimuth();
if (azimuth < (180 - DIRECTION_DELTA)
&& azimuth > DIRECTION_DELTA) {
portions.add(Direction.EAST);
} else if (azimuth < 0 - DIRECTION_DELTA
&& azimuth > DIRECTION_DELTA - 180) {
portions.add(Direction.WEST);
}
if (azimuth < (90 - DIRECTION_DELTA)
&& azimuth > (-90 + DIRECTION_DELTA)) {
portions.add(Direction.NORTH);
} else if (azimuth > (90 + DIRECTION_DELTA)
&& azimuth < (-90 - DIRECTION_DELTA)) {
portions.add(Direction.SOUTH);
}
boolean isExtreme = false;
if (!portions.isEmpty() && useExtreme && isExtreme) {
portions.add(Direction.EXTREME);
}
return portions;
}
}
return EnumSet.noneOf(Direction.class);
}
}

View file

@ -0,0 +1,303 @@
/**
* 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.warngen.gis;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.prep.PreparedGeometry;
import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
/**
* Helper class for GisUtil to determine the quadrants of an area.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 2, 2013 1963 jsanchez Initial creation
*
* </pre>
*
* @author jsanchez
* @version 1.0
*/
public class ImpactedQuadrants {
protected boolean nne;
protected boolean ene;
protected boolean ese;
protected boolean sse;
protected boolean ssw;
protected boolean wsw;
protected boolean wnw;
protected boolean nnw;
protected int nn;
protected int ss;
protected int ee;
protected int ww;
protected int ne;
protected int nw;
protected int se;
protected int sw;
/**
* q is the accumulation of the quadrants, qq is the accumulation of the sub
* quadrants
*/
protected int q, qq;
/**
* Extreme portions for north, south, east, and west.
*/
protected int nnx, ssx, eex, wwx;
/**
* Accumulation of extreme portions.
*/
protected int xxx;
/**
* Indicates if warned area is in central part regardless if warned area is
* near parentGeom's centroid.
*/
protected boolean cc = false;
protected PreparedGeometry centralGeom = null;
public ImpactedQuadrants() {
nne = ene = ese = sse = ssw = wsw = wnw = nnw = false;
nn = ss = ee = ww = ne = nw = se = sw = 0;
nnx = ssx = eex = wwx = 0;
xxx = 0;
}
/**
* Divides the parentGeom into 8 quadrants. Returns an ImpactedQuadrants
* object to identify which quadrants of parentGeom were intersected by the
* warnedArea.
*
* @param parentGeom
* - the parent geometry such as the impacted county/zone
* @param warnedArea
* - the intersection geometry of the hatched warned geometry and
* the parent geometry
* @param useCentral
* - boolean flag to allow CENTRAL portions to be included.
* @return
*/
public static ImpactedQuadrants findImpactedQuadrants(Geometry parentGeom,
Geometry warnedArea, boolean useCentral) {
// Find the bounds of the parentGeom to help create the bounds of a
// quadrant.
Envelope envelopeInternal = parentGeom.getEnvelopeInternal();
double minLat = envelopeInternal.getMinY();
double maxLat = envelopeInternal.getMaxY();
double minLon = envelopeInternal.getMinX();
double maxLon = envelopeInternal.getMaxX();
// Create a PreparedGeomery for each quadrant in parentGeom
Coordinate centroid = envelopeInternal.centre();
Coordinate c1 = new Coordinate(minLon, maxLat);
Coordinate c2 = new Coordinate(centroid.x, maxLat);
Coordinate c3 = new Coordinate(maxLon, maxLat);
Coordinate c4 = new Coordinate(maxLon, centroid.y);
Coordinate c5 = new Coordinate(maxLon, minLat);
Coordinate c6 = new Coordinate(centroid.x, minLat);
Coordinate c7 = new Coordinate(minLon, minLat);
Coordinate c8 = new Coordinate(minLon, centroid.y);
PreparedGeometry nnwQuad = createQuadrant(c1, c2, centroid);
PreparedGeometry nneQuad = createQuadrant(c2, c3, centroid);
PreparedGeometry eneQuad = createQuadrant(c3, c4, centroid);
PreparedGeometry eseQuad = createQuadrant(c4, c5, centroid);
PreparedGeometry sseQuad = createQuadrant(c5, c6, centroid);
PreparedGeometry sswQuad = createQuadrant(c6, c7, centroid);
PreparedGeometry wswQuad = createQuadrant(c7, c8, centroid);
PreparedGeometry wnwQuad = createQuadrant(c8, c1, centroid);
// Determine if the warnedArea intersected the quadrant.
ImpactedQuadrants impactedQuadrants = new ImpactedQuadrants();
impactedQuadrants.nne = nneQuad.intersects(warnedArea);
impactedQuadrants.ene = eneQuad.intersects(warnedArea);
impactedQuadrants.ese = eseQuad.intersects(warnedArea);
impactedQuadrants.sse = sseQuad.intersects(warnedArea);
impactedQuadrants.ssw = sswQuad.intersects(warnedArea);
impactedQuadrants.wsw = wswQuad.intersects(warnedArea);
impactedQuadrants.wnw = wnwQuad.intersects(warnedArea);
impactedQuadrants.nnw = nnwQuad.intersects(warnedArea);
// The following is A1 ported code used
if (impactedQuadrants.nne || impactedQuadrants.ene) {
impactedQuadrants.ne = 1;
}
if (impactedQuadrants.sse || impactedQuadrants.ese) {
impactedQuadrants.se = 1;
}
if (impactedQuadrants.nnw || impactedQuadrants.wnw) {
impactedQuadrants.nw = 1;
}
if (impactedQuadrants.ssw || impactedQuadrants.wsw) {
impactedQuadrants.sw = 1;
}
if (impactedQuadrants.nne || impactedQuadrants.nnw) {
impactedQuadrants.nn = 1;
}
if (impactedQuadrants.sse || impactedQuadrants.ssw) {
impactedQuadrants.ss = 1;
}
if (impactedQuadrants.wnw || impactedQuadrants.wsw) {
impactedQuadrants.ww = 1;
}
if (impactedQuadrants.nne || impactedQuadrants.ese) {
impactedQuadrants.ee = 1;
}
// Accumulates the quadrants and subquadrants
impactedQuadrants.q = impactedQuadrants.ne + impactedQuadrants.nw
+ impactedQuadrants.se + impactedQuadrants.sw;
impactedQuadrants.qq = impactedQuadrants.nn + impactedQuadrants.ss
+ impactedQuadrants.ee + impactedQuadrants.ww;
// Identify if central.
if (useCentral) {
identifyCentral(impactedQuadrants, parentGeom, warnedArea);
}
// Identify extremes in use.
identifyExtremes(impactedQuadrants, envelopeInternal, warnedArea);
return impactedQuadrants;
}
/**
* Creates a quadrant based on 3 coordinates.
*
* @param c1
* @param c2
* @param c3
* @return
*/
private static PreparedGeometry createQuadrant(Coordinate c1,
Coordinate c2, Coordinate c3) {
Coordinate[] coords = new Coordinate[] { c1, c2, c3, c1 };
GeometryFactory gf = new GeometryFactory();
Geometry geom = gf.createPolygon(gf.createLinearRing(coords), null);
return PreparedGeometryFactory.prepare(geom);
}
/**
* Creates a geometry that is the center of the parentGeom.
*
* @param parentGeom
* @return
*/
private static PreparedGeometry createCentralGeometry(Geometry parentGeom) {
Envelope envelope = parentGeom.getEnvelopeInternal();
Coordinate c = parentGeom.getCentroid().getCoordinate();
double percentage = 0.50;
double deltaHeight = envelope.getHeight() * percentage / 2;
double deltaWidtth = envelope.getWidth() * percentage / 2;
Coordinate c1 = new Coordinate(c.x - deltaWidtth, c.y + deltaHeight);
Coordinate c2 = new Coordinate(c.x + deltaWidtth, c.y + deltaHeight);
Coordinate c3 = new Coordinate(c.x - deltaWidtth, c.y - deltaHeight);
Coordinate c4 = new Coordinate(c.x + deltaWidtth, c.y - deltaHeight);
Coordinate[] coords = new Coordinate[] { c1, c2, c3, c4, c1 };
GeometryFactory gf = new GeometryFactory();
Geometry geom = gf.createPolygon(gf.createLinearRing(coords), null);
geom.setUserData(parentGeom.getUserData());
return PreparedGeometryFactory.prepare(geom);
}
/**
* Identifies if the warnedArea intersects the central portions of the
* parentGeom.
*
* @param impactedQuadrants
* @param parentGeom
* @param warnedArea
*/
private static void identifyCentral(ImpactedQuadrants impactedQuadrants,
Geometry parentGeom, Geometry warnedArea) {
impactedQuadrants.centralGeom = createCentralGeometry(parentGeom);
Envelope centralEnvelope = impactedQuadrants.centralGeom.getGeometry()
.getEnvelopeInternal();
Envelope warnedEnvelope = warnedArea.getEnvelopeInternal();
if ((warnedEnvelope.getMaxX() < centralEnvelope.getMaxX() && warnedEnvelope
.getMinX() > centralEnvelope.getMinX())
|| (warnedEnvelope.getMaxY() < centralEnvelope.getMaxY() && warnedEnvelope
.getMinY() > centralEnvelope.getMinY())) {
impactedQuadrants.cc = true;
}
}
/**
* Identifies portions as extreme if the centroid of the warnedArea is
* within 5 % of the parentEnvelopeInternal.
*
* @param impactedQuadrants
* @param parentEnvelopeInternal
* @param warnedArea
*/
private static void identifyExtremes(ImpactedQuadrants impactedQuadrants,
Envelope parentEnvelopeInternal, Geometry warnedArea) {
Coordinate warnedAreaCentroid = warnedArea.getCentroid()
.getCoordinate();
double deltaY = parentEnvelopeInternal.getHeight() * 0.05;
double deltaX = parentEnvelopeInternal.getWidth() * 0.05;
if (warnedAreaCentroid.y > parentEnvelopeInternal.getMaxY() - deltaY) {
impactedQuadrants.nnx = 1;
}
if (warnedAreaCentroid.y < parentEnvelopeInternal.getMinY() + deltaY) {
impactedQuadrants.ssx = 1;
}
if (warnedAreaCentroid.x > parentEnvelopeInternal.getMaxX() - deltaX) {
impactedQuadrants.eex = 1;
}
if (warnedAreaCentroid.x < parentEnvelopeInternal.getMinX() + deltaX) {
impactedQuadrants.wwx = 1;
}
impactedQuadrants.xxx = impactedQuadrants.nnx + impactedQuadrants.ssx
+ impactedQuadrants.eex + impactedQuadrants.wwx;
}
}

View file

@ -73,7 +73,6 @@ import com.raytheon.viz.warngen.PreferenceUtil;
import com.raytheon.viz.warngen.WarngenException;
import com.raytheon.viz.warngen.config.AbstractDbSourceDataAdaptor;
import com.raytheon.viz.warngen.config.DataAdaptorFactory;
import com.raytheon.viz.warngen.config.DbAreaSourceDataAdaptor;
import com.raytheon.viz.warngen.util.Abbreviation;
import com.raytheon.viz.warngen.util.AdjustAngle;
import com.raytheon.viz.warnings.DateUtil;
@ -108,6 +107,7 @@ import com.vividsolutions.jts.geom.Point;
* Mar 5, 2013 1600 jsanchez Used AdjustAngle instead of AbstractStormTrackResource to handle angle adjusting.
* Mar 25, 2013 1605 jsanchez Checks if a storm location is over an urban bound area.
* Apr 24, 2013 1943 jsanchez Calculated partOfArea for a storm location over an urban bound area.
* May 2, 2013 1963 jsanchez Referenced calculateLocationPortion from GisUtil.
*
* </pre>
*
@ -733,11 +733,10 @@ public class Wx {
// has already been set in DbAreaSoureDataAdapter
Point reference = gf.createPoint(coords[i]);
if (cp.prepGeom.intersects(reference)) {
cp.partOfArea = GisUtil
.asStringList(DbAreaSourceDataAdaptor
cp.partOfArea = GisUtil.asStringList(GisUtil
.calculateLocationPortion(
cp.prepGeom.getGeometry(),
cp.point, reference, gc));
cp.prepGeom.getGeometry(), reference,
false));
distance = 0;
}
}

View file

@ -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
* </pre>
*
* @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<String, Double> intersectSize = new HashMap<String, Double>();
String[] oneLetterTZ;
double minSize = 1.0E-3d;
if (areas != null && areas.length > 0) {
if ((areas != null) && (areas.length > 0)) {
Set<String> timeZones = new HashSet<String>();
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,19 +398,20 @@ 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 {
throw new VizException(
"Calling to area.getTimezone() returns null.");
@ -414,16 +420,17 @@ public class TemplateRunner {
Map<String, String> officeCityTimezone = createOfficeTimezoneMap();
String cityTimezone = null;
if (officeCityTimezone != null)
if (officeCityTimezone != null) {
cityTimezone = officeCityTimezone.get(warngenLayer
.getLocalizedSite());
}
Iterator<String> 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,9 +730,10 @@ 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();
cal.add(Calendar.MILLISECOND, 1);
@ -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<AffectedAreas> al = new ArrayList<AffectedAreas>();
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,11 +1170,13 @@ 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<String, String[]> 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,17 +1219,19 @@ public class TemplateRunner {
"Error generating included watches.", exc);
return false;
}
if (feArea == NOT_IN_CWA)
if (feArea == NOT_IN_CWA) {
continue;
}
Set<String> feAreas = map.get(stateAbbrev);
if (feAreas == null) {
feAreas = new HashSet<String>();
map.put(stateAbbrev, feAreas);
}
if (feArea != null)
if (feArea != null) {
feAreas.add(feArea);
}
}
ArrayList<Portion> portions = new ArrayList<Portion>(map.size());
for (Entry<String, Set<String>> e : map.entrySet()) {
@ -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,9 +1368,10 @@ 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,11 +1390,12 @@ 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
// CWA?

View file

@ -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;
@ -70,7 +69,7 @@ import com.vividsolutions.jts.geom.Geometry;
* record when actually retrieving for use
* Apr 22, 2013 jsanchez Set the issue time for follow up warnings.
* May 07, 2013 1973 rferrel Corrections when getting Issue time.
*
* May 10, 2013 1951 rjpeter Updated ugcZones references
* </pre>
*
* @author mschenke
@ -105,17 +104,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;
}
@ -181,11 +184,11 @@ public class CurrentWarnings {
return warnings;
}
private String officeId;
private final String officeId;
private Map<String, AbstractWarningRecord> recordsMap = new HashMap<String, AbstractWarningRecord>();
private final Map<String, AbstractWarningRecord> recordsMap = new HashMap<String, AbstractWarningRecord>();
private Map<WarningKey, List<AbstractWarningRecord>> warningMap = new HashMap<WarningKey, List<AbstractWarningRecord>>() {
private final Map<WarningKey, List<AbstractWarningRecord>> warningMap = new HashMap<WarningKey, List<AbstractWarningRecord>>() {
private static final long serialVersionUID = 1L;
@ -232,7 +235,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);
}
}
@ -264,11 +267,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;
}
@ -317,7 +321,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.getIssueTime());
@ -326,37 +330,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;
}
}
}
}
@ -430,7 +417,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) {
@ -443,13 +430,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;

View file

@ -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;
@ -51,7 +48,7 @@ import com.raytheon.viz.warnings.DateUtil;
* 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.
*
* May 10, 2013 1951 rjpeter Updated ugcZones references
* </pre>
*
* @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<String, String> 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<UGCZone> ugcs, Date endtime,
int interval) {
public static String getUgcLine(Set<String> ugcs, Date endtime, int interval) {
StringBuffer rval = new StringBuffer();
ArrayList<String> countiesOrZones = new ArrayList<String>();
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<UGCZone> a,
Set<UGCZone> b) {
boolean rval = true;
public static boolean containsSameCountiesOrZones(Set<String> a,
Set<String> b) {
boolean rval = a.size() == b.size();
if (rval) {
// 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;
}
}
rval = a.containsAll(b);
if (rval) {
// 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;
rval = b.containsAll(a);
}
}

View file

@ -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
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 10, 2013 1951 rjpeter Initial history entry, updated ugcZones references
* </pre>
*
* @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<String> queries = new ArrayList<String>();
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<Object[]> 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) {

View file

@ -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;
@ -49,7 +48,7 @@ import com.vividsolutions.jts.geom.GeometryFactory;
* ------------ ---------- ----------- --------------------------
* 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
* </pre>
*
* @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<String> marinezone = new ArrayList<String>();
List<Geometry> geometries = new ArrayList<Geometry>();
for (String ugc : record.getUgcsString()) {
for (String ugc : record.getUgcZones()) {
Geometry geom = null;
WeakReference<Geometry> 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<UGCZone> ugcZones = watch.getUgczones();
ugcZones.addAll(watchrec.getUgczones());
watch.setUgczones(ugcZones);
} else if (watchrec.getUgcZones() != null) {
Set<String> 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);
}
}

View file

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

View file

@ -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()

View file

@ -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"

View file

@ -1443,6 +1443,7 @@ D2DAccumulativeElements= {
#############DCS3501
"HIRESWarw": ["tp"],
"HIRESWnmm": ["tp"],
"RTMA": ["tp"],
#DR20634 "SPC": ["tp"],
#Dummy ones for the transition from Eta to NAM. These are ignored.

View file

@ -295,6 +295,13 @@
value="com.raytheon.uf.common.dataplugin.gfe.request.GetSelectTimeRangeRequest" />
<constructor-arg ref="GetSelectTRHandler" />
</bean>
<bean id="createNewDbHandler"
class="com.raytheon.edex.plugin.gfe.server.handler.CreateNewDbHandler" />
<bean factory-bean="handlerRegistry" factory-method="register">
<constructor-arg
value="com.raytheon.uf.common.dataplugin.gfe.request.CreateNewDbRequest" />
<constructor-arg ref="createNewDbHandler" />
</bean>
<!-- Service Backup Handlers -->

View file

@ -43,6 +43,7 @@ import com.raytheon.edex.plugin.gfe.server.GridParmManager;
import com.raytheon.edex.plugin.gfe.server.database.D2DGridDatabase;
import com.raytheon.edex.plugin.gfe.server.database.D2DSatDatabaseManager;
import com.raytheon.edex.plugin.gfe.server.database.GridDatabase;
import com.raytheon.edex.plugin.gfe.server.database.IFPGridDatabase;
import com.raytheon.edex.plugin.gfe.server.database.NetCDFDatabaseManager;
import com.raytheon.edex.plugin.gfe.server.database.TopoDatabaseManager;
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitRecord;
@ -86,6 +87,7 @@ import com.raytheon.uf.edex.site.notify.SendSiteActivationNotifications;
* Feb 28, 2013 #1447 dgilling Enable active table fetching on site
* activation.
* Mar 20, 2013 #1774 randerso Changed to use GFED2DDao
* May 02, 2013 #1969 randerso Moved updateDbs method into IFPGridDatabase
*
* </pre>
*
@ -350,13 +352,12 @@ public class GFESiteActivation implements ISiteActivationListener {
statusHandler.handle(Priority.EVENTA,
"Checking for IFPGridDatabase updates...");
for (String site : ifpInventory.keySet()) {
for (int i = 0; i < ifpInventory.get(site).size(); i++) {
GridDatabase db = GridParmManager.getDb(ifpInventory.get(
site).get(i));
for (DatabaseID dbid : ifpInventory.get(site)) {
GridDatabase db = GridParmManager.getDb(dbid);
// cluster locked since IFPGridDatabase can modify the grids
// based on changes to grid size, etc
if (db.databaseIsValid()) {
db.updateDbs();
if (db instanceof IFPGridDatabase && db.databaseIsValid()) {
((IFPGridDatabase) db).updateDbs();
}
}
}

View file

@ -51,6 +51,8 @@ import com.raytheon.uf.edex.plugin.grid.dao.GridDao;
* 04/04/13 #1787 randerso Fixed to support changes to D2D grid location
* Additional cleanup to move the D2D to GFE translation
* logic into D2DGridDatabase.
* 05/03/13 #1974 randerso Changed queryByParmId to look for parm with duration
* suffix first.
*
* </pre>
*
@ -163,14 +165,18 @@ public class GFED2DDao extends GridDao {
Date refTime, String d2dParmName, Level d2dLevel, Session s)
throws DataAccessLayerException {
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
DatabaseQuery query;
query = new DatabaseQuery(GridRecord.class.getName());
query.addReturnedField(FCST_TIME);
query.addReturnedField("id");
query.addReturnedField(GridConstants.PARAMETER_ABBREVIATION);
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
query.addQueryParam(REF_TIME, refTime);
query.addQueryParam(GridConstants.PARAMETER_ABBREVIATION, d2dParmName);
query.addQueryParam(GridConstants.PARAMETER_ABBREVIATION, d2dParmName
+ "%hr", QueryOperand.LIKE);
query.addQueryParam(GridConstants.LEVEL_ID, d2dLevel.getId());
query.addOrder(FCST_TIME, true);
query.addOrder(GridConstants.PARAMETER_ABBREVIATION, true);
@SuppressWarnings("unchecked")
List<Object[]> firstTry = (List<Object[]>) this.queryByCriteria(query);
@ -180,23 +186,25 @@ public class GFED2DDao extends GridDao {
query = new DatabaseQuery(GridRecord.class.getName());
query.addReturnedField(FCST_TIME);
query.addReturnedField("id");
query.addReturnedField(GridConstants.PARAMETER_ABBREVIATION);
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
query.addQueryParam(REF_TIME, refTime);
query.addQueryParam(GridConstants.PARAMETER_ABBREVIATION,
d2dParmName + "%hr", QueryOperand.LIKE);
d2dParmName);
query.addQueryParam(GridConstants.LEVEL_ID, d2dLevel.getId());
query.addOrder(FCST_TIME, true);
query.addOrder(GridConstants.PARAMETER_ABBREVIATION, true);
@SuppressWarnings("unchecked")
List<Object[]> secondTry = (List<Object[]>) this
.queryByCriteria(query);
for (Object[] row : secondTry) {
dataTimes.put((Integer) row[0], (Integer) row[1]);
}
} else {
Pattern p = Pattern.compile("^" + d2dParmName + "(\\d+)hr$");
int i = 0;
while (i < secondTry.size()) {
Object[] row = secondTry.get(i++);
while (i < firstTry.size()) {
Object[] row = firstTry.get(i++);
Integer fcstHr = (Integer) row[0];
Integer id = (Integer) row[1];
Matcher matcher = p.matcher((String) row[2]);
@ -205,8 +213,8 @@ public class GFED2DDao extends GridDao {
dur = Integer.parseInt(matcher.group(1));
}
for (int j = i; j < secondTry.size(); j++) {
Object[] nextRow = secondTry.get(j);
for (int j = i; j < firstTry.size(); j++) {
Object[] nextRow = firstTry.get(j);
if (fcstHr.equals(nextRow[0])) {
i = j;
String nextParam = (String) nextRow[2];
@ -224,10 +232,6 @@ public class GFED2DDao extends GridDao {
}
dataTimes.put(fcstHr, id);
}
} else {
for (Object[] row : firstTry) {
dataTimes.put((Integer) row[0], (Integer) row[1]);
}
}
return dataTimes;
}

View file

@ -95,6 +95,9 @@ import com.raytheon.uf.edex.database.purge.PurgeLogger;
* 03/20/2013 #1774 randerso Removed dead method, changed to use new
* D2DGridDatabase constructor
* 04/23/2013 #1949 rjpeter Added inventory retrieval for a given time range.
* 05/02/13 #1969 randerso Fixed possible null pointer in getParmList
* Removed inventory from DBInvChangedNotification
* 05/03/13 #1974 randerso Fixed error logging to include stack trace
* </pre>
*
* @author bphillip
@ -910,9 +913,7 @@ public class GridParmManager {
try {
createDB(id);
if (!inv.contains(id)) {
inv.add(id);
Collections.sort(inv);
createDbNotification(id.getSiteId(), inv,
createDbNotification(id.getSiteId(),
Arrays.asList(new DatabaseID[] { id }),
new ArrayList<DatabaseID>());
}
@ -981,7 +982,13 @@ public class GridParmManager {
public static ServerResponse<List<ParmID>> getParmList(DatabaseID id) {
ServerResponse<List<ParmID>> sr = new ServerResponse<List<ParmID>>();
try {
sr = getDb(id).getParmList();
GridDatabase db = getDb(id);
if (db != null) {
sr = db.getParmList();
} else {
sr.addMessage("Database " + id
+ " does not exist for getParmList()");
}
} catch (Exception e) {
sr.addMessage("Error getting db: " + id);
logger.error("Error getting db: " + id, e);
@ -1210,7 +1217,7 @@ public class GridParmManager {
dbId.getModelTimeAsDate());
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage());
e.getLocalizedMessage(), e);
db = null;
}
}
@ -1363,14 +1370,13 @@ public class GridParmManager {
List<DatabaseID> deletions = new ArrayList<DatabaseID>(prevInventory);
deletions.removeAll(newInventory);
createDbNotification(siteID, newInventory, additions, deletions);
createDbNotification(siteID, additions, deletions);
}
private static void createDbNotification(String siteID,
List<DatabaseID> dbs, List<DatabaseID> additions,
List<DatabaseID> deletions) {
List<DatabaseID> additions, List<DatabaseID> deletions) {
if (!additions.isEmpty() || !deletions.isEmpty()) {
DBInvChangeNotification notify = new DBInvChangeNotification(dbs,
DBInvChangeNotification notify = new DBInvChangeNotification(
additions, deletions, siteID);
SendNotifications.send(notify);
}

View file

@ -105,6 +105,8 @@ import com.raytheon.uf.edex.database.DataAccessLayerException;
* 04/04/2013 #1774 randerso Moved wind component checking to GfeIngestNotificaionFilter
* 04/04/2013 #1787 randerso Move the D2D to GFE translation logic out of GFED2DDao
* 04/17/2013 #1913 randerso Added GFE level mapping to replace GridTranslator
* 05/02/2013 #1969 randerso Removed unnecessary updateDbs method
* 05/03/2013 #1974 randerso Fixed error handling when no D2D level mapping found
*
* </pre>
*
@ -202,7 +204,7 @@ public class D2DGridDatabase extends VGridDatabase {
private final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("GFE:");
public static class D2DParm {
public class D2DParm {
private ParmID parmId;
private GridParmInfo gpi;
@ -346,11 +348,6 @@ public class D2DGridDatabase extends VGridDatabase {
return remap;
}
@Override
public void updateDbs() {
// no op
}
/**
* Attempts to load the supplied ParmAtts using the given level.
*
@ -1256,25 +1253,30 @@ public class D2DGridDatabase extends VGridDatabase {
return parmName + "_" + level;
}
private static Level getD2DLevel(String gfeLevel) {
List<Level> levels;
private Level getD2DLevel(String gfeLevel) {
List<Level> levels = Collections.emptyList();
try {
levels = LevelMappingFactory.getInstance(GFE_LEVEL_MAPPING_FILE)
.getLevelMappingForKey(gfeLevel).getLevels();
LevelMapping lm = LevelMappingFactory.getInstance(
GFE_LEVEL_MAPPING_FILE).getLevelMappingForKey(gfeLevel);
if (lm != null) {
levels = lm.getLevels();
}
} catch (CommunicationException e) {
levels = Collections.emptyList();
// do nothing
}
Level level = null;
if (levels.isEmpty()) {
statusHandler.warn("No D2D level found for: " + gfeLevel);
statusHandler.warn("No D2D level found for: " + gfeLevel
+ ". Check gfeLevelMapping and parameterInfo files.");
} else {
level = levels.get(0);
}
return level;
}
private static String getGFELevel(Level d2dLevel) {
private String getGFELevel(Level d2dLevel) {
LevelMapping levelMapping;
try {
levelMapping = LevelMappingFactory.getInstance(
@ -1284,7 +1286,10 @@ public class D2DGridDatabase extends VGridDatabase {
}
String gfeLevel = null;
if (levelMapping != null) {
if (levelMapping == null) {
statusHandler.warn("No GFE level found for: " + d2dLevel
+ ". Check gfeLevelMapping and parameterInfo files.");
} else {
gfeLevel = levelMapping.getKey();
}
return gfeLevel;

View file

@ -54,6 +54,7 @@ import com.raytheon.uf.edex.database.DataAccessLayerException;
* May 16, 2011 bphillip Initial creation
* May 04, 2012 #574 dgilling Add unimplemented methods from GridDatabase.
* Oct 10 2012 #1260 randerso Added code to set valid flag
* 05/02/13 #1969 randerso Removed unnecessary updateDbs method
*
* </pre>
*
@ -191,11 +192,6 @@ public class D2DSatDatabase extends VGridDatabase {
return null;
}
@Override
public void updateDbs() {
// no op
}
/*
* (non-Javadoc)
*

View file

@ -76,6 +76,7 @@ import com.raytheon.uf.common.util.Pair;
* 03/15/13 #1795 njensen Added updatePublishTime()
* 04/23/13 #1949 rjpeter Added default implementations of history by time range
* and cachedParmId
* 05/02/13 #1969 randerso Removed unnecessary updateDbs method
* </pre>
*
* @author bphillip
@ -505,8 +506,6 @@ public abstract class GridDatabase {
}
public abstract void updateDbs();
/**
* Return the internally cache'd parmID for this database implementation.
*

View file

@ -118,6 +118,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* 03/15/13 #1795 njensen Added updatePublishTime()
* 03/20/13 #1774 randerso Cleanup code to use proper constructors
* 04/08/13 #1949 rjpeter Updated to work with normalized database.
* 05/02/13 #1969 randerso Removed updateDbs from parent class
* </pre>
*
* @author bphillip
@ -198,7 +199,6 @@ public class IFPGridDatabase extends GridDatabase {
* Upon site activation, this method is called to calculate any changes to
* parm info or grid locations
*/
@Override
public void updateDbs() {
Map<String, GridParmInfo> parmInfoUser = new HashMap<String, GridParmInfo>();
Map<String, ParmStorageInfo> parmStorageInfoUser = new HashMap<String, ParmStorageInfo>();

View file

@ -39,6 +39,7 @@ import com.raytheon.uf.edex.database.DataAccessLayerException;
* ------------ ---------- ----------- --------------------------
* Aug 26, 2011 dgilling Initial creation
* May 04, 2012 #574 dgilling Port getSiteID() method.
* May 2, 2013 #1969 randerso Removed unnecessary updateDbs method
*
* </pre>
*
@ -69,17 +70,6 @@ public abstract class VGridDatabase extends GridDatabase {
return config.getSiteID().get(0);
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.edex.plugin.gfe.server.database.GridDatabase#updateDbs()
*/
@Override
public void updateDbs() {
// no-op
}
public abstract SortedSet<Date> getValidTimes() throws GfeException,
DataAccessLayerException;
}

View file

@ -0,0 +1,60 @@
/**
* 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.edex.plugin.gfe.server.handler;
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
import com.raytheon.uf.common.dataplugin.gfe.request.CreateNewDbRequest;
import com.raytheon.uf.common.dataplugin.gfe.server.message.ServerResponse;
import com.raytheon.uf.common.serialization.comm.IRequestHandler;
/**
* Handler for CreateNewDb request
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 2, 2013 #1969 randerso Initial creation
* May 3, 2013 #1969 randerso Code review comment incorporation
*
* </pre>
*
* @author randerso
* @version 1.0
*/
public class CreateNewDbHandler implements IRequestHandler<CreateNewDbRequest> {
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.common.serialization.comm.IRequestHandler#handleRequest
* (com.raytheon.uf.common.serialization.comm.IServerRequest)
*/
@Override
public ServerResponse<?> handleRequest(CreateNewDbRequest request)
throws Exception {
return GridParmManager.createNewDb(request.getDbId());
}
}

View file

@ -38,6 +38,7 @@ import com.raytheon.uf.common.serialization.comm.IRequestHandler;
* ------------ ---------- ----------- --------------------------
* 04/08/08 #875 bphillip Initial Creation
* 09/22/09 3058 rjpeter Converted to IRequestHandler
* 05/02/13 #1969 randerso Fixed null pointer if getParmList fails
* </pre>
*
* @author bphillip
@ -52,9 +53,12 @@ public class GetParmListHandler implements IRequestHandler<GetParmListRequest> {
ServerResponse<List<ParmID>> sr = new ServerResponse<List<ParmID>>();
for (DatabaseID id : request.getDbIds()) {
ServerResponse<List<ParmID>> ssr = GridParmManager.getParmList(id);
if (ssr.isOkay()) {
retVal.addAll(ssr.getPayload());
} else {
sr.addMessages(ssr);
}
}
if (sr.isOkay()) {
sr.setPayload(retVal);
}

View file

@ -81,6 +81,7 @@ import com.raytheon.uf.edex.core.EDEXUtil;
* Apr 01, 2013 #1774 randerso Moved wind component checking to GfeIngestNotificaionFilter
* Apr 04, 2013 #1787 randerso Added null check to prevent log spamming for parameters
* not included in the parameter info file
* May 2, 2013 #1969 randerso Updated for change to DBInvChangeNotification
*
* </pre>
*
@ -165,8 +166,7 @@ public class GfeIngestNotificationFilter {
fullInv.add(dbId);
newDbs.add(dbId);
GfeNotification dbInv = new DBInvChangeNotification(
fullInv, Arrays.asList(dbId),
new ArrayList<DatabaseID>(0), site);
Arrays.asList(dbId), null, site);
sendNotification(dbInv);
}

View file

@ -2,6 +2,8 @@
<!--
Mar 20, 2013 #1774 randerso Added all parms from dataFieldTable.txt
sorted lists for ease of update
May 07, 2013 #1974 randerso Removed unnecessary TPCSG_ entries (should only need TPCSG-)
Changed TP_XXX to tpXXX for RFC total precip
-->
<aliasList caseSensitive="true" namespace="gfeParamName">
<alias base="AV">av</alias>
@ -265,142 +267,95 @@
<alias base="Tmean">tmean</alias>
<alias base="TOTSN">totsn</alias>
<alias base="TP120hr">tp120hr</alias>
<alias base="TP12c1">tp12c1</alias>
<alias base="TP12c2">tp12c2</alias>
<alias base="TP12c3">tp12c3</alias>
<alias base="TP12c4">tp12c4</alias>
<alias base="TP12c5">tp12c5</alias>
<alias base="TP12c6">tp12c6</alias>
<alias base="TP12c7">tp12c7</alias>
<alias base="TP12c8">tp12c8</alias>
<alias base="tp12c1">tp12c1</alias>
<alias base="tp12c2">tp12c2</alias>
<alias base="tp12c3">tp12c3</alias>
<alias base="tp12c4">tp12c4</alias>
<alias base="tp12c5">tp12c5</alias>
<alias base="tp12c6">tp12c6</alias>
<alias base="tp12c7">tp12c7</alias>
<alias base="tp12c8">tp12c8</alias>
<alias base="TP12mean">tpmean12</alias>
<alias base="TP12sprd">tpsprd12</alias>
<alias base="TP24c1">tp24c1</alias>
<alias base="TP24c2">tp24c2</alias>
<alias base="TP24c3">tp24c3</alias>
<alias base="TP24c4">tp24c4</alias>
<alias base="TP24c5">tp24c5</alias>
<alias base="TP24c6">tp24c6</alias>
<alias base="TP24c7">tp24c7</alias>
<alias base="TP24c8">tp24c8</alias>
<alias base="tp24c1">tp24c1</alias>
<alias base="tp24c2">tp24c2</alias>
<alias base="tp24c3">tp24c3</alias>
<alias base="tp24c4">tp24c4</alias>
<alias base="tp24c5">tp24c5</alias>
<alias base="tp24c6">tp24c6</alias>
<alias base="tp24c7">tp24c7</alias>
<alias base="tp24c8">tp24c8</alias>
<alias base="TP24mean">tpmean24</alias>
<alias base="TP24sprd">tpsprd24</alias>
<alias base="TP3c1">tp3c1</alias>
<alias base="TP3c2">tp3c2</alias>
<alias base="TP3c3">tp3c3</alias>
<alias base="TP3c4">tp3c4</alias>
<alias base="TP3c5">tp3c5</alias>
<alias base="TP3c6">tp3c6</alias>
<alias base="TP3c7">tp3c7</alias>
<alias base="TP3c8">tp3c8</alias>
<alias base="tp3c1">tp3c1</alias>
<alias base="tp3c2">tp3c2</alias>
<alias base="tp3c3">tp3c3</alias>
<alias base="tp3c4">tp3c4</alias>
<alias base="tp3c5">tp3c5</alias>
<alias base="tp3c6">tp3c6</alias>
<alias base="tp3c7">tp3c7</alias>
<alias base="tp3c8">tp3c8</alias>
<alias base="TP3mean">tpmean3</alias>
<alias base="TP3sprd">tpsprd3</alias>
<alias base="TP6c1">tp6c1</alias>
<alias base="TP6c2">tp6c2</alias>
<alias base="TP6c3">tp6c3</alias>
<alias base="TP6c4">tp6c4</alias>
<alias base="TP6c5">tp6c5</alias>
<alias base="TP6c6">tp6c6</alias>
<alias base="TP6c7">tp6c7</alias>
<alias base="TP6c8">tp6c8</alias>
<alias base="tp6c1">tp6c1</alias>
<alias base="tp6c2">tp6c2</alias>
<alias base="tp6c3">tp6c3</alias>
<alias base="tp6c4">tp6c4</alias>
<alias base="tp6c5">tp6c5</alias>
<alias base="tp6c6">tp6c6</alias>
<alias base="tp6c7">tp6c7</alias>
<alias base="tp6c8">tp6c8</alias>
<alias base="TP6mean">tpmean6</alias>
<alias base="TP6sprd">tpsprd6</alias>
<alias base="TP_ACR">tp_ACR</alias>
<alias base="TP-ACR">tp_ACR</alias>
<alias base="TP_ALR">tp_ALR</alias>
<alias base="TP-ALR">tp_ALR</alias>
<alias base="TPCSG_122E2">PSurge4Ft</alias>
<alias base="tpACR">tp_ACR</alias>
<alias base="tpALR">tp_ALR</alias>
<alias base="TPCSG-122E2">PSurge4Ft</alias>
<alias base="TPCSG_152E2">PSurge5Ft</alias>
<alias base="TPCSG-152E2">PSurge5Ft</alias>
<alias base="TPCSG_183E2">PSurge6Ft</alias>
<alias base="TPCSG-183E2">PSurge6Ft</alias>
<alias base="TPCSG_20">Surge20Pct</alias>
<alias base="TPCSG-20">Surge20Pct</alias>
<alias base="TPCSG_213E2">PSurge7Ft</alias>
<alias base="TPCSG-213E2">PSurge7Ft</alias>
<alias base="TPCSG_244E2">PSurge8Ft</alias>
<alias base="TPCSG-244E2">PSurge8Ft</alias>
<alias base="TPCSG_274E2">PSurge9Ft</alias>
<alias base="TPCSG-274E2">PSurge9Ft</alias>
<alias base="TPCSG_305E2">PSurge10Ft</alias>
<alias base="TPCSG-305E2">PSurge10Ft</alias>
<alias base="TPCSG_30">Surge30Pct</alias>
<alias base="TPCSG-30">Surge30Pct</alias>
<alias base="TPCSG_335E2">PSurge11Ft</alias>
<alias base="TPCSG-335E2">PSurge11Ft</alias>
<alias base="TPCSG_366E2">PSurge12Ft</alias>
<alias base="TPCSG-366E2">PSurge12Ft</alias>
<alias base="TPCSG_396E2">PSurge13Ft</alias>
<alias base="TPCSG-396E2">PSurge13Ft</alias>
<alias base="TPCSG_40">Surge40Pct</alias>
<alias base="TPCSG-40">Surge40Pct</alias>
<alias base="TPCSG_427E2">PSurge14Ft</alias>
<alias base="TPCSG-427E2">PSurge14Ft</alias>
<alias base="TPCSG_457E2">PSurge15Ft</alias>
<alias base="TPCSG-457E2">PSurge15Ft</alias>
<alias base="TPCSG_488E2">PSurge16Ft</alias>
<alias base="TPCSG-488E2">PSurge16Ft</alias>
<alias base="TPCSG_50">Surge50Pct</alias>
<alias base="TPCSG-50">Surge50Pct</alias>
<alias base="TPCSG_518E2">PSurge17Ft</alias>
<alias base="TPCSG-518E2">PSurge17Ft</alias>
<alias base="TPCSG_549E2">PSurge18Ft</alias>
<alias base="TPCSG-549E2">PSurge18Ft</alias>
<alias base="TPCSG_579E2">PSurge19Ft</alias>
<alias base="TPCSG-579E2">PSurge19Ft</alias>
<alias base="TPCSG_60">Surge60Pct</alias>
<alias base="TPCSG-60">Surge60Pct</alias>
<alias base="TPCSG_610E2">PSurge20Ft</alias>
<alias base="TPCSG-610E2">PSurge20Ft</alias>
<alias base="TPCSG_61E2">PSurge2Ft</alias>
<alias base="TPCSG-61E2">PSurge2Ft</alias>
<alias base="TPCSG_640E2">PSurge21Ft</alias>
<alias base="TPCSG-640E2">PSurge21Ft</alias>
<alias base="TPCSG_671E2">PSurge22Ft</alias>
<alias base="TPCSG-671E2">PSurge22Ft</alias>
<alias base="TPCSG_701E2">PSurge23Ft</alias>
<alias base="TPCSG-701E2">PSurge23Ft</alias>
<alias base="TPCSG_70">Surge70Pct</alias>
<alias base="TPCSG-70">Surge70Pct</alias>
<alias base="TPCSG_732E2">PSurge24Ft</alias>
<alias base="TPCSG-732E2">PSurge24Ft</alias>
<alias base="TPCSG_762E2">PSurge25Ft</alias>
<alias base="TPCSG-762E2">PSurge25Ft</alias>
<alias base="TPCSG_80">Surge80Pct</alias>
<alias base="TPCSG-80">Surge80Pct</alias>
<alias base="TPCSG_90">Surge90Pct</alias>
<alias base="TPCSG-90">Surge90Pct</alias>
<alias base="TPCSG_91E2">PSurge3Ft</alias>
<alias base="TPCSG-91E2">PSurge3Ft</alias>
<alias base="TPCSG_SLOSH">SloshSurge</alias>
<alias base="TPCSG-SLOSH">SloshSurge</alias>
<alias base="TPCSG">Surge10Pct</alias>
<alias base="TP_ECMWF">tp_ecmwf</alias>
<alias base="TP_FWR">tp_FWR</alias>
<alias base="TP-FWR">tp_FWR</alias>
<alias base="TP_HPC">tp_HPC</alias>
<alias base="TP-HPC">tp_HPC</alias>
<alias base="TP_KRF">tp_KRF</alias>
<alias base="TP-KRF">tp_KRF</alias>
<alias base="TP_MSR">tp_MSR</alias>
<alias base="TP-MSR">tp_MSR</alias>
<alias base="TP_ORN">tp_ORN</alias>
<alias base="TP-ORN">tp_ORN</alias>
<alias base="TP_PTR">tp_PTR</alias>
<alias base="TP-PTR">tp_PTR</alias>
<alias base="TP_RHA">tp_RHA</alias>
<alias base="TP-RHA">tp_RHA</alias>
<alias base="TP_RSA">tp_RSA</alias>
<alias base="TP-RSA">tp_RSA</alias>
<alias base="TP_STR">tp_STR</alias>
<alias base="TP-STR">tp_STR</alias>
<alias base="TP_TAR">tp_TAR</alias>
<alias base="TP-TAR">tp_TAR</alias>
<alias base="TP_TIR">tp_TIR</alias>
<alias base="TP-TIR">tp_TIR</alias>
<alias base="TP_TUA">tp_TUA</alias>
<alias base="TP-TUA">tp_TUA</alias>
<alias base="TP-ECMWF">tp_ecmwf</alias>
<alias base="tpFWR">tp_FWR</alias>
<alias base="tpHPC">tp_HPC</alias>
<alias base="tpKRF">tp_KRF</alias>
<alias base="tpMSR">tp_MSR</alias>
<alias base="tpORN">tp_ORN</alias>
<alias base="tpPTR">tp_PTR</alias>
<alias base="tpRHA">tp_RHA</alias>
<alias base="tpRSA">tp_RSA</alias>
<alias base="tpSTR">tp_STR</alias>
<alias base="tpTAR">tp_TAR</alias>
<alias base="tpTIR">tp_TIR</alias>
<alias base="tpTUA">tp_TUA</alias>
<alias base="TPW">tpw</alias>
<alias base="Tsprd">tsprd</alias>
<alias base="tTOT">ttot</alias>

View file

@ -807,7 +807,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]

View file

@ -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;
@ -52,21 +52,22 @@ import com.vividsolutions.jts.geom.Geometry;
* ------------ ---------- ----------- --------------------------
* Mar 24, 2009 njensen Initial creation
* Feb 26, 2013 1447 dgilling Implement equals().
*
* May 10, 2013 1951 rjpeter Added own id sequence tagging
* </pre>
*
* @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);

View file

@ -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.
*
* <pre>
*
@ -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.
* </pre>
*
* @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 {

View file

@ -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.
*
* <pre>
*
@ -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.
* </pre>
*
* @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 {

View file

@ -68,8 +68,7 @@
id="com.raytheon.uf.common.dataaccess"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
version="0.0.0"/>
<plugin
id="com.raytheon.uf.common.dataplugin"

View file

@ -19,21 +19,16 @@
**/
package com.raytheon.uf.common.dataplugin.ffmp;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.zip.GZIPInputStream;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
@ -43,8 +38,6 @@ import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.localization.exception.LocalizationOpFailedException;
import com.raytheon.uf.common.serialization.SerializationUtil;
import com.raytheon.uf.common.serialization.adapters.FloatWKBReader;
import com.raytheon.uf.common.serialization.adapters.FloatWKBWriter;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
@ -135,44 +128,9 @@ public class HucLevelGeometriesFactory {
if (f.exists()) {
try {
File file = f.getFile();
byte[] bytes = FileUtil.file2bytes(file, false);
if (bytes[0] == (byte) 0x1f && bytes[1] == (byte) 0x8b) {
// GZIP magic number is present, before 13.4.1 these
// files were compressed and stored in a different
// format, to maintain backwards compatibility we check
// for compression and deserialize the old way. This
// code can be removed any time after 13.5.1.
System.out.println("Decompressing geometry files.");
InputStream is = new ByteArrayInputStream(bytes);
is = new GZIPInputStream(is, bytes.length);
ByteArrayOutputStream os = new ByteArrayOutputStream(
bytes.length * 3 / 2);
byte[] buffer = new byte[1024 * 8];
int numRead = 0;
while ((numRead = is.read(buffer)) >= 0) {
os.write(buffer, 0, numRead);
}
bytes = os.toByteArray();
map = (Map<Long, Geometry>) SerializationUtil
.transformFromThrift(Map.class, bytes);
// save them back the new way.
persistGeometryMap(dataKey, cwa, huc, map);
} else {
Map<Long, byte[]> serializableMap = (Map<Long, byte[]>) SerializationUtil
.transformFromThrift(Map.class, bytes);
FloatWKBReader reader = new FloatWKBReader(
new GeometryFactory());
map = new HashMap<Long, Geometry>(
serializableMap.size());
for (Entry<Long, byte[]> entry : serializableMap
.entrySet()) {
InputStream in = new ByteArrayInputStream(
entry.getValue());
Geometry geom = reader.readGeometry(in);
map.put(entry.getKey(), geom);
}
}
.transformFromThrift(FileUtil.file2bytes(
f.getFile(), true));
int sizeGuess = Math.max(
Math.abs(pfafs.size() - map.size()), 10);
pfafsToGenerate = new ArrayList<Long>(sizeGuess);
@ -389,23 +347,13 @@ public class HucLevelGeometriesFactory {
protected synchronized void persistGeometryMap(String dataKey, String cwa,
String huc, Map<Long, Geometry> map) throws Exception {
LocalizationContext lc = pathManager.getContext(
LocalizationType.COMMON_STATIC, LocalizationLevel.SITE);
LocalizationFile lf = pathManager.getLocalizationFile(lc,
getGeomPath(dataKey, cwa, huc));
FloatWKBWriter writer = new FloatWKBWriter();
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
Map<Long, byte[]> serializableMap = new HashMap<Long, byte[]>();
for (Entry<Long, Geometry> entry : map.entrySet()) {
writer.writeGeometry(entry.getValue(), bos);
serializableMap.put(entry.getKey(), bos.toByteArray());
bos.reset();
}
byte[] bytes = SerializationUtil.transformToThrift(serializableMap);
FileUtil.bytes2File(bytes, lf.getFile(), false);
FileUtil.bytes2File(SerializationUtil.transformToThrift(map),
lf.getFile(), true);
lf.save();
}
protected synchronized String getGeomPath(String dataKey, String cwa,

View file

@ -0,0 +1,63 @@
/**
* 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.gfe.request;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
/**
* Request to create a new GFE database
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 2, 2013 #1969 randerso Initial creation
*
* </pre>
*
* @author randerso
* @version 1.0
*/
@DynamicSerialize
public class CreateNewDbRequest extends AbstractGfeRequest {
@DynamicSerializeElement
private DatabaseID dbId;
public CreateNewDbRequest() {
}
public CreateNewDbRequest(DatabaseID dbId) {
this.dbId = dbId;
}
public DatabaseID getDbId() {
return dbId;
}
public void setDbId(DatabaseID dbId) {
this.dbId = dbId;
}
}

View file

@ -20,7 +20,7 @@
package com.raytheon.uf.common.dataplugin.gfe.server.notify;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
@ -36,6 +36,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 08/17/10 #6742 bphillip Initial Creation
* 05/02/13 #1969 randerso Removed inventory field, general cleanup
*
* </pre>
*
@ -47,20 +48,13 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
public class DBInvChangeNotification extends GfeNotification implements
ISerializableObject {
/** The current database inventory */
@DynamicSerializeElement
private List<DatabaseID> inventory = new ArrayList<DatabaseID>();
/** The additions to the database inventory */
@DynamicSerializeElement
private List<DatabaseID> additions = new ArrayList<DatabaseID>();
private List<DatabaseID> additions = Collections.emptyList();
/** The deletions to the database inventory */
@DynamicSerializeElement
private List<DatabaseID> deletions = new ArrayList<DatabaseID>();
private List<DatabaseID> deletions = Collections.emptyList();
/**
* Creates a new DBInvChangeNotification
@ -72,21 +66,24 @@ public class DBInvChangeNotification extends GfeNotification implements
/**
* Creates a new DBInvChangeNotification
*
* @param inventory
* The current database inventory
* @param additions
* The DatabaseIDs that have been added to the inventory
* The DatabaseIDs that have been added to the inventory. Can be
* null if none.
* @param deletions
* The DatabaseIDs that have been deleted from the inventory
* The DatabaseIDs that have been deleted from the inventory Can
* be null if none.
*/
public DBInvChangeNotification(List<DatabaseID> inventory,
List<DatabaseID> additions, List<DatabaseID> deletions,
String siteId) {
// super(siteId);
this.inventory = inventory;
public DBInvChangeNotification(List<DatabaseID> additions,
List<DatabaseID> deletions, String siteId) {
super(siteId);
if (additions != null) {
this.additions = additions;
}
if (deletions != null) {
this.deletions = deletions;
this.siteID = siteId;
}
}
@Override
@ -96,8 +93,7 @@ public class DBInvChangeNotification extends GfeNotification implements
}
DBInvChangeNotification rhs = (DBInvChangeNotification) obj;
if (inventory.containsAll(rhs.getInventory())
&& additions.containsAll(rhs.getAdditions())
if (additions.containsAll(rhs.getAdditions())
&& deletions.containsAll(rhs.getDeletions())
&& siteID.equals(rhs.getSiteID())) {
return true;
@ -109,27 +105,11 @@ public class DBInvChangeNotification extends GfeNotification implements
@Override
public String toString() {
StringBuilder str = new StringBuilder();
str.append("Inventory: ").append(this.inventory).append("\n");
str.append("Additions: ").append(this.additions).append("\n");
str.append("Deletions: ").append(this.deletions).append("\n");
return str.toString();
}
/**
* @return the inventory
*/
public List<DatabaseID> getInventory() {
return inventory;
}
/**
* @param inventory
* the inventory to set
*/
public void setInventory(List<DatabaseID> inventory) {
this.inventory = inventory;
}
/**
* @return the additions
*/

View file

@ -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

View file

@ -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
*
* <pre>
@ -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.
* </pre>
*
* @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<UGCZone> ugczones = new HashSet<UGCZone>();
protected String ugcZoneList;
@Transient
protected Set<String> 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<UGCZone> getUgczones() {
return ugczones;
}
/**
* @param ugczones
* the ugczones to set
*/
public void setUgczones(Set<UGCZone> 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<String> 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<String> list) {
ugcZones = new LinkedHashSet<String>(list);
StringBuilder builder = new StringBuilder(ugcZones.size() * 8);
boolean addComma = false;
for (String ugc : list) {
if (addComma) {
builder.append(", ");
} else {
addComma = true;
}
return s;
builder.append(ugc);
}
ugcZoneList = builder.toString();
}
public Set<String> getUgcZones() {
if (ugcZones == null) {
ugcZones = new LinkedHashSet<String>();
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;
}
}

View file

@ -20,8 +20,6 @@
package com.raytheon.uf.common.dataplugin.warning;
import java.util.List;
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
@ -29,9 +27,6 @@ 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;
@ -49,6 +44,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
* 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.
* May 07, 2013 1869 bsteffen Remove dataURI column from
* PluginDataObject.
*
@ -64,14 +60,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 {
@ -104,17 +97,7 @@ public class PracticeWarningRecord extends AbstractWarningRecord {
*/
public PracticeWarningRecord(String uri) {
super(uri);
identifier = java.util.UUID.randomUUID().toString();
}
@Override
public void setUgcs(List<String> list) {
ugczones.clear();
for (String s : list) {
ugczones.add(new UGCZone(s, this));
}
}
@Override
@Column
@Access(AccessType.PROPERTY)

View file

@ -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.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 12, 2008 bwoodle Initial creation
*
* </pre>
*
* @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;
}
}

View file

@ -21,7 +21,6 @@
package com.raytheon.uf.common.dataplugin.warning;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.Access;
@ -31,9 +30,6 @@ 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;
@ -51,30 +47,26 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
* 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.
* May 02, 2013 1949 rjpeter Removed ugcZones.
* May 07, 2013 1869 bsteffen Remove dataURI column from
* PluginDataObject.
*
* </pre>
*
* @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 {
@ -107,7 +99,7 @@ public class WarningRecord extends AbstractWarningRecord {
private static Map<String, WarningAction> unknownMap = new HashMap<String, WarningAction>();
private String text;
private final String text;
private WarningAction(String text) {
this.text = text;
@ -168,14 +160,6 @@ public class WarningRecord extends AbstractWarningRecord {
public WarningRecord(String uri) {
super(uri);
}
public void setUgcs(List<String> list) {
ugczones.clear();
for (String s : list) {
ugczones.add(new UGCZone(s, this));
}
}
@Override
@Column
@Access(AccessType.PROPERTY)

View file

@ -25,6 +25,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometry;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Nov 15, 2010 mschenke Initial creation
* Apr 28, 2013 1955 jsanchez Added an ignoreUserData flag to intersection method.
*
* </pre>
*
@ -93,7 +94,7 @@ public class GeometryUtil {
GeometryFactory gf = new GeometryFactory();
List<Geometry> intersection = new ArrayList<Geometry>(
g1.getNumGeometries() + g2.getNumGeometries());
intersection(g1, g2, intersection);
intersection(g1, g2, intersection, false);
Geometry rval = gf.createGeometryCollection(intersection
.toArray(new Geometry[intersection.size()]));
rval.setUserData(g2.getUserData());
@ -101,21 +102,24 @@ public class GeometryUtil {
}
private static void intersection(Geometry g1, Geometry g2,
List<Geometry> intersections) {
List<Geometry> intersections, boolean ignoreUserData) {
if (g1 instanceof GeometryCollection) {
for (int i = 0; i < g1.getNumGeometries(); ++i) {
intersection(g1.getGeometryN(i), g2, intersections);
intersection(g1.getGeometryN(i), g2, intersections,
ignoreUserData);
}
} else {
if (g2 instanceof GeometryCollection) {
for (int i = 0; i < g2.getNumGeometries(); ++i) {
intersection(g1, g2.getGeometryN(i), intersections);
intersection(g1, g2.getGeometryN(i), intersections,
ignoreUserData);
}
} else {
String g1Name = toString(g1.getUserData());
String g2Name = toString(g2.getUserData());
if ((g1Name == null || g2Name == null || g2Name.equals(g1Name))) {
if (g1Name == null || g2Name == null || g2Name.equals(g1Name)
|| ignoreUserData) {
Geometry section = g1.intersection(g2);
if (section.isEmpty() == false) {
if (g2.getUserData() != null) {
@ -138,7 +142,8 @@ public class GeometryUtil {
/**
* Intersection between g1 and prepared geometry pg. Resulting Geometry will
* have user data from pg
* have user data from pg. Using this method assumes that g1 and pg come
* from the same area source (i.e County, Zone)
*
* @param g1
* @param g2
@ -146,10 +151,25 @@ public class GeometryUtil {
* @return the intersection between g1 and g2
*/
public static Geometry intersection(Geometry g1, PreparedGeometry pg) {
return intersection(g1, pg, false);
}
/**
* Intersection between g1 and prepared geometry pg. Resulting Geometry will
* have user data from pg. Setting ignoreUserDate to 'true' will collect
* intersecting geometries although g1 and pg are from different sources.
*
* @param g1
* @param pg
* @param ignoreUserData
* @return
*/
public static Geometry intersection(Geometry g1, PreparedGeometry pg,
boolean ignoreUserData) {
GeometryFactory gf = new GeometryFactory();
List<Geometry> intersection = new ArrayList<Geometry>(
g1.getNumGeometries() + 1);
intersection(g1, pg, intersection);
intersection(g1, pg, intersection, ignoreUserData);
Geometry rval = gf.createGeometryCollection(intersection
.toArray(new Geometry[intersection.size()]));
rval.setUserData(pg.getGeometry().getUserData());
@ -157,19 +177,21 @@ public class GeometryUtil {
}
private static void intersection(Geometry g1, PreparedGeometry pg,
List<Geometry> intersections) {
List<Geometry> intersections, boolean ignoreUserData) {
if (g1 instanceof GeometryCollection) {
for (int i = 0; i < g1.getNumGeometries(); ++i) {
intersection(g1.getGeometryN(i), pg, intersections);
intersection(g1.getGeometryN(i), pg, intersections,
ignoreUserData);
}
} else {
String g1Name = toString(g1.getUserData());
String g2Name = toString(pg.getGeometry().getUserData());
if ((g2Name != null && g2Name.equals(g1Name))
|| ((g1Name == null || g2Name == null) && pg.intersects(g1))) {
|| ((g1Name == null || g2Name == null || ignoreUserData) && pg
.intersects(g1))) {
Geometry g2 = pg.getGeometry();
intersection(g1, g2, intersections);
intersection(g1, g2, intersections, ignoreUserData);
}
}
}

View file

@ -2,6 +2,6 @@
<?eclipse-pydev version="1.0"?>
<pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.5</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
</pydev_project>

View file

@ -1,19 +1,23 @@
diff -crB a/qpid-java.spec b/qpid-java.spec
*** a/qpid-java.spec 2013-05-14 20:24:21.000000000 -0500
--- b/qpid-java.spec 2013-05-15 16:24:20.000000000 -0500
--- b/qpid-java.spec 2013-05-14 20:23:49.000000000 -0500
***************
*** 1,4 ****
*** 1,6 ****
! Name: qpid-java
Version: 0.18
! Release: 2%{?dist}
Summary: Java implementation of Apache Qpid
--- 1,6 ----
License: Apache Software License
Group: Development/Java
--- 1,8 ----
! %define _awips2_directory "/awips2/qpid"
!
! Name: awips2-qpid-java
Version: 0.18
! Release: 3%{?dist}
! Release: 1%{?dist}
Summary: Java implementation of Apache Qpid
License: Apache Software License
Group: Development/Java
***************
*** 12,21 ****
--- 14,28 ----
@ -45,7 +49,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec
Requires: log4j >= 1.2.12
%description client
--- 42,60 ----
--- 42,61 ----
%description common
Java implementation of Apache Qpid - common files
@ -53,6 +57,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec
+ Summary: Java implementation of Apache Qpid - broker files
+ Group: Development/Java
+ BuildArch: noarch
+ Provides: awips2-base-component
+
+ %description broker
+ Java implementation of Apache Qpid - broker files
@ -74,7 +79,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec
%description example
Java implementation of Apache Qpid - example
--- 64,70 ----
--- 65,71 ----
Summary: Java implementation of Apache Qpid - example
Group: Development/Java
BuildArch: noarch
@ -84,7 +89,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec
Java implementation of Apache Qpid - example
***************
*** 58,67 ****
--- 73,97 ----
--- 74,98 ----
%setup -q -n %{qpid_src_dir}
mkdir -p java/lib/required
tar -xvzf %SOURCE1 -C java/lib/required
@ -119,7 +124,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec
# blacklisted jars are either provided by the Requires: or not needed.
BLACKLIST="slf4j qpid-client-tests qpid-all qpid-common-tests"
--- 100,114 ----
--- 101,115 ----
(
cd %{qpid_src_dir}/java
@ -184,7 +189,7 @@ diff -crB a/qpid-java.spec b/qpid-java.spec
%changelog
* Thu Sep 6 2012 Irina Boverman <iboverma@redhat.com> - 0.18-2
--- 122,233 ----
--- 123,234 ----
cd ..