Issue #1774 Fix D2D accumulative parameter time ranges

Change-Id: I57b32881a30e89c999dae6db7753da83f9e949c1

Former-commit-id: aee839a85ec68c7eb80ef1e7236af6cb4666372b
This commit is contained in:
Ron Anderson 2013-03-27 09:29:55 -05:00
parent 29c5918428
commit 5bb47b7931
28 changed files with 1959 additions and 1283 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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");
}
}
}
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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();
} }
/* /*

View file

@ -48,7 +48,8 @@ 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>
* *
* @author njensen * @author njensen
@ -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;

View file

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

View file

@ -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 = {}

View file

@ -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;
@ -31,13 +34,24 @@ class TimeConstraints(object):
duration = int(duration) duration = int(duration)
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