Issue #1774 Fix D2D accumulative parameter time ranges
Change-Id: I57b32881a30e89c999dae6db7753da83f9e949c1 Former-commit-id: aee839a85ec68c7eb80ef1e7236af6cb4666372b
This commit is contained in:
parent
29c5918428
commit
5bb47b7931
28 changed files with 1959 additions and 1283 deletions
|
@ -100,6 +100,7 @@ import com.raytheon.viz.gfe.core.parm.vcparm.VCModuleJobPool;
|
||||||
* use in PngWriter
|
* use in PngWriter
|
||||||
* 01/22/2013 #1515 dgilling Increase default size of VCModule thread pool
|
* 01/22/2013 #1515 dgilling Increase default size of VCModule thread pool
|
||||||
* to decrease UI hang-ups waiting for results.
|
* to decrease UI hang-ups waiting for results.
|
||||||
|
* 03/20/2013 #1774 randerso Code cleanup
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -243,7 +244,7 @@ public abstract class AbstractParmManager implements IParmManager {
|
||||||
|
|
||||||
protected DatabaseID productDB;
|
protected DatabaseID productDB;
|
||||||
|
|
||||||
protected List<DatabaseID> availableDatabases;
|
protected Set<DatabaseID> availableDatabases;
|
||||||
|
|
||||||
protected final DatabaseID mutableDb;
|
protected final DatabaseID mutableDb;
|
||||||
|
|
||||||
|
@ -320,26 +321,16 @@ public abstract class AbstractParmManager implements IParmManager {
|
||||||
|
|
||||||
dbCategories = Arrays.asList(prefs.getStringArray("dbTypes"));
|
dbCategories = Arrays.asList(prefs.getStringArray("dbTypes"));
|
||||||
|
|
||||||
this.availableDatabases = getDatabaseInventory();
|
this.availableDatabases = new HashSet<DatabaseID>(
|
||||||
|
getDatabaseInventory());
|
||||||
|
|
||||||
this.dbInvChangeListener = new AbstractGFENotificationObserver<DBInvChangeNotification>(
|
this.dbInvChangeListener = new AbstractGFENotificationObserver<DBInvChangeNotification>(
|
||||||
DBInvChangeNotification.class) {
|
DBInvChangeNotification.class) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notify(DBInvChangeNotification notificationMessage) {
|
public void notify(DBInvChangeNotification notificationMessage) {
|
||||||
|
updatedDatabaseList(notificationMessage.getDeletions(),
|
||||||
List<DatabaseID> newInventory;
|
notificationMessage.getAdditions());
|
||||||
List<DatabaseID> additions = new ArrayList<DatabaseID>();
|
|
||||||
List<DatabaseID> deletions = new ArrayList<DatabaseID>();
|
|
||||||
|
|
||||||
newInventory = filterDbIds(notificationMessage.getInventory());
|
|
||||||
additions.addAll(newInventory);
|
|
||||||
additions.removeAll(availableDatabases);
|
|
||||||
deletions.addAll(availableDatabases);
|
|
||||||
deletions.removeAll(newInventory);
|
|
||||||
availableDatabases = newInventory;
|
|
||||||
|
|
||||||
updatedDatabaseList(availableDatabases, deletions, additions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -1862,15 +1853,16 @@ public abstract class AbstractParmManager implements IParmManager {
|
||||||
* The list of available parms is updated based on the list of additions and
|
* The list of available parms is updated based on the list of additions and
|
||||||
* deletions.
|
* deletions.
|
||||||
*
|
*
|
||||||
* @param newList
|
|
||||||
* The full inventory, including new additions and deletions
|
|
||||||
* @param deletions
|
* @param deletions
|
||||||
* The items being removed from the inventory
|
* The items being removed from the inventory
|
||||||
* @param additions
|
* @param additions
|
||||||
* The items being added from the inventory
|
* The items being added from the inventory
|
||||||
*/
|
*/
|
||||||
public void updatedDatabaseList(List<DatabaseID> newList,
|
public void updatedDatabaseList(List<DatabaseID> deletions,
|
||||||
List<DatabaseID> deletions, List<DatabaseID> additions) {
|
List<DatabaseID> additions) {
|
||||||
|
availableDatabases.addAll(additions);
|
||||||
|
availableDatabases.removeAll(deletions);
|
||||||
|
|
||||||
List<ParmID> toDelete = new ArrayList<ParmID>();
|
List<ParmID> toDelete = new ArrayList<ParmID>();
|
||||||
|
|
||||||
for (DatabaseID dbId : deletions) {
|
for (DatabaseID dbId : deletions) {
|
||||||
|
|
|
@ -60,6 +60,7 @@ import com.raytheon.uf.common.dataplugin.gfe.slice.VectorGridSlice;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.slice.WeatherGridSlice;
|
import com.raytheon.uf.common.dataplugin.gfe.slice.WeatherGridSlice;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.weather.WeatherKey;
|
import com.raytheon.uf.common.dataplugin.gfe.weather.WeatherKey;
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
import com.raytheon.viz.gfe.Activator;
|
import com.raytheon.viz.gfe.Activator;
|
||||||
import com.raytheon.viz.gfe.core.DataManager;
|
import com.raytheon.viz.gfe.core.DataManager;
|
||||||
import com.raytheon.viz.gfe.core.griddata.DiscreteGridData;
|
import com.raytheon.viz.gfe.core.griddata.DiscreteGridData;
|
||||||
|
@ -82,6 +83,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* 02/04/2008 chammack Initial Creation
|
* 02/04/2008 chammack Initial Creation
|
||||||
|
* 03/20/2013 #1774 randerso Use TimeUtil constants
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -106,10 +108,10 @@ public class MockParmManager extends AbstractParmManager {
|
||||||
"CST6CDT");
|
"CST6CDT");
|
||||||
|
|
||||||
private static final TimeConstraints TC1 = new TimeConstraints(
|
private static final TimeConstraints TC1 = new TimeConstraints(
|
||||||
TimeConstraints.HOUR, TimeConstraints.HOUR, 0);
|
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
|
||||||
|
|
||||||
private static final TimeConstraints TC2 = new TimeConstraints(
|
private static final TimeConstraints TC2 = new TimeConstraints(
|
||||||
13 * TimeConstraints.HOUR, TimeConstraints.DAY, 13);
|
13 * TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_DAY, 13);
|
||||||
|
|
||||||
protected Set<Parm> fullParmSet;
|
protected Set<Parm> fullParmSet;
|
||||||
|
|
||||||
|
@ -662,6 +664,7 @@ public class MockParmManager extends AbstractParmManager {
|
||||||
return gloc;
|
return gloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Parm getParmInExpr(final String exprName, boolean enableTopo) {
|
public Parm getParmInExpr(final String exprName, boolean enableTopo) {
|
||||||
return getParmInExpr(exprName, enableTopo, dataManager
|
return getParmInExpr(exprName, enableTopo, dataManager
|
||||||
.getSpatialDisplayManager().getActivatedParm());
|
.getSpatialDisplayManager().getActivatedParm());
|
||||||
|
@ -795,10 +798,12 @@ public class MockParmManager extends AbstractParmManager {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<DatabaseID> getIscDatabases() {
|
public List<DatabaseID> getIscDatabases() {
|
||||||
return new ArrayList<DatabaseID>();
|
return new ArrayList<DatabaseID>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public ParmID getISCParmID(ParmID pid) {
|
public ParmID getISCParmID(ParmID pid) {
|
||||||
return new ParmID();
|
return new ParmID();
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,15 +30,16 @@ import org.junit.Test;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData;
|
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData.ProjectionType;
|
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData.ProjectionType;
|
||||||
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
|
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DBit;
|
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DBit;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
|
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.slice.ScalarGridSlice;
|
import com.raytheon.uf.common.dataplugin.gfe.slice.ScalarGridSlice;
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
import com.raytheon.viz.gfe.core.parm.MockParm;
|
import com.raytheon.viz.gfe.core.parm.MockParm;
|
||||||
import com.raytheon.viz.gfe.core.wxvalue.ScalarWxValue;
|
import com.raytheon.viz.gfe.core.wxvalue.ScalarWxValue;
|
||||||
import com.vividsolutions.jts.geom.Coordinate;
|
import com.vividsolutions.jts.geom.Coordinate;
|
||||||
|
@ -55,6 +56,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Mar 26, 2008 rbell Initial creation
|
* Mar 26, 2008 rbell Initial creation
|
||||||
|
* Mar 20, 2013 #1774 randerso Use TimeUtil constants
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -106,8 +108,8 @@ public class ScalarGridDataTest {
|
||||||
new Point(4, 4), new Coordinate(45, 30), new Coordinate(9, 9),
|
new Point(4, 4), new Coordinate(45, 30), new Coordinate(9, 9),
|
||||||
"CST6CDT");
|
"CST6CDT");
|
||||||
|
|
||||||
TimeConstraints testTC1 = new TimeConstraints(TimeConstraints.HOUR,
|
TimeConstraints testTC1 = new TimeConstraints(
|
||||||
TimeConstraints.HOUR, 0);
|
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
|
||||||
|
|
||||||
GridParmInfo testGPI1 = new GridParmInfo(testPID1, testGL1,
|
GridParmInfo testGPI1 = new GridParmInfo(testPID1, testGL1,
|
||||||
GridType.SCALAR, "F", "Temperature", -20f, 80f, 2, false,
|
GridType.SCALAR, "F", "Temperature", -20f, 80f, 2, false,
|
||||||
|
|
|
@ -29,15 +29,16 @@ import org.junit.Test;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData;
|
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData.ProjectionType;
|
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData.ProjectionType;
|
||||||
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
|
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DBit;
|
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DBit;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
|
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.slice.VectorGridSlice;
|
import com.raytheon.uf.common.dataplugin.gfe.slice.VectorGridSlice;
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
import com.raytheon.viz.gfe.core.parm.MockParm;
|
import com.raytheon.viz.gfe.core.parm.MockParm;
|
||||||
import com.raytheon.viz.gfe.core.wxvalue.VectorWxValue;
|
import com.raytheon.viz.gfe.core.wxvalue.VectorWxValue;
|
||||||
import com.vividsolutions.jts.geom.Coordinate;
|
import com.vividsolutions.jts.geom.Coordinate;
|
||||||
|
@ -53,7 +54,8 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* SOFTWARE HISTORY
|
* SOFTWARE HISTORY
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Mar 26, 2008 rbell Initial creation
|
* Mar 26, 2008 rbell Initial creation
|
||||||
|
* Mar 20, 2013 #1774 randerso Use TimeUtil constants
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -66,8 +68,8 @@ public class VectorGridDataTest {
|
||||||
private final float testFA1[] = new float[145 * 145];
|
private final float testFA1[] = new float[145 * 145];
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 145 * 145; i++) {
|
for (int i = 0; i < 145 * 145; i++) {
|
||||||
this.testFA1[i] = (float) (i + (i / (Math.pow(10.0, (i + "")
|
this.testFA1[i] = (float) (i + (i / (Math.pow(10.0,
|
||||||
.length()))));
|
(i + "").length()))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +106,7 @@ public class VectorGridDataTest {
|
||||||
"CST6CDT");
|
"CST6CDT");
|
||||||
|
|
||||||
private final TimeConstraints testTC1 = new TimeConstraints(
|
private final TimeConstraints testTC1 = new TimeConstraints(
|
||||||
TimeConstraints.HOUR, TimeConstraints.HOUR, 0);
|
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
|
||||||
|
|
||||||
private final GridParmInfo testGPI1 = new GridParmInfo(this.testPID1,
|
private final GridParmInfo testGPI1 = new GridParmInfo(this.testPID1,
|
||||||
this.testGL1, GridType.VECTOR, "F", "Temperature", -20f, 80f, 2,
|
this.testGL1, GridType.VECTOR, "F", "Temperature", -20f, 80f, 2,
|
||||||
|
|
|
@ -42,6 +42,7 @@ import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice;
|
import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.slice.ScalarGridSlice;
|
import com.raytheon.uf.common.dataplugin.gfe.slice.ScalarGridSlice;
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
import com.raytheon.viz.gfe.GFEOperationFailedException;
|
import com.raytheon.viz.gfe.GFEOperationFailedException;
|
||||||
import com.raytheon.viz.gfe.core.DataManager;
|
import com.raytheon.viz.gfe.core.DataManager;
|
||||||
import com.raytheon.viz.gfe.core.griddata.AbstractGridData;
|
import com.raytheon.viz.gfe.core.griddata.AbstractGridData;
|
||||||
|
@ -64,6 +65,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* 02/21/2008 chammack Initial Creation
|
* 02/21/2008 chammack Initial Creation
|
||||||
|
* 03/20/2013 #1774 randerso Use TimeUtil constants
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -84,7 +86,7 @@ public class TestParm {
|
||||||
"CST6CDT");
|
"CST6CDT");
|
||||||
|
|
||||||
private static final TimeConstraints TC1 = new TimeConstraints(
|
private static final TimeConstraints TC1 = new TimeConstraints(
|
||||||
TimeConstraints.HOUR, TimeConstraints.HOUR, 0);
|
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
|
||||||
|
|
||||||
private static GridParmInfo gpi;
|
private static GridParmInfo gpi;
|
||||||
|
|
||||||
|
@ -136,7 +138,7 @@ public class TestParm {
|
||||||
"CST6CDT");
|
"CST6CDT");
|
||||||
|
|
||||||
private final TimeConstraints testTC1 = new TimeConstraints(
|
private final TimeConstraints testTC1 = new TimeConstraints(
|
||||||
TimeConstraints.HOUR, TimeConstraints.HOUR, 0);
|
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
|
||||||
|
|
||||||
private final GridParmInfo testGPI1 = new GridParmInfo(this.testPID1,
|
private final GridParmInfo testGPI1 = new GridParmInfo(this.testPID1,
|
||||||
this.testGL1, GridType.SCALAR, "F", "Temperature", -20f, 80f, 2,
|
this.testGL1, GridType.SCALAR, "F", "Temperature", -20f, 80f, 2,
|
||||||
|
|
|
@ -34,7 +34,6 @@ import java.util.regex.Pattern;
|
||||||
|
|
||||||
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
|
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
|
||||||
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
|
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
|
||||||
import com.raytheon.edex.plugin.gfe.db.dao.GFEDao;
|
|
||||||
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
||||||
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
|
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.D2DGridDatabase;
|
||||||
|
@ -47,6 +46,7 @@ import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.exception.GfeException;
|
import com.raytheon.uf.common.dataplugin.gfe.exception.GfeException;
|
||||||
|
import com.raytheon.uf.common.dataplugin.gfe.server.message.ServerResponse;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
|
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
|
||||||
import com.raytheon.uf.common.message.WsId;
|
import com.raytheon.uf.common.message.WsId;
|
||||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
|
@ -70,6 +70,8 @@ import com.raytheon.uf.edex.site.SiteAwareRegistry;
|
||||||
* D2DParmIdCache toGfeIngestNotificationFilter.
|
* D2DParmIdCache toGfeIngestNotificationFilter.
|
||||||
* Added code to match wind components and send
|
* Added code to match wind components and send
|
||||||
* GridUpdateNotifications.
|
* GridUpdateNotifications.
|
||||||
|
* Mar 20, 2013 #1774 randerso Changde to use GFDD2DDao
|
||||||
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author bphillip
|
* @author bphillip
|
||||||
|
@ -308,7 +310,6 @@ public class D2DParmIdCache {
|
||||||
"Building D2DParmIdCache for " + siteID + "...");
|
"Building D2DParmIdCache for " + siteID + "...");
|
||||||
IFPServerConfig config = IFPServerConfigManager
|
IFPServerConfig config = IFPServerConfigManager
|
||||||
.getServerConfig(siteID);
|
.getServerConfig(siteID);
|
||||||
GFEDao dao = new GFEDao();
|
|
||||||
Set<ParmID> parmIds = new HashSet<ParmID>();
|
Set<ParmID> parmIds = new HashSet<ParmID>();
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
List<String> d2dModels = config.getD2dModels();
|
List<String> d2dModels = config.getD2dModels();
|
||||||
|
@ -318,8 +319,8 @@ public class D2DParmIdCache {
|
||||||
if ((d2dModelName != null) && (gfeModel != null)) {
|
if ((d2dModelName != null) && (gfeModel != null)) {
|
||||||
List<DatabaseID> dbIds = null;
|
List<DatabaseID> dbIds = null;
|
||||||
try {
|
try {
|
||||||
dbIds = dao.getD2DDatabaseIdsFromDb(d2dModelName,
|
dbIds = D2DGridDatabase.getD2DDatabaseIdsFromDb(config,
|
||||||
gfeModel, siteID);
|
d2dModelName);
|
||||||
} catch (DataAccessLayerException e) {
|
} catch (DataAccessLayerException e) {
|
||||||
throw new PluginException(
|
throw new PluginException(
|
||||||
"Unable to get D2D Database Ids from database!",
|
"Unable to get D2D Database Ids from database!",
|
||||||
|
@ -333,9 +334,14 @@ public class D2DParmIdCache {
|
||||||
|
|
||||||
for (int i = 0; i < versions; i++) {
|
for (int i = 0; i < versions; i++) {
|
||||||
try {
|
try {
|
||||||
parmIds.addAll(dao.getD2DParmIdsFromDb(
|
D2DGridDatabase db = (D2DGridDatabase) GridParmManager
|
||||||
d2dModelName, dbIds.get(i)));
|
.getDb(dbIds.get(i));
|
||||||
} catch (DataAccessLayerException e) {
|
ServerResponse<List<ParmID>> sr = db
|
||||||
|
.getParmList();
|
||||||
|
if (sr.isOkay()) {
|
||||||
|
parmIds.addAll(sr.getPayload());
|
||||||
|
}
|
||||||
|
} catch (GfeException e) {
|
||||||
throw new PluginException(
|
throw new PluginException(
|
||||||
"Error adding parmIds to D2DParmIdCache!!",
|
"Error adding parmIds to D2DParmIdCache!!",
|
||||||
e);
|
e);
|
||||||
|
|
|
@ -34,13 +34,13 @@ import com.google.common.util.concurrent.MoreExecutors;
|
||||||
import com.raytheon.edex.plugin.gfe.cache.d2dparms.D2DParmIdCache;
|
import com.raytheon.edex.plugin.gfe.cache.d2dparms.D2DParmIdCache;
|
||||||
import com.raytheon.edex.plugin.gfe.cache.gridlocations.GridLocationCache;
|
import com.raytheon.edex.plugin.gfe.cache.gridlocations.GridLocationCache;
|
||||||
import com.raytheon.edex.plugin.gfe.cache.ifpparms.IFPParmIdCache;
|
import com.raytheon.edex.plugin.gfe.cache.ifpparms.IFPParmIdCache;
|
||||||
import com.raytheon.edex.plugin.gfe.db.dao.GFEDao;
|
|
||||||
import com.raytheon.edex.plugin.gfe.db.dao.IscSendRecordDao;
|
import com.raytheon.edex.plugin.gfe.db.dao.IscSendRecordDao;
|
||||||
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
||||||
import com.raytheon.edex.plugin.gfe.exception.GfeMissingConfigurationException;
|
import com.raytheon.edex.plugin.gfe.exception.GfeMissingConfigurationException;
|
||||||
import com.raytheon.edex.plugin.gfe.isc.IRTManager;
|
import com.raytheon.edex.plugin.gfe.isc.IRTManager;
|
||||||
import com.raytheon.edex.plugin.gfe.reference.MapManager;
|
import com.raytheon.edex.plugin.gfe.reference.MapManager;
|
||||||
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
|
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.D2DSatDatabaseManager;
|
||||||
import com.raytheon.edex.plugin.gfe.server.database.GridDatabase;
|
import com.raytheon.edex.plugin.gfe.server.database.GridDatabase;
|
||||||
import com.raytheon.edex.plugin.gfe.server.database.NetCDFDatabaseManager;
|
import com.raytheon.edex.plugin.gfe.server.database.NetCDFDatabaseManager;
|
||||||
|
@ -84,6 +84,7 @@ import com.raytheon.uf.edex.site.ISiteActivationListener;
|
||||||
* missing configuration (no stack trace).
|
* missing configuration (no stack trace).
|
||||||
* Feb 28, 2013 #1447 dgilling Enable active table fetching on site
|
* Feb 28, 2013 #1447 dgilling Enable active table fetching on site
|
||||||
* activation.
|
* activation.
|
||||||
|
* Mar 20, 2013 #1774 randerso Changed to use GFED2DDao
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -425,7 +426,6 @@ public class GFESiteActivation implements ISiteActivationListener {
|
||||||
if (LockState.SUCCESSFUL.equals(ct.getLockState())) {
|
if (LockState.SUCCESSFUL.equals(ct.getLockState())) {
|
||||||
boolean clearTime = false;
|
boolean clearTime = false;
|
||||||
try {
|
try {
|
||||||
GFEDao dao = new GFEDao();
|
|
||||||
List<String> d2dModels = configRef.getD2dModels();
|
List<String> d2dModels = configRef.getD2dModels();
|
||||||
List<List<String>> idsByVersion = new ArrayList<List<String>>(
|
List<List<String>> idsByVersion = new ArrayList<List<String>>(
|
||||||
5);
|
5);
|
||||||
|
@ -440,10 +440,9 @@ public class GFESiteActivation implements ISiteActivationListener {
|
||||||
.desiredDbVersions(new DatabaseID(
|
.desiredDbVersions(new DatabaseID(
|
||||||
siteID, DataType.GRID, "",
|
siteID, DataType.GRID, "",
|
||||||
gfeModel));
|
gfeModel));
|
||||||
List<DatabaseID> dbIds = dao
|
List<DatabaseID> dbIds = D2DGridDatabase
|
||||||
.getD2DDatabaseIdsFromDb(
|
.getD2DDatabaseIdsFromDb(configRef,
|
||||||
d2dModelName, gfeModel,
|
d2dModelName, versions);
|
||||||
siteID, versions);
|
|
||||||
|
|
||||||
while (versions > idsByVersion.size()) {
|
while (versions > idsByVersion.size()) {
|
||||||
idsByVersion.add(new ArrayList<String>(
|
idsByVersion.add(new ArrayList<String>(
|
||||||
|
|
|
@ -0,0 +1,419 @@
|
||||||
|
/**
|
||||||
|
* 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.db.dao;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.SortedMap;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.hibernate.Query;
|
||||||
|
import org.hibernate.SQLQuery;
|
||||||
|
import org.hibernate.Session;
|
||||||
|
|
||||||
|
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
|
||||||
|
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
|
||||||
|
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
||||||
|
import com.raytheon.edex.plugin.gfe.util.GridTranslator;
|
||||||
|
import com.raytheon.uf.common.comm.CommunicationException;
|
||||||
|
import com.raytheon.uf.common.dataplugin.PluginException;
|
||||||
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
||||||
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
|
||||||
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
||||||
|
import com.raytheon.uf.common.dataplugin.grid.GridConstants;
|
||||||
|
import com.raytheon.uf.common.dataplugin.grid.GridInfoConstants;
|
||||||
|
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
|
||||||
|
import com.raytheon.uf.common.dataplugin.level.Level;
|
||||||
|
import com.raytheon.uf.common.dataplugin.level.LevelFactory;
|
||||||
|
import com.raytheon.uf.common.parameter.mapping.ParameterMapper;
|
||||||
|
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
|
import com.raytheon.uf.common.util.mapping.MultipleMappingException;
|
||||||
|
import com.raytheon.uf.edex.database.DataAccessLayerException;
|
||||||
|
import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
||||||
|
import com.raytheon.uf.edex.plugin.grid.dao.GridDao;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data access object for manipulating GFE Records
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
|
* 03/20/13 #1774 randerso Refactored out of GFEDao
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author randerso
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
// **********************************************************************
|
||||||
|
// TODO: this was moved out of GFEDao and needs to be cleaned up to better
|
||||||
|
// use the inherited GridDao functionality and hibernate instead of
|
||||||
|
// SQL/HQL queries. Some parts of the queries could be pushed up to
|
||||||
|
// GridDao
|
||||||
|
// **********************************************************************
|
||||||
|
public class GFED2DDao extends GridDao {
|
||||||
|
private static final String FCST_TIME = "dataTime.fcstTime";
|
||||||
|
|
||||||
|
private static final String REF_TIME = "dataTime.refTime";
|
||||||
|
|
||||||
|
// hibernate query to find grid info record for the given datasetId and
|
||||||
|
// parameter
|
||||||
|
private static final String SQL_D2D_GRID_PARM_QUERY = "select parameter_abbreviation, id "
|
||||||
|
+ "FROM grid_info WHERE "
|
||||||
|
+ GridInfoConstants.DATASET_ID
|
||||||
|
+ " = :"
|
||||||
|
+ GridInfoConstants.DATASET_ID
|
||||||
|
+ " AND "
|
||||||
|
+ "level_id = :level_id AND "
|
||||||
|
+ "(lower(parameter_abbreviation) = :abbrev OR lower(parameter_abbreviation) like :hourAbbrev)";
|
||||||
|
|
||||||
|
// hibernate query to find the times for the GridRecord for the given
|
||||||
|
// info.id, id returned to allow easy lookup of the record associated with
|
||||||
|
// the time
|
||||||
|
private static final String HQL_D2D_GRID_TIME_QUERY = "select dataTime.fcstTime, id from GridRecord "
|
||||||
|
+ "where "
|
||||||
|
+ GridConstants.INFO_ID
|
||||||
|
+ " = :info_id AND dataTime.refTime = :refTime order by dataTime.fcstTime";
|
||||||
|
|
||||||
|
private static final Pattern WIND_PATTERN = Pattern.compile("wind");
|
||||||
|
|
||||||
|
public GFED2DDao() throws PluginException {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves a list of available forecast times
|
||||||
|
*
|
||||||
|
* @param dbId
|
||||||
|
* The database ID to get the times for
|
||||||
|
* @return The list of forecast times associated with the specified
|
||||||
|
* DatabaseID
|
||||||
|
* @throws DataAccessLayerException
|
||||||
|
* If errors occur while querying the metadata database
|
||||||
|
*/
|
||||||
|
public List<Integer> getD2DForecastTimes(DatabaseID dbId)
|
||||||
|
throws DataAccessLayerException {
|
||||||
|
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
|
||||||
|
query.addDistinctParameter(FCST_TIME);
|
||||||
|
try {
|
||||||
|
IFPServerConfig config = IFPServerConfigManager
|
||||||
|
.getServerConfig(dbId.getSiteId());
|
||||||
|
query.addQueryParam(GridConstants.DATASET_ID,
|
||||||
|
config.d2dModelNameMapping(dbId.getModelName()));
|
||||||
|
} catch (GfeConfigurationException e) {
|
||||||
|
throw new DataAccessLayerException(
|
||||||
|
"Error occurred looking up model name mapping", e);
|
||||||
|
}
|
||||||
|
query.addQueryParam(REF_TIME, dbId.getModelTimeAsDate());
|
||||||
|
query.addOrder(FCST_TIME, true);
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<Integer> vals = (List<Integer>) this.queryByCriteria(query);
|
||||||
|
return vals;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves a GridRecord from the grib metadata database based on a ParmID,
|
||||||
|
* TimeRange, and GridParmInfo.
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* The parmID of the desired GridRecord
|
||||||
|
* @param forecastTime
|
||||||
|
* The foreCast time of the desired GridRecord, null for any
|
||||||
|
* record
|
||||||
|
* @param info
|
||||||
|
* The GridParmInfo for the requested d2d grid.
|
||||||
|
* @return The GridRecord from the grib metadata database
|
||||||
|
* @throws DataAccessLayerException
|
||||||
|
* If errors occur while querying the metadata database
|
||||||
|
*/
|
||||||
|
public GridRecord getD2DGrid(ParmID id, Integer forecastTime,
|
||||||
|
GridParmInfo info) throws DataAccessLayerException {
|
||||||
|
Session s = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
s = getHibernateTemplate().getSessionFactory().openSession();
|
||||||
|
// TODO: clean up so we only make one db query
|
||||||
|
SortedMap<Integer, Integer> rawTimes = queryByD2DParmId(id, s);
|
||||||
|
|
||||||
|
// if forecastTime is null just pick one,
|
||||||
|
// this is for static data since all times are the same
|
||||||
|
if (forecastTime == null) {
|
||||||
|
forecastTime = rawTimes.keySet().iterator().next();
|
||||||
|
}
|
||||||
|
|
||||||
|
GridRecord retVal = (GridRecord) s.get(GridRecord.class,
|
||||||
|
rawTimes.get(forecastTime));
|
||||||
|
retVal.setPluginName(GridConstants.GRID);
|
||||||
|
return retVal;
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
if (s != null) {
|
||||||
|
try {
|
||||||
|
s.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
statusHandler.error(
|
||||||
|
"Error occurred closing database session", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a SortedMap of DataTime and GridRecord ids from the grib metadata
|
||||||
|
* database which match the given ParmID. Session passed to allow reuse
|
||||||
|
* across multiple calls.
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* The ParmID to search with
|
||||||
|
* @param s
|
||||||
|
* The database session to use
|
||||||
|
* @return The list of GridRecords from the grib metadata database which
|
||||||
|
* match the given ParmID
|
||||||
|
* @throws DataAccessLayerException
|
||||||
|
* If errors occur while querying the metadata database
|
||||||
|
*/
|
||||||
|
public SortedMap<Integer, Integer> queryByD2DParmId(ParmID id, Session s)
|
||||||
|
throws DataAccessLayerException {
|
||||||
|
String levelName = GridTranslator.getLevelName(id.getParmLevel());
|
||||||
|
|
||||||
|
double[] levelValues = GridTranslator.getLevelValue(id.getParmLevel());
|
||||||
|
boolean levelOnePresent = (levelValues[0] != Level
|
||||||
|
.getInvalidLevelValue());
|
||||||
|
boolean levelTwoPresent = (levelValues[1] != Level
|
||||||
|
.getInvalidLevelValue());
|
||||||
|
Level level = null;
|
||||||
|
|
||||||
|
// to have a level 2, must have a level one
|
||||||
|
try {
|
||||||
|
if (levelOnePresent && levelTwoPresent) {
|
||||||
|
level = LevelFactory.getInstance().getLevel(levelName,
|
||||||
|
levelValues[0], levelValues[1]);
|
||||||
|
} else if (levelOnePresent) {
|
||||||
|
level = LevelFactory.getInstance().getLevel(levelName,
|
||||||
|
levelValues[0]);
|
||||||
|
} else {
|
||||||
|
level = LevelFactory.getInstance().getLevel(levelName, 0.0);
|
||||||
|
}
|
||||||
|
} catch (CommunicationException e) {
|
||||||
|
logger.error(e.getLocalizedMessage(), e);
|
||||||
|
}
|
||||||
|
if (level == null) {
|
||||||
|
logger.warn("Unable to query D2D parms, ParmID " + id
|
||||||
|
+ " does not map to a level");
|
||||||
|
return new TreeMap<Integer, Integer>();
|
||||||
|
}
|
||||||
|
|
||||||
|
SQLQuery modelQuery = s.createSQLQuery(SQL_D2D_GRID_PARM_QUERY);
|
||||||
|
modelQuery.setLong("level_id", level.getId());
|
||||||
|
DatabaseID dbId = id.getDbId();
|
||||||
|
|
||||||
|
try {
|
||||||
|
IFPServerConfig config = IFPServerConfigManager
|
||||||
|
.getServerConfig(dbId.getSiteId());
|
||||||
|
modelQuery.setString(GridInfoConstants.DATASET_ID,
|
||||||
|
config.d2dModelNameMapping(dbId.getModelName()));
|
||||||
|
} catch (GfeConfigurationException e) {
|
||||||
|
throw new DataAccessLayerException(
|
||||||
|
"Error occurred looking up model name mapping", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
String abbreviation = null;
|
||||||
|
try {
|
||||||
|
abbreviation = ParameterMapper.getInstance().lookupBaseName(
|
||||||
|
id.getParmName(), "gfeParamName");
|
||||||
|
} catch (MultipleMappingException e) {
|
||||||
|
statusHandler.handle(Priority.WARN, e.getLocalizedMessage(), e);
|
||||||
|
abbreviation = e.getArbitraryMapping();
|
||||||
|
}
|
||||||
|
|
||||||
|
abbreviation = abbreviation.toLowerCase();
|
||||||
|
modelQuery.setString("abbrev", abbreviation);
|
||||||
|
modelQuery.setString("hourAbbrev", abbreviation + "%hr");
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<Object[]> results = modelQuery.list();
|
||||||
|
|
||||||
|
Integer modelId = null;
|
||||||
|
if (results.size() == 0) {
|
||||||
|
return new TreeMap<Integer, Integer>();
|
||||||
|
} else if (results.size() > 1) {
|
||||||
|
// hours matched, take hour with least number that matches exact
|
||||||
|
// param
|
||||||
|
Pattern p = Pattern.compile("^" + abbreviation + "(\\d+)hr$");
|
||||||
|
int lowestHr = -1;
|
||||||
|
for (Object[] rows : results) {
|
||||||
|
String param = ((String) rows[0]).toLowerCase();
|
||||||
|
if (param.equals(abbreviation) && (lowestHr < 0)) {
|
||||||
|
modelId = (Integer) rows[1];
|
||||||
|
} else {
|
||||||
|
Matcher matcher = p.matcher(param);
|
||||||
|
if (matcher.matches()) {
|
||||||
|
int hr = Integer.parseInt(matcher.group(1));
|
||||||
|
if ((lowestHr < 0) || (hr < lowestHr)) {
|
||||||
|
modelId = (Integer) rows[1];
|
||||||
|
lowestHr = hr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
modelId = (Integer) (results.get(0))[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
Query timeQuery = s.createQuery(HQL_D2D_GRID_TIME_QUERY);
|
||||||
|
timeQuery.setInteger("info_id", modelId);
|
||||||
|
timeQuery.setParameter("refTime", dbId.getModelTimeAsDate());
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<Object[]> timeResults = timeQuery.list();
|
||||||
|
|
||||||
|
if (timeResults.isEmpty()) {
|
||||||
|
return new TreeMap<Integer, Integer>();
|
||||||
|
}
|
||||||
|
|
||||||
|
SortedMap<Integer, Integer> dataTimes = new TreeMap<Integer, Integer>();
|
||||||
|
for (Object[] rows : timeResults) {
|
||||||
|
dataTimes.put((Integer) rows[0], (Integer) rows[1]);
|
||||||
|
}
|
||||||
|
return dataTimes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the available Forecast Hours by D2D parm id.
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return the list of forecast hours
|
||||||
|
* @throws DataAccessLayerException
|
||||||
|
*/
|
||||||
|
public List<Integer> queryFcstHourByD2DParmId(ParmID id)
|
||||||
|
throws DataAccessLayerException {
|
||||||
|
List<Integer> timeList = new ArrayList<Integer>();
|
||||||
|
Session s = null;
|
||||||
|
try {
|
||||||
|
s = getHibernateTemplate().getSessionFactory().openSession();
|
||||||
|
|
||||||
|
if (id.getParmName().equalsIgnoreCase("wind")) {
|
||||||
|
String idString = id.toString();
|
||||||
|
Matcher idWindMatcher = WIND_PATTERN.matcher(idString);
|
||||||
|
|
||||||
|
ParmID uWindId = new ParmID(idWindMatcher.replaceAll("uW"));
|
||||||
|
SortedMap<Integer, Integer> results = queryByD2DParmId(uWindId,
|
||||||
|
s);
|
||||||
|
List<Integer> uTimeList = new ArrayList<Integer>(results.size());
|
||||||
|
for (Integer o : results.keySet()) {
|
||||||
|
uTimeList.add(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
ParmID vWindId = new ParmID(idWindMatcher.replaceAll("vW"));
|
||||||
|
results = queryByD2DParmId(vWindId, s);
|
||||||
|
Set<Integer> vTimeList = new HashSet<Integer>(results.size(), 1);
|
||||||
|
for (Integer o : results.keySet()) {
|
||||||
|
vTimeList.add(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Integer tr : uTimeList) {
|
||||||
|
if (vTimeList.contains(tr)) {
|
||||||
|
timeList.add(tr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!timeList.isEmpty()) {
|
||||||
|
return timeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParmID sWindId = new ParmID(idWindMatcher.replaceAll("ws"));
|
||||||
|
results = queryByD2DParmId(sWindId, s);
|
||||||
|
List<Integer> sTimeList = new ArrayList<Integer>(results.size());
|
||||||
|
for (Integer o : results.keySet()) {
|
||||||
|
sTimeList.add(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
ParmID dWindId = new ParmID(idWindMatcher.replaceAll("wd"));
|
||||||
|
results = queryByD2DParmId(dWindId, s);
|
||||||
|
Set<Integer> dTimeList = new HashSet<Integer>(results.size(), 1);
|
||||||
|
for (Integer o : results.keySet()) {
|
||||||
|
dTimeList.add(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Integer tr : sTimeList) {
|
||||||
|
if (dTimeList.contains(tr)) {
|
||||||
|
timeList.add(tr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SortedMap<Integer, Integer> results = queryByD2DParmId(id, s);
|
||||||
|
for (Integer o : results.keySet()) {
|
||||||
|
timeList.add(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (s != null) {
|
||||||
|
try {
|
||||||
|
s.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
statusHandler.error(
|
||||||
|
"Error occurred closing database session", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return timeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves model run times for the n most recent model runs of a given
|
||||||
|
* d2dModelName
|
||||||
|
*
|
||||||
|
* @param d2dModelName
|
||||||
|
* @param maxRecords
|
||||||
|
* @return
|
||||||
|
* @throws DataAccessLayerException
|
||||||
|
*/
|
||||||
|
public List<Date> getD2DModelRunTimes(String d2dModelName, int maxRecords)
|
||||||
|
throws DataAccessLayerException {
|
||||||
|
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
|
||||||
|
query.addDistinctParameter(REF_TIME);
|
||||||
|
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
|
||||||
|
query.addOrder(REF_TIME, false);
|
||||||
|
if (maxRecords > 0) {
|
||||||
|
query.setMaxResults(maxRecords);
|
||||||
|
}
|
||||||
|
List<?> result = this.queryByCriteria(query);
|
||||||
|
|
||||||
|
List<Date> inventory = new ArrayList<Date>(result.size());
|
||||||
|
for (Object obj : result) {
|
||||||
|
// convert returned "Dates" (actually java.sql.TimeStamps) to actual
|
||||||
|
// java.util.Dates so equals comparisons work correctly
|
||||||
|
Date date = new Date(((Date) obj).getTime());
|
||||||
|
inventory.add(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
return inventory;
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,18 +27,13 @@ import java.util.Calendar;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.SortedMap;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.hibernate.Query;
|
import org.hibernate.Query;
|
||||||
import org.hibernate.SQLQuery;
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
import org.hibernate.criterion.DetachedCriteria;
|
import org.hibernate.criterion.DetachedCriteria;
|
||||||
|
@ -49,44 +44,27 @@ import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
||||||
|
|
||||||
import com.raytheon.edex.db.dao.DefaultPluginDao;
|
import com.raytheon.edex.db.dao.DefaultPluginDao;
|
||||||
import com.raytheon.edex.plugin.gfe.config.GFESiteActivation;
|
import com.raytheon.edex.plugin.gfe.config.GFESiteActivation;
|
||||||
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
|
|
||||||
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
|
|
||||||
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
|
||||||
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
|
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.GridDatabase;
|
import com.raytheon.edex.plugin.gfe.server.database.GridDatabase;
|
||||||
import com.raytheon.edex.plugin.gfe.util.GridTranslator;
|
|
||||||
import com.raytheon.edex.plugin.gfe.util.SendNotifications;
|
import com.raytheon.edex.plugin.gfe.util.SendNotifications;
|
||||||
import com.raytheon.uf.common.comm.CommunicationException;
|
|
||||||
import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
||||||
import com.raytheon.uf.common.dataplugin.PluginException;
|
import com.raytheon.uf.common.dataplugin.PluginException;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID.DataType;
|
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
|
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.exception.GfeException;
|
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
|
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.server.notify.LockNotification;
|
import com.raytheon.uf.common.dataplugin.gfe.server.notify.LockNotification;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.type.Pair;
|
import com.raytheon.uf.common.dataplugin.gfe.type.Pair;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.util.GfeUtil;
|
import com.raytheon.uf.common.dataplugin.gfe.util.GfeUtil;
|
||||||
import com.raytheon.uf.common.dataplugin.grid.GridConstants;
|
|
||||||
import com.raytheon.uf.common.dataplugin.grid.GridInfoConstants;
|
|
||||||
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
|
|
||||||
import com.raytheon.uf.common.dataplugin.level.Level;
|
|
||||||
import com.raytheon.uf.common.dataplugin.level.LevelFactory;
|
|
||||||
import com.raytheon.uf.common.dataplugin.persist.IPersistable;
|
import com.raytheon.uf.common.dataplugin.persist.IPersistable;
|
||||||
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
|
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
|
||||||
import com.raytheon.uf.common.dataquery.db.QueryResult;
|
import com.raytheon.uf.common.dataquery.db.QueryResult;
|
||||||
import com.raytheon.uf.common.datastorage.DataStoreFactory;
|
import com.raytheon.uf.common.datastorage.DataStoreFactory;
|
||||||
import com.raytheon.uf.common.datastorage.IDataStore;
|
import com.raytheon.uf.common.datastorage.IDataStore;
|
||||||
import com.raytheon.uf.common.parameter.mapping.ParameterMapper;
|
|
||||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
import com.raytheon.uf.common.time.DataTime;
|
import com.raytheon.uf.common.time.DataTime;
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
import com.raytheon.uf.common.time.util.TimeUtil;
|
|
||||||
import com.raytheon.uf.common.util.mapping.MultipleMappingException;
|
|
||||||
import com.raytheon.uf.edex.database.DataAccessLayerException;
|
import com.raytheon.uf.edex.database.DataAccessLayerException;
|
||||||
import com.raytheon.uf.edex.database.purge.PurgeLogger;
|
import com.raytheon.uf.edex.database.purge.PurgeLogger;
|
||||||
import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
||||||
|
@ -112,7 +90,8 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
||||||
* 01/21/12 #1504 randerso Back ported change to use ParameterMapper into 13.1.2
|
* 01/21/12 #1504 randerso Back ported change to use ParameterMapper into 13.1.2
|
||||||
* 02/10/13 #1603 randerso Eliminated unnecessary conversion from lists to arrays
|
* 02/10/13 #1603 randerso Eliminated unnecessary conversion from lists to arrays
|
||||||
* 02/12/13 #1608 randerso Changed to use explicit deletes for groups and datasets
|
* 02/12/13 #1608 randerso Changed to use explicit deletes for groups and datasets
|
||||||
* 03/15/13 #1795 njensen Added updatePublishTime()
|
* 03/15/13 #1795 njensen Added updatePublishTime()
|
||||||
|
* 03/21/13 #1774 randerso Moved D2D routines into {@link com.raytheon.edex.plugin.gfe.db.dao.GFED2DDao}
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -120,25 +99,6 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
*/
|
*/
|
||||||
public class GFEDao extends DefaultPluginDao {
|
public class GFEDao extends DefaultPluginDao {
|
||||||
// hibernate query to find grid info record for the given datasetId and
|
|
||||||
// parameter
|
|
||||||
private String SQL_D2D_GRID_PARM_QUERY = "select parameter_abbreviation, id "
|
|
||||||
+ "FROM grid_info WHERE "
|
|
||||||
+ GridInfoConstants.DATASET_ID
|
|
||||||
+ " = :"
|
|
||||||
+ GridInfoConstants.DATASET_ID
|
|
||||||
+ " AND "
|
|
||||||
+ "level_id = :level_id AND "
|
|
||||||
+ "(lower(parameter_abbreviation) = :abbrev OR lower(parameter_abbreviation) like :hourAbbrev)";
|
|
||||||
|
|
||||||
// hibernate query to find the times for the GridRecord for the given
|
|
||||||
// info.id, id returned to allow easy lookup of the record associated with
|
|
||||||
// the time
|
|
||||||
private static final String HQL_D2D_GRID_TIME_QUERY = "select dataTime, id from GridRecord "
|
|
||||||
+ "where "
|
|
||||||
+ GridConstants.INFO_ID
|
|
||||||
+ " = :info_id AND dataTime.refTime = :refTime order by dataTime.fcstTime";
|
|
||||||
|
|
||||||
private static final Pattern WIND_PATTERN = Pattern.compile("wind");
|
private static final Pattern WIND_PATTERN = Pattern.compile("wind");
|
||||||
|
|
||||||
public GFEDao() throws PluginException {
|
public GFEDao() throws PluginException {
|
||||||
|
@ -596,348 +556,6 @@ public class GFEDao extends DefaultPluginDao {
|
||||||
return history;
|
return history;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves a list of valid times for a specified ParmID from the grib
|
|
||||||
* metadata database. The valid time is constructed by adding the forecast
|
|
||||||
* time to the reference time.
|
|
||||||
*
|
|
||||||
* @param id
|
|
||||||
* The parmID to get the times for
|
|
||||||
* @return The list of times associated with the specified ParmID
|
|
||||||
* @throws DataAccessLayerException
|
|
||||||
* If errors occur while querying the metadata database
|
|
||||||
*/
|
|
||||||
public List<TimeRange> getD2DTimes(ParmID id)
|
|
||||||
throws DataAccessLayerException {
|
|
||||||
return queryTimeByD2DParmId(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves a list of available forecast times
|
|
||||||
*
|
|
||||||
* @param dbId
|
|
||||||
* The database ID to get the times for
|
|
||||||
* @return The list of forecast times associated with the specified
|
|
||||||
* DatabaseID
|
|
||||||
* @throws DataAccessLayerException
|
|
||||||
* If errors occur while querying the metadata database
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public List<Integer> getD2DForecastTimes(DatabaseID dbId)
|
|
||||||
throws DataAccessLayerException {
|
|
||||||
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
|
|
||||||
query.addDistinctParameter("dataTime.fcstTime");
|
|
||||||
try {
|
|
||||||
IFPServerConfig config = IFPServerConfigManager
|
|
||||||
.getServerConfig(dbId.getSiteId());
|
|
||||||
query.addQueryParam(GridConstants.DATASET_ID,
|
|
||||||
config.d2dModelNameMapping(dbId.getModelName()));
|
|
||||||
} catch (GfeConfigurationException e) {
|
|
||||||
throw new DataAccessLayerException(
|
|
||||||
"Error occurred looking up model name mapping", e);
|
|
||||||
}
|
|
||||||
query.addQueryParam("dataTime.refTime", dbId.getModelTimeAsDate());
|
|
||||||
query.addOrder("dataTime.fcstTime", true);
|
|
||||||
List<?> vals = this.queryByCriteria(query);
|
|
||||||
return (List<Integer>) vals;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves a GridRecord from the grib metadata database based on a ParmID,
|
|
||||||
* TimeRange, and GridParmInfo.
|
|
||||||
*
|
|
||||||
* @param id
|
|
||||||
* The parmID of the desired GridRecord
|
|
||||||
* @param timeRange
|
|
||||||
* The timeRange of the desired GridRecord
|
|
||||||
* @param info
|
|
||||||
* The GridParmInfo for the requested d2d grid.
|
|
||||||
* @return The GridRecord from the grib metadata database
|
|
||||||
* @throws DataAccessLayerException
|
|
||||||
* If errors occur while querying the metadata database
|
|
||||||
*/
|
|
||||||
public GridRecord getD2DGrid(ParmID id, TimeRange timeRange,
|
|
||||||
GridParmInfo info) throws DataAccessLayerException {
|
|
||||||
Session s = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
s = getHibernateTemplate().getSessionFactory().openSession();
|
|
||||||
// TODO: clean up so we only make one db query
|
|
||||||
SortedMap<DataTime, Integer> rawTimes = queryByD2DParmId(id, s);
|
|
||||||
List<TimeRange> gribTimes = new ArrayList<TimeRange>();
|
|
||||||
for (DataTime dt : rawTimes.keySet()) {
|
|
||||||
gribTimes.add(dt.getValidPeriod());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (isMos(id)) {
|
|
||||||
for (Map.Entry<DataTime, Integer> timeEntry : rawTimes
|
|
||||||
.entrySet()) {
|
|
||||||
TimeRange gribTime = timeEntry.getKey()
|
|
||||||
.getValidPeriod();
|
|
||||||
TimeRange time = info.getTimeConstraints()
|
|
||||||
.constraintTime(gribTime.getEnd());
|
|
||||||
if (timeRange.getEnd().equals(time.getEnd())
|
|
||||||
|| !info.getTimeConstraints().anyConstraints()) {
|
|
||||||
GridRecord retVal = (GridRecord) s.get(
|
|
||||||
GridRecord.class, timeEntry.getValue());
|
|
||||||
retVal.setPluginName(GridConstants.GRID);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (D2DGridDatabase.isNonAccumDuration(id, gribTimes)) {
|
|
||||||
for (Map.Entry<DataTime, Integer> timeEntry : rawTimes
|
|
||||||
.entrySet()) {
|
|
||||||
TimeRange gribTime = timeEntry.getKey()
|
|
||||||
.getValidPeriod();
|
|
||||||
if (timeRange.getStart().equals(gribTime.getEnd())
|
|
||||||
|| timeRange.equals(gribTime)) {
|
|
||||||
GridRecord retVal = (GridRecord) s.get(
|
|
||||||
GridRecord.class, timeEntry.getValue());
|
|
||||||
retVal.setPluginName(GridConstants.GRID);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (Map.Entry<DataTime, Integer> timeEntry : rawTimes
|
|
||||||
.entrySet()) {
|
|
||||||
TimeRange gribTime = timeEntry.getKey()
|
|
||||||
.getValidPeriod();
|
|
||||||
TimeRange time = info.getTimeConstraints()
|
|
||||||
.constraintTime(gribTime.getStart());
|
|
||||||
if ((timeRange.getStart().equals(time.getStart()) || !info
|
|
||||||
.getTimeConstraints().anyConstraints())) {
|
|
||||||
GridRecord retVal = (GridRecord) s.get(
|
|
||||||
GridRecord.class, timeEntry.getValue());
|
|
||||||
retVal.setPluginName(GridConstants.GRID);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (GfeConfigurationException e) {
|
|
||||||
throw new DataAccessLayerException(
|
|
||||||
"Error getting configuration for "
|
|
||||||
+ id.getDbId().getSiteId(), e);
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
if (s != null) {
|
|
||||||
try {
|
|
||||||
s.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
statusHandler.error(
|
|
||||||
"Error occurred closing database session", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a SortedMap of DataTime and GridRecord ids from the grib metadata
|
|
||||||
* database which match the given ParmID. Session passed to allow reuse
|
|
||||||
* across multiple calls.
|
|
||||||
*
|
|
||||||
* @param id
|
|
||||||
* The ParmID to search with
|
|
||||||
* @param s
|
|
||||||
* The database session to use
|
|
||||||
* @return The list of GridRecords from the grib metadata database which
|
|
||||||
* match the given ParmID
|
|
||||||
* @throws DataAccessLayerException
|
|
||||||
* If errors occur while querying the metadata database
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public SortedMap<DataTime, Integer> queryByD2DParmId(ParmID id, Session s)
|
|
||||||
throws DataAccessLayerException {
|
|
||||||
String levelName = GridTranslator.getLevelName(id.getParmLevel());
|
|
||||||
|
|
||||||
double[] levelValues = GridTranslator.getLevelValue(id.getParmLevel());
|
|
||||||
boolean levelOnePresent = (levelValues[0] != Level
|
|
||||||
.getInvalidLevelValue());
|
|
||||||
boolean levelTwoPresent = (levelValues[1] != Level
|
|
||||||
.getInvalidLevelValue());
|
|
||||||
Level level = null;
|
|
||||||
|
|
||||||
// to have a level 2, must have a level one
|
|
||||||
try {
|
|
||||||
if (levelOnePresent && levelTwoPresent) {
|
|
||||||
level = LevelFactory.getInstance().getLevel(levelName,
|
|
||||||
levelValues[0], levelValues[1]);
|
|
||||||
} else if (levelOnePresent) {
|
|
||||||
level = LevelFactory.getInstance().getLevel(levelName,
|
|
||||||
levelValues[0]);
|
|
||||||
} else {
|
|
||||||
level = LevelFactory.getInstance().getLevel(levelName, 0.0);
|
|
||||||
}
|
|
||||||
} catch (CommunicationException e) {
|
|
||||||
logger.error(e.getLocalizedMessage(), e);
|
|
||||||
}
|
|
||||||
if (level == null) {
|
|
||||||
logger.warn("Unable to query D2D parms, ParmID " + id
|
|
||||||
+ " does not map to a level");
|
|
||||||
return new TreeMap<DataTime, Integer>();
|
|
||||||
}
|
|
||||||
|
|
||||||
SQLQuery modelQuery = s.createSQLQuery(SQL_D2D_GRID_PARM_QUERY);
|
|
||||||
modelQuery.setLong("level_id", level.getId());
|
|
||||||
DatabaseID dbId = id.getDbId();
|
|
||||||
|
|
||||||
try {
|
|
||||||
IFPServerConfig config = IFPServerConfigManager
|
|
||||||
.getServerConfig(dbId.getSiteId());
|
|
||||||
modelQuery.setString(GridInfoConstants.DATASET_ID,
|
|
||||||
config.d2dModelNameMapping(dbId.getModelName()));
|
|
||||||
} catch (GfeConfigurationException e) {
|
|
||||||
throw new DataAccessLayerException(
|
|
||||||
"Error occurred looking up model name mapping", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
String abbreviation = null;
|
|
||||||
try {
|
|
||||||
abbreviation = ParameterMapper.getInstance().lookupBaseName(
|
|
||||||
id.getParmName(), "gfeParamName");
|
|
||||||
} catch (MultipleMappingException e) {
|
|
||||||
statusHandler.handle(Priority.WARN, e.getLocalizedMessage(), e);
|
|
||||||
abbreviation = e.getArbitraryMapping();
|
|
||||||
}
|
|
||||||
|
|
||||||
abbreviation = abbreviation.toLowerCase();
|
|
||||||
modelQuery.setString("abbrev", abbreviation);
|
|
||||||
modelQuery.setString("hourAbbrev", abbreviation + "%hr");
|
|
||||||
List<?> results = modelQuery.list();
|
|
||||||
Integer modelId = null;
|
|
||||||
if (results.size() == 0) {
|
|
||||||
return new TreeMap<DataTime, Integer>();
|
|
||||||
} else if (results.size() > 1) {
|
|
||||||
// hours matched, take hour with least number that matches exact
|
|
||||||
// param
|
|
||||||
Pattern p = Pattern.compile("^" + abbreviation + "(\\d+)hr$");
|
|
||||||
int lowestHr = -1;
|
|
||||||
for (Object[] rows : (List<Object[]>) results) {
|
|
||||||
String param = ((String) rows[0]).toLowerCase();
|
|
||||||
if (param.equals(abbreviation) && (lowestHr < 0)) {
|
|
||||||
modelId = (Integer) rows[1];
|
|
||||||
} else {
|
|
||||||
Matcher matcher = p.matcher(param);
|
|
||||||
if (matcher.matches()) {
|
|
||||||
int hr = Integer.parseInt(matcher.group(1));
|
|
||||||
if ((lowestHr < 0) || (hr < lowestHr)) {
|
|
||||||
modelId = (Integer) rows[1];
|
|
||||||
lowestHr = hr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
modelId = (Integer) ((Object[]) results.get(0))[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
Query timeQuery = s.createQuery(HQL_D2D_GRID_TIME_QUERY);
|
|
||||||
timeQuery.setInteger("info_id", modelId);
|
|
||||||
timeQuery.setParameter("refTime", dbId.getModelTimeAsDate());
|
|
||||||
List<Object[]> timeResults = timeQuery.list();
|
|
||||||
if (timeResults.isEmpty()) {
|
|
||||||
return new TreeMap<DataTime, Integer>();
|
|
||||||
}
|
|
||||||
|
|
||||||
SortedMap<DataTime, Integer> dataTimes = new TreeMap<DataTime, Integer>();
|
|
||||||
for (Object[] rows : timeResults) {
|
|
||||||
dataTimes.put((DataTime) rows[0], (Integer) rows[1]);
|
|
||||||
}
|
|
||||||
return dataTimes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<TimeRange> queryTimeByD2DParmId(ParmID id)
|
|
||||||
throws DataAccessLayerException {
|
|
||||||
List<TimeRange> timeList = new ArrayList<TimeRange>();
|
|
||||||
Session s = null;
|
|
||||||
try {
|
|
||||||
s = getHibernateTemplate().getSessionFactory().openSession();
|
|
||||||
|
|
||||||
if (id.getParmName().equalsIgnoreCase("wind")) {
|
|
||||||
String idString = id.toString();
|
|
||||||
Matcher idWindMatcher = WIND_PATTERN.matcher(idString);
|
|
||||||
|
|
||||||
ParmID uWindId = new ParmID(idWindMatcher.replaceAll("uW"));
|
|
||||||
SortedMap<DataTime, Integer> results = queryByD2DParmId(
|
|
||||||
uWindId, s);
|
|
||||||
List<TimeRange> uTimeList = new ArrayList<TimeRange>(
|
|
||||||
results.size());
|
|
||||||
for (DataTime o : results.keySet()) {
|
|
||||||
uTimeList.add(new TimeRange(o.getValidPeriod().getStart(),
|
|
||||||
3600 * 1000));
|
|
||||||
}
|
|
||||||
|
|
||||||
ParmID vWindId = new ParmID(idWindMatcher.replaceAll("vW"));
|
|
||||||
results = queryByD2DParmId(vWindId, s);
|
|
||||||
Set<TimeRange> vTimeList = new HashSet<TimeRange>(
|
|
||||||
results.size(), 1);
|
|
||||||
for (DataTime o : results.keySet()) {
|
|
||||||
vTimeList.add(new TimeRange(o.getValidPeriod().getStart(),
|
|
||||||
3600 * 1000));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (TimeRange tr : uTimeList) {
|
|
||||||
if (vTimeList.contains(tr)) {
|
|
||||||
timeList.add(new TimeRange(tr.getStart(), tr.getStart()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!timeList.isEmpty()) {
|
|
||||||
return timeList;
|
|
||||||
}
|
|
||||||
|
|
||||||
ParmID sWindId = new ParmID(idWindMatcher.replaceAll("ws"));
|
|
||||||
results = queryByD2DParmId(sWindId, s);
|
|
||||||
List<TimeRange> sTimeList = new ArrayList<TimeRange>(
|
|
||||||
results.size());
|
|
||||||
for (DataTime o : results.keySet()) {
|
|
||||||
sTimeList.add(new TimeRange(o.getValidPeriod().getStart(),
|
|
||||||
3600 * 1000));
|
|
||||||
}
|
|
||||||
|
|
||||||
ParmID dWindId = new ParmID(idWindMatcher.replaceAll("wd"));
|
|
||||||
results = queryByD2DParmId(dWindId, s);
|
|
||||||
Set<TimeRange> dTimeList = new HashSet<TimeRange>(
|
|
||||||
results.size(), 1);
|
|
||||||
for (DataTime o : results.keySet()) {
|
|
||||||
dTimeList.add(new TimeRange(o.getValidPeriod().getStart(),
|
|
||||||
3600 * 1000));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (TimeRange tr : sTimeList) {
|
|
||||||
if (dTimeList.contains(tr)) {
|
|
||||||
timeList.add(new TimeRange(tr.getStart(), tr.getStart()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
SortedMap<DataTime, Integer> results = queryByD2DParmId(id, s);
|
|
||||||
if (isMos(id)) {
|
|
||||||
for (DataTime o : results.keySet()) {
|
|
||||||
timeList.add(new TimeRange(o.getValidPeriod().getEnd(),
|
|
||||||
o.getValidPeriod().getDuration()));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (DataTime o : results.keySet()) {
|
|
||||||
timeList.add(o.getValidPeriod());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
if (s != null) {
|
|
||||||
try {
|
|
||||||
s.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
statusHandler.error(
|
|
||||||
"Error occurred closing database session", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return timeList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void purgeGFEGrids(final DatabaseID dbId) {
|
public void purgeGFEGrids(final DatabaseID dbId) {
|
||||||
txTemplate.execute(new TransactionCallbackWithoutResult() {
|
txTemplate.execute(new TransactionCallbackWithoutResult() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -959,107 +577,6 @@ public class GFEDao extends DefaultPluginDao {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<DatabaseID> getD2DDatabaseIdsFromDb(String d2dModelName,
|
|
||||||
String gfeModel, String siteID) throws DataAccessLayerException {
|
|
||||||
return getD2DDatabaseIdsFromDb(d2dModelName, gfeModel, siteID, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<DatabaseID> getD2DDatabaseIdsFromDb(String d2dModelName,
|
|
||||||
String gfeModel, String siteID, int maxRecords)
|
|
||||||
throws DataAccessLayerException {
|
|
||||||
List<DatabaseID> dbInventory = new ArrayList<DatabaseID>();
|
|
||||||
|
|
||||||
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
|
|
||||||
query.addDistinctParameter("dataTime.refTime");
|
|
||||||
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
|
|
||||||
query.addOrder("dataTime.refTime", false);
|
|
||||||
if (maxRecords > 0) {
|
|
||||||
query.setMaxResults(maxRecords);
|
|
||||||
}
|
|
||||||
List<?> result = this.queryByCriteria(query);
|
|
||||||
|
|
||||||
for (Object obj : result) {
|
|
||||||
DatabaseID dbId = null;
|
|
||||||
dbId = new DatabaseID(siteID, DataType.GRID, "D2D", gfeModel,
|
|
||||||
(Date) obj);
|
|
||||||
try {
|
|
||||||
GridDatabase db = GridParmManager.getDb(dbId);
|
|
||||||
if ((db != null) && !dbInventory.contains(dbId)) {
|
|
||||||
dbInventory.add(dbId);
|
|
||||||
}
|
|
||||||
} catch (GfeException e) {
|
|
||||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
|
||||||
e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dbInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the latest (or newest) model run for the given site and model
|
|
||||||
* name.
|
|
||||||
*
|
|
||||||
* @param d2dModel
|
|
||||||
* A GridModel object that contains the D2D model name.
|
|
||||||
* @param gfeModel
|
|
||||||
* The GFE model name that corresponds to d2dModel.
|
|
||||||
* @param siteID
|
|
||||||
* The site to retrieve the data for.
|
|
||||||
* @return The DatabaseID of the newest D2D model, or null if no models can
|
|
||||||
* be found.
|
|
||||||
* @throws DataAccessLayerException
|
|
||||||
*/
|
|
||||||
public DatabaseID getLatestD2DDatabaseIdsFromDb(String d2dModelName,
|
|
||||||
String gfeModel, String siteID) throws DataAccessLayerException {
|
|
||||||
List<DatabaseID> dbIds = getD2DDatabaseIdsFromDb(d2dModelName,
|
|
||||||
gfeModel, siteID, 1);
|
|
||||||
if (!dbIds.isEmpty()) {
|
|
||||||
return dbIds.get(0);
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<ParmID> getD2DParmIdsFromDb(String d2dModelName, DatabaseID dbId)
|
|
||||||
throws DataAccessLayerException {
|
|
||||||
|
|
||||||
Set<ParmID> parmIds = new HashSet<ParmID>();
|
|
||||||
|
|
||||||
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
|
|
||||||
query.addDistinctParameter(GridConstants.PARAMETER_ABBREVIATION);
|
|
||||||
query.addDistinctParameter(GridConstants.MASTER_LEVEL_NAME);
|
|
||||||
query.addDistinctParameter(GridConstants.LEVEL_ONE);
|
|
||||||
query.addDistinctParameter(GridConstants.LEVEL_TWO);
|
|
||||||
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
|
|
||||||
query.addQueryParam(
|
|
||||||
"dataTime.refTime",
|
|
||||||
TimeUtil.formatDate(dbId.getModelTimeAsDate()).replaceAll("_",
|
|
||||||
" "));
|
|
||||||
|
|
||||||
List<?> result = this.queryByCriteria(query);
|
|
||||||
|
|
||||||
for (Object obj : result) {
|
|
||||||
Object[] objArr = (Object[]) obj;
|
|
||||||
String levelName = GridTranslator.getShortLevelName(
|
|
||||||
(String) objArr[1], (Double) objArr[2], (Double) objArr[3]);
|
|
||||||
if (!levelName.equals(LevelFactory.UNKNOWN_LEVEL)) {
|
|
||||||
String abbrev = (String) objArr[0];
|
|
||||||
try {
|
|
||||||
abbrev = ParameterMapper.getInstance().lookupAlias(abbrev,
|
|
||||||
"gfeParamName");
|
|
||||||
} catch (MultipleMappingException e) {
|
|
||||||
statusHandler.handle(Priority.WARN,
|
|
||||||
e.getLocalizedMessage(), e);
|
|
||||||
abbrev = e.getArbitraryMapping();
|
|
||||||
}
|
|
||||||
ParmID newParmId = new ParmID(abbrev, dbId, levelName);
|
|
||||||
parmIds.add(newParmId);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return parmIds;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes GridParmInfo from the HDF5 file and any data associated with that
|
* Removes GridParmInfo from the HDF5 file and any data associated with that
|
||||||
* info
|
* info
|
||||||
|
@ -1136,12 +653,6 @@ public class GFEDao extends DefaultPluginDao {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isMos(ParmID id) {
|
|
||||||
return id.getDbId().getModelName().equals("MOSGuide")
|
|
||||||
&& (id.getParmName().startsWith("mxt") || id.getParmName()
|
|
||||||
.startsWith("mnt"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the publish times in the database of all provided
|
* Updates the publish times in the database of all provided
|
||||||
* GridDataHistories. Does not alter the publish times in memory.
|
* GridDataHistories. Does not alter the publish times in memory.
|
||||||
|
|
|
@ -20,8 +20,11 @@
|
||||||
package com.raytheon.edex.plugin.gfe.paraminfo;
|
package com.raytheon.edex.plugin.gfe.paraminfo;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.xml.bind.annotation.XmlAccessType;
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
import javax.xml.bind.annotation.XmlAccessorType;
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
@ -31,6 +34,7 @@ import javax.xml.bind.annotation.XmlElements;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -41,7 +45,9 @@ import com.raytheon.uf.common.time.TimeRange;
|
||||||
* SOFTWARE HISTORY
|
* SOFTWARE HISTORY
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Jun 24, 2010 #6372 bphillip Initial creation
|
* Jun 24, 2010 #6372 bphillip Initial creation
|
||||||
|
* Mar 20, 2013 #1774 randerso Added getParmNames,
|
||||||
|
* changed getAvailableTimes to match A1
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -108,12 +114,21 @@ public class GridParamInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TimeRange> getAvailableTimes(Date refTime) {
|
public List<TimeRange> getAvailableTimes(Date refTime) {
|
||||||
List<TimeRange> availTimes = new ArrayList<TimeRange>();
|
List<TimeRange> availTimes = new ArrayList<TimeRange>(times.size());
|
||||||
for (int i = 1; i < times.size(); i++) {
|
for (Integer fcstHour : times) {
|
||||||
availTimes.add(new TimeRange(refTime.getTime() + times.get(i - 1)
|
availTimes.add(new TimeRange(new Date(refTime.getTime() + fcstHour
|
||||||
* 1000, refTime.getTime() + times.get(i) * 1000));
|
* TimeUtil.MILLIS_PER_SECOND), TimeUtil.MILLIS_PER_HOUR));
|
||||||
}
|
}
|
||||||
return availTimes;
|
return availTimes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Collection<String> getParmNames() {
|
||||||
|
List<ParameterInfo> paramInfoList = this.getGridParamInfo();
|
||||||
|
Set<String> parmNames = new HashSet<String>();
|
||||||
|
for (ParameterInfo info : paramInfoList) {
|
||||||
|
parmNames.add(info.getShort_name());
|
||||||
|
}
|
||||||
|
|
||||||
|
return parmNames;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,8 +56,10 @@ import com.raytheon.uf.common.util.mapping.MultipleMappingException;
|
||||||
* Jan 25, 2012 DR 14305 ryu Read site parameterInfo files
|
* Jan 25, 2012 DR 14305 ryu Read site parameterInfo files
|
||||||
* Sep 12, 2012 #1117 dgilling Implement method to retrieve all
|
* Sep 12, 2012 #1117 dgilling Implement method to retrieve all
|
||||||
* parm names for a given model.
|
* parm names for a given model.
|
||||||
* Feb 15, 2013 1598 bsteffen Make GridParamInfoLookup filter on
|
* Feb 15, 2013 1598 bsteffen Make GridParamInfoLookup filter on
|
||||||
* extension.
|
* extension.
|
||||||
|
* Mar 20, 2013 #1774 randerso Added getModelInfo,
|
||||||
|
* added Dflt if no levels specified
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -94,7 +96,14 @@ public class GridParamInfoLookup {
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private GridParamInfo getGridParamInfo(String mappedModel) {
|
/**
|
||||||
|
* Gets the model information based on the specified model
|
||||||
|
*
|
||||||
|
* @param mappedModel
|
||||||
|
* The model name
|
||||||
|
* @return The parameter information or null if none found
|
||||||
|
*/
|
||||||
|
public GridParamInfo getGridParamInfo(String mappedModel) {
|
||||||
String paramInfoName = null;
|
String paramInfoName = null;
|
||||||
try {
|
try {
|
||||||
paramInfoName = DatasetIdMapper.getInstance().lookupAliasOrNull(
|
paramInfoName = DatasetIdMapper.getInstance().lookupAliasOrNull(
|
||||||
|
@ -211,5 +220,17 @@ public class GridParamInfoLookup {
|
||||||
"Error unmarshalling grid parameter information", e);
|
"Error unmarshalling grid parameter information", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (GridParamInfo gridParamInfo : modelParamMap.values()) {
|
||||||
|
for (String parmName : gridParamInfo.getParmNames()) {
|
||||||
|
ParameterInfo parameterInfo = gridParamInfo
|
||||||
|
.getParameterInfo(parmName);
|
||||||
|
|
||||||
|
// add Dflt level if no other levels defined
|
||||||
|
if (parameterInfo.getLevels().isEmpty()) {
|
||||||
|
parameterInfo.getLevels().add("Dflt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
||||||
* Jun 24, 2010 bphillip Initial creation
|
* Jun 24, 2010 bphillip Initial creation
|
||||||
* Sep 12, 2012 #1117 dgilling Create field to hold list of
|
* Sep 12, 2012 #1117 dgilling Create field to hold list of
|
||||||
* valid levels for each parameter.
|
* valid levels for each parameter.
|
||||||
|
* Mar 20, 2013 #1774 randerso Added getMinVal and getMaxVal
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -53,6 +54,13 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
||||||
@XmlAccessorType(XmlAccessType.NONE)
|
@XmlAccessorType(XmlAccessType.NONE)
|
||||||
public class ParameterInfo {
|
public class ParameterInfo {
|
||||||
|
|
||||||
|
// The netCDF convention is MINFLOAT to MAXFLOAT.
|
||||||
|
// But we can't use it or GFE will attempt to create
|
||||||
|
// billions and billions of contours.
|
||||||
|
public static final float MIN_VALUE = 0f;
|
||||||
|
|
||||||
|
public static final float MAX_VALUE = 10000f;
|
||||||
|
|
||||||
@XmlElement
|
@XmlElement
|
||||||
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
|
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
|
||||||
private String short_name;
|
private String short_name;
|
||||||
|
@ -190,6 +198,28 @@ public class ParameterInfo {
|
||||||
this.valid_range = valid_range;
|
this.valid_range = valid_range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the minimum valid value
|
||||||
|
*/
|
||||||
|
public float getMinVal() {
|
||||||
|
float min = MIN_VALUE;
|
||||||
|
if (valid_range != null && valid_range.length == 2) {
|
||||||
|
min = valid_range[0];
|
||||||
|
}
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the maximum valid value
|
||||||
|
*/
|
||||||
|
public float getMaxVal() {
|
||||||
|
float min = MAX_VALUE;
|
||||||
|
if (valid_range != null && valid_range.length == 2) {
|
||||||
|
min = valid_range[1];
|
||||||
|
}
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the fillValue
|
* @return the fillValue
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -91,6 +91,8 @@ import com.raytheon.uf.edex.database.purge.PurgeLogger;
|
||||||
* smartInit hdf5 data
|
* smartInit hdf5 data
|
||||||
* 03/07/13 #1773 njensen Logged commitGrid() times
|
* 03/07/13 #1773 njensen Logged commitGrid() times
|
||||||
* 03/15/13 #1795 njensen Sped up commitGrid()
|
* 03/15/13 #1795 njensen Sped up commitGrid()
|
||||||
|
* 03/20/2013 #1774 randerso Removed dead method, changed to use new
|
||||||
|
* D2DGridDatabase constructor
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -356,48 +358,6 @@ public class GridParmManager {
|
||||||
return sr;
|
return sr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ServerResponse<String> getD2DGridData(
|
|
||||||
List<GetGridRequest> requests) {
|
|
||||||
|
|
||||||
ServerResponse<String> retVal = new ServerResponse<String>();
|
|
||||||
|
|
||||||
// Get the grid data
|
|
||||||
ServerResponse<List<IGridSlice>> sr = getGridData(requests);
|
|
||||||
retVal.addMessages(sr);
|
|
||||||
if (!sr.isOkay()) {
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
// // Now store it off in a temp location so the client can get to it
|
|
||||||
// for (IGridSlice slice : sr.getPayload()) {
|
|
||||||
// try {
|
|
||||||
// GridDatabase db = getDb(requests.get(0).getParmId().getDbId());
|
|
||||||
// if (db instanceof D2DGridDatabase) {
|
|
||||||
// File tempDir = GfeUtil.getTempHDF5Dir(
|
|
||||||
// GridDatabase.gfeBaseDataDir, requests.get(0)
|
|
||||||
// .getParmId());
|
|
||||||
// if (!tempDir.exists()) {
|
|
||||||
// tempDir.mkdirs();
|
|
||||||
// }
|
|
||||||
// db.saveGridToHdf5(slice, GfeUtil.getTempHDF5File(
|
|
||||||
// GridDatabase.gfeBaseDataDir, requests.get(0)
|
|
||||||
// .getParmId()), GfeUtil.getHDF5Group(
|
|
||||||
// requests.get(0).getParmId(), slice.getValidTime()));
|
|
||||||
// } else {
|
|
||||||
// retVal
|
|
||||||
// .addMessage("Cannot save temp grids for non-D2D grid databases.");
|
|
||||||
// return retVal;
|
|
||||||
// }
|
|
||||||
// } catch (GfeException e) {
|
|
||||||
// sr.addMessage("Unable to get DB: "
|
|
||||||
// + requests.get(0).getParmId().getDbId());
|
|
||||||
// return retVal;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return retVal;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * Request to commit data to the official database. The changes are
|
* * Request to commit data to the official database. The changes are
|
||||||
* returned through the calling argument "changes".
|
* returned through the calling argument "changes".
|
||||||
|
@ -1197,7 +1157,12 @@ public class GridParmManager {
|
||||||
IFPServerConfig serverConfig = IFPServerConfigManager
|
IFPServerConfig serverConfig = IFPServerConfigManager
|
||||||
.getServerConfig(siteId);
|
.getServerConfig(siteId);
|
||||||
try {
|
try {
|
||||||
db = new D2DGridDatabase(serverConfig, dbId);
|
// this is still necessary on other JVMs from where
|
||||||
|
// ingested
|
||||||
|
String d2dModelName = serverConfig
|
||||||
|
.d2dModelNameMapping(modelName);
|
||||||
|
db = new D2DGridDatabase(serverConfig, d2dModelName,
|
||||||
|
dbId.getModelTimeAsDate());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
statusHandler.handle(Priority.PROBLEM,
|
statusHandler.handle(Priority.PROBLEM,
|
||||||
e.getLocalizedMessage());
|
e.getLocalizedMessage());
|
||||||
|
@ -1363,10 +1328,9 @@ public class GridParmManager {
|
||||||
private static void createDbNotification(String siteID,
|
private static void createDbNotification(String siteID,
|
||||||
List<DatabaseID> dbs, List<DatabaseID> additions,
|
List<DatabaseID> dbs, List<DatabaseID> additions,
|
||||||
List<DatabaseID> deletions) {
|
List<DatabaseID> deletions) {
|
||||||
DBInvChangeNotification notify = new DBInvChangeNotification(dbs,
|
|
||||||
additions, deletions, siteID);
|
|
||||||
|
|
||||||
if (!additions.isEmpty() || !deletions.isEmpty()) {
|
if (!additions.isEmpty() || !deletions.isEmpty()) {
|
||||||
|
DBInvChangeNotification notify = new DBInvChangeNotification(dbs,
|
||||||
|
additions, deletions, siteID);
|
||||||
SendNotifications.send(notify);
|
SendNotifications.send(notify);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -94,7 +94,6 @@ import com.raytheon.uf.edex.core.dataplugin.PluginRegistry;
|
||||||
import com.raytheon.uf.edex.database.DataAccessLayerException;
|
import com.raytheon.uf.edex.database.DataAccessLayerException;
|
||||||
import com.raytheon.uf.edex.database.plugin.PluginFactory;
|
import com.raytheon.uf.edex.database.plugin.PluginFactory;
|
||||||
import com.vividsolutions.jts.geom.Coordinate;
|
import com.vividsolutions.jts.geom.Coordinate;
|
||||||
import com.vividsolutions.jts.io.WKTReader;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GFE Grid database containing IFP Grid data.
|
* GFE Grid database containing IFP Grid data.
|
||||||
|
@ -115,6 +114,7 @@ import com.vividsolutions.jts.io.WKTReader;
|
||||||
* 02/12/13 #1608 randerso Changed to explicitly call deleteGroups
|
* 02/12/13 #1608 randerso Changed to explicitly call deleteGroups
|
||||||
* 03/07/13 #1737 njensen Logged getGridData times
|
* 03/07/13 #1737 njensen Logged getGridData times
|
||||||
* 03/15/13 #1795 njensen Added updatePublishTime()
|
* 03/15/13 #1795 njensen Added updatePublishTime()
|
||||||
|
* 03/20/13 #1774 randerso Cleanup code to use proper constructors
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -1191,6 +1191,7 @@ public class IFPGridDatabase extends GridDatabase {
|
||||||
"Unable to update grid history!!", e);
|
"Unable to update grid history!!", e);
|
||||||
}
|
}
|
||||||
return sr;
|
return sr;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1591,77 +1592,79 @@ public class IFPGridDatabase extends GridDatabase {
|
||||||
protected GridParmInfo populateGpi(Map<String, Object> dataAttributes)
|
protected GridParmInfo populateGpi(Map<String, Object> dataAttributes)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
|
|
||||||
GridParmInfo gpi = new GridParmInfo();
|
String projID = (String) dataAttributes
|
||||||
TimeConstraints tc = new TimeConstraints();
|
.get("gridLoc.projection.projectionID");
|
||||||
GridLocation location = new GridLocation();
|
ProjectionType projType = ProjectionType
|
||||||
ProjectionData pd = new ProjectionData();
|
.valueOf((String) dataAttributes
|
||||||
|
.get("gridLoc.projection.projectionType"));
|
||||||
pd.setProjectionID((String) dataAttributes
|
Coordinate latLonLL = new Coordinate(
|
||||||
.get("gridLoc.projection.projectionID"));
|
(Float) dataAttributes.get("gridLoc.projection.latLonLL.x"),
|
||||||
pd.setProjectionType(ProjectionType.valueOf((String) dataAttributes
|
(Float) dataAttributes.get("gridLoc.projection.latLonLL.y"));
|
||||||
.get("gridLoc.projection.projectionType")));
|
Coordinate latLonUR = new Coordinate(
|
||||||
pd.setLatLonLL(new Coordinate((Float) dataAttributes
|
(Float) dataAttributes.get("gridLoc.projection.latLonUR.x"),
|
||||||
.get("gridLoc.projection.latLonLL.x"), (Float) dataAttributes
|
(Float) dataAttributes.get("gridLoc.projection.latLonUR.y"));
|
||||||
.get("gridLoc.projection.latLonLL.y")));
|
Coordinate latLonOrig = new Coordinate(
|
||||||
pd.setLatLonUR(new Coordinate((Float) dataAttributes
|
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.x"),
|
||||||
.get("gridLoc.projection.latLonUR.x"), (Float) dataAttributes
|
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.y"));
|
||||||
.get("gridLoc.projection.latLonUR.y")));
|
Float stdPar1 = (Float) dataAttributes
|
||||||
pd.setLatLonOrigin(new Coordinate((Float) dataAttributes
|
.get("gridLoc.projection.stdParallelOne");
|
||||||
.get("gridLoc.projection.latLonOrigin.x"),
|
Float stdPar2 = (Float) dataAttributes
|
||||||
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.y")));
|
.get("gridLoc.projection.stdParallelTwo");
|
||||||
pd.setStdParallelOne((Float) dataAttributes
|
Point gridLL = new Point(
|
||||||
.get("gridLoc.projection.stdParallelOne"));
|
|
||||||
pd.setStdParallelTwo((Float) dataAttributes
|
|
||||||
.get("gridLoc.projection.stdParallelTwo"));
|
|
||||||
pd.setGridPointLL(new Point((Integer) dataAttributes
|
|
||||||
.get("gridLoc.projection.gridPointLL.x"),
|
|
||||||
(Integer) dataAttributes
|
(Integer) dataAttributes
|
||||||
.get("gridLoc.projection.gridPointLL.y")));
|
.get("gridLoc.projection.gridPointLL.x"),
|
||||||
pd.setGridPointUR(new Point((Integer) dataAttributes
|
|
||||||
.get("gridLoc.projection.gridPointUR.x"),
|
|
||||||
(Integer) dataAttributes
|
(Integer) dataAttributes
|
||||||
.get("gridLoc.projection.gridPointUR.y")));
|
.get("gridLoc.projection.gridPointLL.y"));
|
||||||
pd.setLatIntersect((Float) dataAttributes
|
Point gridUR = new Point(
|
||||||
.get("gridLoc.projection.latIntersect"));
|
(Integer) dataAttributes
|
||||||
pd.setLonCenter((Float) dataAttributes
|
.get("gridLoc.projection.gridPointUR.x"),
|
||||||
.get("gridLoc.projection.lonCenter"));
|
(Integer) dataAttributes
|
||||||
pd.setLonOrigin((Float) dataAttributes
|
.get("gridLoc.projection.gridPointUR.y"));
|
||||||
.get("gridLoc.projection.lonOrigin"));
|
Float latInt = (Float) dataAttributes
|
||||||
|
.get("gridLoc.projection.latIntersect");
|
||||||
|
Float lonCenter = (Float) dataAttributes
|
||||||
|
.get("gridLoc.projection.lonCenter");
|
||||||
|
Float lonOrig = (Float) dataAttributes
|
||||||
|
.get("gridLoc.projection.lonOrigin");
|
||||||
|
ProjectionData proj = new ProjectionData(projID, projType, latLonLL,
|
||||||
|
latLonUR, latLonOrig, stdPar1, stdPar2, gridLL, gridUR, latInt,
|
||||||
|
lonCenter, lonOrig);
|
||||||
|
|
||||||
location.setSiteId((String) dataAttributes.get("gridLoc.siteID"));
|
String id = (String) dataAttributes.get("gridLoc.siteID");
|
||||||
location.setNx((Integer) dataAttributes.get("gridLoc.nx"));
|
int nx = (Integer) dataAttributes.get("gridLoc.nx");
|
||||||
location.setNy((Integer) dataAttributes.get("gridLoc.ny"));
|
int ny = (Integer) dataAttributes.get("gridLoc.ny");
|
||||||
location.setTimeZone((String) dataAttributes.get("gridLoc.timeZone"));
|
Coordinate domainOrigin = new Coordinate(
|
||||||
location.setOrigin(new Coordinate((Float) dataAttributes
|
(Float) dataAttributes.get("gridLoc.origin.x"),
|
||||||
.get("gridLoc.origin.x"), (Float) dataAttributes
|
(Float) dataAttributes.get("gridLoc.origin.y"));
|
||||||
.get("gridLoc.origin.y")));
|
Coordinate domainExtent = new Coordinate(
|
||||||
location.setExtent(new Coordinate((Float) dataAttributes
|
(Float) dataAttributes.get("gridLoc.extent.x"),
|
||||||
.get("gridLoc.extent.x"), (Float) dataAttributes
|
(Float) dataAttributes.get("gridLoc.extent.y"));
|
||||||
.get("gridLoc.extent.y")));
|
String timeZone = (String) dataAttributes.get("gridLoc.timeZone");
|
||||||
location.setGeometry(new WKTReader().read((String) dataAttributes
|
GridLocation gridLoc = new GridLocation(id, proj, new Point(nx, ny),
|
||||||
.get("gridLoc.geometry")));
|
domainOrigin, domainExtent, timeZone);
|
||||||
location.setCrsWKT((String) dataAttributes.get("gridLoc.crs"));
|
|
||||||
location.setProjection(pd);
|
|
||||||
|
|
||||||
tc.setDuration((Integer) dataAttributes.get("timeConstraints.duration"));
|
int duration = (Integer) dataAttributes.get("timeConstraints.duration");
|
||||||
tc.setRepeatInterval((Integer) dataAttributes
|
int repeatInterval = (Integer) dataAttributes
|
||||||
.get("timeConstraints.repeatInterval"));
|
.get("timeConstraints.repeatInterval");
|
||||||
tc.setStartTime((Integer) dataAttributes
|
int startTime = (Integer) dataAttributes
|
||||||
.get("timeConstraints.startTime"));
|
.get("timeConstraints.startTime");
|
||||||
|
TimeConstraints timeConstraints = new TimeConstraints(duration,
|
||||||
|
repeatInterval, startTime);
|
||||||
|
|
||||||
gpi.setParmID(new ParmID((String) dataAttributes.get("parmID")));
|
ParmID parmId = new ParmID((String) dataAttributes.get("parmID"));
|
||||||
gpi.setGridType(GridType.valueOf((String) dataAttributes
|
GridType gridType = GridType.valueOf((String) dataAttributes
|
||||||
.get("gridType")));
|
.get("gridType"));
|
||||||
gpi.setDescriptiveName((String) dataAttributes.get("descriptiveName"));
|
String descriptiveName = (String) dataAttributes.get("descriptiveName");
|
||||||
gpi.setUnitString((String) dataAttributes.get("unitString"));
|
String unit = (String) dataAttributes.get("unitString");
|
||||||
gpi.setMaxValue((Float) dataAttributes.get("maxValue"));
|
Float minValue = (Float) dataAttributes.get("minValue");
|
||||||
gpi.setMinValue((Float) dataAttributes.get("minValue"));
|
Float maxValue = (Float) dataAttributes.get("maxValue");
|
||||||
gpi.setPrecision((Integer) dataAttributes.get("precision"));
|
int precision = (Integer) dataAttributes.get("precision");
|
||||||
gpi.setRateParm((Boolean) dataAttributes.get("rateParm"));
|
boolean timeIndependentParm = (Boolean) dataAttributes
|
||||||
gpi.setTimeIndependentParm((Boolean) dataAttributes
|
.get("timeIndependentParm");
|
||||||
.get("timeIndependentParm"));
|
boolean rateParm = (Boolean) dataAttributes.get("rateParm");
|
||||||
gpi.setTimeConstraints(tc);
|
GridParmInfo gpi = new GridParmInfo(parmId, gridLoc, gridType, unit,
|
||||||
gpi.setGridLoc(location);
|
descriptiveName, minValue, maxValue, precision,
|
||||||
|
timeIndependentParm, timeConstraints, rateParm);
|
||||||
|
|
||||||
return gpi;
|
return gpi;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,34 +36,32 @@ import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
|
||||||
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
||||||
import com.raytheon.edex.plugin.gfe.server.D2DSatParm;
|
import com.raytheon.edex.plugin.gfe.server.D2DSatParm;
|
||||||
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
|
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.D2DSatDatabase;
|
import com.raytheon.edex.plugin.gfe.server.database.D2DSatDatabase;
|
||||||
import com.raytheon.edex.plugin.gfe.server.database.D2DSatDatabaseManager;
|
import com.raytheon.edex.plugin.gfe.server.database.D2DSatDatabaseManager;
|
||||||
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitQueue;
|
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitQueue;
|
||||||
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitRecord;
|
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitRecord;
|
||||||
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitRecordPK;
|
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitRecordPK;
|
||||||
import com.raytheon.edex.plugin.gfe.util.GridTranslator;
|
|
||||||
import com.raytheon.edex.plugin.gfe.util.SendNotifications;
|
import com.raytheon.edex.plugin.gfe.util.SendNotifications;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID.DataType;
|
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.server.notify.DBInvChangeNotification;
|
import com.raytheon.uf.common.dataplugin.gfe.server.notify.DBInvChangeNotification;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GfeNotification;
|
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GfeNotification;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
|
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
|
||||||
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
|
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
|
||||||
|
import com.raytheon.uf.common.dataplugin.level.Level;
|
||||||
import com.raytheon.uf.common.dataplugin.satellite.SatelliteRecord;
|
import com.raytheon.uf.common.dataplugin.satellite.SatelliteRecord;
|
||||||
import com.raytheon.uf.common.message.WsId;
|
import com.raytheon.uf.common.message.WsId;
|
||||||
import com.raytheon.uf.common.parameter.mapping.ParameterMapper;
|
|
||||||
import com.raytheon.uf.common.serialization.SerializationUtil;
|
import com.raytheon.uf.common.serialization.SerializationUtil;
|
||||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
import com.raytheon.uf.common.status.UFStatus;
|
import com.raytheon.uf.common.status.UFStatus;
|
||||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
import com.raytheon.uf.common.util.mapping.MultipleMappingException;
|
|
||||||
import com.raytheon.uf.edex.core.EDEXUtil;
|
import com.raytheon.uf.edex.core.EDEXUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO Add Description
|
* Filters data URI notifications and sends GridUpdate and DbInvChanged
|
||||||
|
* notifications for new D2D data
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
*
|
*
|
||||||
|
@ -77,6 +75,7 @@ import com.raytheon.uf.edex.core.EDEXUtil;
|
||||||
* D2DParmIdCache to GfeIngestNotificationFilter
|
* D2DParmIdCache to GfeIngestNotificationFilter
|
||||||
* Mar 25, 2013 1823 dgilling Trigger SAT smart init based only on record's
|
* Mar 25, 2013 1823 dgilling Trigger SAT smart init based only on record's
|
||||||
* SectorId and PhysicalElement.
|
* SectorId and PhysicalElement.
|
||||||
|
* Mar 20, 2013 #1774 randerso Refactor to use grid durations from D2DGridDatabase
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -124,7 +123,6 @@ public class GfeIngestNotificationFilter {
|
||||||
Map<SmartInitRecordPK, SmartInitRecord> inits = new HashMap<SmartInitRecordPK, SmartInitRecord>();
|
Map<SmartInitRecordPK, SmartInitRecord> inits = new HashMap<SmartInitRecordPK, SmartInitRecord>();
|
||||||
// Loop through each record received and construct a ParmID
|
// Loop through each record received and construct a ParmID
|
||||||
Map<ParmID, List<TimeRange>> gridInv = new HashMap<ParmID, List<TimeRange>>();
|
Map<ParmID, List<TimeRange>> gridInv = new HashMap<ParmID, List<TimeRange>>();
|
||||||
List<GridUpdateNotification> guns = new ArrayList<GridUpdateNotification>();
|
|
||||||
Set<DatabaseID> newDbs = new HashSet<DatabaseID>();
|
Set<DatabaseID> newDbs = new HashSet<DatabaseID>();
|
||||||
|
|
||||||
IFPServerConfig config = null;
|
IFPServerConfig config = null;
|
||||||
|
@ -138,12 +136,11 @@ public class GfeIngestNotificationFilter {
|
||||||
for (GridRecord grid : gridRecords) {
|
for (GridRecord grid : gridRecords) {
|
||||||
String gfeModel = config.gfeModelNameMapping(grid
|
String gfeModel = config.gfeModelNameMapping(grid
|
||||||
.getDatasetId());
|
.getDatasetId());
|
||||||
|
DatabaseID dbId = D2DGridDatabase.getDbId(grid.getDatasetId(),
|
||||||
|
grid.getDataTime().getRefTime(), config);
|
||||||
|
|
||||||
// ignore if no mapping
|
// ignore if no mapping
|
||||||
if (gfeModel != null && gfeModel.length() > 0) {
|
if (dbId != null) {
|
||||||
DatabaseID dbId = new DatabaseID(site, DataType.GRID,
|
|
||||||
"D2D", gfeModel, grid.getDataTime().getRefTime());
|
|
||||||
|
|
||||||
if ((!D2DParmIdCache.getInstance().getDatabaseIDs()
|
if ((!D2DParmIdCache.getInstance().getDatabaseIDs()
|
||||||
.contains(dbId))
|
.contains(dbId))
|
||||||
&& (!newDbs.contains(dbId))) {
|
&& (!newDbs.contains(dbId))) {
|
||||||
|
@ -158,33 +155,22 @@ public class GfeIngestNotificationFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
String abbrev = grid.getParameter().getAbbreviation();
|
String abbrev = grid.getParameter().getAbbreviation();
|
||||||
String gfeParmName = null;
|
Level level = grid.getLevel();
|
||||||
try {
|
|
||||||
gfeParmName = ParameterMapper.getInstance()
|
|
||||||
.lookupAlias(abbrev, "gfeParamName");
|
|
||||||
} catch (MultipleMappingException e) {
|
|
||||||
statusHandler.handle(Priority.WARN,
|
|
||||||
e.getLocalizedMessage(), e);
|
|
||||||
gfeParmName = e.getArbitraryMapping();
|
|
||||||
}
|
|
||||||
|
|
||||||
String level = GridTranslator.getShortLevelName(grid
|
D2DGridDatabase db = (D2DGridDatabase) GridParmManager
|
||||||
.getLevel().getMasterLevel().getName(), grid
|
.getDb(dbId);
|
||||||
.getLevel().getLevelonevalue(), grid.getLevel()
|
ParmID parmID = db.getParmId(abbrev, level);
|
||||||
.getLeveltwovalue());
|
|
||||||
ParmID parmID = new ParmID(gfeParmName, dbId, level);
|
|
||||||
|
|
||||||
List<TimeRange> trs = gridInv.get(parmID);
|
List<TimeRange> trs = gridInv.get(parmID);
|
||||||
if (trs == null) {
|
if (trs == null) {
|
||||||
trs = new ArrayList<TimeRange>();
|
trs = new ArrayList<TimeRange>();
|
||||||
gridInv.put(parmID, trs);
|
gridInv.put(parmID, trs);
|
||||||
}
|
}
|
||||||
TimeRange validPeriod = grid.getDataTime().getValidPeriod();
|
|
||||||
if (validPeriod.getDuration() > 0) {
|
Integer fcstHour = grid.getDataTime().getFcstTime();
|
||||||
trs.add(validPeriod);
|
TimeRange tr = db.getTimeRange(parmID, fcstHour);
|
||||||
} else {
|
if (tr != null) {
|
||||||
trs.add(new TimeRange(grid.getDataTime()
|
trs.add(tr);
|
||||||
.getValidPeriod().getStart(), 3600 * 1000));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> siteInitModules = config.initModels(gfeModel);
|
List<String> siteInitModules = config.initModels(gfeModel);
|
||||||
|
@ -215,6 +201,7 @@ public class GfeIngestNotificationFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DR 15442 - move last for loop out of the for loop at line 110
|
// DR 15442 - move last for loop out of the for loop at line 110
|
||||||
|
List<GridUpdateNotification> guns = new ArrayList<GridUpdateNotification>();
|
||||||
for (ParmID parmId : gridInv.keySet()) {
|
for (ParmID parmId : gridInv.keySet()) {
|
||||||
try {
|
try {
|
||||||
List<TimeRange> trs = gridInv.get(parmId);
|
List<TimeRange> trs = gridInv.get(parmId);
|
||||||
|
|
|
@ -1,152 +1,437 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<!--
|
||||||
|
Mar 20, 2013 #1774 randerso Added all parms from dataFieldTable.txt
|
||||||
|
sorted lists for ease of update
|
||||||
|
-->
|
||||||
<aliasList caseSensitive="true" namespace="gfeParamName">
|
<aliasList caseSensitive="true" namespace="gfeParamName">
|
||||||
<alias base="WGH">wgh</alias>
|
<alias base="AV">av</alias>
|
||||||
<alias base="AV">av</alias>
|
<alias base="CAPE">cape</alias>
|
||||||
<alias base="CRAIN">crain</alias>
|
<alias base="CFRZR">cfrzr</alias>
|
||||||
<alias base="CFRZR">cfrzr</alias>
|
<alias base="CICEP">cicep</alias>
|
||||||
<alias base="CICEP">cicep</alias>
|
<alias base="CIn">cin</alias>
|
||||||
<alias base="CSNOW">csnow</alias>
|
<alias base="CP3hr">cp3hr</alias>
|
||||||
<alias base="CAPE">cape</alias>
|
<alias base="CP">cp</alias>
|
||||||
<alias base="CIn">cin</alias>
|
<alias base="CPOFP">cpofp</alias>
|
||||||
<alias base="CP">cp</alias>
|
<alias base="CPOZP">cpozp</alias>
|
||||||
<alias base="CP3hr">cp3hr</alias>
|
<alias base="CRAIN">crain</alias>
|
||||||
<alias base="DpD">dpd</alias>
|
<alias base="CSNOW">csnow</alias>
|
||||||
<alias base="DpT">dpt</alias>
|
<alias base="DIRPW">dirpw</alias>
|
||||||
<alias base="WVDIR">wvdir</alias>
|
<alias base="DIRSW">dirsw</alias>
|
||||||
<alias base="SWDIR">swdir</alias>
|
<alias base="DpD">dpd</alias>
|
||||||
<alias base="EPT">ept</alias>
|
<alias base="DpT">dpt</alias>
|
||||||
<alias base="GeH">geh</alias>
|
<alias base="EMSP">emsp</alias>
|
||||||
<alias base="GH">gh</alias>
|
<alias base="EPT">ept</alias>
|
||||||
<alias base="HIdx">hidx</alias>
|
<alias base="GeH">geh</alias>
|
||||||
<alias base="LgSP">lgsp</alias>
|
<alias base="GH">gh</alias>
|
||||||
<alias base="LgSP3hr">lgsp3hr</alias>
|
<alias base="GVV">gvv</alias>
|
||||||
<alias base="LHF">lhf</alias>
|
<alias base="Heli">heli</alias>
|
||||||
<alias base="MnT">mnt</alias>
|
<alias base="HIdx">hidx</alias>
|
||||||
<alias base="WVPER">wvper</alias>
|
<alias base="HTSGW">htsgw</alias>
|
||||||
<alias base="SWPER">swper</alias>
|
<alias base="KI">ki</alias>
|
||||||
<alias base="MxT">mxt</alias>
|
<alias base="LgSP3hr">lgsp3hr</alias>
|
||||||
<alias base="PLI">pli</alias>
|
<alias base="LgSP">lgsp</alias>
|
||||||
<alias base="PoT">pot</alias>
|
<alias base="LHF">lhf</alias>
|
||||||
<alias base="P">p</alias>
|
<alias base="MMSP">mmsp</alias>
|
||||||
<alias base="PMSL">pmsl</alias>
|
<alias base="MnT">mnt</alias>
|
||||||
<alias base="EMSP">emsp</alias>
|
<alias base="MSG">msg</alias>
|
||||||
<alias base="MMSP">mmsp</alias>
|
<alias base="MxT">mxt</alias>
|
||||||
<alias base="DIRPW">dirpw</alias>
|
<alias base="PERPW">perpw</alias>
|
||||||
<alias base="PERPW">perpw</alias>
|
<alias base="PERSW">persw</alias>
|
||||||
<alias base="HTSGW">htsgw</alias>
|
<alias base="PLI">pli</alias>
|
||||||
<alias base="PR">pr</alias>
|
<alias base="PMSL">pmsl</alias>
|
||||||
<alias base="CPOFP">cpofp</alias>
|
<alias base="PoT">pot</alias>
|
||||||
<alias base="CPOZP">cpozp</alias>
|
<alias base="P">p</alias>
|
||||||
<alias base="PW">pw</alias>
|
<alias base="PR">pr</alias>
|
||||||
<alias base="RH">rh</alias>
|
<alias base="PVV">pvv</alias>
|
||||||
<alias base="SHF">shf</alias>
|
<alias base="PW">pw</alias>
|
||||||
<alias base="DIRSW">dirsw</alias>
|
<alias base="RH">rh</alias>
|
||||||
<alias base="PERSW">persw</alias>
|
<alias base="SCP">scp</alias>
|
||||||
<alias base="WVHGT">wvhgt</alias>
|
<alias base="SHF">shf</alias>
|
||||||
<alias base="SWELL">swell</alias>
|
<alias base="SH">sh</alias>
|
||||||
<alias base="SCP">scp</alias>
|
<alias base="SLI">sli</alias>
|
||||||
<alias base="SnD">snd</alias>
|
<alias base="SnD">snd</alias>
|
||||||
<alias base="SH">sh</alias>
|
<alias base="SVV">svv</alias>
|
||||||
<alias base="Heli">heli</alias>
|
<alias base="SWDIR">swdir</alias>
|
||||||
<alias base="SLI">sli</alias>
|
<alias base="SWELL">swell</alias>
|
||||||
<alias base="BLI">bli</alias>
|
<alias base="SWPER">swper</alias>
|
||||||
<alias base="T">t</alias>
|
<alias base="TCC">tcc</alias>
|
||||||
<alias base="TCC">tcc</alias>
|
<alias base="ThP">thp</alias>
|
||||||
<alias base="ThP">thp</alias>
|
<alias base="TKE">tke</alias>
|
||||||
<alias base="TP">tp</alias>
|
<alias base="TP12hr">tp12hr</alias>
|
||||||
<alias base="TP3hr">tp3hr</alias>
|
<alias base="TP24hr">tp24hr</alias>
|
||||||
<alias base="TP6hr">tp6hr</alias>
|
<alias base="TP3hr">tp3hr</alias>
|
||||||
<alias base="TP12hr">tp12hr</alias>
|
<alias base="TP48hr">tp48hr</alias>
|
||||||
<alias base="TP24hr">tp24hr</alias>
|
<alias base="TP6hr">tp6hr</alias>
|
||||||
<alias base="TP48hr">tp48hr</alias>
|
<alias base="TP">tp</alias>
|
||||||
<alias base="USTM">ustm</alias>
|
<alias base="T">t</alias>
|
||||||
<alias base="VSTM">vstm</alias>
|
<alias base="USTM">ustm</alias>
|
||||||
<alias base="uW">uw</alias>
|
<alias base="uW">uw</alias>
|
||||||
<alias base="vW">vw</alias>
|
<alias base="VAPP">vapp</alias>
|
||||||
<alias base="VAPP">vapp</alias>
|
<alias base="Vis">vis</alias>
|
||||||
<alias base="PVV">pvv</alias>
|
<alias base="VPT">vpt</alias>
|
||||||
<alias base="Vis">vis</alias>
|
<alias base="VSTM">vstm</alias>
|
||||||
<alias base="VPT">vpt</alias>
|
<alias base="vW">vw</alias>
|
||||||
<alias base="WEASD">weasd</alias>
|
<alias base="WD">wd</alias>
|
||||||
<alias base="WD">wd</alias>
|
<alias base="WEASD">weasd</alias>
|
||||||
<alias base="WS">ws</alias>
|
<alias base="WGH">wgh</alias>
|
||||||
<alias base="WGS">wgs</alias>
|
<alias base="WGS">wgs</alias>
|
||||||
<alias base="MSG">msg</alias>
|
<alias base="WS">ws</alias>
|
||||||
<alias base="SVV">svv</alias>
|
<alias base="WVDIR">wvdir</alias>
|
||||||
<alias base="GVV">gvv</alias>
|
<alias base="WVHGT">wvhgt</alias>
|
||||||
<alias base="KI">ki</alias>
|
<alias base="WVPER">wvper</alias>
|
||||||
<alias base="TKE">tke</alias>
|
<!-- Parameters below this point are not defined in parameter definition
|
||||||
<!-- Parameters below this point are not defined in parameter definition
|
files. Since these are not very well defined parameters they will only be
|
||||||
files. Since these are not very well defined parameters they will only be
|
used if the grib decoder happens to give parameters the same base abbreviation.
|
||||||
used if the grib decoder happens to give parameters the same base abbreviation.
|
In the future more work should be done to merge these names into definition
|
||||||
In the future more work should be done to merge these names into definition
|
files. -->
|
||||||
files. -->
|
<alias base="ADIMC">adimc</alias>
|
||||||
<alias base="CCP">ccpc</alias>
|
<alias base="Alti">alti</alias>
|
||||||
<alias base="Pchg">pt3</alias>
|
<alias base="BH">bh</alias>
|
||||||
<alias base="VV">ww</alias>
|
<alias base="BLI">bli</alias>
|
||||||
<alias base="TP-HPC">tp_HPC</alias>
|
<alias base="BPVV">bpvv</alias>
|
||||||
<alias base="TP-ACR">tp_ACR</alias>
|
<alias base="BWu">bwu</alias>
|
||||||
<alias base="TP-ALR">tp_ALR</alias>
|
<alias base="BWv">bwv</alias>
|
||||||
<alias base="TP-FWR">tp_FWR</alias>
|
<alias base="CAPEc1">capec1</alias>
|
||||||
<alias base="TP-KRF">tp_KRF</alias>
|
<alias base="CAPEc2">capec2</alias>
|
||||||
<alias base="TP-MSR">tp_MSR</alias>
|
<alias base="CAPEc3">capec3</alias>
|
||||||
<alias base="TP-ORN">tp_ORN</alias>
|
<alias base="CAPEc4">capec4</alias>
|
||||||
<alias base="TP-PTR">tp_PTR</alias>
|
<alias base="CAPEc5">capec5</alias>
|
||||||
<alias base="TP-RHA">tp_RHA</alias>
|
<alias base="CB">cb</alias>
|
||||||
<alias base="TP-RSA">tp_RSA</alias>
|
<alias base="CC">cc</alias>
|
||||||
<alias base="TP-STR">tp_STR</alias>
|
<alias base="CCOV">ccov</alias>
|
||||||
<alias base="TP-TAR">tp_TAR</alias>
|
<alias base="CCP">ccpc</alias>
|
||||||
<alias base="TP-TIR">tp_TIR</alias>
|
<alias base="CFRZRc1">cfrzrc1</alias>
|
||||||
<alias base="TP-TUA">tp_TUA</alias>
|
<alias base="CFRZRmean">cfrzrmean</alias>
|
||||||
<alias base="TP3mean">tpmean3</alias>
|
<alias base="CFRZRsprd">cfrzrsprd</alias>
|
||||||
<alias base="TP6mean">tpmean6</alias>
|
<alias base="CIce">cice</alias>
|
||||||
<alias base="TP12mean">tpmean12</alias>
|
<alias base="CICEPc1">cicepc1</alias>
|
||||||
<alias base="TP24mean">tpmean24</alias>
|
<alias base="CICEPmean">cicepmean</alias>
|
||||||
<alias base="SNOL12mean">snolmean12</alias>
|
<alias base="CICEPsprd">cicepsprd</alias>
|
||||||
<alias base="TP3sprd">tpsprd3</alias>
|
<alias base="Cigc1">cigc1</alias>
|
||||||
<alias base="TP6sprd">tpsprd6</alias>
|
<alias base="Cigc2">cigc2</alias>
|
||||||
<alias base="TP12sprd">tpsprd12</alias>
|
<alias base="Cigc3">cigc3</alias>
|
||||||
<alias base="TP24sprd">tpsprd24</alias>
|
<alias base="CP2hr">cp2hr</alias>
|
||||||
<alias base="SNOL12sprd">snolsprd12</alias>
|
<alias base="CPVV">cpvv</alias>
|
||||||
<alias base="QPE01">qpe1</alias>
|
<alias base="CRAINc1">crainc1</alias>
|
||||||
<alias base="QPE06">qpe6</alias>
|
<alias base="CRAINmean">crainmean</alias>
|
||||||
<alias base="TPCSG">Surge10Pct</alias>
|
<alias base="CRAINsprd">crainsprd</alias>
|
||||||
<alias base="TPCSG-305E2">PSurge10Ft</alias>
|
<alias base="CSNOWc1">csnowc1</alias>
|
||||||
<alias base="TPCSG-274E2">PSurge9Ft</alias>
|
<alias base="CSNOWmean">csnowmean</alias>
|
||||||
<alias base="TPCSG-244E2">PSurge8Ft</alias>
|
<alias base="CSNOWsprd">csnowsprd</alias>
|
||||||
<alias base="TPCSG-213E2">PSurge7Ft</alias>
|
<alias base="CSSI">cssi</alias>
|
||||||
<alias base="TPCSG-183E2">PSurge6Ft</alias>
|
<alias base="CTop">ctop</alias>
|
||||||
<alias base="TPCSG-152E2">PSurge5Ft</alias>
|
<alias base="CTSTM">ctstm</alias>
|
||||||
<alias base="TPCSG-122E2">PSurge4Ft</alias>
|
<alias base="CTyp">ctyp</alias>
|
||||||
<alias base="TPCSG-91E2">PSurge3Ft</alias>
|
<alias base="CW">cw</alias>
|
||||||
<alias base="TPCSG-61E2">PSurge2Ft</alias>
|
<alias base="CXR">cxr</alias>
|
||||||
<alias base="SIPD">sld</alias>
|
<alias base="DpTerranl">dpterranl</alias>
|
||||||
<alias base="MAXRH3hr">maxRH3hr</alias>
|
<alias base="DpTmean">dptmean</alias>
|
||||||
<alias base="MAXRH12hr">maxRH12hr</alias>
|
<alias base="DpTsprd">dptsprd</alias>
|
||||||
<alias base="MINRH3hr">minRH3hr</alias>
|
<alias base="ELON">elon</alias>
|
||||||
<alias base="MINRH12hr">minRH12hr</alias>
|
<alias base="FD">fd</alias>
|
||||||
<alias base="TPCSG-SLOSH">SloshSurge</alias>
|
<alias base="FZNP">fznp</alias>
|
||||||
<alias base="TPCSG-20">Surge20Pct</alias>
|
<alias base="GHmean">ghmean</alias>
|
||||||
<alias base="TPCSG-30">Surge30Pct</alias>
|
<alias base="GHsprd">ghsprd</alias>
|
||||||
<alias base="TPCSG-40">Surge40Pct</alias>
|
<alias base="HyC">hyc</alias>
|
||||||
<alias base="TPCSG-50">Surge50Pct</alias>
|
<alias base="ICEC">icec</alias>
|
||||||
<alias base="TPCSG-60">Surge60Pct</alias>
|
<alias base="ICEG">iceg</alias>
|
||||||
<alias base="TPCSG-70">Surge70Pct</alias>
|
<alias base="ICNG">icng</alias>
|
||||||
<alias base="TPCSG-80">Surge80Pct</alias>
|
<alias base="ICPRB">icprb</alias>
|
||||||
<alias base="TPCSG-90">Surge90Pct</alias>
|
<alias base="ICSEV">icsev</alias>
|
||||||
<alias base="TPCSG-335E2">PSurge11Ft</alias>
|
<alias base="IIdx">iidx</alias>
|
||||||
<alias base="TPCSG-366E2">PSurge12Ft</alias>
|
<alias base="ILW">ilw</alias>
|
||||||
<alias base="TPCSG-396E2">PSurge13Ft</alias>
|
<alias base="IP">ip</alias>
|
||||||
<alias base="TPCSG-427E2">PSurge14Ft</alias>
|
<alias base="LgSP2hr">lgsp2hr</alias>
|
||||||
<alias base="TPCSG-457E2">PSurge15Ft</alias>
|
<alias base="LLIP">llip</alias>
|
||||||
<alias base="TPCSG-488E2">PSurge16Ft</alias>
|
<alias base="LLR">llr</alias>
|
||||||
<alias base="TPCSG-518E2">PSurge17Ft</alias>
|
<alias base="LZFPC">lzfpc</alias>
|
||||||
<alias base="TPCSG-549E2">PSurge18Ft</alias>
|
<alias base="LZFSC">lzfsc</alias>
|
||||||
<alias base="TPCSG-579E2">PSurge19Ft</alias>
|
<alias base="LZTWC">lztwc</alias>
|
||||||
<alias base="TPCSG-610E2">PSurge20Ft</alias>
|
<alias base="MAdv">madv</alias>
|
||||||
<alias base="TPCSG-640E2">PSurge21Ft</alias>
|
<alias base="MAXRH12hr">maxRH12hr</alias>
|
||||||
<alias base="TPCSG-671E2">PSurge22Ft</alias>
|
<alias base="MAXRH3hr">maxRH3hr</alias>
|
||||||
<alias base="TPCSG-701E2">PSurge23Ft</alias>
|
<alias base="MCDD">mcdd</alias>
|
||||||
<alias base="TPCSG-732E2">PSurge24Ft</alias>
|
<alias base="MCon">mcon</alias>
|
||||||
<alias base="TPCSG-762E2">PSurge25Ft</alias>
|
<alias base="MINRH12hr">minRH12hr</alias>
|
||||||
|
<alias base="MINRH3hr">minRH3hr</alias>
|
||||||
|
<alias base="MnT12hr">mnt12hr</alias>
|
||||||
|
<alias base="MnT3hr">mnt3hr</alias>
|
||||||
|
<alias base="MnT6hr">mnt6hr</alias>
|
||||||
|
<alias base="MRET">mret</alias>
|
||||||
|
<alias base="MSLP">mslp</alias>
|
||||||
|
<alias base="MWu">mwu</alias>
|
||||||
|
<alias base="MWv">mwv</alias>
|
||||||
|
<alias base="MxT12hr">mxt12hr</alias>
|
||||||
|
<alias base="MxT3hr">mxt3hr</alias>
|
||||||
|
<alias base="MxT6hr">mxt6hr</alias>
|
||||||
|
<alias base="NBE">nbe</alias>
|
||||||
|
<alias base="NLAT">nlat</alias>
|
||||||
|
<alias base="NLRS">nlrs</alias>
|
||||||
|
<alias base="OTIM">otim</alias>
|
||||||
|
<alias base="PAcc">pacc</alias>
|
||||||
|
<alias base="PBE">pbe</alias>
|
||||||
|
<alias base="Pchg">pt3</alias>
|
||||||
|
<alias base="PC">pc</alias>
|
||||||
|
<alias base="Perranl">perranl</alias>
|
||||||
|
<alias base="PICE">pice</alias>
|
||||||
|
<alias base="PLIxc1">plixc1</alias>
|
||||||
|
<alias base="PLIxc2">plixc2</alias>
|
||||||
|
<alias base="PLIxc3">plixc3</alias>
|
||||||
|
<alias base="PLIxc4">plixc4</alias>
|
||||||
|
<alias base="PLIxc5">plixc5</alias>
|
||||||
|
<alias base="PMSLmean">pmslmean</alias>
|
||||||
|
<alias base="PMSLsprd">pmslsprd</alias>
|
||||||
|
<alias base="POP12hr">pop12hr</alias>
|
||||||
|
<alias base="POP3hr">pop3hr</alias>
|
||||||
|
<alias base="POP6hr">pop6hr</alias>
|
||||||
|
<alias base="POP">pop</alias>
|
||||||
|
<alias base="PPAM">ppam</alias>
|
||||||
|
<alias base="PPAN">ppan</alias>
|
||||||
|
<alias base="PPAS">ppas</alias>
|
||||||
|
<alias base="PPBM">ppbm</alias>
|
||||||
|
<alias base="PPBN">ppbn</alias>
|
||||||
|
<alias base="PPBS">ppbs</alias>
|
||||||
|
<alias base="PPFFG">ppffg</alias>
|
||||||
|
<alias base="PPNN">ppnn</alias>
|
||||||
|
<alias base="prcp12hr">prcp12hr</alias>
|
||||||
|
<alias base="prcp3hr">prcp3hr</alias>
|
||||||
|
<alias base="prcp6hr">prcp6hr</alias>
|
||||||
|
<alias base="Prob34">prob34</alias>
|
||||||
|
<alias base="Prob50">prob50</alias>
|
||||||
|
<alias base="Prob64">prob64</alias>
|
||||||
|
<alias base="PTAM">ptam</alias>
|
||||||
|
<alias base="PTAN">ptan</alias>
|
||||||
|
<alias base="PTA">pta</alias>
|
||||||
|
<alias base="PTAS">ptas</alias>
|
||||||
|
<alias base="PTBM">ptbm</alias>
|
||||||
|
<alias base="PTBN">ptbn</alias>
|
||||||
|
<alias base="PTBS">ptbs</alias>
|
||||||
|
<alias base="PTNN">ptnn</alias>
|
||||||
|
<alias base="PTOR">ptor</alias>
|
||||||
|
<alias base="PT">pt</alias>
|
||||||
|
<alias base="PTT">ptt</alias>
|
||||||
|
<alias base="PTyp">ptyp</alias>
|
||||||
|
<alias base="PWmean">pwmean</alias>
|
||||||
|
<alias base="PWS34">pws34</alias>
|
||||||
|
<alias base="PWS50">pws50</alias>
|
||||||
|
<alias base="PWS64">pws64</alias>
|
||||||
|
<alias base="PWsprd">pwsprd</alias>
|
||||||
|
<alias base="QPE01">qpe1</alias>
|
||||||
|
<alias base="QPE06">qpe6</alias>
|
||||||
|
<alias base="QPE24">qpe24</alias>
|
||||||
|
<alias base="RAIN">rain</alias>
|
||||||
|
<alias base="REFC">refc</alias>
|
||||||
|
<alias base="REFD">refd</alias>
|
||||||
|
<alias base="RHmean">rhmean</alias>
|
||||||
|
<alias base="RHsprd">rhsprd</alias>
|
||||||
|
<alias base="ROUTED_FLOW_C">routed_flow_c</alias>
|
||||||
|
<alias base="ROUTED_FLOW_H">routed_flow_h</alias>
|
||||||
|
<alias base="ROUTED_FLOW_M">routed_flow_m</alias>
|
||||||
|
<alias base="ROUTED_FLOW">routed_flow</alias>
|
||||||
|
<alias base="RR">rr</alias>
|
||||||
|
<alias base="RRV">rrv</alias>
|
||||||
|
<alias base="S1Hr">s1hr</alias>
|
||||||
|
<alias base="SAcc">sacc</alias>
|
||||||
|
<alias base="SHerranl">sherranl</alias>
|
||||||
|
<alias base="shWlt">shwlt</alias>
|
||||||
|
<alias base="SIPD">sld</alias>
|
||||||
|
<alias base="SI">si</alias>
|
||||||
|
<alias base="SMC">smc</alias>
|
||||||
|
<alias base="SNOL12c10">snol12c10</alias>
|
||||||
|
<alias base="SNOL12c1">snol12c1</alias>
|
||||||
|
<alias base="SNOL12c2">snol12c2</alias>
|
||||||
|
<alias base="SNOL12c3">snol12c3</alias>
|
||||||
|
<alias base="SNOL12c4">snol12c4</alias>
|
||||||
|
<alias base="SNOL12c5">snol12c5</alias>
|
||||||
|
<alias base="SNOL12c6">snol12c6</alias>
|
||||||
|
<alias base="SNOL12c7">snol12c7</alias>
|
||||||
|
<alias base="SNOL12c8">snol12c8</alias>
|
||||||
|
<alias base="SNOL12c9">snol12c9</alias>
|
||||||
|
<alias base="SNOL12mean">snolmean12</alias>
|
||||||
|
<alias base="SNOL12sprd">snolsprd12</alias>
|
||||||
|
<alias base="snowd3hr">snowd3hr</alias>
|
||||||
|
<alias base="snowd6hr">snowd6hr</alias>
|
||||||
|
<alias base="SNOW">snow</alias>
|
||||||
|
<alias base="SPT">spt</alias>
|
||||||
|
<alias base="STOT">stot</alias>
|
||||||
|
<alias base="STPA">stpa</alias>
|
||||||
|
<alias base="ST">st</alias>
|
||||||
|
<alias base="TAdv">tadv</alias>
|
||||||
|
<alias base="Tc1">tc1</alias>
|
||||||
|
<alias base="Terranl">terranl</alias>
|
||||||
|
<alias base="ThP12hr">thp12hr</alias>
|
||||||
|
<alias base="ThP3hr">thp3hr</alias>
|
||||||
|
<alias base="ThP6hr">thp6hr</alias>
|
||||||
|
<alias base="Tmean">tmean</alias>
|
||||||
|
<alias base="TOTSN">totsn</alias>
|
||||||
|
<alias base="TP120hr">tp120hr</alias>
|
||||||
|
<alias base="TP12c1">tp12c1</alias>
|
||||||
|
<alias base="TP12c2">tp12c2</alias>
|
||||||
|
<alias base="TP12c3">tp12c3</alias>
|
||||||
|
<alias base="TP12c4">tp12c4</alias>
|
||||||
|
<alias base="TP12c5">tp12c5</alias>
|
||||||
|
<alias base="TP12c6">tp12c6</alias>
|
||||||
|
<alias base="TP12c7">tp12c7</alias>
|
||||||
|
<alias base="TP12c8">tp12c8</alias>
|
||||||
|
<alias base="TP12mean">tpmean12</alias>
|
||||||
|
<alias base="TP12sprd">tpsprd12</alias>
|
||||||
|
<alias base="TP24c1">tp24c1</alias>
|
||||||
|
<alias base="TP24c2">tp24c2</alias>
|
||||||
|
<alias base="TP24c3">tp24c3</alias>
|
||||||
|
<alias base="TP24c4">tp24c4</alias>
|
||||||
|
<alias base="TP24c5">tp24c5</alias>
|
||||||
|
<alias base="TP24c6">tp24c6</alias>
|
||||||
|
<alias base="TP24c7">tp24c7</alias>
|
||||||
|
<alias base="TP24c8">tp24c8</alias>
|
||||||
|
<alias base="TP24mean">tpmean24</alias>
|
||||||
|
<alias base="TP24sprd">tpsprd24</alias>
|
||||||
|
<alias base="TP3c1">tp3c1</alias>
|
||||||
|
<alias base="TP3c2">tp3c2</alias>
|
||||||
|
<alias base="TP3c3">tp3c3</alias>
|
||||||
|
<alias base="TP3c4">tp3c4</alias>
|
||||||
|
<alias base="TP3c5">tp3c5</alias>
|
||||||
|
<alias base="TP3c6">tp3c6</alias>
|
||||||
|
<alias base="TP3c7">tp3c7</alias>
|
||||||
|
<alias base="TP3c8">tp3c8</alias>
|
||||||
|
<alias base="TP3mean">tpmean3</alias>
|
||||||
|
<alias base="TP3sprd">tpsprd3</alias>
|
||||||
|
<alias base="TP6c1">tp6c1</alias>
|
||||||
|
<alias base="TP6c2">tp6c2</alias>
|
||||||
|
<alias base="TP6c3">tp6c3</alias>
|
||||||
|
<alias base="TP6c4">tp6c4</alias>
|
||||||
|
<alias base="TP6c5">tp6c5</alias>
|
||||||
|
<alias base="TP6c6">tp6c6</alias>
|
||||||
|
<alias base="TP6c7">tp6c7</alias>
|
||||||
|
<alias base="TP6c8">tp6c8</alias>
|
||||||
|
<alias base="TP6mean">tpmean6</alias>
|
||||||
|
<alias base="TP6sprd">tpsprd6</alias>
|
||||||
|
<alias base="TP_ACR">tp_ACR</alias>
|
||||||
|
<alias base="TP-ACR">tp_ACR</alias>
|
||||||
|
<alias base="TP_ALR">tp_ALR</alias>
|
||||||
|
<alias base="TP-ALR">tp_ALR</alias>
|
||||||
|
<alias base="TPCSG_122E2">PSurge4Ft</alias>
|
||||||
|
<alias base="TPCSG-122E2">PSurge4Ft</alias>
|
||||||
|
<alias base="TPCSG_152E2">PSurge5Ft</alias>
|
||||||
|
<alias base="TPCSG-152E2">PSurge5Ft</alias>
|
||||||
|
<alias base="TPCSG_183E2">PSurge6Ft</alias>
|
||||||
|
<alias base="TPCSG-183E2">PSurge6Ft</alias>
|
||||||
|
<alias base="TPCSG_20">Surge20Pct</alias>
|
||||||
|
<alias base="TPCSG-20">Surge20Pct</alias>
|
||||||
|
<alias base="TPCSG_213E2">PSurge7Ft</alias>
|
||||||
|
<alias base="TPCSG-213E2">PSurge7Ft</alias>
|
||||||
|
<alias base="TPCSG_244E2">PSurge8Ft</alias>
|
||||||
|
<alias base="TPCSG-244E2">PSurge8Ft</alias>
|
||||||
|
<alias base="TPCSG_274E2">PSurge9Ft</alias>
|
||||||
|
<alias base="TPCSG-274E2">PSurge9Ft</alias>
|
||||||
|
<alias base="TPCSG_305E2">PSurge10Ft</alias>
|
||||||
|
<alias base="TPCSG-305E2">PSurge10Ft</alias>
|
||||||
|
<alias base="TPCSG_30">Surge30Pct</alias>
|
||||||
|
<alias base="TPCSG-30">Surge30Pct</alias>
|
||||||
|
<alias base="TPCSG_335E2">PSurge11Ft</alias>
|
||||||
|
<alias base="TPCSG-335E2">PSurge11Ft</alias>
|
||||||
|
<alias base="TPCSG_366E2">PSurge12Ft</alias>
|
||||||
|
<alias base="TPCSG-366E2">PSurge12Ft</alias>
|
||||||
|
<alias base="TPCSG_396E2">PSurge13Ft</alias>
|
||||||
|
<alias base="TPCSG-396E2">PSurge13Ft</alias>
|
||||||
|
<alias base="TPCSG_40">Surge40Pct</alias>
|
||||||
|
<alias base="TPCSG-40">Surge40Pct</alias>
|
||||||
|
<alias base="TPCSG_427E2">PSurge14Ft</alias>
|
||||||
|
<alias base="TPCSG-427E2">PSurge14Ft</alias>
|
||||||
|
<alias base="TPCSG_457E2">PSurge15Ft</alias>
|
||||||
|
<alias base="TPCSG-457E2">PSurge15Ft</alias>
|
||||||
|
<alias base="TPCSG_488E2">PSurge16Ft</alias>
|
||||||
|
<alias base="TPCSG-488E2">PSurge16Ft</alias>
|
||||||
|
<alias base="TPCSG_50">Surge50Pct</alias>
|
||||||
|
<alias base="TPCSG-50">Surge50Pct</alias>
|
||||||
|
<alias base="TPCSG_518E2">PSurge17Ft</alias>
|
||||||
|
<alias base="TPCSG-518E2">PSurge17Ft</alias>
|
||||||
|
<alias base="TPCSG_549E2">PSurge18Ft</alias>
|
||||||
|
<alias base="TPCSG-549E2">PSurge18Ft</alias>
|
||||||
|
<alias base="TPCSG_579E2">PSurge19Ft</alias>
|
||||||
|
<alias base="TPCSG-579E2">PSurge19Ft</alias>
|
||||||
|
<alias base="TPCSG_60">Surge60Pct</alias>
|
||||||
|
<alias base="TPCSG-60">Surge60Pct</alias>
|
||||||
|
<alias base="TPCSG_610E2">PSurge20Ft</alias>
|
||||||
|
<alias base="TPCSG-610E2">PSurge20Ft</alias>
|
||||||
|
<alias base="TPCSG_61E2">PSurge2Ft</alias>
|
||||||
|
<alias base="TPCSG-61E2">PSurge2Ft</alias>
|
||||||
|
<alias base="TPCSG_640E2">PSurge21Ft</alias>
|
||||||
|
<alias base="TPCSG-640E2">PSurge21Ft</alias>
|
||||||
|
<alias base="TPCSG_671E2">PSurge22Ft</alias>
|
||||||
|
<alias base="TPCSG-671E2">PSurge22Ft</alias>
|
||||||
|
<alias base="TPCSG_701E2">PSurge23Ft</alias>
|
||||||
|
<alias base="TPCSG-701E2">PSurge23Ft</alias>
|
||||||
|
<alias base="TPCSG_70">Surge70Pct</alias>
|
||||||
|
<alias base="TPCSG-70">Surge70Pct</alias>
|
||||||
|
<alias base="TPCSG_732E2">PSurge24Ft</alias>
|
||||||
|
<alias base="TPCSG-732E2">PSurge24Ft</alias>
|
||||||
|
<alias base="TPCSG_762E2">PSurge25Ft</alias>
|
||||||
|
<alias base="TPCSG-762E2">PSurge25Ft</alias>
|
||||||
|
<alias base="TPCSG_80">Surge80Pct</alias>
|
||||||
|
<alias base="TPCSG-80">Surge80Pct</alias>
|
||||||
|
<alias base="TPCSG_90">Surge90Pct</alias>
|
||||||
|
<alias base="TPCSG-90">Surge90Pct</alias>
|
||||||
|
<alias base="TPCSG_91E2">PSurge3Ft</alias>
|
||||||
|
<alias base="TPCSG-91E2">PSurge3Ft</alias>
|
||||||
|
<alias base="TPCSG_SLOSH">SloshSurge</alias>
|
||||||
|
<alias base="TPCSG-SLOSH">SloshSurge</alias>
|
||||||
|
<alias base="TPCSG">Surge10Pct</alias>
|
||||||
|
<alias base="TP_ECMWF">tp_ecmwf</alias>
|
||||||
|
<alias base="TP_FWR">tp_FWR</alias>
|
||||||
|
<alias base="TP-FWR">tp_FWR</alias>
|
||||||
|
<alias base="TP_HPC">tp_HPC</alias>
|
||||||
|
<alias base="TP-HPC">tp_HPC</alias>
|
||||||
|
<alias base="TP_KRF">tp_KRF</alias>
|
||||||
|
<alias base="TP-KRF">tp_KRF</alias>
|
||||||
|
<alias base="TP_MSR">tp_MSR</alias>
|
||||||
|
<alias base="TP-MSR">tp_MSR</alias>
|
||||||
|
<alias base="TP_ORN">tp_ORN</alias>
|
||||||
|
<alias base="TP-ORN">tp_ORN</alias>
|
||||||
|
<alias base="TP_PTR">tp_PTR</alias>
|
||||||
|
<alias base="TP-PTR">tp_PTR</alias>
|
||||||
|
<alias base="TP_RHA">tp_RHA</alias>
|
||||||
|
<alias base="TP-RHA">tp_RHA</alias>
|
||||||
|
<alias base="TP_RSA">tp_RSA</alias>
|
||||||
|
<alias base="TP-RSA">tp_RSA</alias>
|
||||||
|
<alias base="TP_STR">tp_STR</alias>
|
||||||
|
<alias base="TP-STR">tp_STR</alias>
|
||||||
|
<alias base="TP_TAR">tp_TAR</alias>
|
||||||
|
<alias base="TP-TAR">tp_TAR</alias>
|
||||||
|
<alias base="TP_TIR">tp_TIR</alias>
|
||||||
|
<alias base="TP-TIR">tp_TIR</alias>
|
||||||
|
<alias base="TP_TUA">tp_TUA</alias>
|
||||||
|
<alias base="TP-TUA">tp_TUA</alias>
|
||||||
|
<alias base="TPW">tpw</alias>
|
||||||
|
<alias base="Tsprd">tsprd</alias>
|
||||||
|
<alias base="tTOT">ttot</alias>
|
||||||
|
<alias base="TURB">turb</alias>
|
||||||
|
<alias base="uWerranl">uwerranl</alias>
|
||||||
|
<alias base="uWmean">uwmean</alias>
|
||||||
|
<alias base="uWsprd">uwsprd</alias>
|
||||||
|
<alias base="UZFWC">uzfwc</alias>
|
||||||
|
<alias base="UZTWC">uztwc</alias>
|
||||||
|
<alias base="Visc1">visc1</alias>
|
||||||
|
<alias base="Visc2">visc2</alias>
|
||||||
|
<alias base="VMCC">vmcc</alias>
|
||||||
|
<alias base="VSS">vss</alias>
|
||||||
|
<alias base="VV">ww</alias>
|
||||||
|
<alias base="vWerranl">vwerranl</alias>
|
||||||
|
<alias base="vWmean">vwmean</alias>
|
||||||
|
<alias base="vWsprd">vwsprd</alias>
|
||||||
|
<alias base="WATER_DEPTH">water_depth</alias>
|
||||||
|
<alias base="WDerranl">wderranl</alias>
|
||||||
|
<alias base="WGD">wgd</alias>
|
||||||
|
<alias base="WOm">wom</alias>
|
||||||
|
<alias base="WSc1">wsc1</alias>
|
||||||
|
<alias base="WSc2">wsc2</alias>
|
||||||
|
<alias base="WSc3">wsc3</alias>
|
||||||
|
<alias base="WSc4">wsc4</alias>
|
||||||
|
<alias base="WSerranl">wserranl</alias>
|
||||||
|
<alias base="WSmean">wsmean</alias>
|
||||||
|
<alias base="WSp1">wsp1</alias>
|
||||||
|
<alias base="WSp2">wsp2</alias>
|
||||||
|
<alias base="WSp3">wsp3</alias>
|
||||||
|
<alias base="WSsprd">wssprd</alias>
|
||||||
|
<alias base="wxType">wx</alias>
|
||||||
|
<alias base="zAGL">zagl</alias>
|
||||||
</aliasList>
|
</aliasList>
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Mar 20, 2013 #1774 randerso Fixed wx definition
|
||||||
|
-->
|
||||||
<gridParamInfo xmlns:ns2="group">
|
<gridParamInfo xmlns:ns2="group">
|
||||||
<valtimeMINUSreftime>
|
<valtimeMINUSreftime>
|
||||||
<fcst>302400</fcst>
|
<fcst>302400</fcst>
|
||||||
|
@ -124,13 +127,13 @@
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
<short_name>wxType</short_name>
|
<short_name>wx</short_name>
|
||||||
<long_name>Weather</long_name>
|
<long_name>Weather</long_name>
|
||||||
<units/>
|
<units/>
|
||||||
<udunits/>
|
<udunits/>
|
||||||
<uiname>Weather</uiname>
|
<uiname>Weather</uiname>
|
||||||
<valid_range>0.0</valid_range>
|
<valid_range>0.0</valid_range>
|
||||||
<valid_range>12.0</valid_range>
|
<valid_range>10.0</valid_range>
|
||||||
<fillValue>-99999.0</fillValue>
|
<fillValue>-99999.0</fillValue>
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>SFC</levelsDesc>
|
<levelsDesc>SFC</levelsDesc>
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Mar 20, 2013 #1774 randerso Added forecast hours out to 18
|
||||||
|
-->
|
||||||
<gridParamInfo xmlns:ns2="group">
|
<gridParamInfo xmlns:ns2="group">
|
||||||
<valtimeMINUSreftime>
|
<valtimeMINUSreftime>
|
||||||
<fcst>0</fcst>
|
<fcst>0</fcst>
|
||||||
|
@ -14,6 +17,12 @@
|
||||||
<fcst>36000</fcst>
|
<fcst>36000</fcst>
|
||||||
<fcst>39600</fcst>
|
<fcst>39600</fcst>
|
||||||
<fcst>43200</fcst>
|
<fcst>43200</fcst>
|
||||||
|
<fcst>46800</fcst>
|
||||||
|
<fcst>50400</fcst>
|
||||||
|
<fcst>54000</fcst>
|
||||||
|
<fcst>57600</fcst>
|
||||||
|
<fcst>61200</fcst>
|
||||||
|
<fcst>64800</fcst>
|
||||||
</valtimeMINUSreftime>
|
</valtimeMINUSreftime>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
<short_name>weasd</short_name>
|
<short_name>weasd</short_name>
|
||||||
|
|
|
@ -2,9 +2,7 @@ com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData
|
||||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID
|
com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID
|
||||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord
|
com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord
|
||||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation
|
com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation
|
||||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo
|
|
||||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID
|
com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID
|
||||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints
|
|
||||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation
|
com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation
|
||||||
com.raytheon.uf.common.dataplugin.gfe.reference.ReferenceData
|
com.raytheon.uf.common.dataplugin.gfe.reference.ReferenceData
|
||||||
com.raytheon.uf.common.dataplugin.gfe.sample.SampleData
|
com.raytheon.uf.common.dataplugin.gfe.sample.SampleData
|
||||||
|
|
|
@ -28,10 +28,6 @@ import javax.measure.unit.NonSI;
|
||||||
import javax.measure.unit.SI;
|
import javax.measure.unit.SI;
|
||||||
import javax.measure.unit.Unit;
|
import javax.measure.unit.Unit;
|
||||||
import javax.measure.unit.UnitFormat;
|
import javax.measure.unit.UnitFormat;
|
||||||
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 com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
|
||||||
import com.raytheon.uf.common.dataplugin.gfe.discrete.DiscreteKey;
|
import com.raytheon.uf.common.dataplugin.gfe.discrete.DiscreteKey;
|
||||||
|
@ -53,6 +49,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* 02/05/2008 chammack Separated static attributes from GFERecord
|
* 02/05/2008 chammack Separated static attributes from GFERecord
|
||||||
* 02/27/2008 879 rbell Added constructors and equals(Object)
|
* 02/27/2008 879 rbell Added constructors and equals(Object)
|
||||||
|
* 03/20/2013 #1774 randerso Removed unnecessary XML annotations,
|
||||||
|
* added isValid method to match A1
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -60,7 +58,6 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@XmlAccessorType(XmlAccessType.NONE)
|
|
||||||
@DynamicSerialize
|
@DynamicSerialize
|
||||||
public class GridParmInfo implements Cloneable, ISerializableObject {
|
public class GridParmInfo implements Cloneable, ISerializableObject {
|
||||||
private static final transient IUFStatusHandler statusHandler = UFStatus
|
private static final transient IUFStatusHandler statusHandler = UFStatus
|
||||||
|
@ -91,105 +88,51 @@ public class GridParmInfo implements Cloneable, ISerializableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The parm id associated with this grid parm info */
|
/** The parm id associated with this grid parm info */
|
||||||
@XmlElement
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private ParmID parmID;
|
private ParmID parmID;
|
||||||
|
|
||||||
/** The grid location associated with this grid parm info */
|
/** The grid location associated with this grid parm info */
|
||||||
@XmlElement
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private GridLocation gridLoc;
|
private GridLocation gridLoc;
|
||||||
|
|
||||||
/** The grid type */
|
/** The grid type */
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private GridType gridType;
|
private GridType gridType;
|
||||||
|
|
||||||
/** The parameter descriptive name */
|
/** The parameter descriptive name */
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private String descriptiveName;
|
private String descriptiveName;
|
||||||
|
|
||||||
/** The units associated with the parameter */
|
/** The units associated with the parameter */
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private String unitString;
|
private String unitString;
|
||||||
|
|
||||||
private Unit<?> unitObject;
|
private Unit<?> unitObject;
|
||||||
|
|
||||||
/** The minimum allowed value */
|
/** The minimum allowed value */
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private float minValue;
|
private float minValue;
|
||||||
|
|
||||||
/** The maximum allowed value */
|
/** The maximum allowed value */
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private float maxValue;
|
private float maxValue;
|
||||||
|
|
||||||
/** The precision of the value */
|
/** The precision of the value */
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private int precision;
|
private int precision;
|
||||||
|
|
||||||
/** Is value a rate parameter */
|
/** Is value a rate parameter */
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private boolean rateParm;
|
private boolean rateParm;
|
||||||
|
|
||||||
/** Time Constraints */
|
/** Time Constraints */
|
||||||
@XmlElement
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private TimeConstraints timeConstraints;
|
private TimeConstraints timeConstraints;
|
||||||
|
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private boolean timeIndependentParm;
|
private boolean timeIndependentParm;
|
||||||
|
|
||||||
private void validCheck() {
|
private String errorMessage;
|
||||||
if (!parmID.isValid()) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"GridParmInfo.ParmID is not valid [" + parmID + ']');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timeConstraints == null) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"GridParmInfo.TimeConstraints are null");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gridLoc == null) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"GridParmInfo.GridLocation is null");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timeIndependentParm && timeConstraints.anyConstraints()) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"GridParmInfo is invalid. There are time constraints "
|
|
||||||
+ " for a time independent parm. Constraints: "
|
|
||||||
+ timeConstraints);
|
|
||||||
}
|
|
||||||
|
|
||||||
// units defined
|
|
||||||
if (unitString == null) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"GridParmInfo.Units are not defined.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// max/min/precision checks
|
|
||||||
if (maxValue < minValue) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"GridParmInfo is invalid. Max<Min " + "Max=" + maxValue
|
|
||||||
+ " Min=" + minValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
// precision check
|
|
||||||
if (precision < -2 || precision > 5) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"GridParmInfo is invalid. Precision out of limits. "
|
|
||||||
+ " Precision is: " + precision
|
|
||||||
+ ". Must be betwwen -2 and 5");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public GridParmInfo() {
|
public GridParmInfo() {
|
||||||
gridType = GridType.NONE;
|
gridType = GridType.NONE;
|
||||||
|
@ -252,7 +195,10 @@ public class GridParmInfo implements Cloneable, ISerializableObject {
|
||||||
this.timeConstraints = timeConstraints;
|
this.timeConstraints = timeConstraints;
|
||||||
this.rateParm = rateParm;
|
this.rateParm = rateParm;
|
||||||
|
|
||||||
validCheck();
|
if (!validCheck()) {
|
||||||
|
statusHandler.warn(this.errorMessage);
|
||||||
|
setDefaultValues();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public GridParmInfo(ParmID id, GridLocation gridLoc, GridType gridType,
|
public GridParmInfo(ParmID id, GridLocation gridLoc, GridType gridType,
|
||||||
|
@ -263,6 +209,87 @@ public class GridParmInfo implements Cloneable, ISerializableObject {
|
||||||
precision, timeIndependentParm, timeConstraints, false);
|
precision, timeIndependentParm, timeConstraints, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GridParmInfo::setDefaultValues() Sets default values in private data.
|
||||||
|
* Sets values to 0 or their default construction. Grid type is set to NONE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void setDefaultValues() {
|
||||||
|
this.parmID = new ParmID();
|
||||||
|
this.timeConstraints = new TimeConstraints();
|
||||||
|
this.gridLoc = new GridLocation();
|
||||||
|
this.unitString = "";
|
||||||
|
this.descriptiveName = "";
|
||||||
|
this.minValue = this.maxValue = 0.0f;
|
||||||
|
this.precision = 0;
|
||||||
|
this.timeIndependentParm = false;
|
||||||
|
this.gridType = GridType.NONE;
|
||||||
|
this.rateParm = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean validCheck() {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (!parmID.isValid()) {
|
||||||
|
sb.append("GridParmInfo.ParmID is not valid [");
|
||||||
|
sb.append(parmID);
|
||||||
|
sb.append("]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!timeConstraints.isValid()) {
|
||||||
|
sb.append("GridParmInfo.TimeConstraints are not valid [");
|
||||||
|
sb.append(timeConstraints);
|
||||||
|
sb.append("]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gridLoc.isValid()) {
|
||||||
|
sb.append("GridParmInfo.GridLocation is not valid\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeIndependentParm && timeConstraints.anyConstraints()) {
|
||||||
|
sb.append("GridParmInfo is invalid. There are time constraints ");
|
||||||
|
sb.append(" for a time independent parm. Constraints: ");
|
||||||
|
sb.append(timeConstraints);
|
||||||
|
sb.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// units defined
|
||||||
|
if (unitString == null || unitString.isEmpty()) {
|
||||||
|
sb.append("GridParmInfo.Units are not defined.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// max/min/precision checks
|
||||||
|
if (maxValue < minValue) {
|
||||||
|
sb.append("GridParmInfo is invalid. Max<Min Max=");
|
||||||
|
sb.append(maxValue);
|
||||||
|
sb.append(" Min=");
|
||||||
|
sb.append(minValue);
|
||||||
|
sb.append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// precision check
|
||||||
|
if (precision < -2 || precision > 5) {
|
||||||
|
sb.append("GridParmInfo is invalid. Precision out of limits. ");
|
||||||
|
sb.append(" Precision is: ");
|
||||||
|
sb.append(precision);
|
||||||
|
sb.append(". Must be betwwen -2 and 5\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.errorMessage = sb.toString();
|
||||||
|
if (errorMessage.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if valid
|
||||||
|
*/
|
||||||
|
public boolean isValid() {
|
||||||
|
return errorMessage.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the gridType
|
* @return the gridType
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -23,14 +23,15 @@ import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.xml.bind.annotation.XmlAccessType;
|
import com.raytheon.uf.common.dataplugin.gfe.serialize.TimeConstraintsAdapter;
|
||||||
import javax.xml.bind.annotation.XmlAccessorType;
|
|
||||||
import javax.xml.bind.annotation.XmlAttribute;
|
|
||||||
|
|
||||||
import com.raytheon.uf.common.serialization.ISerializableObject;
|
import com.raytheon.uf.common.serialization.ISerializableObject;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||||
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter;
|
||||||
|
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
|
import com.raytheon.uf.common.status.UFStatus;
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A TimeConstraint represents a parm's quantum and time block alignments.
|
* A TimeConstraint represents a parm's quantum and time block alignments.
|
||||||
|
@ -40,6 +41,8 @@ import com.raytheon.uf.common.time.TimeRange;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* 2/19/2008 chammack Ported from AWIPS I
|
* 2/19/2008 chammack Ported from AWIPS I
|
||||||
|
* 03/20/2013 #1774 randerso Added isValid method, use TimeUtil constants,
|
||||||
|
* added serialization adapter, removed setters.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -47,26 +50,22 @@ import com.raytheon.uf.common.time.TimeRange;
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@XmlAccessorType(XmlAccessType.NONE)
|
|
||||||
@DynamicSerialize
|
@DynamicSerialize
|
||||||
|
@DynamicSerializeTypeAdapter(factory = TimeConstraintsAdapter.class)
|
||||||
public class TimeConstraints implements ISerializableObject {
|
public class TimeConstraints implements ISerializableObject {
|
||||||
public static final int HOUR = 3600;
|
private static final transient IUFStatusHandler statusHandler = UFStatus
|
||||||
|
.getHandler(TimeConstraints.class);
|
||||||
|
|
||||||
public static final int DAY = 24 * HOUR;
|
|
||||||
|
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private int duration;
|
private int duration;
|
||||||
|
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private int repeatInterval;
|
private int repeatInterval;
|
||||||
|
|
||||||
@XmlAttribute
|
|
||||||
@DynamicSerializeElement
|
@DynamicSerializeElement
|
||||||
private int startTime;
|
private int startTime;
|
||||||
|
|
||||||
private static final int MilliSecInDay = (DAY * 1000);
|
boolean valid;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Constructor
|
* Default Constructor
|
||||||
|
@ -75,23 +74,35 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
duration = 0;
|
duration = 0;
|
||||||
repeatInterval = 0;
|
repeatInterval = 0;
|
||||||
startTime = 0;
|
startTime = 0;
|
||||||
|
valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeConstraints(int duration, int repeatInterval, int startTime) {
|
public TimeConstraints(int duration, int repeatInterval, int startTime) {
|
||||||
|
|
||||||
if (duration == 0 && repeatInterval == 0 && startTime == 0) {
|
|
||||||
// all zeroes is OK
|
|
||||||
} else if (repeatInterval <= 0 || repeatInterval > DAY
|
|
||||||
|| DAY % repeatInterval != 0 || repeatInterval < duration
|
|
||||||
|| startTime < 0 || startTime > DAY || duration < 0
|
|
||||||
|| duration > DAY) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Bad init values for timeConstraints");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.duration = duration;
|
this.duration = duration;
|
||||||
this.repeatInterval = repeatInterval;
|
this.repeatInterval = repeatInterval;
|
||||||
this.startTime = startTime;
|
this.startTime = startTime;
|
||||||
|
|
||||||
|
if (this.duration == 0 && this.repeatInterval == 0
|
||||||
|
&& this.startTime == 0) {
|
||||||
|
valid = true;
|
||||||
|
} else {
|
||||||
|
if (repeatInterval <= 0
|
||||||
|
|| repeatInterval > TimeUtil.SECONDS_PER_DAY
|
||||||
|
|| TimeUtil.SECONDS_PER_DAY % repeatInterval != 0
|
||||||
|
|| repeatInterval < duration || startTime < 0
|
||||||
|
|| startTime > TimeUtil.SECONDS_PER_DAY || duration < 0
|
||||||
|
|| duration > TimeUtil.SECONDS_PER_DAY) {
|
||||||
|
statusHandler.warn("Bad init values for TimeConstraints: "
|
||||||
|
+ this);
|
||||||
|
valid = false;
|
||||||
|
this.duration = 0;
|
||||||
|
this.repeatInterval = 0;
|
||||||
|
this.startTime = 0;
|
||||||
|
} else {
|
||||||
|
valid = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -103,14 +114,16 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
* the time that the range should contain
|
* the time that the range should contain
|
||||||
*/
|
*/
|
||||||
public TimeRange constraintTime(Date absTime) {
|
public TimeRange constraintTime(Date absTime) {
|
||||||
|
if (!valid) {
|
||||||
if (!anyConstraints()) {
|
return new TimeRange();
|
||||||
|
} else if (!anyConstraints()) {
|
||||||
return TimeRange.allTimes();
|
return TimeRange.allTimes();
|
||||||
}
|
}
|
||||||
|
|
||||||
long secSinceMidnight = absTime.getTime() % MilliSecInDay;
|
long secSinceMidnight = absTime.getTime() % TimeUtil.MILLIS_PER_DAY;
|
||||||
|
|
||||||
long midnight = (absTime.getTime() / MilliSecInDay) * MilliSecInDay;
|
long midnight = (absTime.getTime() / TimeUtil.MILLIS_PER_DAY)
|
||||||
|
* TimeUtil.MILLIS_PER_DAY;
|
||||||
|
|
||||||
int tStart = startTime - repeatInterval;
|
int tStart = startTime - repeatInterval;
|
||||||
|
|
||||||
|
@ -119,12 +132,12 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
tStart -= repeatInterval; // keep going until below 0
|
tStart -= repeatInterval; // keep going until below 0
|
||||||
}
|
}
|
||||||
|
|
||||||
while (tStart < DAY) {
|
while (tStart < TimeUtil.SECONDS_PER_DAY) {
|
||||||
int tEnd = tStart + duration;
|
int tEnd = tStart + duration;
|
||||||
if ((tStart * 1000) <= secSinceMidnight
|
if ((tStart * TimeUtil.MILLIS_PER_SECOND) <= secSinceMidnight
|
||||||
&& secSinceMidnight < (tEnd * 1000)) {
|
&& secSinceMidnight < (tEnd * TimeUtil.MILLIS_PER_SECOND)) {
|
||||||
return new TimeRange(midnight + 1000 * tStart, midnight + 1000
|
return new TimeRange(midnight + TimeUtil.MILLIS_PER_SECOND
|
||||||
* tEnd);
|
* tStart, midnight + TimeUtil.MILLIS_PER_SECOND * tEnd);
|
||||||
}
|
}
|
||||||
tStart += repeatInterval;
|
tStart += repeatInterval;
|
||||||
}
|
}
|
||||||
|
@ -150,17 +163,6 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
return duration;
|
return duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param duration
|
|
||||||
* the duration to set
|
|
||||||
*/
|
|
||||||
public void setDuration(int duration) {
|
|
||||||
if (duration < 0 || duration > DAY) {
|
|
||||||
throw new IllegalArgumentException("Bad duration");
|
|
||||||
}
|
|
||||||
this.duration = duration;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the repeatInterval
|
* @return the repeatInterval
|
||||||
*/
|
*/
|
||||||
|
@ -168,20 +170,6 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
return repeatInterval;
|
return repeatInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param repeatInterval
|
|
||||||
* the repeatInterval to set
|
|
||||||
*/
|
|
||||||
public void setRepeatInterval(int repeatInterval) {
|
|
||||||
if (repeatInterval < 0 || repeatInterval > DAY
|
|
||||||
|| (repeatInterval != 0 && DAY % repeatInterval != 0)
|
|
||||||
|| repeatInterval < duration) {
|
|
||||||
throw new IllegalArgumentException("Bad repeatInterval");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.repeatInterval = repeatInterval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the startTime
|
* @return the startTime
|
||||||
*/
|
*/
|
||||||
|
@ -190,14 +178,10 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param startTime
|
* @return true if valid
|
||||||
* the startTime to set
|
|
||||||
*/
|
*/
|
||||||
public void setStartTime(int startTime) {
|
public boolean isValid() {
|
||||||
if (startTime < 0 || startTime > DAY) {
|
return valid;
|
||||||
throw new IllegalArgumentException("Bad startTime");
|
|
||||||
}
|
|
||||||
this.startTime = startTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -213,7 +197,7 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
|
|
||||||
TimeConstraints rhs = (TimeConstraints) obj;
|
TimeConstraints rhs = (TimeConstraints) obj;
|
||||||
|
|
||||||
return (duration == rhs.duration
|
return (valid == rhs.valid && duration == rhs.duration
|
||||||
&& repeatInterval == rhs.repeatInterval && startTime == rhs.startTime);
|
&& repeatInterval == rhs.repeatInterval && startTime == rhs.startTime);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -232,7 +216,8 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
|
|
||||||
// get the constraint times for the given time range
|
// get the constraint times for the given time range
|
||||||
TimeRange tr1 = constraintTime(tr.getStart());
|
TimeRange tr1 = constraintTime(tr.getStart());
|
||||||
TimeRange tr2 = constraintTime(new Date(tr.getEnd().getTime() - 1000));
|
TimeRange tr2 = constraintTime(new Date(tr.getEnd().getTime()
|
||||||
|
- TimeUtil.MILLIS_PER_SECOND));
|
||||||
|
|
||||||
// checking
|
// checking
|
||||||
if (!tr1.isValid() || !tr2.isValid()) {
|
if (!tr1.isValid() || !tr2.isValid()) {
|
||||||
|
@ -255,7 +240,7 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
* @return possible time ranges
|
* @return possible time ranges
|
||||||
*/
|
*/
|
||||||
public TimeRange[] constraintTimes(final TimeRange timeRange) {
|
public TimeRange[] constraintTimes(final TimeRange timeRange) {
|
||||||
if (!timeRange.isValid()) {
|
if (!valid || !timeRange.isValid()) {
|
||||||
return new TimeRange[0]; // return empty sequence
|
return new TimeRange[0]; // return empty sequence
|
||||||
} else if (!anyConstraints()) {
|
} else if (!anyConstraints()) {
|
||||||
TimeRange maxTR = TimeRange.allTimes();
|
TimeRange maxTR = TimeRange.allTimes();
|
||||||
|
@ -266,7 +251,8 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
// is beyond the time range given
|
// is beyond the time range given
|
||||||
List<TimeRange> sbs = new ArrayList<TimeRange>(); // returned value
|
List<TimeRange> sbs = new ArrayList<TimeRange>(); // returned value
|
||||||
TimeRange tr = firstSB(timeRange.getStart());
|
TimeRange tr = firstSB(timeRange.getStart());
|
||||||
while (timeRange.getEnd().getTime() + (duration * 1000) > tr.getEnd()
|
while (timeRange.getEnd().getTime()
|
||||||
|
+ (duration * TimeUtil.MILLIS_PER_SECOND) > tr.getEnd()
|
||||||
.getTime()) {
|
.getTime()) {
|
||||||
if (tr.overlaps(timeRange)) {
|
if (tr.overlaps(timeRange)) {
|
||||||
sbs.add(tr);
|
sbs.add(tr);
|
||||||
|
@ -286,8 +272,9 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
*/
|
*/
|
||||||
private TimeRange nextSB(final TimeRange timeRange) {
|
private TimeRange nextSB(final TimeRange timeRange) {
|
||||||
long nextStart = timeRange.getStart().getTime()
|
long nextStart = timeRange.getStart().getTime()
|
||||||
+ (repeatInterval * 1000);
|
+ (repeatInterval * TimeUtil.MILLIS_PER_SECOND);
|
||||||
long nextEnd = timeRange.getEnd().getTime() + (repeatInterval * 1000);
|
long nextEnd = timeRange.getEnd().getTime()
|
||||||
|
+ (repeatInterval * TimeUtil.MILLIS_PER_SECOND);
|
||||||
return new TimeRange(nextStart, nextEnd);
|
return new TimeRange(nextStart, nextEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,15 +287,17 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
* @return first time constraint
|
* @return first time constraint
|
||||||
*/
|
*/
|
||||||
private TimeRange firstSB(Date searchTime) {
|
private TimeRange firstSB(Date searchTime) {
|
||||||
long midnightMilliSeconds = (searchTime.getTime() / MilliSecInDay)
|
long midnightMilliSeconds = (searchTime.getTime() / TimeUtil.MILLIS_PER_DAY)
|
||||||
* MilliSecInDay;
|
* TimeUtil.MILLIS_PER_DAY;
|
||||||
|
|
||||||
long ystdMidnight = midnightMilliSeconds - MilliSecInDay; // to catch
|
// to catch overlap
|
||||||
// overlap
|
long ystdMidnight = midnightMilliSeconds - TimeUtil.MILLIS_PER_DAY;
|
||||||
|
|
||||||
// calculate the first time range
|
// calculate the first time range
|
||||||
Date startT = new Date(ystdMidnight + (startTime * 1000));
|
Date startT = new Date(ystdMidnight
|
||||||
Date endT = new Date(startT.getTime() + (duration * 1000));
|
+ (startTime * TimeUtil.MILLIS_PER_SECOND));
|
||||||
|
Date endT = new Date(startT.getTime()
|
||||||
|
+ (duration * TimeUtil.MILLIS_PER_SECOND));
|
||||||
return new TimeRange(startT, endT);
|
return new TimeRange(startT, endT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,11 +308,21 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if (!anyConstraints()) {
|
if (!valid) {
|
||||||
|
return "<Invalid>";
|
||||||
|
} else if (!anyConstraints()) {
|
||||||
return "<NoConstraints>";
|
return "<NoConstraints>";
|
||||||
} else {
|
} else {
|
||||||
return "[s=" + startTime / 3600 + "h" + ",i=" + repeatInterval
|
StringBuilder sb = new StringBuilder();
|
||||||
/ 3600 + "h" + ",d=" + duration / 3600 + "h]";
|
sb.append("[s=");
|
||||||
|
sb.append(startTime / TimeUtil.SECONDS_PER_HOUR);
|
||||||
|
sb.append("h, i=");
|
||||||
|
sb.append(repeatInterval / TimeUtil.SECONDS_PER_HOUR);
|
||||||
|
sb.append("h, d=");
|
||||||
|
sb.append(duration / TimeUtil.SECONDS_PER_HOUR);
|
||||||
|
sb.append("h]");
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -338,7 +337,7 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
*/
|
*/
|
||||||
public TimeRange expandTRToQuantum(final TimeRange timeRange) {
|
public TimeRange expandTRToQuantum(final TimeRange timeRange) {
|
||||||
|
|
||||||
if (!timeRange.isValid()) {
|
if (!valid || !timeRange.isValid()) {
|
||||||
return new TimeRange();
|
return new TimeRange();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,7 +352,7 @@ public class TimeConstraints implements ISerializableObject {
|
||||||
// <=)
|
// <=)
|
||||||
TimeRange tr1 = constraintTime(timeRange.getStart());
|
TimeRange tr1 = constraintTime(timeRange.getStart());
|
||||||
TimeRange tr2 = constraintTime(new Date(timeRange.getEnd()
|
TimeRange tr2 = constraintTime(new Date(timeRange.getEnd()
|
||||||
.getTime() - 1000));
|
.getTime() - TimeUtil.MILLIS_PER_SECOND));
|
||||||
if (!tr1.isValid() || !tr2.isValid()) {
|
if (!tr1.isValid() || !tr2.isValid()) {
|
||||||
return new TimeRange();
|
return new TimeRange();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
/**
|
||||||
|
* 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.serialize;
|
||||||
|
|
||||||
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints;
|
||||||
|
import com.raytheon.uf.common.serialization.IDeserializationContext;
|
||||||
|
import com.raytheon.uf.common.serialization.ISerializationContext;
|
||||||
|
import com.raytheon.uf.common.serialization.ISerializationTypeAdapter;
|
||||||
|
import com.raytheon.uf.common.serialization.SerializationException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrift serialization adapter for TimeConstraints
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
*
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
|
* Mar 11, 2013 #1774 randerso Initial creation
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author randerso
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class TimeConstraintsAdapter implements
|
||||||
|
ISerializationTypeAdapter<TimeConstraints> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(ISerializationContext serializer,
|
||||||
|
TimeConstraints object) throws SerializationException {
|
||||||
|
serializer.writeI32(object.getDuration());
|
||||||
|
serializer.writeI32(object.getRepeatInterval());
|
||||||
|
serializer.writeI32(object.getStartTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TimeConstraints deserialize(IDeserializationContext deserializer)
|
||||||
|
throws SerializationException {
|
||||||
|
return new TimeConstraints(deserializer.readI32(),
|
||||||
|
deserializer.readI32(), deserializer.readI32());
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,6 +40,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter;
|
||||||
import com.raytheon.uf.common.time.adapter.TimeRangeTypeAdapter;
|
import com.raytheon.uf.common.time.adapter.TimeRangeTypeAdapter;
|
||||||
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -51,6 +52,8 @@ import com.raytheon.uf.common.time.adapter.TimeRangeTypeAdapter;
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Jun 19, 2007 chammack Port from AWIPS Common
|
* Jun 19, 2007 chammack Port from AWIPS Common
|
||||||
* 02/27/2008 879 rbell Added compareTo(TimeRange)
|
* 02/27/2008 879 rbell Added compareTo(TimeRange)
|
||||||
|
* 03/20/2013 #1774 randerso Changed toString to display times even when
|
||||||
|
* duration is 0, use TimeUtil constants.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -100,15 +103,10 @@ import com.raytheon.uf.common.time.adapter.TimeRangeTypeAdapter;
|
||||||
public class TimeRange implements Serializable, Comparable<TimeRange>,
|
public class TimeRange implements Serializable, Comparable<TimeRange>,
|
||||||
ISerializableObject, Cloneable {
|
ISerializableObject, Cloneable {
|
||||||
|
|
||||||
private static final int SEC_PER_MIN = 60;
|
|
||||||
|
|
||||||
private static final int SEC_PER_HOUR = 3600;
|
|
||||||
|
|
||||||
private static final long SEC_PER_DAY = SEC_PER_HOUR * 24;
|
|
||||||
|
|
||||||
// This constant gives a value similar to GFEs AbsTime.MaxFutureValue()
|
// This constant gives a value similar to GFEs AbsTime.MaxFutureValue()
|
||||||
// and doesn't break Calendar like Long.MAX_VALUE does
|
// and doesn't break Calendar like Long.MAX_VALUE does
|
||||||
private static final long MAX_TIME = (long) Integer.MAX_VALUE * 1000;
|
private static final long MAX_TIME = Integer.MAX_VALUE
|
||||||
|
* TimeUtil.MILLIS_PER_SECOND;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -245,15 +243,15 @@ public class TimeRange implements Serializable, Comparable<TimeRange>,
|
||||||
*/
|
*/
|
||||||
public String durationAsPrettyString() {
|
public String durationAsPrettyString() {
|
||||||
long dur = getDuration();
|
long dur = getDuration();
|
||||||
long days = dur / SEC_PER_DAY;
|
long days = dur / TimeUtil.SECONDS_PER_DAY;
|
||||||
|
|
||||||
dur -= days * SEC_PER_DAY;
|
dur -= days * TimeUtil.SECONDS_PER_DAY;
|
||||||
long hours = dur / SEC_PER_HOUR;
|
long hours = dur / TimeUtil.SECONDS_PER_HOUR;
|
||||||
|
|
||||||
dur -= hours * SEC_PER_HOUR;
|
dur -= hours * TimeUtil.SECONDS_PER_HOUR;
|
||||||
long min = dur / SEC_PER_MIN;
|
long min = dur / TimeUtil.SECONDS_PER_MINUTE;
|
||||||
|
|
||||||
long sec = dur - min * SEC_PER_MIN;
|
long sec = dur - min * TimeUtil.SECONDS_PER_MINUTE;
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
|
@ -534,17 +532,20 @@ public class TimeRange implements Serializable, Comparable<TimeRange>,
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if (isValid()) {
|
final DateFormat GMTFormat = new SimpleDateFormat(
|
||||||
final DateFormat GMTFormat = new SimpleDateFormat(
|
"MMM dd yy HH:mm:ss zzz");
|
||||||
"MMM dd yy HH:mm:ss zzz");
|
GMTFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||||
GMTFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
|
|
||||||
|
|
||||||
return "(" + GMTFormat.format(getStart()) + ", "
|
StringBuilder sb = new StringBuilder();
|
||||||
+ GMTFormat.format(getEnd()) + ")";
|
sb.append("(");
|
||||||
} else {
|
sb.append(GMTFormat.format(getStart()));
|
||||||
return "(Invalid)";
|
sb.append(", ");
|
||||||
|
sb.append(GMTFormat.format(getEnd()));
|
||||||
|
if (!isValid()) {
|
||||||
|
sb.append(", Invalid");
|
||||||
}
|
}
|
||||||
|
sb.append(")");
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -48,6 +48,7 @@ import com.raytheon.uf.common.time.domain.api.ITimePoint;
|
||||||
* Jan 22, 2013 1484 mpduff Add HOURS_PER_WEEK.
|
* Jan 22, 2013 1484 mpduff Add HOURS_PER_WEEK.
|
||||||
* Jan 22, 2013 1519 djohnson Add MINUTES_PER_DAY.
|
* Jan 22, 2013 1519 djohnson Add MINUTES_PER_DAY.
|
||||||
* Feb 26, 2013 1597 randerso Add SECONDS_PER_HOUR.
|
* Feb 26, 2013 1597 randerso Add SECONDS_PER_HOUR.
|
||||||
|
* Mar 20, 2013 1774 randerso Add SECONDS_PER_DAY, changed SECONDS_PER_HOUR to int.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -97,11 +98,13 @@ public final class TimeUtil {
|
||||||
|
|
||||||
public static final int MINUTES_PER_HOUR = 60;
|
public static final int MINUTES_PER_HOUR = 60;
|
||||||
|
|
||||||
public static final long SECONDS_PER_HOUR = SECONDS_PER_MINUTE
|
public static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE
|
||||||
* MINUTES_PER_HOUR;
|
* MINUTES_PER_HOUR;
|
||||||
|
|
||||||
public static final int HOURS_PER_DAY = 24;
|
public static final int HOURS_PER_DAY = 24;
|
||||||
|
|
||||||
|
public static final int SECONDS_PER_DAY = HOURS_PER_DAY * SECONDS_PER_HOUR;
|
||||||
|
|
||||||
public static final int HOURS_PER_HALF_DAY = HOURS_PER_DAY / 2;
|
public static final int HOURS_PER_HALF_DAY = HOURS_PER_DAY / 2;
|
||||||
|
|
||||||
public static final int HOURS_PER_QUARTER_DAY = HOURS_PER_HALF_DAY / 2;
|
public static final int HOURS_PER_QUARTER_DAY = HOURS_PER_HALF_DAY / 2;
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
##
|
||||||
|
# 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.
|
||||||
|
##
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Adapter for com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# SOFTWARE HISTORY
|
||||||
|
#
|
||||||
|
# Date Ticket# Engineer Description
|
||||||
|
# ------------ ---------- ----------- --------------------------
|
||||||
|
# 03/20/13 #1774 randerso Initial Creation.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import TimeConstraints
|
||||||
|
|
||||||
|
ClassAdapter = 'com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints'
|
||||||
|
|
||||||
|
def serialize(context, timeConstraints):
|
||||||
|
context.writeI32(timeConstraints.getDuration());
|
||||||
|
context.writeI32(timeConstraints.getRepeatInterval());
|
||||||
|
context.writeI32(timeConstraints.getStartTime());
|
||||||
|
|
||||||
|
def deserialize(context):
|
||||||
|
result = TimeConstraints(context.readI32(), context.readI32(), context.readI32())
|
||||||
|
return result
|
|
@ -28,6 +28,7 @@
|
||||||
# Date Ticket# Engineer Description
|
# Date Ticket# Engineer Description
|
||||||
# ------------ ---------- ----------- --------------------------
|
# ------------ ---------- ----------- --------------------------
|
||||||
# 08/31/10 njensen Initial Creation.
|
# 08/31/10 njensen Initial Creation.
|
||||||
|
# 03/20/13 #1774 randerso Added TimeConstraintsAdapter
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -50,8 +51,9 @@ __all__ = [
|
||||||
'TimestampAdapter',
|
'TimestampAdapter',
|
||||||
'EnumSetAdapter',
|
'EnumSetAdapter',
|
||||||
'FloatBufferAdapter',
|
'FloatBufferAdapter',
|
||||||
'ByteBufferAdapter'
|
'ByteBufferAdapter',
|
||||||
# 'GridDataHistoryAdapter'
|
'TimeConstraintsAdapter',
|
||||||
|
# 'GridDataHistoryAdapter',
|
||||||
]
|
]
|
||||||
|
|
||||||
classAdapterRegistry = {}
|
classAdapterRegistry = {}
|
||||||
|
|
|
@ -19,8 +19,11 @@
|
||||||
##
|
##
|
||||||
|
|
||||||
# File auto-generated against equivalent DynamicSerialize Java class
|
# File auto-generated against equivalent DynamicSerialize Java class
|
||||||
|
#
|
||||||
|
# 03/20/2013 #1774 randerso Removed setters, added isValid.
|
||||||
|
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
HOUR = 3600;
|
HOUR = 3600;
|
||||||
DAY = 24 * HOUR;
|
DAY = 24 * HOUR;
|
||||||
|
@ -32,12 +35,23 @@ class TimeConstraints(object):
|
||||||
repeatInterval = int(repeatInterval)
|
repeatInterval = int(repeatInterval)
|
||||||
startTime = int(startTime)
|
startTime = int(startTime)
|
||||||
|
|
||||||
if duration != 0 or repeatInterval != 0 or startTime != 0:
|
self.valid = False;
|
||||||
if (repeatInterval <= 0 or repeatInterval > DAY) or \
|
if duration == 0 and repeatInterval == 0 and startTime == 0:
|
||||||
(DAY % repeatInterval != 0 or repeatInterval < duration) or \
|
self.valid = True;
|
||||||
(startTime < 0 or startTime > DAY) or \
|
else:
|
||||||
(duration < 0 or duration > DAY):
|
if repeatInterval <= 0 or repeatInterval > DAY \
|
||||||
raise ValueError("Bad init values for TimeConstraints.")
|
or DAY % repeatInterval != 0 \
|
||||||
|
or repeatInterval < duration \
|
||||||
|
or startTime < 0 or startTime > DAY \
|
||||||
|
or duration < 0 or duration > DAY:
|
||||||
|
|
||||||
|
logging.warning("Bad init values for TimeConstraints: ", self);
|
||||||
|
self.valid = False;
|
||||||
|
duration = 0;
|
||||||
|
repeatInterval = 0;
|
||||||
|
startTime = 0;
|
||||||
|
else:
|
||||||
|
self.valid = True;
|
||||||
|
|
||||||
self.duration = duration
|
self.duration = duration
|
||||||
self.repeatInterval = repeatInterval
|
self.repeatInterval = repeatInterval
|
||||||
|
@ -47,12 +61,14 @@ class TimeConstraints(object):
|
||||||
return self.__repr__()
|
return self.__repr__()
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
if not self.anyConstraints():
|
if not self.isValid():
|
||||||
|
return "<Invalid>"
|
||||||
|
elif not self.anyConstraints():
|
||||||
return "<NoConstraints>"
|
return "<NoConstraints>"
|
||||||
else:
|
else:
|
||||||
return "[s=" + str(self.startTime / HOUR) + "h,i=" + \
|
return "[s=" + str(self.startTime / HOUR) + "h, i=" + \
|
||||||
str(self.repeatInterval / HOUR) + "h,d=" + \
|
str(self.repeatInterval / HOUR) + "h, d=" + \
|
||||||
str(self.duration / 3600) + "h]"
|
str(self.duration / HOUR) + "h]"
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
if not isinstance(other, TimeConstraints):
|
if not isinstance(other, TimeConstraints):
|
||||||
|
@ -72,29 +88,13 @@ class TimeConstraints(object):
|
||||||
return (self.duration != 0)
|
return (self.duration != 0)
|
||||||
|
|
||||||
def isValid(self):
|
def isValid(self):
|
||||||
if self.duration != 0 or self.repeatInterval != 0 or self.startTime != 0:
|
return self.valid
|
||||||
if (self.repeatInterval <= 0 or self.repeatInterval > DAY) or \
|
|
||||||
(DAY % self.repeatInterval != 0 or self.repeatInterval < self.duration) or \
|
|
||||||
(self.startTime < 0 or self.startTime > DAY) or \
|
|
||||||
(self.duration < 0 or self.duration > DAY):
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def getDuration(self):
|
def getDuration(self):
|
||||||
return self.duration
|
return self.duration
|
||||||
|
|
||||||
def setDuration(self, duration):
|
|
||||||
self.duration = duration
|
|
||||||
|
|
||||||
def getRepeatInterval(self):
|
def getRepeatInterval(self):
|
||||||
return self.repeatInterval
|
return self.repeatInterval
|
||||||
|
|
||||||
def setRepeatInterval(self, repeatInterval):
|
|
||||||
self.repeatInterval = repeatInterval
|
|
||||||
|
|
||||||
def getStartTime(self):
|
def getStartTime(self):
|
||||||
return self.startTime
|
return self.startTime
|
||||||
|
|
||||||
def setStartTime(self, startTime):
|
|
||||||
self.startTime = startTime
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue