diff --git a/cave/com.raytheon.uf.viz.common.core.feature/feature.xml b/cave/com.raytheon.uf.viz.common.core.feature/feature.xml index 58b1e636a7..d3bdcec9a9 100644 --- a/cave/com.raytheon.uf.viz.common.core.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.common.core.feature/feature.xml @@ -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"/> + version="0.0.0"/> + version="0.0.0"/> + version="0.0.0"/> + version="0.0.0"/> + version="0.0.0"/> + version="0.0.0"/> diff --git a/cave/com.raytheon.viz.gfe.feature/feature.xml b/cave/com.raytheon.viz.gfe.feature/feature.xml index aaa39de8bb..f652dd3a41 100644 --- a/cave/com.raytheon.viz.gfe.feature/feature.xml +++ b/cave/com.raytheon.viz.gfe.feature/feature.xml @@ -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"/> * SOFTWARE HISTORY * Date Ticket# Engineer Description @@ -103,9 +103,10 @@ 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 + * * - * + * * @author chammack * @version 1.0 */ @@ -421,7 +422,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#dispose() */ @Override @@ -493,14 +494,14 @@ public abstract class AbstractParmManager implements IParmManager { /** * Return the DataManager - * + * * @return the dataManager */ protected abstract DataManager getDataManager(); /* * (non-Javadoc) - * + * * @see java.lang.Object#finalize() */ @Override @@ -511,7 +512,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Recalculate the system time range using the total time span of all * displayed parms and their locks - * + * * @return the system time range */ protected TimeRange recalcSystemTimeRange() { @@ -573,7 +574,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.parm.IParmManager#getLockedParms() */ @Override @@ -595,7 +596,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.parm.IParmManager#getParm(com.raytheon.viz. * gfe.core.parm.ParmID) @@ -617,7 +618,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.parm.IParmManager#getUndisplayedParms() */ @Override @@ -632,7 +633,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#getSelectedParms() */ @Override @@ -655,7 +656,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#getModifiedParms() */ @Override @@ -678,7 +679,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Returns a matching parm * (creates if necessary) for the given expression * and database id. - * + * * @param dbid * the database * @param exprName @@ -812,7 +813,7 @@ public abstract class AbstractParmManager implements IParmManager { * Helper function for setParms. Takes the toBeLoaded and * removeParms lists, calculates non-visible ISC dependencies, and then * returns the updated lists through the calling arguments. - * + * * @param toBeLoaded * @param removeParms */ @@ -824,8 +825,10 @@ public abstract class AbstractParmManager implements IParmManager { List 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); } @@ -843,7 +846,7 @@ public abstract class AbstractParmManager implements IParmManager { * Helper function for setParms. Takes the toBeLoaded, * addedParms, removeParms, and modParms lists, calculates dependencies, and * then returns the updated lists through the calling arguments. - * + * * @param toBeLoaded * @param addParms * @param removeParms @@ -938,7 +941,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Actual parm creation mechanism - * + * * @param pid * parm id * @param mutableParm @@ -951,20 +954,20 @@ public abstract class AbstractParmManager implements IParmManager { boolean mutableParm, boolean displayable) throws GFEServerException; /** - * + * * Command to create/remove parms based on ParmID. For additions, the Map * contains the ParmID and visibility. - * + * * implementation --------------------------------------------------------- * Note: addParms, removeParms is modified within this routine, thus they * are not passed in as const references. - * + * * Routine converts the ParmIDs into Parms*. Special cases for VCParms, * since they need to load other parms possibly. Thus the input add and * remove may not result in the same parms being created and destroyed. * ------ * --------------------------------------------------------------------- - * + * * @param addParms * @param removeParms */ @@ -1087,7 +1090,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Command to create/remove parms based on ParmID. - * + * * @param addParms * the parms to add * @param removeParms @@ -1101,7 +1104,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#getParmInExpr(java.lang.String, * boolean, com.raytheon.viz.gfe.core.parm.Parm) @@ -1153,7 +1156,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.parm.IParmManager#getDisplayedParms() */ @Override @@ -1174,7 +1177,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#setDisplayedParms(com.raytheon * .edex.plugin.gfe.db.objects.ParmID[]) @@ -1278,7 +1281,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.msgs.IParmIDChangedListener#parmIDChanged(com * .raytheon.viz.gfe.core.parm.Parm, @@ -1294,7 +1297,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @seecom.raytheon.viz.gfe.core.msgs.IParmInventoryChangedListener# * parmInventoryChanged(com.raytheon.viz.gfe.core.parm.Parm, * com.raytheon.uf.common.time.TimeRange) @@ -1318,7 +1321,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.msgs.ILockTableChangedListener#lockTableChanged * (com.raytheon.viz.gfe.core.parm.Parm, @@ -1336,7 +1339,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addDisplayedParmListChangedListener * (com.raytheon.viz.gfe.core.msgs.IDisplayedParmListChangedListener) @@ -1349,7 +1352,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeDisplayedParmListChangedListener * (com.raytheon.viz.gfe.core.msgs.IDisplayedParmListChangedListener) @@ -1362,7 +1365,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addParmListChangedListener(com * .raytheon.viz.gfe.core.msgs.IParmListChangedListener) @@ -1375,7 +1378,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeParmListChangedListener( * com.raytheon.viz.gfe.core.msgs.IParmListChangedListener) @@ -1387,7 +1390,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addParmIDChangedListener(com.raytheon * .viz.gfe.core.msgs.IParmIDChangedListener) @@ -1399,7 +1402,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeParmIDChangedListener(com * .raytheon.viz.gfe.core.msgs.IParmIDChangedListener) @@ -1411,7 +1414,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addSystemTimeRangeChangedListener * (com.raytheon.viz.gfe.core.msgs.ISystemTimeRangeChangedListener) @@ -1424,7 +1427,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeSystemTimeRangeChangedListener * (com.raytheon.viz.gfe.core.msgs.ISystemTimeRangeChangedListener) @@ -1437,7 +1440,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addAvailableSourcesChangedListener * (com.raytheon.viz.gfe.core.msgs.IAvailableSourcesChangedListener) @@ -1450,7 +1453,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#addNewModelAvailableListener(com * .raytheon.viz.gfe.core.msgs.INewModelAvailableListener) @@ -1462,7 +1465,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeAvailableSourcesChangedListener * (com.raytheon.viz.gfe.core.msgs.IAvailableSourcesChangedListener) @@ -1475,7 +1478,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#removeNewModelAvailableListener * (com.raytheon.viz.gfe.core.msgs.INewModelAvailableListener) @@ -1488,7 +1491,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the displayed parm list changed listener - * + * * @param parms * complete list of parms * @param adds @@ -1515,7 +1518,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the ParmID changed event. - * + * * @param parm * The parm which had its ParmID change * @param newParmId @@ -1538,7 +1541,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the parm list changed listener - * + * * @param parms * complete list of parms * @param adds @@ -1564,7 +1567,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the system time range changed listener - * + * * @param systemTimeRange * new system time range */ @@ -1586,7 +1589,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the available sources changed event. - * + * * @param inventory * The complete inventory * @param deletions @@ -1615,7 +1618,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Fire the new model available event. - * + * * @param additions * The DatabaseID of the newly-available model */ @@ -1636,7 +1639,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Return a list of ParmIDs for a list of Parms - * + * * @param parms * @return */ @@ -1652,7 +1655,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#getParms(com.raytheon.uf.common * .dataplugin.gfe.db.objects.ParmID[]) @@ -1670,7 +1673,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Return a list of Parms for a list of ParmIDs with nulls in place of parms * that are not loaded. - * + * * @param parmIDs * @return */ @@ -1688,7 +1691,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#getAllAvailableParms() */ @Override @@ -1704,7 +1707,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#setParmDisplayable(com.raytheon * .viz.gfe.core.parm.Parm, boolean) @@ -1730,7 +1733,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#deallocateUnusedGrids(int) */ @Override @@ -1797,7 +1800,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#getProductDB() */ @Override @@ -1808,7 +1811,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Filters out a complete list of databaseIDs to those only allowed by the * dbCatagories in the gfeConfig. Sorts the final list. - * + * * @param dbIds * The list of DatabaseIDs to filter * @return A sorted list of DatabseIDs that are GRID types and match the @@ -1835,7 +1838,7 @@ public abstract class AbstractParmManager implements IParmManager { * mutable model, plus all other databases identified by the database * categories specified in the gfeConfig. The databases are filtered by * projection also, since the GFE can only handle one projection. - * + * * @return A filtered list of available databases. */ private List getDatabaseInventory() { @@ -1855,7 +1858,7 @@ public abstract class AbstractParmManager implements IParmManager { * This function is called when the list of available database has changed. * The list of available parms is updated based on the list of additions and * deletions. - * + * * @param deletions * The items being removed from the inventory * @param additions @@ -1863,33 +1866,35 @@ public abstract class AbstractParmManager implements IParmManager { */ public void updatedDatabaseList(List deletions, List additions) { + + // create list of additions we didn't already have + List newAdditions = new ArrayList(additions); + newAdditions.removeAll(availableDatabases); + availableDatabases.addAll(additions); availableDatabases.removeAll(deletions); List toDelete = new ArrayList(); - for (DatabaseID dbId : deletions) { - for (Parm parm : getAllParms()) { - if (parm.getParmID().getDbId().equals(dbId)) { - toDelete.add(parm.getParmID()); - } + for (Parm parm : getAllParms()) { + 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(), toDelete); + setParms(new ArrayList(0), toDelete); - if (additions.size() > 0) { - for (DatabaseID model : additions) { - updateModel(model); - fireNewModelAvailable(model); - } + for (DatabaseID model : newAdditions) { + updateModel(model); + fireNewModelAvailable(model); } } /* * (non-Javadoc) - * + * * @see * com.raytheon.viz.gfe.core.IParmManager#updateModel(com.raytheon.uf.common * .dataplugin.gfe.db.objects.DatabaseID) @@ -1999,7 +2004,7 @@ public abstract class AbstractParmManager implements IParmManager { /* * (non-Javadoc) - * + * * @see com.raytheon.viz.gfe.core.IParmManager#deleteTemporaryParms() */ @Override @@ -2072,7 +2077,7 @@ public abstract class AbstractParmManager implements IParmManager { /** * Returns the Virtual Parm index into vcModules for the given ParmID. - * + * * @param pid * ParmID to search for. * @return The index of the ParmID if it is in vcModules. Else, -1. diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/IFPClient.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/IFPClient.java index 1b50f9893e..9ac2a67853 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/IFPClient.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/IFPClient.java @@ -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 + * * * * @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); + } + } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/ParmManager.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/ParmManager.java index 78061e0833..cfcd866cbc 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/ParmManager.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/internal/ParmManager.java @@ -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. * * * @author bphillip @@ -83,8 +86,6 @@ public class ParmManager extends AbstractParmManager { .getHandler(ParmManager.class); @SuppressWarnings("unused") - private final Set availableParmIDs; - private final GridLocation gloc; private List availableServerDatabases; @@ -107,9 +108,6 @@ public class ParmManager extends AbstractParmManager { // Get the composite grid location this.gloc = dataManager.getClient().getDBGridLocation(); - List ids = dataManager.getClient().getParmList(mutableDb); - this.availableParmIDs = new HashSet(ids); - this.systemTimeRange = recalcSystemTimeRange(); this.parmIDCacheServer = new HashMap>(); this.parmIDCacheVParm = new HashMap>(); @@ -912,25 +910,39 @@ public class ParmManager extends AbstractParmManager { } Collections.sort(this.availableServerDatabases); - boolean containsMutable = availableServerDatabases - .contains(getMutableDatabase()); - if (getMutableDatabase().isValid() && containsMutable) { - // order of isc databases is important, since ISCDataAccess will - // 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)) { - iscDbs.add(dbid); - } + DatabaseID mutableDbId = getMutableDatabase(); + if (mutableDbId.isValid()) { + boolean containsMutable = availableServerDatabases + .contains(mutableDbId); + + if (!containsMutable) { + ServerResponse sr = this.dataManager.getClient() + .createNewDb(mutableDbId); + containsMutable = sr.isOkay(); } - for (DatabaseID dbid : availableVParmDatabases) { - if (dbid.getModelName().equals("ISC") && !iscDbs.contains(dbid)) { - iscDbs.add(dbid); + + if (containsMutable) { + // order of isc databases is important, since ISCDataAccess will + // 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)) { + iscDbs.add(dbid); + } } - } - for (DatabaseID dbid : availableServerDatabases) { - if (dbid.getModelName().equals("ISC") && !iscDbs.contains(dbid)) { - iscDbs.add(dbid); + for (DatabaseID dbid : availableVParmDatabases) { + if (dbid.getModelName().equals("ISC") + && !iscDbs.contains(dbid)) { + iscDbs.add(dbid); + } + } + for (DatabaseID dbid : availableServerDatabases) { + if (dbid.getModelName().equals("ISC") + && !iscDbs.contains(dbid)) { + iscDbs.add(dbid); + } } } } diff --git a/cave/com.raytheon.viz.hydro.feature/feature.xml b/cave/com.raytheon.viz.hydro.feature/feature.xml index 9b7a71b961..a0fab3939d 100644 --- a/cave/com.raytheon.viz.hydro.feature/feature.xml +++ b/cave/com.raytheon.viz.hydro.feature/feature.xml @@ -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"/> + version="0.0.0"/> diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/config/DbAreaSourceDataAdaptor.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/config/DbAreaSourceDataAdaptor.java index 40bddfedc7..b490e54ae8 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/config/DbAreaSourceDataAdaptor.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/config/DbAreaSourceDataAdaptor.java @@ -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. * * * @@ -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 directions; - - public double lowRange; - - public double highRange; - - public CardinalRange(EnumSet 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 calculateLocationPortion(Geometry geom, - Coordinate point, Geometry intersection, GeodeticCalculator gc) { - EnumSet 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. * diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Area.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Area.java index d51509d2c6..7c7b4e5d7b 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Area.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Area.java @@ -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. * * * @author chammack @@ -174,7 +174,6 @@ public class Area { List uniqueFips = new ArrayList(); List areas = new ArrayList(); - 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 areasMap = new HashMap(); + String hatchedAreaSource = config.getHatchedAreaSource() + .getAreaSource(); for (AreaSourceConfiguration asc : config.getAreaSources()) { if (asc.getType() == AreaType.INTERSECT) { List geoms = new ArrayList(); 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); } diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/GisUtil.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/GisUtil.java index f677f85ae4..47573626a5 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/GisUtil.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/GisUtil.java @@ -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. * * * @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 gc = new ThreadLocal() { + @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 calculatePortion(Geometry parentGeom, + Geometry warnedArea, boolean useCentral, boolean useExtreme) { + EnumSet portions = EnumSet.noneOf(Direction.class); + ImpactedQuadrants iQuad = ImpactedQuadrants.findImpactedQuadrants( + parentGeom, warnedArea, useCentral); - double containsPercent = geom.buffer(0.00001).difference(filter) - .getArea() - / geom.getArea(); - if (containsPercent < CONTAINS_PERCENTAGE) { - return true; + // 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); + } + + // 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; + // 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); + } + } + + // 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); + } + } + + // add extreme for three quadrant case. + if (!portions.isEmpty()) { + if (useExtreme && iQuad.xxx > 0) { + portions.add(Direction.EXTREME); + return portions; + } + } + + // All of either type of quadrant in use. + if (iQuad.q == 4 && iQuad.qq == 4) { + return EnumSet.noneOf(Direction.class); + } + + // 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); + } + } + + // add extreme for simple direction case. + if (portions.isEmpty() == false) { + if (useExtreme && iQuad.xxx > 0) { + portions.add(Direction.EXTREME); + } + return portions; + } + + // Catch with the point descriptor one last time + return getPointDesc(iQuad, useExtreme); } - public static Geometry intersect(Geometry shadedArea, Geometry filter) { - GeometryFactory gf = new GeometryFactory(); - Geometry rval = shadedArea; - if (filter instanceof GeometryCollection) { - GeometryCollection gc = (GeometryCollection) filter; - List unionGeometries = new ArrayList(); - 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); - } - } + /** + * 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 getPointDesc(ImpactedQuadrants iQuad, + boolean useExtrme) { + EnumSet portions = EnumSet.noneOf(Direction.class); - 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 calculatePortion(Geometry geom, - Geometry geom2, GeodeticCalculator gc) { - return calculatePortion(geom, geom2, gc, SuppressMap.NONE); - } - - public static EnumSet 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 (iQuad.nnw || iQuad.nne) { + portions.add(Direction.NORTH); + } else if (iQuad.ssw || iQuad.sse) { + portions.add(Direction.SOUTH); } - 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); + if (iQuad.ene || iQuad.ese) { + portions.add(Direction.EAST); + } else if (iQuad.wnw || iQuad.wsw) { + portions.add(Direction.WEST); } - 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 (iQuad.cc) { + portions.add(Direction.CENTRAL); } - 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; + if (!portions.isEmpty() && useExtrme && iQuad.xxx > 0) { + portions.add(Direction.EXTREME); } - - List geoms = new ArrayList(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 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); - } - } - - if (yDirection != null - && (yDirection.equals(Direction.NORTH) || yDirection - .equals(Direction.SOUTH))) { - if (env.getWidth() < RATIO * approximateWidth) { - retVal.add(Direction.CENTRAL); - } - } - - 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); - } - - if (isExtreme && !suppressType.equals(SuppressMap.ALL)) - retVal.add(Direction.EXTREME); - - return retVal; - } - - 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; - } - - return false; + return portions; } public static List asStringList(EnumSet 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 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 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); + + } + } diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/ImpactedQuadrants.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/ImpactedQuadrants.java new file mode 100644 index 0000000000..441315d797 --- /dev/null +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/ImpactedQuadrants.java @@ -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. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * May 2, 2013      1963    jsanchez     Initial creation
+ * 
+ * 
+ * + * @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; + } +} diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java index 6ce201d60b..836f2fb125 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java @@ -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. * * * @@ -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 - .calculateLocationPortion( - cp.prepGeom.getGeometry(), - cp.point, reference, gc)); + cp.partOfArea = GisUtil.asStringList(GisUtil + .calculateLocationPortion( + cp.prepGeom.getGeometry(), reference, + false)); distance = 0; } } diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java index d76eb9d54e..0062794e5d 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java @@ -150,7 +150,7 @@ import com.vividsolutions.jts.io.WKTReader; * Feb 15, 2013 1607 jsanchez Added two variables corEventTime and corCreateTime. * Feb 15, 2013 15820 Qinglu Lin Added createOfficeTimezoneMap() and added logic so that localtimezone * and secondtimezone can get correct values when warning area covers two time zones. - * + * May 10, 2013 1951 rjpeter Updated ugcZones references * * * @author njensen @@ -239,7 +239,7 @@ public class TemplateRunner { WKTReader wkt = new WKTReader(); DataTime[] datatimes = warngenLayer.getDescriptor().getFramesInfo() .getFrameTimes(); - Date eventTime = datatimes != null && datatimes.length > 0 ? datatimes[datatimes.length - 1] + Date eventTime = (datatimes != null) && (datatimes.length > 0) ? datatimes[datatimes.length - 1] .getRefTimeAsCalendar().getTime() : startTime; Date simulatedTime = SimulatedTime.getSystemTime().getTime(); WarngenConfiguration config = warngenLayer.getConfiguration(); @@ -319,7 +319,7 @@ public class TemplateRunner { Map intersectSize = new HashMap(); String[] oneLetterTZ; double minSize = 1.0E-3d; - if (areas != null && areas.length > 0) { + if ((areas != null) && (areas.length > 0)) { Set timeZones = new HashSet(); for (AffectedAreas area : areas) { if (area.getTimezone() != null) { @@ -347,9 +347,11 @@ public class TemplateRunner { n2 = 0; size = 0.0d; totalSize = 0.0d; - if (timezoneGeom != null && warningArea != null) { - if (intersectSize.get(oneLetterTZ[i]) != null) + if ((timezoneGeom != null) + && (warningArea != null)) { + if (intersectSize.get(oneLetterTZ[i]) != null) { continue; + } poly1 = new Polygon[warningArea .getNumGeometries()]; n1 = warningArea.getNumGeometries(); @@ -369,19 +371,22 @@ public class TemplateRunner { for (Polygon p2 : poly2) { size = p1.intersection(p2) .getArea(); - if (size > 0.0) + if (size > 0.0) { totalSize += size; + } } - if (totalSize > minSize) + if (totalSize > minSize) { break; // save time when the size of // poly1 or poly2 is large + } } intersectSize .put(oneLetterTZ[i], totalSize); - } else + } else { throw new VizException( "Either timezoneGeom or/and warningArea is null. " + "Timezone cannot be determined."); + } System.out .println("Time to do size computation = " + (System.currentTimeMillis() - t0)); @@ -393,17 +398,18 @@ public class TemplateRunner { // area is very small, // use the timezone of larger intersection size. if (timeZones.size() == 0) { - if (intersectSize.size() > 1) + if (intersectSize.size() > 1) { if (intersectSize.get(oneLetterTZ[0]) > intersectSize .get(oneLetterTZ[1])) { timeZones.add(oneLetterTZ[0]); } else { timeZones.add(oneLetterTZ[1]); } - else + } else { throw new VizException( "The size of intersectSize is less than 1, " + "timezone cannot be determined."); + } } } } else { @@ -414,16 +420,17 @@ public class TemplateRunner { Map officeCityTimezone = createOfficeTimezoneMap(); String cityTimezone = null; - if (officeCityTimezone != null) + if (officeCityTimezone != null) { cityTimezone = officeCityTimezone.get(warngenLayer .getLocalizedSite()); + } Iterator iterator = timeZones.iterator(); - if (timeZones.size() > 1 && cityTimezone != null) { + if ((timeZones.size() > 1) && (cityTimezone != null)) { String timezone; while (iterator.hasNext()) { timezone = iterator.next(); if (timezone.equals(cityTimezone) - && context.get("localtimezone") == null) { + && (context.get("localtimezone") == null)) { context.put("localtimezone", timezone); } else if (context.get("secondtimezone") == null) { context.put("secondtimezone", timezone); @@ -441,7 +448,7 @@ public class TemplateRunner { } // CAN and EXP products follow different rules as followups - if (!(selectedAction == WarningAction.CAN || selectedAction == WarningAction.EXP)) { + if (!((selectedAction == WarningAction.CAN) || (selectedAction == WarningAction.EXP))) { wx = new Wx(config, stormTrackState, warngenLayer.getStormLocations(stormTrackState), startTime.getTime(), DateUtil.roundDateTo15(endTime) @@ -463,10 +470,11 @@ public class TemplateRunner { context.put("duration", duration); context.put("event", eventTime); - if (selectedAction == WarningAction.COR) + if (selectedAction == WarningAction.COR) { context.put("TMLtime", eventTime); - else + } else { context.put("TMLtime", simulatedTime); + } context.put("ugcline", FipsUtil.getUgcLine(areas, wx.getEndTime(), 15)); context.put("areaPoly", GisUtil.convertCoords(warngenLayer @@ -550,7 +558,7 @@ public class TemplateRunner { canOrExpCal.add(Calendar.MILLISECOND, 1); context.put( "ugcline", - FipsUtil.getUgcLine(oldWarn.getUgczones(), + FipsUtil.getUgcLine(oldWarn.getUgcZones(), canOrExpCal.getTime(), 0)); String oldGeom = oldWarn.getGeometry().toString(); context.put("areaPoly", GisUtil.convertCoords(wkt.read(oldGeom) @@ -605,7 +613,7 @@ public class TemplateRunner { context.put("includedWatches", config.getIncludedWatches()); // Additional Information for Followup Products - if (etn != null && etn.length() > 0) { + if ((etn != null) && (etn.length() > 0)) { AbstractWarningRecord oldWarn = null; // COR product - What are we correcting? @@ -618,7 +626,7 @@ public class TemplateRunner { CurrentWarnings cw = CurrentWarnings.getInstance(threeLetterSiteId); - if (selectedAction == WarningAction.COR && !allowsNewProduct) { + if ((selectedAction == WarningAction.COR) && !allowsNewProduct) { oldWarn = cw.getFollowUpByTracking(etn, phenSig, new WarningAction[] { WarningAction.CON, WarningAction.COR }); @@ -627,8 +635,8 @@ public class TemplateRunner { } // Hydro product - if (oldWarn.getFloodSeverity() != null - && oldWarn.getFloodSeverity().length() >= 1) { + if ((oldWarn.getFloodSeverity() != null) + && (oldWarn.getFloodSeverity().length() >= 1)) { context.put("floodseverity", oldWarn.getFloodSeverity()); context.put("floodic", oldWarn.getImmediateCause()); } @@ -651,8 +659,9 @@ public class TemplateRunner { context.put("now", new Date(wwaMNDTime)); // original warning's 'now' time used in MND header context.put("corCreateTime", new Date(wwaMNDTime)); - } else + } else { context.put("now", simulatedTime); + } context.put("event", oldWarn.getIssueTime().getTime()); // original warning's 'event' time, which should match the storm // track @@ -721,8 +730,9 @@ public class TemplateRunner { } } } - if (untilIndex < 0 || atIndex < 0 || elipsisIndex < 0) + if ((untilIndex < 0) || (atIndex < 0) || (elipsisIndex < 0)) { throw new VizException("Cannot find * AT line."); + } } Calendar cal = oldWarn.getEndTime(); @@ -779,18 +789,18 @@ public class TemplateRunner { oldWarn.getGeometry(), removedAreas, threeLetterSiteId); for (int i = 0; i < cancelareas.length; i++) { - for (int j = 0; j < areas.length; j++) { - if (cancelareas[i] != null + for (AffectedAreas area : areas) { + if ((cancelareas[i] != null) && cancelareas[i].getFips().equals( - areas[j].getFips())) { + area.getFips())) { cancelareas[i] = null; } } } ArrayList al = new ArrayList(); - for (int i = 0; i < cancelareas.length; i++) { - if (cancelareas[i] != null) { - al.add(cancelareas[i]); + for (AffectedAreas cancelarea : cancelareas) { + if (cancelarea != null) { + al.add(cancelarea); } } context.put("cancel" @@ -970,7 +980,7 @@ public class TemplateRunner { WatchUtil rval = null; String[] includedWatches = config.getIncludedWatches(); - if (includedWatches != null && includedWatches.length > 0) { + if ((includedWatches != null) && (includedWatches.length > 0)) { String phensigList = null; for (String includedWatch : includedWatches) { if (includedWatch.equalsIgnoreCase("torWatches")) { @@ -1110,7 +1120,7 @@ public class TemplateRunner { } GeospatialData[] geoData = warngenLayer.getGeodataFeatures( asc.getAreaSource(), warngenLayer.getLocalizedSite()); - if (geoData == null || geoData.length == 0) { + if ((geoData == null) || (geoData.length == 0)) { statusHandler.handle(Priority.ERROR, "Cannot process watches: cannot get geospatial data"); return rval; @@ -1143,8 +1153,9 @@ public class TemplateRunner { } // TODO: Building geometry just to perform this test is probably // inefficient with the post-DR-15430 logic... - if (!ar.getGeometry().isEmpty()) + if (!ar.getGeometry().isEmpty()) { work.valid = true; + } /* * TODO: Currently adding all zones to the list even if they are not @@ -1159,10 +1170,12 @@ public class TemplateRunner { * If none of the areas in the watch were neer our warning polygon, * do not included it. */ - if (!work.valid) + if (!work.valid) { continue; - if (determineAffectedPortions(work.ugcZone, asc, geoData, work.waw)) + } + if (determineAffectedPortions(work.ugcZone, asc, geoData, work.waw)) { rval.addWaw(work.waw); + } } return rval; @@ -1190,8 +1203,8 @@ public class TemplateRunner { Entry e = null; // Either zero or more than one sates/counties would be wrong - if (parsed.size() != 1 - || (e = parsed.entrySet().iterator().next()).getValue().length != 1) { + if ((parsed.size() != 1) + || ((e = parsed.entrySet().iterator().next()).getValue().length != 1)) { statusHandler.handle(Priority.ERROR, "Invalid ugczone in active table entry: " + ugc); continue; @@ -1206,16 +1219,18 @@ public class TemplateRunner { "Error generating included watches.", exc); return false; } - if (feArea == NOT_IN_CWA) + if (feArea == NOT_IN_CWA) { continue; + } Set feAreas = map.get(stateAbbrev); if (feAreas == null) { feAreas = new HashSet(); map.put(stateAbbrev, feAreas); } - if (feArea != null) + if (feArea != null) { feAreas.add(feArea); + } } ArrayList portions = new ArrayList(map.size()); @@ -1265,48 +1280,55 @@ public class TemplateRunner { if ("pa".equals(part)) { pa = 1; continue; - } else if ("nn".equals(part)) + } else if ("nn".equals(part)) { nnn = nn = 1; - else if ("ss".equals(part)) + } else if ("ss".equals(part)) { sss = ss = 1; - else if ("ee".equals(part)) + } else if ("ee".equals(part)) { eee = ee = 1; - else if ("ww".equals(part)) + } else if ("ww".equals(part)) { www = ww = 1; - else if ("nw".equals(part)) + } else if ("nw".equals(part)) { nnn = www = nw = 1; - else if ("nc".equals(part)) + } else if ("nc".equals(part)) { nnn = nc = 1; - else if ("ne".equals(part)) + } else if ("ne".equals(part)) { nnn = eee = ne = 1; - else if ("wc".equals(part)) + } else if ("wc".equals(part)) { www = wc = 1; - else if ("cc".equals(part)) { + } else if ("cc".equals(part)) { cc = 1; continue; - } else if ("ec".equals(part)) + } else if ("ec".equals(part)) { eee = ec = 1; - else if ("sw".equals(part)) + } else if ("sw".equals(part)) { sss = www = sw = 1; - else if ("sc".equals(part)) + } else if ("sc".equals(part)) { sss = sc = 1; - else if ("se".equals(part)) + } else if ("se".equals(part)) { sss = eee = se = 1; + } partAbrev = part; } // decide how to describe these subareas. - if (ne > 0 && nw > 0) + if ((ne > 0) && (nw > 0)) { nn = 1; - if (se > 0 && sw > 0) + } + if ((se > 0) && (sw > 0)) { ss = 1; - if (se > 0 && ne > 0) + } + if ((se > 0) && (ne > 0)) { ee = 1; - if (sw > 0 && nw > 0) + } + if ((sw > 0) && (nw > 0)) { ww = 1; - if (nnn > 0 && sss > 0 && eee > 0 && www > 0) + } + if ((nnn > 0) && (sss > 0) && (eee > 0) && (www > 0)) { return abrev; - if (nn > 0 && ss > 0 || ee > 0 && ww > 0) + } + if (((nn > 0) && (ss > 0)) || ((ee > 0) && (ww > 0))) { return abrev; + } if (nnn + sss + eee + www == 3) { if (www == 0) { abrev = "e"; @@ -1319,11 +1341,11 @@ public class TemplateRunner { } return abrev; } - if (nnn == sss && eee == www || cc == m) { + if (((nnn == sss) && (eee == www)) || (cc == m)) { abrev = "c"; return abrev; } - if (pa != 0 && cc == 0) { + if ((pa != 0) && (cc == 0)) { abrev = "pa"; if (--m <= 0) { return abrev; @@ -1346,8 +1368,9 @@ public class TemplateRunner { private static String getStateName(String key, AreaSourceConfiguration asc, GeospatialData[] geoData) { for (GeospatialData g : geoData) { - if (key.equals((String) g.attributes.get("STATE"))) + if (key.equals(g.attributes.get("STATE"))) { return (String) g.parent.attributes.get("NAME"); + } } return null; } @@ -1367,10 +1390,11 @@ public class TemplateRunner { private static String getFeArea(String stateAbbrev, String ugc, AreaSourceConfiguration asc, GeospatialData[] geoData) { for (GeospatialData g : geoData) { - if (stateAbbrev.equals((String) g.attributes.get("STATE")) + if (stateAbbrev.equals(g.attributes.get("STATE")) && ((String) g.attributes.get(asc.getFipsField())) - .endsWith(ugc)) + .endsWith(ugc)) { return (String) g.attributes.get(asc.getFeAreaField()); + } } // TODO: Is this the correct way to determine if the county is in the diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java index b019acb30b..427bb4a979 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/CurrentWarnings.java @@ -33,7 +33,6 @@ import java.util.Set; import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord; import com.raytheon.uf.common.dataplugin.warning.PracticeWarningRecord; -import com.raytheon.uf.common.dataplugin.warning.UGCZone; import com.raytheon.uf.common.dataplugin.warning.WarningRecord; import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction; import com.raytheon.uf.common.dataplugin.warning.util.AnnotationUtil; @@ -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 * * * @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 recordsMap = new HashMap(); + private final Map recordsMap = new HashMap(); - private Map> warningMap = new HashMap>() { + private final Map> warningMap = new HashMap>() { private static final long serialVersionUID = 1L; @@ -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; diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/FipsUtil.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/FipsUtil.java index d3b13b4248..e89f43bcb6 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/FipsUtil.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/util/FipsUtil.java @@ -32,9 +32,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.raytheon.uf.common.dataplugin.warning.UGCZone; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; import com.raytheon.viz.warngen.gis.AffectedAreas; import com.raytheon.viz.warngen.gis.AffectedAreasComparator; import com.raytheon.viz.warnings.DateUtil; @@ -50,8 +47,8 @@ import com.raytheon.viz.warnings.DateUtil; * May 6, 2008 bwoodle Initial creation * Dec 28 2012 DR15599 mgamazaychikov Updated method getListCounties to fix the problem * with generated list of counties. - * Apr 25,2013 1877 jsanchez Sorted the UGC line for cancellations. - * + * Apr 25, 2013 1877 jsanchez Sorted the UGC line for cancellations. + * May 10, 2013 1951 rjpeter Updated ugcZones references * * * @author bwoodle @@ -59,9 +56,6 @@ import com.raytheon.viz.warnings.DateUtil; */ public class FipsUtil { - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(FipsUtil.class); - private static final Map fipsToState; private static String[][] abbrlist = new String[][] { { "02", "AK" }, @@ -126,7 +120,7 @@ public class FipsUtil { for (AffectedAreas area : sortedAreas) { String ugc = getUgc(area); - if (ugc != null && countiesOrZones.contains(ugc) == false) { + if ((ugc != null) && (countiesOrZones.contains(ugc) == false)) { countiesOrZones.add(ugc); } } @@ -159,15 +153,14 @@ public class FipsUtil { * @param endtime * @return */ - public static String getUgcLine(Set ugcs, Date endtime, - int interval) { + public static String getUgcLine(Set ugcs, Date endtime, int interval) { StringBuffer rval = new StringBuffer(); ArrayList countiesOrZones = new ArrayList(); DateUtil du = new DateUtil(); - for (UGCZone ugc : ugcs) { - if (countiesOrZones.contains(ugc.toString()) == false) { - countiesOrZones.add(ugc.toString()); + for (String ugc : ugcs) { + if (countiesOrZones.contains(ugc) == false) { + countiesOrZones.add(ugc); } } @@ -425,33 +418,15 @@ public class FipsUtil { return fipsToState.get(statefips); } - public static boolean containsSameCountiesOrZones(Set a, - Set b) { - boolean rval = true; - - // Check one way... - for (UGCZone z1 : a) { - boolean containsThisItem = false; - for (UGCZone z2 : b) { - if (z1.toString().equals(z2.toString())) { - containsThisItem = true; - } - } - if (!containsThisItem) { - rval = false; - } - } - - // Check the other way... - for (UGCZone z2 : a) { - boolean containsThisItem = false; - for (UGCZone z1 : b) { - if (z1.toString().equals(z2.toString())) { - containsThisItem = true; - } - } - if (!containsThisItem) { - rval = false; + public static boolean containsSameCountiesOrZones(Set a, + Set b) { + boolean rval = a.size() == b.size(); + if (rval) { + // Check one way... + rval = a.containsAll(b); + if (rval) { + // Check the other way... + rval = b.containsAll(a); } } diff --git a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/CWASPSResource.java b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/CWASPSResource.java index 0695c340b4..70c93c3987 100644 --- a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/CWASPSResource.java +++ b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/CWASPSResource.java @@ -1,3 +1,22 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ package com.raytheon.viz.warnings.rsc; import java.text.SimpleDateFormat; @@ -27,7 +46,21 @@ import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKBReader; import com.vividsolutions.jts.io.WKTReader; - +/** + * CWASPSResource + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * May 10, 2013 1951       rjpeter     Initial history entry, updated ugcZones references
+ * 
+ * + * @author rjpeter + * @version 1.0 + */ public class CWASPSResource extends WatchesResource { private static final transient IUFStatusHandler statusHandler = UFStatus @@ -57,9 +90,9 @@ public class CWASPSResource extends WatchesResource { String zoneList = ""; List queries = new ArrayList(); - for (String ugc : record.getUgcsString()) { + for (String ugc : record.getUgcZones()) { - if (ugc.charAt(2) == 'Z' + if ((ugc.charAt(2) == 'Z') && marinezones.contains(ugc.substring(0, 2))) { if (marinezoneList.length() > 0) { marinezoneList += ","; @@ -97,8 +130,8 @@ public class CWASPSResource extends WatchesResource { try { List result = DirectDbQuery.executeQuery(sql, "maps", QueryLanguage.SQL); - if (result != null && result.size() > 0 - && result.get(0)[0] != null) { + if ((result != null) && (result.size() > 0) + && (result.get(0)[0] != null)) { for (Object[] obj : result) { if (obj[0] != null) { WKBReader wkbReader = new WKBReader(); @@ -153,14 +186,15 @@ public class CWASPSResource extends WatchesResource { // if the shape was in the shadedShape map then create a shaded // shape isShaded = true; - } else if (entry.wireframeShape == null && record.getGeometry() == null) { + } else if ((entry.wireframeShape == null) + && (record.getGeometry() == null)) { // if it is not in the wireframeShape map and the geometry is null // then create a shaded shape isShaded = true; } if (isShaded) { - if (record.getUgczones().size() > 0) { + if (!record.getUgcZones().isEmpty()) { // if the geometry is null get a geometry based on the county // list if (record.getGeometry() == null) { diff --git a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java index ad0d7e2767..9580cfa9e6 100644 --- a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java +++ b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WatchesResource.java @@ -15,7 +15,6 @@ import java.util.TimerTask; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord; -import com.raytheon.uf.common.dataplugin.warning.UGCZone; import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; @@ -47,9 +46,9 @@ import com.vividsolutions.jts.geom.GeometryFactory; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Sep 27, 2012 1149 jsanchez Refactored methods from AbstractWarningsResource into this class. + * Sep 27, 2012 1149 jsanchez Refactored methods from AbstractWarningsResource into this class. * May 06, 2013 1930 bsteffen Check for null in WatchesResource. - * + * May 10, 2013 1951 rjpeter Updated ugcZones references * * * @author jsanchez @@ -158,9 +157,9 @@ public class WatchesResource extends AbstractWWAResource { } } } else if (type == ChangeType.CAPABILITY) { - if (color != null - && color.equals(getCapability((ColorableCapability.class)) - .getColor()) == false) { + if ((color != null) + && (color.equals(getCapability((ColorableCapability.class)) + .getColor()) == false)) { color = getCapability((ColorableCapability.class)).getColor(); for (String dataUri : entryMap.keySet()) { @@ -185,9 +184,9 @@ public class WatchesResource extends AbstractWWAResource { AbstractWarningRecord record) throws VizException { Geometry geo; - if (record.getUgczones().size() > 0) { + if (!record.getUgcZones().isEmpty()) { setGeometry(record); - if (record.getGeometry() != null && record.getPhen() != null) { + if ((record.getGeometry() != null) && (record.getPhen() != null)) { IShadedShape ss = target.createShadedShape(false, descriptor.getGridGeometry(), false); geo = (Geometry) record.getGeometry().clone(); @@ -219,11 +218,11 @@ public class WatchesResource extends AbstractWWAResource { WarningAction watchact = WarningAction.valueOf(watchrec .getAct()); - int watchSize = watchrec.getUgczones().size(); + int watchSize = watchrec.getUgcZones().size(); if (watchact != WarningAction.NEW) { AbstractWarningRecord createShape = null; - if (watchact == null || watchact.toString() == null) { + if ((watchact == null) || (watchact.toString() == null)) { createShape = watchrec; } for (String entryKey : entryMap.keySet()) { @@ -233,27 +232,27 @@ public class WatchesResource extends AbstractWWAResource { // checks for any possible null pointer exceptions in // the following block of code, since there is the // possibility of null values - if (rec.getPhensig() != null - && watchrec.getPhensig() != null - && rec.getOfficeid() != null - && watchrec.getOfficeid() != null - && rec.getUgczones() != null - && rec.getStartTime() != null - && watchrec.getStartTime() != null) { + if ((rec.getPhensig() != null) + && (watchrec.getPhensig() != null) + && (rec.getOfficeid() != null) + && (watchrec.getOfficeid() != null) + && (rec.getUgcZones() != null) + && (rec.getStartTime() != null) + && (watchrec.getStartTime() != null)) { if (rec.getPhensig().equals(watchrec.getPhensig()) && rec.getOfficeid().equals( watchrec.getOfficeid()) && rec.getEtn().equals(watchrec.getEtn())) { - int recSize = rec.getUgczones().size(); + int recSize = rec.getUgcZones().size(); if (!entry.partialCancel) { - if (watchact == WarningAction.EXP - || watchact == WarningAction.CAN) { + if ((watchact == WarningAction.EXP) + || (watchact == WarningAction.CAN)) { entry.partialCancel = true; entry.record .setEndTime((Calendar) watchrec .getStartTime().clone()); - } else if (watchact == WarningAction.CON - && recSize > watchSize + } else if ((watchact == WarningAction.CON) + && (recSize > watchSize) && watchrec.getStartTime().after( rec.getStartTime())) { entry.partialCancel = true; @@ -270,7 +269,7 @@ public class WatchesResource extends AbstractWWAResource { if (createShape != null) { WarningEntry entry = entryMap.get(createShape .getDataURI()); - if (entry != null && entry.shadedShape != null) { + if ((entry != null) && (entry.shadedShape != null)) { entry.shadedShape.dispose(); } initShape(target, createShape); @@ -289,7 +288,7 @@ public class WatchesResource extends AbstractWWAResource { List marinezone = new ArrayList(); List geometries = new ArrayList(); - for (String ugc : record.getUgcsString()) { + for (String ugc : record.getUgcZones()) { Geometry geom = null; WeakReference geomRef = geometryMap.get(ugc); if (geomRef != null) { @@ -383,10 +382,9 @@ public class WatchesResource extends AbstractWWAResource { AbstractWarningRecord watch = watches.get(key); if (watch == null) { watch = watchrec; - } else if (watchrec.getUgczones() != null) { - Set ugcZones = watch.getUgczones(); - ugcZones.addAll(watchrec.getUgczones()); - watch.setUgczones(ugcZones); + } else if (watchrec.getUgcZones() != null) { + Set ugcZones = watch.getUgcZones(); + ugcZones.addAll(watchrec.getUgcZones()); } watches.put(key, watch); } @@ -410,7 +408,7 @@ public class WatchesResource extends AbstractWWAResource { long now = SimulatedTime.getSystemTime().getTime().getTime(); long endTime = rec.getEndTime().getTimeInMillis(); synchronized (expTaskSet) { - if (endTime > now && !expTaskSet.contains(new Long(endTime))) { + if ((endTime > now) && !expTaskSet.contains(new Long(endTime))) { WarningExpirationTask task = new WarningExpirationTask(this); timer.schedule(task, rec.getEndTime().getTime()); expTaskSet.add(new Long(endTime)); @@ -429,7 +427,7 @@ public class WatchesResource extends AbstractWWAResource { Long time = new Long(triggerTime); // remove the instance of the trigger time from the map synchronized (expTaskSet) { - if (expTaskSet != null && expTaskSet.contains(time)) { + if ((expTaskSet != null) && expTaskSet.contains(time)) { expTaskSet.remove(time); } } diff --git a/deltaScripts/13.4.1/alterWarningTables.sql b/deltaScripts/13.4.1/alterWarningTables.sql new file mode 100644 index 0000000000..f09a7f4da9 --- /dev/null +++ b/deltaScripts/13.4.1/alterWarningTables.sql @@ -0,0 +1,53 @@ +-- called by updateWarningTables.sh to alter the warning and practicewarning tables +-- and to create indexes and sequences for the activetable tables +DROP SEQUENCE IF EXISTS practice_activetableseq; +DROP SEQUENCE IF EXISTS activetableseq; +DROP INDEX IF EXISTS activetable_officeid_phensig_idx; +DROP INDEX IF EXISTS practice_activetable_officeid_phensig_idx +DROP INDEX IF EXISTS practicewarning_office_phensig_index +DROP INDEX IF EXISTS warning_office_phensig_index +ALTER TABLE warning DROP COLUMN IF EXISTS ugczones; +ALTER TABLE practicewarning DROP COLUMN IF EXISTS ugczones; + +CREATE INDEX activetable_officeid_phensig_idx + ON activetable + USING btree + (officeid COLLATE pg_catalog."default", phensig COLLATE pg_catalog."default"); + +CREATE INDEX practice_activetable_officeid_phensig_idx + ON practice_activetable + USING btree + (officeid COLLATE pg_catalog."default", phensig COLLATE pg_catalog."default"); + +CREATE SEQUENCE activetableseq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + START 1 + CACHE 1; +ALTER TABLE activetableseq + OWNER TO awips; + +CREATE SEQUENCE practice_activetableseq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + START 1 + CACHE 1; +ALTER TABLE practice_activetableseq + OWNER TO awips; + +CREATE INDEX practicewarning_office_phensig_index + ON practicewarning + USING btree + (officeid COLLATE pg_catalog."default", phensig COLLATE pg_catalog."default"); + +CREATE INDEX warning_office_phensig_index + ON warning + USING btree + (officeid COLLATE pg_catalog."default", phensig COLLATE pg_catalog."default"); + + +ALTER TABLE warning ADD COLUMN ugczones text; +ALTER TABLE practicewarning ADD COLUMN ugczones text; + diff --git a/deltaScripts/13.4.1/parseUgcZones.py b/deltaScripts/13.4.1/parseUgcZones.py new file mode 100644 index 0000000000..ff3792f0f8 --- /dev/null +++ b/deltaScripts/13.4.1/parseUgcZones.py @@ -0,0 +1,37 @@ +# Called by updateWarningTables.sh to parse the ugc zones in table updates +import sys +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import ParmID +from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import DatabaseID + +table = sys.argv[1] +fileName = sys.argv[2] +f = open(fileName, 'r') +ugcZonesUpdateFile = open(table + 'UgcZonesUpdates.sql', 'w') + +prevParentId = None +parentId = None +ugcZones = None + +for line in f: + # break line by columns + columns=line.split('|') + + if len(columns) > 1: + parentId=columns[0].strip() + ugcZone=columns[1].strip() + + if parentId == prevParentId: + ugcZones.append(ugcZone) + else: + if ugcZones is not None: + zoneStr = ", ".join(ugcZones) + ugcZonesUpdateFile.write("UPDATE " + table + " SET ugczones = '" + zoneStr + "' WHERE id = " + prevParentId + ";\n") + ugcZones = [ugcZone] + prevParentId = parentId + +if ugcZones is not None: + zoneStr = ", ".join(ugcZones) + ugcZonesUpdateFile.write("UPDATE " + table + " SET ugczones = '" + zoneStr + "' WHERE id = " + prevParentId + ";\n") + +f.close() +ugcZonesUpdateFile.close() diff --git a/deltaScripts/13.4.1/updateWarningTables.sh b/deltaScripts/13.4.1/updateWarningTables.sh new file mode 100644 index 0000000000..7a3a48091c --- /dev/null +++ b/deltaScripts/13.4.1/updateWarningTables.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# Main script for updating warning database structure + +PSQL="/awips2/psql/bin/psql" +PYTHON="/awips2/python/bin/python" + +SQL_SCRIPT="alterWarningTables.sql" + +# ensure that the sql script is present +if [ ! -f ${SQL_SCRIPT} ]; then + echo "ERROR: the required sql script - ${SQL_SCRIPT} was not found." + echo "FATAL: the update has failed!" + exit 1 +fi + + +echo "Adding ugczones column to warning tables" +${PSQL} -U awips -d metadata -f ${SQL_SCRIPT} +if [ $? -ne 0 ]; then + echo "FATAL: the update has failed!" + exit 1 +fi + +TABLES="practicewarning warning" +for table in $TABLES +do + echo + echo "Querying for $table ugc zones" + RETRIEVE_UGC_ZONES_SQL="SELECT parentwarning, zone FROM warning_ugczone where parentwarning in (select id from $table) order by parentwarning, key" + _ugc_zone_txt="${table}UgcZones.txt" + + ${PSQL} -U awips -d metadata -c "${RETRIEVE_UGC_ZONES_SQL}" -t -o ${_ugc_zone_txt} + if [ $? -ne 0 ]; then + echo "ERROR: Failed to retrieve the ugc zones for $table table." + echo "FATAL: The update has failed." + exit 1 + fi + + echo + echo "Parsing ugc zones for insertion into $table table" + PYTHON_PARSE_SCRIPT="parseUgcZones.py" + if [ ! -f ${PYTHON_PARSE_SCRIPT} ]; then + echo "ERROR: the required python script - ${PYTHON_PARSE_SCRIPT} was not found." + echo "FATAL: the update has failed!" + exit 1 + fi + + ${PYTHON} ${PYTHON_PARSE_SCRIPT} ${table} ${_ugc_zone_txt} + if [ $? -ne 0 ]; then + echo "ERROR: Failed to parse ugc zones." + echo "FATAL: The update has failed." + exit 1 + fi + + echo + echo "Adding ugc zones to $table table" + # ${table}UgcZonesUpdates.sql generated from parseParmIds.py + ${PSQL} -U awips -d metadata -q -f ${table}UgcZonesUpdates.sql + if [ $? -ne 0 ]; then + echo "ERROR: Failed to add ugc zones." + echo "FATAL: The update has failed." + exit 1 + fi +done + +#remove warning_ugczone +echo +echo "Dropping warning_ugczone table" +DROP_TABLE_SQL="DROP TABLE warning_ugczone" + +${PSQL} -U awips -d metadata -c "${DROP_TABLE_SQL}" + +echo +echo "Running full vacuum for warning" +${PSQL} -U awips -d metadata -c "VACUUM FULL VERBOSE ANALYZE warning" diff --git a/edexOsgi/build.edex/esb/data/utility/edex_static/base/config/gfe/serverConfig.py b/edexOsgi/build.edex/esb/data/utility/edex_static/base/config/gfe/serverConfig.py index 5d22246754..bf5c3e4985 100644 --- a/edexOsgi/build.edex/esb/data/utility/edex_static/base/config/gfe/serverConfig.py +++ b/edexOsgi/build.edex/esb/data/utility/edex_static/base/config/gfe/serverConfig.py @@ -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. diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml index aa2189f3d1..b849bac804 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml @@ -295,6 +295,13 @@ value="com.raytheon.uf.common.dataplugin.gfe.request.GetSelectTimeRangeRequest" /> + + + + + diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/config/GFESiteActivation.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/config/GFESiteActivation.java index f5c1fdf364..ac19cd6994 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/config/GFESiteActivation.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/config/GFESiteActivation.java @@ -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 * * * @@ -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(); } } } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFED2DDao.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFED2DDao.java index 4fb1d08c31..91f6a9b463 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFED2DDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFED2DDao.java @@ -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. * * * @@ -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 firstTry = (List) 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 secondTry = (List) 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; } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParmManager.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParmManager.java index 53e5cc9059..b9e52aef28 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParmManager.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/GridParmManager.java @@ -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 * * * @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()); } @@ -981,7 +982,13 @@ public class GridParmManager { public static ServerResponse> getParmList(DatabaseID id) { ServerResponse> sr = new ServerResponse>(); 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 deletions = new ArrayList(prevInventory); deletions.removeAll(newInventory); - createDbNotification(siteID, newInventory, additions, deletions); + createDbNotification(siteID, additions, deletions); } private static void createDbNotification(String siteID, - List dbs, List additions, - List deletions) { + List additions, List deletions) { if (!additions.isEmpty() || !deletions.isEmpty()) { - DBInvChangeNotification notify = new DBInvChangeNotification(dbs, + DBInvChangeNotification notify = new DBInvChangeNotification( additions, deletions, siteID); SendNotifications.send(notify); } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/D2DGridDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/D2DGridDatabase.java index 6d0bf1cf3e..4d398756e0 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/D2DGridDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/D2DGridDatabase.java @@ -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 * * * @@ -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 levels; + private Level getD2DLevel(String gfeLevel) { + List 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; diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/D2DSatDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/D2DSatDatabase.java index 5e0c44183b..c8c820f0a5 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/D2DSatDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/D2DSatDatabase.java @@ -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 * * * @@ -191,11 +192,6 @@ public class D2DSatDatabase extends VGridDatabase { return null; } - @Override - public void updateDbs() { - // no op - } - /* * (non-Javadoc) * diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/GridDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/GridDatabase.java index 57bcb9bfbb..e4c26945b3 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/GridDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/GridDatabase.java @@ -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 * * * @author bphillip @@ -505,8 +506,6 @@ public abstract class GridDatabase { } - public abstract void updateDbs(); - /** * Return the internally cache'd parmID for this database implementation. * diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java index 809dbfb19e..a44ad62234 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java @@ -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 * * * @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 parmInfoUser = new HashMap(); Map parmStorageInfoUser = new HashMap(); diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/VGridDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/VGridDatabase.java index 51772bce0a..908870efe5 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/VGridDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/VGridDatabase.java @@ -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 * * * @@ -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 getValidTimes() throws GfeException, DataAccessLayerException; } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/CreateNewDbHandler.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/CreateNewDbHandler.java new file mode 100644 index 0000000000..ef1ee703d1 --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/CreateNewDbHandler.java @@ -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 + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * May 2, 2013      #1969  randerso     Initial creation
+ * May 3, 2013      #1969  randerso     Code review comment incorporation
+ * 
+ * 
+ * + * @author randerso + * @version 1.0 + */ + +public class CreateNewDbHandler implements IRequestHandler { + + /* + * (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()); + } + +} diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetParmListHandler.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetParmListHandler.java index 3a55be3ada..7ad7b2d2a6 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetParmListHandler.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/handler/GetParmListHandler.java @@ -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 * * * @author bphillip @@ -52,8 +53,11 @@ public class GetParmListHandler implements IRequestHandler { ServerResponse> sr = new ServerResponse>(); for (DatabaseID id : request.getDbIds()) { ServerResponse> ssr = GridParmManager.getParmList(id); - retVal.addAll(ssr.getPayload()); - sr.addMessages(ssr); + if (ssr.isOkay()) { + retVal.addAll(ssr.getPayload()); + } else { + sr.addMessages(ssr); + } } if (sr.isOkay()) { sr.setPayload(retVal); diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/notify/GfeIngestNotificationFilter.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/notify/GfeIngestNotificationFilter.java index e3df8fd6da..fb74c8bfbb 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/notify/GfeIngestNotificationFilter.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/notify/GfeIngestNotificationFilter.java @@ -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 * * * @@ -165,8 +166,7 @@ public class GfeIngestNotificationFilter { fullInv.add(dbId); newDbs.add(dbId); GfeNotification dbInv = new DBInvChangeNotification( - fullInv, Arrays.asList(dbId), - new ArrayList(0), site); + Arrays.asList(dbId), null, site); sendNotification(dbInv); } diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/common_static/base/parameter/alias/gfeParamName.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/common_static/base/parameter/alias/gfeParamName.xml index 0641151bfb..f4a73ab2cd 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/common_static/base/parameter/alias/gfeParamName.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/common_static/base/parameter/alias/gfeParamName.xml @@ -2,6 +2,8 @@ av @@ -265,142 +267,95 @@ tmean totsn tp120hr - tp12c1 - tp12c2 - tp12c3 - tp12c4 - tp12c5 - tp12c6 - tp12c7 - tp12c8 + tp12c1 + tp12c2 + tp12c3 + tp12c4 + tp12c5 + tp12c6 + tp12c7 + tp12c8 tpmean12 tpsprd12 - tp24c1 - tp24c2 - tp24c3 - tp24c4 - tp24c5 - tp24c6 - tp24c7 - tp24c8 + tp24c1 + tp24c2 + tp24c3 + tp24c4 + tp24c5 + tp24c6 + tp24c7 + tp24c8 tpmean24 tpsprd24 - tp3c1 - tp3c2 - tp3c3 - tp3c4 - tp3c5 - tp3c6 - tp3c7 - tp3c8 + tp3c1 + tp3c2 + tp3c3 + tp3c4 + tp3c5 + tp3c6 + tp3c7 + tp3c8 tpmean3 tpsprd3 - tp6c1 - tp6c2 - tp6c3 - tp6c4 - tp6c5 - tp6c6 - tp6c7 - tp6c8 + tp6c1 + tp6c2 + tp6c3 + tp6c4 + tp6c5 + tp6c6 + tp6c7 + tp6c8 tpmean6 tpsprd6 - tp_ACR - tp_ACR - tp_ALR - tp_ALR - PSurge4Ft + tp_ACR + tp_ALR PSurge4Ft - PSurge5Ft PSurge5Ft - PSurge6Ft PSurge6Ft - Surge20Pct Surge20Pct - PSurge7Ft PSurge7Ft - PSurge8Ft PSurge8Ft - PSurge9Ft PSurge9Ft - PSurge10Ft PSurge10Ft - Surge30Pct Surge30Pct - PSurge11Ft PSurge11Ft - PSurge12Ft PSurge12Ft - PSurge13Ft PSurge13Ft - Surge40Pct Surge40Pct - PSurge14Ft PSurge14Ft - PSurge15Ft PSurge15Ft - PSurge16Ft PSurge16Ft - Surge50Pct Surge50Pct - PSurge17Ft PSurge17Ft - PSurge18Ft PSurge18Ft - PSurge19Ft PSurge19Ft - Surge60Pct Surge60Pct - PSurge20Ft PSurge20Ft - PSurge2Ft PSurge2Ft - PSurge21Ft PSurge21Ft - PSurge22Ft PSurge22Ft - PSurge23Ft PSurge23Ft - Surge70Pct Surge70Pct - PSurge24Ft PSurge24Ft - PSurge25Ft PSurge25Ft - Surge80Pct Surge80Pct - Surge90Pct Surge90Pct - PSurge3Ft PSurge3Ft - SloshSurge SloshSurge Surge10Pct - tp_ecmwf - tp_FWR - tp_FWR - tp_HPC - tp_HPC - tp_KRF - tp_KRF - tp_MSR - tp_MSR - tp_ORN - tp_ORN - tp_PTR - tp_PTR - tp_RHA - tp_RHA - tp_RSA - tp_RSA - tp_STR - tp_STR - tp_TAR - tp_TAR - tp_TIR - tp_TIR - tp_TUA - tp_TUA + tp_ecmwf + tp_FWR + tp_HPC + tp_KRF + tp_MSR + tp_ORN + tp_PTR + tp_RHA + tp_RSA + tp_STR + tp_TAR + tp_TIR + tp_TUA tpw tsprd ttot diff --git a/edexOsgi/com.raytheon.edex.plugin.warning/WarningDecoder.py b/edexOsgi/com.raytheon.edex.plugin.warning/WarningDecoder.py index ec9e5d4f28..342ce0333b 100644 --- a/edexOsgi/com.raytheon.edex.plugin.warning/WarningDecoder.py +++ b/edexOsgi/com.raytheon.edex.plugin.warning/WarningDecoder.py @@ -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] diff --git a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/ActiveTableRecord.java b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/ActiveTableRecord.java index 3328c3d31c..eb68d705d3 100644 --- a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/ActiveTableRecord.java +++ b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/ActiveTableRecord.java @@ -24,12 +24,12 @@ import java.util.Calendar; import java.util.List; import javax.persistence.Column; -import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.MappedSuperclass; import javax.persistence.Transient; import org.hibernate.annotations.Type; @@ -51,22 +51,23 @@ import com.vividsolutions.jts.geom.Geometry; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 24, 2009 njensen Initial creation - * Feb 26, 2013 1447 dgilling Implement equals(). - * + * Feb 26, 2013 1447 dgilling Implement equals(). + * May 10, 2013 1951 rjpeter Added own id sequence tagging * * * @author njensen * @version 1.0 */ - -@Entity +@MappedSuperclass @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @DynamicSerialize public abstract class ActiveTableRecord extends PersistableDataObject { protected static final long serialVersionUID = 1L; - @GeneratedValue(strategy = GenerationType.AUTO) + protected static final String ID_GEN = "idgen"; + + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_GEN) @Id protected int id; @@ -1079,7 +1080,7 @@ public abstract class ActiveTableRecord extends PersistableDataObject { atr.setWmoid(wr.getWmoid()); atr.setXxxid(wr.getXxxid()); - for (String ugc : wr.getUgcsString()) { + for (String ugc : wr.getUgcZones()) { ActiveTableRecord ugcRecord = (ActiveTableRecord) atr.clone(); ugcRecord.setUgcZone(ugc); list.add(ugcRecord); diff --git a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/OperationalActiveTableRecord.java b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/OperationalActiveTableRecord.java index b157bf8c3f..44a7efcff6 100644 --- a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/OperationalActiveTableRecord.java +++ b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/OperationalActiveTableRecord.java @@ -20,12 +20,15 @@ package com.raytheon.uf.common.activetable; import javax.persistence.Entity; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; +import org.hibernate.annotations.Index; + import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** - * TODO Add Description + * Operational Active Table, separated so that practice and operational data go to separate tables. * *
  * 
@@ -33,7 +36,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Feb 10, 2010            njensen     Initial creation
- * 
+ * May 10, 2013 1951       rjpeter     Added own id sequence tagging and new index.
  * 
* * @author njensen @@ -41,8 +44,11 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; */ @Entity +@SequenceGenerator(initialValue = 1, name = ActiveTableRecord.ID_GEN, sequenceName = "activetableseq") @Table(name = "activetable") @DynamicSerialize +@org.hibernate.annotations.Table(appliesTo = "activetable", indexes = { @Index(name = "activetable_officeid_phensig_idx", columnNames = { + "officeid", "phensig" }) }) public class OperationalActiveTableRecord extends ActiveTableRecord implements Cloneable { diff --git a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/PracticeActiveTableRecord.java b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/PracticeActiveTableRecord.java index 67a4792e22..fc419204be 100644 --- a/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/PracticeActiveTableRecord.java +++ b/edexOsgi/com.raytheon.uf.common.activetable/src/com/raytheon/uf/common/activetable/PracticeActiveTableRecord.java @@ -20,12 +20,15 @@ package com.raytheon.uf.common.activetable; import javax.persistence.Entity; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; +import org.hibernate.annotations.Index; + import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** - * TODO Add Description + * Practice Active Table, separated so that practice and operational data go to separate tables. * *
  * 
@@ -33,7 +36,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Feb 10, 2010            njensen     Initial creation
- * 
+ * May 10, 2013 1951       rjpeter     Added own id sequence tagging and new index.
  * 
* * @author njensen @@ -41,8 +44,11 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; */ @Entity +@SequenceGenerator(initialValue = 1, name = ActiveTableRecord.ID_GEN, sequenceName = "practice_activetableseq") @Table(name = "practice_activetable") @DynamicSerialize +@org.hibernate.annotations.Table(appliesTo = "practice_activetable", indexes = { @Index(name = "practice_activetable_officeid_phensig_idx", columnNames = { + "officeid", "phensig" }) }) public class PracticeActiveTableRecord extends ActiveTableRecord implements Cloneable { diff --git a/edexOsgi/com.raytheon.uf.common.base.feature/feature.xml b/edexOsgi/com.raytheon.uf.common.base.feature/feature.xml index 90d49c86ea..784aa537bb 100644 --- a/edexOsgi/com.raytheon.uf.common.base.feature/feature.xml +++ b/edexOsgi/com.raytheon.uf.common.base.feature/feature.xml @@ -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"/> = 0) { - os.write(buffer, 0, numRead); - } - bytes = os.toByteArray(); - map = (Map) SerializationUtil - .transformFromThrift(Map.class, bytes); - // save them back the new way. - persistGeometryMap(dataKey, cwa, huc, map); - } else { - Map serializableMap = (Map) SerializationUtil - .transformFromThrift(Map.class, bytes); - FloatWKBReader reader = new FloatWKBReader( - new GeometryFactory()); - map = new HashMap( - serializableMap.size()); - for (Entry entry : serializableMap - .entrySet()) { - InputStream in = new ByteArrayInputStream( - entry.getValue()); - Geometry geom = reader.readGeometry(in); - map.put(entry.getKey(), geom); - } - } + map = (Map) SerializationUtil + .transformFromThrift(FileUtil.file2bytes( + f.getFile(), true)); int sizeGuess = Math.max( Math.abs(pfafs.size() - map.size()), 10); pfafsToGenerate = new ArrayList(sizeGuess); @@ -389,23 +347,13 @@ public class HucLevelGeometriesFactory { protected synchronized void persistGeometryMap(String dataKey, String cwa, String huc, Map 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 serializableMap = new HashMap(); - for (Entry 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, diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/CreateNewDbRequest.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/CreateNewDbRequest.java new file mode 100644 index 0000000000..0967f781da --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/request/CreateNewDbRequest.java @@ -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 + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * May 2, 2013      #1969  randerso     Initial creation
+ * 
+ * 
+ * + * @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; + } +} diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/notify/DBInvChangeNotification.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/notify/DBInvChangeNotification.java index 8c22392772..2a85b77ecc 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/notify/DBInvChangeNotification.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/server/notify/DBInvChangeNotification.java @@ -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 * * * @@ -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 inventory = new ArrayList(); - /** The additions to the database inventory */ - @DynamicSerializeElement - private List additions = new ArrayList(); + private List additions = Collections.emptyList(); /** The deletions to the database inventory */ - @DynamicSerializeElement - private List deletions = new ArrayList(); + private List 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 inventory, - List additions, List deletions, - String siteId) { - // super(siteId); - this.inventory = inventory; - this.additions = additions; - this.deletions = deletions; - this.siteID = siteId; + public DBInvChangeNotification(List additions, + List deletions, String siteId) { + super(siteId); + + if (additions != null) { + this.additions = additions; + } + + if (deletions != null) { + this.deletions = deletions; + } } @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 getInventory() { - return inventory; - } - - /** - * @param inventory - * the inventory to set - */ - public void setInventory(List inventory) { - this.inventory = inventory; - } - /** * @return the additions */ diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject index d8b9b376f6..04a1422726 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -1,4 +1,4 @@ -com.raytheon.uf.common.dataplugin.warning.UGCZone +com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord com.raytheon.uf.common.dataplugin.warning.WarningRecord com.raytheon.uf.common.dataplugin.warning.PracticeWarningRecord com.raytheon.uf.common.dataplugin.warning.config.WarngenConfiguration diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/AbstractWarningRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/AbstractWarningRecord.java index 76ec98bf6c..495421f5fd 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/AbstractWarningRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/AbstractWarningRecord.java @@ -20,39 +20,29 @@ package com.raytheon.uf.common.dataplugin.warning; +import java.util.Arrays; import java.util.Calendar; -import java.util.HashSet; -import java.util.List; +import java.util.LinkedHashSet; import java.util.Set; +import java.util.regex.Pattern; -import javax.persistence.CascadeType; import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; -import javax.persistence.OneToMany; +import javax.persistence.MappedSuperclass; import javax.persistence.SequenceGenerator; import javax.persistence.Transient; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import org.hibernate.annotations.Index; import org.hibernate.annotations.Type; import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; -import com.raytheon.uf.common.serialization.adapters.GeometryAdapter; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.vividsolutions.jts.geom.Geometry; /** - * * Warning Record * *
@@ -61,202 +51,171 @@ import com.vividsolutions.jts.geom.Geometry;
  * ------------ ----------  ----------- --------------------------
  * 03/12/2007   1003        bwoodle     initial creation
  * 04/12/2013   1857        bgonzale    Added SequenceGenerator annotation.
- * 
+ * 05/02/2013   1949        rjpeter     Moved ugcZones to be a column inside table.
  * 
* * @author bwoodle * @version 1 */ -@Entity +@MappedSuperclass @SequenceGenerator(name = PluginDataObject.ID_GEN) @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public abstract class AbstractWarningRecord extends PluginDataObject { + private static final Pattern ugcSplitter = Pattern.compile(", "); private static final long serialVersionUID = 1L; @DataURI(position = 1) @Column(length = 32) - @XmlAttribute @DynamicSerializeElement private String wmoid; @DataURI(position = 2) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String pil; @DataURI(position = 3) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String xxxid; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String countyheader; - @XmlElement + @Column(name = "ugczones", columnDefinition = "text") @DynamicSerializeElement - @OneToMany(cascade = CascadeType.ALL, mappedBy = "parentWarning", fetch = FetchType.EAGER) - protected Set ugczones = new HashSet(); + protected String ugcZoneList; + + @Transient + protected Set ugcZones; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String vtecstr; @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String productClass; @DataURI(position = 4) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String act; @Column(length = 8) - @XmlAttribute @DynamicSerializeElement - @Index(name = "query_index", columnNames = { "officeid", "phensig" }) private String officeid; @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String phen; @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String sig; @DataURI(position = 5) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String etn; /** vtec start time */ - @XmlAttribute @DynamicSerializeElement + @Column private Calendar startTime; @Column - @XmlAttribute @DynamicSerializeElement private Calendar endTime; @Column - @XmlAttribute @DynamicSerializeElement private Calendar issueTime; @Column - @XmlAttribute @DynamicSerializeElement private Calendar purgeTime; @Column(length = 8) - @XmlAttribute @DynamicSerializeElement private boolean ufn; @Column(name = "geometry", columnDefinition = "geometry") @Type(type = "com.raytheon.edex.db.objects.hibernate.GeometryType") - @XmlJavaTypeAdapter(value = GeometryAdapter.class) @DynamicSerializeElement private Geometry geometry; @Transient - @XmlAttribute @DynamicSerializeElement private String forecaster = ""; @Column - @XmlAttribute @DynamicSerializeElement private Integer motdir; @Column - @XmlAttribute @DynamicSerializeElement private Integer motspd; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String loc; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String rawmessage; @DataURI(position = 6) @Column - @XmlAttribute @DynamicSerializeElement private int seg; @DataURI(position = 7) @Column(length = 4) - @XmlAttribute @DynamicSerializeElement private String phensig; @Transient - @XmlAttribute @DynamicSerializeElement private String region; @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String overviewText; /** segment text */ @Column(columnDefinition = "text") - @XmlAttribute @DynamicSerializeElement private String segText; @Column(length = 8) - @XmlAttribute @DynamicSerializeElement private String locationID; @Column(length = 2) - @XmlAttribute @DynamicSerializeElement private String floodSeverity; - @XmlAttribute + @Column @DynamicSerializeElement private String immediateCause; @Column(length = 2) - @XmlAttribute @DynamicSerializeElement private String floodRecordStatus; @Column - @XmlAttribute @DynamicSerializeElement private Calendar floodBegin; @Column - @XmlAttribute @DynamicSerializeElement private Calendar floodCrest; @Column - @XmlAttribute @DynamicSerializeElement private Calendar floodEnd; @@ -280,7 +239,6 @@ public abstract class AbstractWarningRecord extends PluginDataObject { this.setForecaster(old.getForecaster()); this.setGeometry(old.getGeometry()); this.setGeometry(old.getGeometry()); - this.setIdentifier(old.getIdentifier()); this.setInsertTime(old.getInsertTime()); this.setIssueTime(old.getIssueTime()); this.setLoc(old.getLoc()); @@ -315,7 +273,6 @@ public abstract class AbstractWarningRecord extends PluginDataObject { */ public AbstractWarningRecord(String uri) { super(uri); - identifier = java.util.UUID.randomUUID().toString(); } @Override @@ -553,21 +510,6 @@ public abstract class AbstractWarningRecord extends PluginDataObject { this.purgeTime = purgeTime; } - /** - * @return the ugczones - */ - public Set getUgczones() { - return ugczones; - } - - /** - * @param ugczones - * the ugczones to set - */ - public void setUgczones(Set ugczones) { - this.ugczones = ugczones; - } - /** * @return the region */ @@ -688,8 +630,6 @@ public abstract class AbstractWarningRecord extends PluginDataObject { this.floodEnd = floodEnd; } - public abstract void setUgcs(List list); - /** * @return the ufn */ @@ -735,13 +675,40 @@ public abstract class AbstractWarningRecord extends PluginDataObject { this.segText = segText; } - public String[] getUgcsString() { - String[] s = new String[ugczones.size()]; - UGCZone[] ugcs = ugczones.toArray(new UGCZone[ugczones.size()]); - for (int i = 0; i < ugcs.length; i++) { - s[i] = ugcs[i].getZone(); + public void setUgcZones(Set list) { + ugcZones = new LinkedHashSet(list); + StringBuilder builder = new StringBuilder(ugcZones.size() * 8); + boolean addComma = false; + for (String ugc : list) { + if (addComma) { + builder.append(", "); + } else { + addComma = true; + } + builder.append(ugc); } - return s; + ugcZoneList = builder.toString(); } + public Set getUgcZones() { + if (ugcZones == null) { + ugcZones = new LinkedHashSet(); + + if ((ugcZoneList != null) && (ugcZoneList.length() > 0)) { + String[] zones = ugcSplitter.split(ugcZoneList); + ugcZones.addAll(Arrays.asList(zones)); + } + } + + return ugcZones; + } + + public String getUgcZoneList() { + return ugcZoneList; + } + + public void setUgcZoneList(String ugcZoneList) { + this.ugcZoneList = ugcZoneList; + this.ugcZones = null; + } } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java index 63de41ab95..c4ede7e9b4 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/PracticeWarningRecord.java @@ -20,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; @@ -46,9 +41,10 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 10/04/2011 10049 bgonzale initial creation - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * 10/04/2011 10049 bgonzale initial creation + * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime + * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * May 02, 2013 1949 rjpeter Removed ugcZones. * 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 list) { - ugczones.clear(); - for (String s : list) { - ugczones.add(new UGCZone(s, this)); - } - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/UGCZone.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/UGCZone.java deleted file mode 100644 index 632ddbf1bd..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/UGCZone.java +++ /dev/null @@ -1,137 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.uf.common.dataplugin.warning; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; - -import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -/** - * UGC Zones are part of Warning Records. This class will be utilized by the - * Warning Decoder. - * - *
- * SOFTWARE HISTORY
- * Date			Ticket#		Engineer	Description
- * ------------	----------	-----------	--------------------------
- * Jun 12, 2008				bwoodle	Initial creation
- * 
- * 
- * - * @author bwoodle - * @version 1.0 - */ -@Entity -@Table(name = "warning_ugczone") -@XmlAccessorType(XmlAccessType.NONE) -@DynamicSerialize -public class UGCZone extends PersistableDataObject implements - ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue - @XmlAttribute - @DynamicSerializeElement - private Integer key; - - @Column(length = 8) - @XmlAttribute - @DynamicSerializeElement - private String zone; - - @ManyToOne - @JoinColumn(name = "parentWarning", nullable = false) - private AbstractWarningRecord parentWarning; - - public UGCZone() { - } - - public UGCZone(String zone) { - this.zone = zone; - } - - public UGCZone(String zone, AbstractWarningRecord warning) { - this.zone = zone; - parentWarning = warning; - } - - public String toString() { - return zone; - } - - /** - * @return the key - */ - public Integer getKey() { - return key; - } - - /** - * @param key - * the key to set - */ - public void setKey(Integer key) { - this.key = key; - } - - /** - * @return the zone - */ - public String getZone() { - return zone; - } - - /** - * @param zone - * the zone to set - */ - public void setZone(String zone) { - this.zone = zone; - } - - /** - * @return the parentWarning - */ - public AbstractWarningRecord getParentWarning() { - return parentWarning; - } - - /** - * @param parentWarning - * the parentWarning to set - */ - public void setParentWarning(AbstractWarningRecord parentWarning) { - this.parentWarning = parentWarning; - } -} diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java index 517aa49af0..aa8859a38e 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/WarningRecord.java @@ -21,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; @@ -49,32 +45,28 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 03/12/2007 1003 bwoodle initial creation - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime + * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. + * May 02, 2013 1949 rjpeter Removed ugcZones. * May 07, 2013 1869 bsteffen Remove dataURI column from * PluginDataObject. - * * * * @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 unknownMap = new HashMap(); - 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 list) { - ugczones.clear(); - for (String s : list) { - ugczones.add(new UGCZone(s, this)); - } - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/util/GeometryUtil.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/util/GeometryUtil.java index ba51bde91d..0f7eb99cb2 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/util/GeometryUtil.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/util/GeometryUtil.java @@ -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. * * * @@ -93,7 +94,7 @@ public class GeometryUtil { GeometryFactory gf = new GeometryFactory(); List intersection = new ArrayList( 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 intersections) { + List 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 intersection = new ArrayList( 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 intersections) { + List 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); } } } diff --git a/edexOsgi/com.raytheon.uf.tools.cli/.pydevproject b/edexOsgi/com.raytheon.uf.tools.cli/.pydevproject index faf12629d9..f4a659751e 100644 --- a/edexOsgi/com.raytheon.uf.tools.cli/.pydevproject +++ b/edexOsgi/com.raytheon.uf.tools.cli/.pydevproject @@ -2,6 +2,6 @@ -python 2.5 +python 2.7 Default diff --git a/rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0 b/rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0 index b82e9345a0..64df514a2f 100644 --- a/rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0 +++ b/rpms/awips2.qpid/0.18/SPECS/qpid-java.spec.patch0 @@ -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 - 0.18-2 ---- 122,233 ---- +--- 123,234 ---- cd .. diff --git a/rpms/legal/FOSS_licenses/qpid/gentools/lib/LICENSE~omaha_13.4.1 b/rpms/legal/FOSS_licenses/qpid/gentools/lib/LICENSE~omaha_13.4.1 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rpms/legal/FOSS_licenses/werkzeug/LICENSE.txt b/rpms/legal/FOSS_licenses/werkzeug/LICENSE.txt index 2edc73e491..499639ed74 100644 --- a/rpms/legal/FOSS_licenses/werkzeug/LICENSE.txt +++ b/rpms/legal/FOSS_licenses/werkzeug/LICENSE.txt @@ -1,29 +1,29 @@ -Copyright (c) 2010 by the Werkzeug Team, see AUTHORS for more details. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2010 by the Werkzeug Team, see AUTHORS for more details. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.