Issue #1774 Fix D2D accumulative parameter time ranges
Change-Id: I57b32881a30e89c999dae6db7753da83f9e949c1 Former-commit-id: aee839a85ec68c7eb80ef1e7236af6cb4666372b
This commit is contained in:
parent
29c5918428
commit
5bb47b7931
28 changed files with 1959 additions and 1283 deletions
|
@ -100,6 +100,7 @@ import com.raytheon.viz.gfe.core.parm.vcparm.VCModuleJobPool;
|
|||
* use in PngWriter
|
||||
* 01/22/2013 #1515 dgilling Increase default size of VCModule thread pool
|
||||
* to decrease UI hang-ups waiting for results.
|
||||
* 03/20/2013 #1774 randerso Code cleanup
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -243,7 +244,7 @@ public abstract class AbstractParmManager implements IParmManager {
|
|||
|
||||
protected DatabaseID productDB;
|
||||
|
||||
protected List<DatabaseID> availableDatabases;
|
||||
protected Set<DatabaseID> availableDatabases;
|
||||
|
||||
protected final DatabaseID mutableDb;
|
||||
|
||||
|
@ -320,26 +321,16 @@ public abstract class AbstractParmManager implements IParmManager {
|
|||
|
||||
dbCategories = Arrays.asList(prefs.getStringArray("dbTypes"));
|
||||
|
||||
this.availableDatabases = getDatabaseInventory();
|
||||
this.availableDatabases = new HashSet<DatabaseID>(
|
||||
getDatabaseInventory());
|
||||
|
||||
this.dbInvChangeListener = new AbstractGFENotificationObserver<DBInvChangeNotification>(
|
||||
DBInvChangeNotification.class) {
|
||||
|
||||
@Override
|
||||
public void notify(DBInvChangeNotification notificationMessage) {
|
||||
|
||||
List<DatabaseID> newInventory;
|
||||
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);
|
||||
updatedDatabaseList(notificationMessage.getDeletions(),
|
||||
notificationMessage.getAdditions());
|
||||
}
|
||||
|
||||
};
|
||||
|
@ -1862,15 +1853,16 @@ public abstract class AbstractParmManager implements IParmManager {
|
|||
* The list of available parms is updated based on the list of additions and
|
||||
* deletions.
|
||||
*
|
||||
* @param newList
|
||||
* The full inventory, including new additions and deletions
|
||||
* @param deletions
|
||||
* The items being removed from the inventory
|
||||
* @param additions
|
||||
* The items being added from the inventory
|
||||
*/
|
||||
public void updatedDatabaseList(List<DatabaseID> newList,
|
||||
List<DatabaseID> deletions, List<DatabaseID> additions) {
|
||||
public void updatedDatabaseList(List<DatabaseID> deletions,
|
||||
List<DatabaseID> additions) {
|
||||
availableDatabases.addAll(additions);
|
||||
availableDatabases.removeAll(deletions);
|
||||
|
||||
List<ParmID> toDelete = new ArrayList<ParmID>();
|
||||
|
||||
for (DatabaseID dbId : deletions) {
|
||||
|
|
|
@ -60,6 +60,7 @@ import com.raytheon.uf.common.dataplugin.gfe.slice.VectorGridSlice;
|
|||
import com.raytheon.uf.common.dataplugin.gfe.slice.WeatherGridSlice;
|
||||
import com.raytheon.uf.common.dataplugin.gfe.weather.WeatherKey;
|
||||
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.core.DataManager;
|
||||
import com.raytheon.viz.gfe.core.griddata.DiscreteGridData;
|
||||
|
@ -82,6 +83,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 02/04/2008 chammack Initial Creation
|
||||
* 03/20/2013 #1774 randerso Use TimeUtil constants
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -106,10 +108,10 @@ public class MockParmManager extends AbstractParmManager {
|
|||
"CST6CDT");
|
||||
|
||||
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(
|
||||
13 * TimeConstraints.HOUR, TimeConstraints.DAY, 13);
|
||||
13 * TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_DAY, 13);
|
||||
|
||||
protected Set<Parm> fullParmSet;
|
||||
|
||||
|
@ -662,6 +664,7 @@ public class MockParmManager extends AbstractParmManager {
|
|||
return gloc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Parm getParmInExpr(final String exprName, boolean enableTopo) {
|
||||
return getParmInExpr(exprName, enableTopo, dataManager
|
||||
.getSpatialDisplayManager().getActivatedParm());
|
||||
|
@ -795,10 +798,12 @@ public class MockParmManager extends AbstractParmManager {
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<DatabaseID> getIscDatabases() {
|
||||
return new ArrayList<DatabaseID>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParmID getISCParmID(ParmID pid) {
|
||||
return new ParmID();
|
||||
}
|
||||
|
|
|
@ -30,15 +30,16 @@ import org.junit.Test;
|
|||
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
||||
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData;
|
||||
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.GridParmInfo;
|
||||
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.GFERecord.GridType;
|
||||
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.slice.ScalarGridSlice;
|
||||
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.wxvalue.ScalarWxValue;
|
||||
import com.vividsolutions.jts.geom.Coordinate;
|
||||
|
@ -55,6 +56,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Mar 26, 2008 rbell Initial creation
|
||||
* Mar 20, 2013 #1774 randerso Use TimeUtil constants
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -106,8 +108,8 @@ public class ScalarGridDataTest {
|
|||
new Point(4, 4), new Coordinate(45, 30), new Coordinate(9, 9),
|
||||
"CST6CDT");
|
||||
|
||||
TimeConstraints testTC1 = new TimeConstraints(TimeConstraints.HOUR,
|
||||
TimeConstraints.HOUR, 0);
|
||||
TimeConstraints testTC1 = new TimeConstraints(
|
||||
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
|
||||
|
||||
GridParmInfo testGPI1 = new GridParmInfo(testPID1, testGL1,
|
||||
GridType.SCALAR, "F", "Temperature", -20f, 80f, 2, false,
|
||||
|
|
|
@ -29,15 +29,16 @@ import org.junit.Test;
|
|||
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
|
||||
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData;
|
||||
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.GridParmInfo;
|
||||
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.GFERecord.GridType;
|
||||
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.slice.VectorGridSlice;
|
||||
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.wxvalue.VectorWxValue;
|
||||
import com.vividsolutions.jts.geom.Coordinate;
|
||||
|
@ -53,7 +54,8 @@ import com.vividsolutions.jts.geom.Coordinate;
|
|||
* SOFTWARE HISTORY
|
||||
* 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>
|
||||
*
|
||||
|
@ -66,8 +68,8 @@ public class VectorGridDataTest {
|
|||
private final float testFA1[] = new float[145 * 145];
|
||||
{
|
||||
for (int i = 0; i < 145 * 145; i++) {
|
||||
this.testFA1[i] = (float) (i + (i / (Math.pow(10.0, (i + "")
|
||||
.length()))));
|
||||
this.testFA1[i] = (float) (i + (i / (Math.pow(10.0,
|
||||
(i + "").length()))));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -104,7 +106,7 @@ public class VectorGridDataTest {
|
|||
"CST6CDT");
|
||||
|
||||
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,
|
||||
this.testGL1, GridType.VECTOR, "F", "Temperature", -20f, 80f, 2,
|
||||
|
|
|
@ -42,6 +42,7 @@ import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
|
|||
import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice;
|
||||
import com.raytheon.uf.common.dataplugin.gfe.slice.ScalarGridSlice;
|
||||
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.core.DataManager;
|
||||
import com.raytheon.viz.gfe.core.griddata.AbstractGridData;
|
||||
|
@ -64,6 +65,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 02/21/2008 chammack Initial Creation
|
||||
* 03/20/2013 #1774 randerso Use TimeUtil constants
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -84,7 +86,7 @@ public class TestParm {
|
|||
"CST6CDT");
|
||||
|
||||
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;
|
||||
|
||||
|
@ -136,7 +138,7 @@ public class TestParm {
|
|||
"CST6CDT");
|
||||
|
||||
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,
|
||||
this.testGL1, GridType.SCALAR, "F", "Temperature", -20f, 80f, 2,
|
||||
|
|
|
@ -34,7 +34,6 @@ import java.util.regex.Pattern;
|
|||
|
||||
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
|
||||
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
|
||||
import com.raytheon.edex.plugin.gfe.db.dao.GFEDao;
|
||||
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
||||
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
|
||||
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.ParmID;
|
||||
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.message.WsId;
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
|
@ -70,6 +70,8 @@ import com.raytheon.uf.edex.site.SiteAwareRegistry;
|
|||
* D2DParmIdCache toGfeIngestNotificationFilter.
|
||||
* Added code to match wind components and send
|
||||
* GridUpdateNotifications.
|
||||
* Mar 20, 2013 #1774 randerso Changde to use GFDD2DDao
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* @author bphillip
|
||||
|
@ -308,7 +310,6 @@ public class D2DParmIdCache {
|
|||
"Building D2DParmIdCache for " + siteID + "...");
|
||||
IFPServerConfig config = IFPServerConfigManager
|
||||
.getServerConfig(siteID);
|
||||
GFEDao dao = new GFEDao();
|
||||
Set<ParmID> parmIds = new HashSet<ParmID>();
|
||||
long start = System.currentTimeMillis();
|
||||
List<String> d2dModels = config.getD2dModels();
|
||||
|
@ -318,8 +319,8 @@ public class D2DParmIdCache {
|
|||
if ((d2dModelName != null) && (gfeModel != null)) {
|
||||
List<DatabaseID> dbIds = null;
|
||||
try {
|
||||
dbIds = dao.getD2DDatabaseIdsFromDb(d2dModelName,
|
||||
gfeModel, siteID);
|
||||
dbIds = D2DGridDatabase.getD2DDatabaseIdsFromDb(config,
|
||||
d2dModelName);
|
||||
} catch (DataAccessLayerException e) {
|
||||
throw new PluginException(
|
||||
"Unable to get D2D Database Ids from database!",
|
||||
|
@ -333,9 +334,14 @@ public class D2DParmIdCache {
|
|||
|
||||
for (int i = 0; i < versions; i++) {
|
||||
try {
|
||||
parmIds.addAll(dao.getD2DParmIdsFromDb(
|
||||
d2dModelName, dbIds.get(i)));
|
||||
} catch (DataAccessLayerException e) {
|
||||
D2DGridDatabase db = (D2DGridDatabase) GridParmManager
|
||||
.getDb(dbIds.get(i));
|
||||
ServerResponse<List<ParmID>> sr = db
|
||||
.getParmList();
|
||||
if (sr.isOkay()) {
|
||||
parmIds.addAll(sr.getPayload());
|
||||
}
|
||||
} catch (GfeException e) {
|
||||
throw new PluginException(
|
||||
"Error adding parmIds to D2DParmIdCache!!",
|
||||
e);
|
||||
|
|
|
@ -34,13 +34,13 @@ import com.google.common.util.concurrent.MoreExecutors;
|
|||
import com.raytheon.edex.plugin.gfe.cache.d2dparms.D2DParmIdCache;
|
||||
import com.raytheon.edex.plugin.gfe.cache.gridlocations.GridLocationCache;
|
||||
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.exception.GfeConfigurationException;
|
||||
import com.raytheon.edex.plugin.gfe.exception.GfeMissingConfigurationException;
|
||||
import com.raytheon.edex.plugin.gfe.isc.IRTManager;
|
||||
import com.raytheon.edex.plugin.gfe.reference.MapManager;
|
||||
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
|
||||
import com.raytheon.edex.plugin.gfe.server.database.D2DGridDatabase;
|
||||
import com.raytheon.edex.plugin.gfe.server.database.D2DSatDatabaseManager;
|
||||
import com.raytheon.edex.plugin.gfe.server.database.GridDatabase;
|
||||
import com.raytheon.edex.plugin.gfe.server.database.NetCDFDatabaseManager;
|
||||
|
@ -84,6 +84,7 @@ import com.raytheon.uf.edex.site.ISiteActivationListener;
|
|||
* missing configuration (no stack trace).
|
||||
* Feb 28, 2013 #1447 dgilling Enable active table fetching on site
|
||||
* activation.
|
||||
* Mar 20, 2013 #1774 randerso Changed to use GFED2DDao
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -425,7 +426,6 @@ public class GFESiteActivation implements ISiteActivationListener {
|
|||
if (LockState.SUCCESSFUL.equals(ct.getLockState())) {
|
||||
boolean clearTime = false;
|
||||
try {
|
||||
GFEDao dao = new GFEDao();
|
||||
List<String> d2dModels = configRef.getD2dModels();
|
||||
List<List<String>> idsByVersion = new ArrayList<List<String>>(
|
||||
5);
|
||||
|
@ -440,10 +440,9 @@ public class GFESiteActivation implements ISiteActivationListener {
|
|||
.desiredDbVersions(new DatabaseID(
|
||||
siteID, DataType.GRID, "",
|
||||
gfeModel));
|
||||
List<DatabaseID> dbIds = dao
|
||||
.getD2DDatabaseIdsFromDb(
|
||||
d2dModelName, gfeModel,
|
||||
siteID, versions);
|
||||
List<DatabaseID> dbIds = D2DGridDatabase
|
||||
.getD2DDatabaseIdsFromDb(configRef,
|
||||
d2dModelName, versions);
|
||||
|
||||
while (versions > idsByVersion.size()) {
|
||||
idsByVersion.add(new ArrayList<String>(
|
||||
|
|
|
@ -0,0 +1,419 @@
|
|||
/**
|
||||
* This software was developed and / or modified by Raytheon Company,
|
||||
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
*
|
||||
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||
* This software product contains export-restricted data whose
|
||||
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||
* to non-U.S. persons whether in the United States or abroad requires
|
||||
* an export license or other authorization.
|
||||
*
|
||||
* Contractor Name: Raytheon Company
|
||||
* Contractor Address: 6825 Pine Street, Suite 340
|
||||
* Mail Stop B8
|
||||
* Omaha, NE 68106
|
||||
* 402.291.0100
|
||||
*
|
||||
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||
* further licensing information.
|
||||
**/
|
||||
|
||||
package com.raytheon.edex.plugin.gfe.db.dao;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.hibernate.Query;
|
||||
import org.hibernate.SQLQuery;
|
||||
import org.hibernate.Session;
|
||||
|
||||
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
|
||||
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
|
||||
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
||||
import com.raytheon.edex.plugin.gfe.util.GridTranslator;
|
||||
import com.raytheon.uf.common.comm.CommunicationException;
|
||||
import com.raytheon.uf.common.dataplugin.PluginException;
|
||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
|
||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
|
||||
import com.raytheon.uf.common.dataplugin.grid.GridConstants;
|
||||
import com.raytheon.uf.common.dataplugin.grid.GridInfoConstants;
|
||||
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
|
||||
import com.raytheon.uf.common.dataplugin.level.Level;
|
||||
import com.raytheon.uf.common.dataplugin.level.LevelFactory;
|
||||
import com.raytheon.uf.common.parameter.mapping.ParameterMapper;
|
||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||
import com.raytheon.uf.common.util.mapping.MultipleMappingException;
|
||||
import com.raytheon.uf.edex.database.DataAccessLayerException;
|
||||
import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
||||
import com.raytheon.uf.edex.plugin.grid.dao.GridDao;
|
||||
|
||||
/**
|
||||
* Data access object for manipulating GFE Records
|
||||
*
|
||||
* <pre>
|
||||
* SOFTWARE HISTORY
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 03/20/13 #1774 randerso Refactored out of GFEDao
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* @author randerso
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
// **********************************************************************
|
||||
// TODO: this was moved out of GFEDao and needs to be cleaned up to better
|
||||
// use the inherited GridDao functionality and hibernate instead of
|
||||
// SQL/HQL queries. Some parts of the queries could be pushed up to
|
||||
// GridDao
|
||||
// **********************************************************************
|
||||
public class GFED2DDao extends GridDao {
|
||||
private static final String FCST_TIME = "dataTime.fcstTime";
|
||||
|
||||
private static final String REF_TIME = "dataTime.refTime";
|
||||
|
||||
// hibernate query to find grid info record for the given datasetId and
|
||||
// parameter
|
||||
private static final String SQL_D2D_GRID_PARM_QUERY = "select parameter_abbreviation, id "
|
||||
+ "FROM grid_info WHERE "
|
||||
+ GridInfoConstants.DATASET_ID
|
||||
+ " = :"
|
||||
+ GridInfoConstants.DATASET_ID
|
||||
+ " AND "
|
||||
+ "level_id = :level_id AND "
|
||||
+ "(lower(parameter_abbreviation) = :abbrev OR lower(parameter_abbreviation) like :hourAbbrev)";
|
||||
|
||||
// hibernate query to find the times for the GridRecord for the given
|
||||
// info.id, id returned to allow easy lookup of the record associated with
|
||||
// the time
|
||||
private static final String HQL_D2D_GRID_TIME_QUERY = "select dataTime.fcstTime, id from GridRecord "
|
||||
+ "where "
|
||||
+ GridConstants.INFO_ID
|
||||
+ " = :info_id AND dataTime.refTime = :refTime order by dataTime.fcstTime";
|
||||
|
||||
private static final Pattern WIND_PATTERN = Pattern.compile("wind");
|
||||
|
||||
public GFED2DDao() throws PluginException {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a list of available forecast times
|
||||
*
|
||||
* @param dbId
|
||||
* The database ID to get the times for
|
||||
* @return The list of forecast times associated with the specified
|
||||
* DatabaseID
|
||||
* @throws DataAccessLayerException
|
||||
* If errors occur while querying the metadata database
|
||||
*/
|
||||
public List<Integer> getD2DForecastTimes(DatabaseID dbId)
|
||||
throws DataAccessLayerException {
|
||||
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
|
||||
query.addDistinctParameter(FCST_TIME);
|
||||
try {
|
||||
IFPServerConfig config = IFPServerConfigManager
|
||||
.getServerConfig(dbId.getSiteId());
|
||||
query.addQueryParam(GridConstants.DATASET_ID,
|
||||
config.d2dModelNameMapping(dbId.getModelName()));
|
||||
} catch (GfeConfigurationException e) {
|
||||
throw new DataAccessLayerException(
|
||||
"Error occurred looking up model name mapping", e);
|
||||
}
|
||||
query.addQueryParam(REF_TIME, dbId.getModelTimeAsDate());
|
||||
query.addOrder(FCST_TIME, true);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Integer> vals = (List<Integer>) this.queryByCriteria(query);
|
||||
return vals;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a GridRecord from the grib metadata database based on a ParmID,
|
||||
* TimeRange, and GridParmInfo.
|
||||
*
|
||||
* @param id
|
||||
* The parmID of the desired GridRecord
|
||||
* @param forecastTime
|
||||
* The foreCast time of the desired GridRecord, null for any
|
||||
* record
|
||||
* @param info
|
||||
* The GridParmInfo for the requested d2d grid.
|
||||
* @return The GridRecord from the grib metadata database
|
||||
* @throws DataAccessLayerException
|
||||
* If errors occur while querying the metadata database
|
||||
*/
|
||||
public GridRecord getD2DGrid(ParmID id, Integer forecastTime,
|
||||
GridParmInfo info) throws DataAccessLayerException {
|
||||
Session s = null;
|
||||
|
||||
try {
|
||||
s = getHibernateTemplate().getSessionFactory().openSession();
|
||||
// TODO: clean up so we only make one db query
|
||||
SortedMap<Integer, Integer> rawTimes = queryByD2DParmId(id, s);
|
||||
|
||||
// if forecastTime is null just pick one,
|
||||
// this is for static data since all times are the same
|
||||
if (forecastTime == null) {
|
||||
forecastTime = rawTimes.keySet().iterator().next();
|
||||
}
|
||||
|
||||
GridRecord retVal = (GridRecord) s.get(GridRecord.class,
|
||||
rawTimes.get(forecastTime));
|
||||
retVal.setPluginName(GridConstants.GRID);
|
||||
return retVal;
|
||||
|
||||
} finally {
|
||||
if (s != null) {
|
||||
try {
|
||||
s.close();
|
||||
} catch (Exception e) {
|
||||
statusHandler.error(
|
||||
"Error occurred closing database session", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a SortedMap of DataTime and GridRecord ids from the grib metadata
|
||||
* database which match the given ParmID. Session passed to allow reuse
|
||||
* across multiple calls.
|
||||
*
|
||||
* @param id
|
||||
* The ParmID to search with
|
||||
* @param s
|
||||
* The database session to use
|
||||
* @return The list of GridRecords from the grib metadata database which
|
||||
* match the given ParmID
|
||||
* @throws DataAccessLayerException
|
||||
* If errors occur while querying the metadata database
|
||||
*/
|
||||
public SortedMap<Integer, Integer> queryByD2DParmId(ParmID id, Session s)
|
||||
throws DataAccessLayerException {
|
||||
String levelName = GridTranslator.getLevelName(id.getParmLevel());
|
||||
|
||||
double[] levelValues = GridTranslator.getLevelValue(id.getParmLevel());
|
||||
boolean levelOnePresent = (levelValues[0] != Level
|
||||
.getInvalidLevelValue());
|
||||
boolean levelTwoPresent = (levelValues[1] != Level
|
||||
.getInvalidLevelValue());
|
||||
Level level = null;
|
||||
|
||||
// to have a level 2, must have a level one
|
||||
try {
|
||||
if (levelOnePresent && levelTwoPresent) {
|
||||
level = LevelFactory.getInstance().getLevel(levelName,
|
||||
levelValues[0], levelValues[1]);
|
||||
} else if (levelOnePresent) {
|
||||
level = LevelFactory.getInstance().getLevel(levelName,
|
||||
levelValues[0]);
|
||||
} else {
|
||||
level = LevelFactory.getInstance().getLevel(levelName, 0.0);
|
||||
}
|
||||
} catch (CommunicationException e) {
|
||||
logger.error(e.getLocalizedMessage(), e);
|
||||
}
|
||||
if (level == null) {
|
||||
logger.warn("Unable to query D2D parms, ParmID " + id
|
||||
+ " does not map to a level");
|
||||
return new TreeMap<Integer, Integer>();
|
||||
}
|
||||
|
||||
SQLQuery modelQuery = s.createSQLQuery(SQL_D2D_GRID_PARM_QUERY);
|
||||
modelQuery.setLong("level_id", level.getId());
|
||||
DatabaseID dbId = id.getDbId();
|
||||
|
||||
try {
|
||||
IFPServerConfig config = IFPServerConfigManager
|
||||
.getServerConfig(dbId.getSiteId());
|
||||
modelQuery.setString(GridInfoConstants.DATASET_ID,
|
||||
config.d2dModelNameMapping(dbId.getModelName()));
|
||||
} catch (GfeConfigurationException e) {
|
||||
throw new DataAccessLayerException(
|
||||
"Error occurred looking up model name mapping", e);
|
||||
}
|
||||
|
||||
String abbreviation = null;
|
||||
try {
|
||||
abbreviation = ParameterMapper.getInstance().lookupBaseName(
|
||||
id.getParmName(), "gfeParamName");
|
||||
} catch (MultipleMappingException e) {
|
||||
statusHandler.handle(Priority.WARN, e.getLocalizedMessage(), e);
|
||||
abbreviation = e.getArbitraryMapping();
|
||||
}
|
||||
|
||||
abbreviation = abbreviation.toLowerCase();
|
||||
modelQuery.setString("abbrev", abbreviation);
|
||||
modelQuery.setString("hourAbbrev", abbreviation + "%hr");
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Object[]> results = modelQuery.list();
|
||||
|
||||
Integer modelId = null;
|
||||
if (results.size() == 0) {
|
||||
return new TreeMap<Integer, Integer>();
|
||||
} else if (results.size() > 1) {
|
||||
// hours matched, take hour with least number that matches exact
|
||||
// param
|
||||
Pattern p = Pattern.compile("^" + abbreviation + "(\\d+)hr$");
|
||||
int lowestHr = -1;
|
||||
for (Object[] rows : results) {
|
||||
String param = ((String) rows[0]).toLowerCase();
|
||||
if (param.equals(abbreviation) && (lowestHr < 0)) {
|
||||
modelId = (Integer) rows[1];
|
||||
} else {
|
||||
Matcher matcher = p.matcher(param);
|
||||
if (matcher.matches()) {
|
||||
int hr = Integer.parseInt(matcher.group(1));
|
||||
if ((lowestHr < 0) || (hr < lowestHr)) {
|
||||
modelId = (Integer) rows[1];
|
||||
lowestHr = hr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
modelId = (Integer) (results.get(0))[1];
|
||||
}
|
||||
|
||||
Query timeQuery = s.createQuery(HQL_D2D_GRID_TIME_QUERY);
|
||||
timeQuery.setInteger("info_id", modelId);
|
||||
timeQuery.setParameter("refTime", dbId.getModelTimeAsDate());
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Object[]> timeResults = timeQuery.list();
|
||||
|
||||
if (timeResults.isEmpty()) {
|
||||
return new TreeMap<Integer, Integer>();
|
||||
}
|
||||
|
||||
SortedMap<Integer, Integer> dataTimes = new TreeMap<Integer, Integer>();
|
||||
for (Object[] rows : timeResults) {
|
||||
dataTimes.put((Integer) rows[0], (Integer) rows[1]);
|
||||
}
|
||||
return dataTimes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the available Forecast Hours by D2D parm id.
|
||||
*
|
||||
* @param id
|
||||
* @return the list of forecast hours
|
||||
* @throws DataAccessLayerException
|
||||
*/
|
||||
public List<Integer> queryFcstHourByD2DParmId(ParmID id)
|
||||
throws DataAccessLayerException {
|
||||
List<Integer> timeList = new ArrayList<Integer>();
|
||||
Session s = null;
|
||||
try {
|
||||
s = getHibernateTemplate().getSessionFactory().openSession();
|
||||
|
||||
if (id.getParmName().equalsIgnoreCase("wind")) {
|
||||
String idString = id.toString();
|
||||
Matcher idWindMatcher = WIND_PATTERN.matcher(idString);
|
||||
|
||||
ParmID uWindId = new ParmID(idWindMatcher.replaceAll("uW"));
|
||||
SortedMap<Integer, Integer> results = queryByD2DParmId(uWindId,
|
||||
s);
|
||||
List<Integer> uTimeList = new ArrayList<Integer>(results.size());
|
||||
for (Integer o : results.keySet()) {
|
||||
uTimeList.add(o);
|
||||
}
|
||||
|
||||
ParmID vWindId = new ParmID(idWindMatcher.replaceAll("vW"));
|
||||
results = queryByD2DParmId(vWindId, s);
|
||||
Set<Integer> vTimeList = new HashSet<Integer>(results.size(), 1);
|
||||
for (Integer o : results.keySet()) {
|
||||
vTimeList.add(o);
|
||||
}
|
||||
|
||||
for (Integer tr : uTimeList) {
|
||||
if (vTimeList.contains(tr)) {
|
||||
timeList.add(tr);
|
||||
}
|
||||
}
|
||||
|
||||
if (!timeList.isEmpty()) {
|
||||
return timeList;
|
||||
}
|
||||
|
||||
ParmID sWindId = new ParmID(idWindMatcher.replaceAll("ws"));
|
||||
results = queryByD2DParmId(sWindId, s);
|
||||
List<Integer> sTimeList = new ArrayList<Integer>(results.size());
|
||||
for (Integer o : results.keySet()) {
|
||||
sTimeList.add(o);
|
||||
}
|
||||
|
||||
ParmID dWindId = new ParmID(idWindMatcher.replaceAll("wd"));
|
||||
results = queryByD2DParmId(dWindId, s);
|
||||
Set<Integer> dTimeList = new HashSet<Integer>(results.size(), 1);
|
||||
for (Integer o : results.keySet()) {
|
||||
dTimeList.add(o);
|
||||
}
|
||||
|
||||
for (Integer tr : sTimeList) {
|
||||
if (dTimeList.contains(tr)) {
|
||||
timeList.add(tr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SortedMap<Integer, Integer> results = queryByD2DParmId(id, s);
|
||||
for (Integer o : results.keySet()) {
|
||||
timeList.add(o);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if (s != null) {
|
||||
try {
|
||||
s.close();
|
||||
} catch (Exception e) {
|
||||
statusHandler.error(
|
||||
"Error occurred closing database session", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return timeList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves model run times for the n most recent model runs of a given
|
||||
* d2dModelName
|
||||
*
|
||||
* @param d2dModelName
|
||||
* @param maxRecords
|
||||
* @return
|
||||
* @throws DataAccessLayerException
|
||||
*/
|
||||
public List<Date> getD2DModelRunTimes(String d2dModelName, int maxRecords)
|
||||
throws DataAccessLayerException {
|
||||
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
|
||||
query.addDistinctParameter(REF_TIME);
|
||||
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
|
||||
query.addOrder(REF_TIME, false);
|
||||
if (maxRecords > 0) {
|
||||
query.setMaxResults(maxRecords);
|
||||
}
|
||||
List<?> result = this.queryByCriteria(query);
|
||||
|
||||
List<Date> inventory = new ArrayList<Date>(result.size());
|
||||
for (Object obj : result) {
|
||||
// convert returned "Dates" (actually java.sql.TimeStamps) to actual
|
||||
// java.util.Dates so equals comparisons work correctly
|
||||
Date date = new Date(((Date) obj).getTime());
|
||||
inventory.add(date);
|
||||
}
|
||||
|
||||
return inventory;
|
||||
}
|
||||
}
|
|
@ -27,18 +27,13 @@ import java.util.Calendar;
|
|||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
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 org.hibernate.Transaction;
|
||||
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.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.database.D2DGridDatabase;
|
||||
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.uf.common.comm.CommunicationException;
|
||||
import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
||||
import com.raytheon.uf.common.dataplugin.PluginException;
|
||||
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.DataType;
|
||||
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.exception.GfeException;
|
||||
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.type.Pair;
|
||||
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.PersistableDataObject;
|
||||
import com.raytheon.uf.common.dataquery.db.QueryResult;
|
||||
import com.raytheon.uf.common.datastorage.DataStoreFactory;
|
||||
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.time.DataTime;
|
||||
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.purge.PurgeLogger;
|
||||
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
|
||||
* 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
|
||||
* 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>
|
||||
*
|
||||
|
@ -120,25 +99,6 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery;
|
|||
* @version 1.0
|
||||
*/
|
||||
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");
|
||||
|
||||
public GFEDao() throws PluginException {
|
||||
|
@ -596,348 +556,6 @@ public class GFEDao extends DefaultPluginDao {
|
|||
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) {
|
||||
txTemplate.execute(new TransactionCallbackWithoutResult() {
|
||||
@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
|
||||
* 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
|
||||
* GridDataHistories. Does not alter the publish times in memory.
|
||||
|
|
|
@ -20,8 +20,11 @@
|
|||
package com.raytheon.edex.plugin.gfe.paraminfo;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
|
@ -31,6 +34,7 @@ import javax.xml.bind.annotation.XmlElements;
|
|||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
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
|
||||
* 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>
|
||||
*
|
||||
|
@ -108,12 +114,21 @@ public class GridParamInfo {
|
|||
}
|
||||
|
||||
public List<TimeRange> getAvailableTimes(Date refTime) {
|
||||
List<TimeRange> availTimes = new ArrayList<TimeRange>();
|
||||
for (int i = 1; i < times.size(); i++) {
|
||||
availTimes.add(new TimeRange(refTime.getTime() + times.get(i - 1)
|
||||
* 1000, refTime.getTime() + times.get(i) * 1000));
|
||||
List<TimeRange> availTimes = new ArrayList<TimeRange>(times.size());
|
||||
for (Integer fcstHour : times) {
|
||||
availTimes.add(new TimeRange(new Date(refTime.getTime() + fcstHour
|
||||
* TimeUtil.MILLIS_PER_SECOND), TimeUtil.MILLIS_PER_HOUR));
|
||||
}
|
||||
return availTimes;
|
||||
}
|
||||
|
||||
public Collection<String> getParmNames() {
|
||||
List<ParameterInfo> paramInfoList = this.getGridParamInfo();
|
||||
Set<String> parmNames = new HashSet<String>();
|
||||
for (ParameterInfo info : paramInfoList) {
|
||||
parmNames.add(info.getShort_name());
|
||||
}
|
||||
|
||||
return parmNames;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,8 +56,10 @@ import com.raytheon.uf.common.util.mapping.MultipleMappingException;
|
|||
* Jan 25, 2012 DR 14305 ryu Read site parameterInfo files
|
||||
* Sep 12, 2012 #1117 dgilling Implement method to retrieve all
|
||||
* parm names for a given model.
|
||||
* Feb 15, 2013 1598 bsteffen Make GridParamInfoLookup filter on
|
||||
* extension.
|
||||
* Feb 15, 2013 1598 bsteffen Make GridParamInfoLookup filter on
|
||||
* extension.
|
||||
* Mar 20, 2013 #1774 randerso Added getModelInfo,
|
||||
* added Dflt if no levels specified
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -94,7 +96,14 @@ public class GridParamInfoLookup {
|
|||
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;
|
||||
try {
|
||||
paramInfoName = DatasetIdMapper.getInstance().lookupAliasOrNull(
|
||||
|
@ -211,5 +220,17 @@ public class GridParamInfoLookup {
|
|||
"Error unmarshalling grid parameter information", e);
|
||||
}
|
||||
}
|
||||
|
||||
for (GridParamInfo gridParamInfo : modelParamMap.values()) {
|
||||
for (String parmName : gridParamInfo.getParmNames()) {
|
||||
ParameterInfo parameterInfo = gridParamInfo
|
||||
.getParameterInfo(parmName);
|
||||
|
||||
// add Dflt level if no other levels defined
|
||||
if (parameterInfo.getLevels().isEmpty()) {
|
||||
parameterInfo.getLevels().add("Dflt");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
|||
* Jun 24, 2010 bphillip Initial creation
|
||||
* Sep 12, 2012 #1117 dgilling Create field to hold list of
|
||||
* valid levels for each parameter.
|
||||
* Mar 20, 2013 #1774 randerso Added getMinVal and getMaxVal
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -53,6 +54,13 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
|||
@XmlAccessorType(XmlAccessType.NONE)
|
||||
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
|
||||
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
|
||||
private String short_name;
|
||||
|
@ -190,6 +198,28 @@ public class ParameterInfo {
|
|||
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
|
||||
*/
|
||||
|
|
|
@ -91,6 +91,8 @@ import com.raytheon.uf.edex.database.purge.PurgeLogger;
|
|||
* smartInit hdf5 data
|
||||
* 03/07/13 #1773 njensen Logged commitGrid() times
|
||||
* 03/15/13 #1795 njensen Sped up commitGrid()
|
||||
* 03/20/2013 #1774 randerso Removed dead method, changed to use new
|
||||
* D2DGridDatabase constructor
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -356,48 +358,6 @@ public class GridParmManager {
|
|||
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
|
||||
* returned through the calling argument "changes".
|
||||
|
@ -1197,7 +1157,12 @@ public class GridParmManager {
|
|||
IFPServerConfig serverConfig = IFPServerConfigManager
|
||||
.getServerConfig(siteId);
|
||||
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) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
e.getLocalizedMessage());
|
||||
|
@ -1363,10 +1328,9 @@ public class GridParmManager {
|
|||
private static void createDbNotification(String siteID,
|
||||
List<DatabaseID> dbs, List<DatabaseID> additions,
|
||||
List<DatabaseID> deletions) {
|
||||
DBInvChangeNotification notify = new DBInvChangeNotification(dbs,
|
||||
additions, deletions, siteID);
|
||||
|
||||
if (!additions.isEmpty() || !deletions.isEmpty()) {
|
||||
DBInvChangeNotification notify = new DBInvChangeNotification(dbs,
|
||||
additions, deletions, siteID);
|
||||
SendNotifications.send(notify);
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -94,7 +94,6 @@ import com.raytheon.uf.edex.core.dataplugin.PluginRegistry;
|
|||
import com.raytheon.uf.edex.database.DataAccessLayerException;
|
||||
import com.raytheon.uf.edex.database.plugin.PluginFactory;
|
||||
import com.vividsolutions.jts.geom.Coordinate;
|
||||
import com.vividsolutions.jts.io.WKTReader;
|
||||
|
||||
/**
|
||||
* 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
|
||||
* 03/07/13 #1737 njensen Logged getGridData times
|
||||
* 03/15/13 #1795 njensen Added updatePublishTime()
|
||||
* 03/20/13 #1774 randerso Cleanup code to use proper constructors
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -1191,6 +1191,7 @@ public class IFPGridDatabase extends GridDatabase {
|
|||
"Unable to update grid history!!", e);
|
||||
}
|
||||
return sr;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1591,77 +1592,79 @@ public class IFPGridDatabase extends GridDatabase {
|
|||
protected GridParmInfo populateGpi(Map<String, Object> dataAttributes)
|
||||
throws Exception {
|
||||
|
||||
GridParmInfo gpi = new GridParmInfo();
|
||||
TimeConstraints tc = new TimeConstraints();
|
||||
GridLocation location = new GridLocation();
|
||||
ProjectionData pd = new ProjectionData();
|
||||
|
||||
pd.setProjectionID((String) dataAttributes
|
||||
.get("gridLoc.projection.projectionID"));
|
||||
pd.setProjectionType(ProjectionType.valueOf((String) dataAttributes
|
||||
.get("gridLoc.projection.projectionType")));
|
||||
pd.setLatLonLL(new Coordinate((Float) dataAttributes
|
||||
.get("gridLoc.projection.latLonLL.x"), (Float) dataAttributes
|
||||
.get("gridLoc.projection.latLonLL.y")));
|
||||
pd.setLatLonUR(new Coordinate((Float) dataAttributes
|
||||
.get("gridLoc.projection.latLonUR.x"), (Float) dataAttributes
|
||||
.get("gridLoc.projection.latLonUR.y")));
|
||||
pd.setLatLonOrigin(new Coordinate((Float) dataAttributes
|
||||
.get("gridLoc.projection.latLonOrigin.x"),
|
||||
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.y")));
|
||||
pd.setStdParallelOne((Float) dataAttributes
|
||||
.get("gridLoc.projection.stdParallelOne"));
|
||||
pd.setStdParallelTwo((Float) dataAttributes
|
||||
.get("gridLoc.projection.stdParallelTwo"));
|
||||
pd.setGridPointLL(new Point((Integer) dataAttributes
|
||||
.get("gridLoc.projection.gridPointLL.x"),
|
||||
String projID = (String) dataAttributes
|
||||
.get("gridLoc.projection.projectionID");
|
||||
ProjectionType projType = ProjectionType
|
||||
.valueOf((String) dataAttributes
|
||||
.get("gridLoc.projection.projectionType"));
|
||||
Coordinate latLonLL = new Coordinate(
|
||||
(Float) dataAttributes.get("gridLoc.projection.latLonLL.x"),
|
||||
(Float) dataAttributes.get("gridLoc.projection.latLonLL.y"));
|
||||
Coordinate latLonUR = new Coordinate(
|
||||
(Float) dataAttributes.get("gridLoc.projection.latLonUR.x"),
|
||||
(Float) dataAttributes.get("gridLoc.projection.latLonUR.y"));
|
||||
Coordinate latLonOrig = new Coordinate(
|
||||
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.x"),
|
||||
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.y"));
|
||||
Float stdPar1 = (Float) dataAttributes
|
||||
.get("gridLoc.projection.stdParallelOne");
|
||||
Float stdPar2 = (Float) dataAttributes
|
||||
.get("gridLoc.projection.stdParallelTwo");
|
||||
Point gridLL = new Point(
|
||||
(Integer) dataAttributes
|
||||
.get("gridLoc.projection.gridPointLL.y")));
|
||||
pd.setGridPointUR(new Point((Integer) dataAttributes
|
||||
.get("gridLoc.projection.gridPointUR.x"),
|
||||
.get("gridLoc.projection.gridPointLL.x"),
|
||||
(Integer) dataAttributes
|
||||
.get("gridLoc.projection.gridPointUR.y")));
|
||||
pd.setLatIntersect((Float) dataAttributes
|
||||
.get("gridLoc.projection.latIntersect"));
|
||||
pd.setLonCenter((Float) dataAttributes
|
||||
.get("gridLoc.projection.lonCenter"));
|
||||
pd.setLonOrigin((Float) dataAttributes
|
||||
.get("gridLoc.projection.lonOrigin"));
|
||||
.get("gridLoc.projection.gridPointLL.y"));
|
||||
Point gridUR = new Point(
|
||||
(Integer) dataAttributes
|
||||
.get("gridLoc.projection.gridPointUR.x"),
|
||||
(Integer) dataAttributes
|
||||
.get("gridLoc.projection.gridPointUR.y"));
|
||||
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"));
|
||||
location.setNx((Integer) dataAttributes.get("gridLoc.nx"));
|
||||
location.setNy((Integer) dataAttributes.get("gridLoc.ny"));
|
||||
location.setTimeZone((String) dataAttributes.get("gridLoc.timeZone"));
|
||||
location.setOrigin(new Coordinate((Float) dataAttributes
|
||||
.get("gridLoc.origin.x"), (Float) dataAttributes
|
||||
.get("gridLoc.origin.y")));
|
||||
location.setExtent(new Coordinate((Float) dataAttributes
|
||||
.get("gridLoc.extent.x"), (Float) dataAttributes
|
||||
.get("gridLoc.extent.y")));
|
||||
location.setGeometry(new WKTReader().read((String) dataAttributes
|
||||
.get("gridLoc.geometry")));
|
||||
location.setCrsWKT((String) dataAttributes.get("gridLoc.crs"));
|
||||
location.setProjection(pd);
|
||||
String id = (String) dataAttributes.get("gridLoc.siteID");
|
||||
int nx = (Integer) dataAttributes.get("gridLoc.nx");
|
||||
int ny = (Integer) dataAttributes.get("gridLoc.ny");
|
||||
Coordinate domainOrigin = new Coordinate(
|
||||
(Float) dataAttributes.get("gridLoc.origin.x"),
|
||||
(Float) dataAttributes.get("gridLoc.origin.y"));
|
||||
Coordinate domainExtent = new Coordinate(
|
||||
(Float) dataAttributes.get("gridLoc.extent.x"),
|
||||
(Float) dataAttributes.get("gridLoc.extent.y"));
|
||||
String timeZone = (String) dataAttributes.get("gridLoc.timeZone");
|
||||
GridLocation gridLoc = new GridLocation(id, proj, new Point(nx, ny),
|
||||
domainOrigin, domainExtent, timeZone);
|
||||
|
||||
tc.setDuration((Integer) dataAttributes.get("timeConstraints.duration"));
|
||||
tc.setRepeatInterval((Integer) dataAttributes
|
||||
.get("timeConstraints.repeatInterval"));
|
||||
tc.setStartTime((Integer) dataAttributes
|
||||
.get("timeConstraints.startTime"));
|
||||
int duration = (Integer) dataAttributes.get("timeConstraints.duration");
|
||||
int repeatInterval = (Integer) dataAttributes
|
||||
.get("timeConstraints.repeatInterval");
|
||||
int startTime = (Integer) dataAttributes
|
||||
.get("timeConstraints.startTime");
|
||||
TimeConstraints timeConstraints = new TimeConstraints(duration,
|
||||
repeatInterval, startTime);
|
||||
|
||||
gpi.setParmID(new ParmID((String) dataAttributes.get("parmID")));
|
||||
gpi.setGridType(GridType.valueOf((String) dataAttributes
|
||||
.get("gridType")));
|
||||
gpi.setDescriptiveName((String) dataAttributes.get("descriptiveName"));
|
||||
gpi.setUnitString((String) dataAttributes.get("unitString"));
|
||||
gpi.setMaxValue((Float) dataAttributes.get("maxValue"));
|
||||
gpi.setMinValue((Float) dataAttributes.get("minValue"));
|
||||
gpi.setPrecision((Integer) dataAttributes.get("precision"));
|
||||
gpi.setRateParm((Boolean) dataAttributes.get("rateParm"));
|
||||
gpi.setTimeIndependentParm((Boolean) dataAttributes
|
||||
.get("timeIndependentParm"));
|
||||
gpi.setTimeConstraints(tc);
|
||||
gpi.setGridLoc(location);
|
||||
ParmID parmId = new ParmID((String) dataAttributes.get("parmID"));
|
||||
GridType gridType = GridType.valueOf((String) dataAttributes
|
||||
.get("gridType"));
|
||||
String descriptiveName = (String) dataAttributes.get("descriptiveName");
|
||||
String unit = (String) dataAttributes.get("unitString");
|
||||
Float minValue = (Float) dataAttributes.get("minValue");
|
||||
Float maxValue = (Float) dataAttributes.get("maxValue");
|
||||
int precision = (Integer) dataAttributes.get("precision");
|
||||
boolean timeIndependentParm = (Boolean) dataAttributes
|
||||
.get("timeIndependentParm");
|
||||
boolean rateParm = (Boolean) dataAttributes.get("rateParm");
|
||||
GridParmInfo gpi = new GridParmInfo(parmId, gridLoc, gridType, unit,
|
||||
descriptiveName, minValue, maxValue, precision,
|
||||
timeIndependentParm, timeConstraints, rateParm);
|
||||
|
||||
return gpi;
|
||||
}
|
||||
|
|
|
@ -36,34 +36,32 @@ import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
|
|||
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
|
||||
import com.raytheon.edex.plugin.gfe.server.D2DSatParm;
|
||||
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.D2DSatDatabaseManager;
|
||||
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitQueue;
|
||||
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitRecord;
|
||||
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.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.DataType;
|
||||
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.GfeNotification;
|
||||
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
|
||||
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.message.WsId;
|
||||
import com.raytheon.uf.common.parameter.mapping.ParameterMapper;
|
||||
import com.raytheon.uf.common.serialization.SerializationUtil;
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
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.util.mapping.MultipleMappingException;
|
||||
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>
|
||||
*
|
||||
|
@ -77,6 +75,7 @@ import com.raytheon.uf.edex.core.EDEXUtil;
|
|||
* D2DParmIdCache to GfeIngestNotificationFilter
|
||||
* Mar 25, 2013 1823 dgilling Trigger SAT smart init based only on record's
|
||||
* SectorId and PhysicalElement.
|
||||
* Mar 20, 2013 #1774 randerso Refactor to use grid durations from D2DGridDatabase
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -124,7 +123,6 @@ public class GfeIngestNotificationFilter {
|
|||
Map<SmartInitRecordPK, SmartInitRecord> inits = new HashMap<SmartInitRecordPK, SmartInitRecord>();
|
||||
// Loop through each record received and construct a ParmID
|
||||
Map<ParmID, List<TimeRange>> gridInv = new HashMap<ParmID, List<TimeRange>>();
|
||||
List<GridUpdateNotification> guns = new ArrayList<GridUpdateNotification>();
|
||||
Set<DatabaseID> newDbs = new HashSet<DatabaseID>();
|
||||
|
||||
IFPServerConfig config = null;
|
||||
|
@ -138,12 +136,11 @@ public class GfeIngestNotificationFilter {
|
|||
for (GridRecord grid : gridRecords) {
|
||||
String gfeModel = config.gfeModelNameMapping(grid
|
||||
.getDatasetId());
|
||||
DatabaseID dbId = D2DGridDatabase.getDbId(grid.getDatasetId(),
|
||||
grid.getDataTime().getRefTime(), config);
|
||||
|
||||
// ignore if no mapping
|
||||
if (gfeModel != null && gfeModel.length() > 0) {
|
||||
DatabaseID dbId = new DatabaseID(site, DataType.GRID,
|
||||
"D2D", gfeModel, grid.getDataTime().getRefTime());
|
||||
|
||||
if (dbId != null) {
|
||||
if ((!D2DParmIdCache.getInstance().getDatabaseIDs()
|
||||
.contains(dbId))
|
||||
&& (!newDbs.contains(dbId))) {
|
||||
|
@ -158,33 +155,22 @@ public class GfeIngestNotificationFilter {
|
|||
}
|
||||
|
||||
String abbrev = grid.getParameter().getAbbreviation();
|
||||
String gfeParmName = null;
|
||||
try {
|
||||
gfeParmName = ParameterMapper.getInstance()
|
||||
.lookupAlias(abbrev, "gfeParamName");
|
||||
} catch (MultipleMappingException e) {
|
||||
statusHandler.handle(Priority.WARN,
|
||||
e.getLocalizedMessage(), e);
|
||||
gfeParmName = e.getArbitraryMapping();
|
||||
}
|
||||
Level level = grid.getLevel();
|
||||
|
||||
String level = GridTranslator.getShortLevelName(grid
|
||||
.getLevel().getMasterLevel().getName(), grid
|
||||
.getLevel().getLevelonevalue(), grid.getLevel()
|
||||
.getLeveltwovalue());
|
||||
ParmID parmID = new ParmID(gfeParmName, dbId, level);
|
||||
D2DGridDatabase db = (D2DGridDatabase) GridParmManager
|
||||
.getDb(dbId);
|
||||
ParmID parmID = db.getParmId(abbrev, level);
|
||||
|
||||
List<TimeRange> trs = gridInv.get(parmID);
|
||||
if (trs == null) {
|
||||
trs = new ArrayList<TimeRange>();
|
||||
gridInv.put(parmID, trs);
|
||||
}
|
||||
TimeRange validPeriod = grid.getDataTime().getValidPeriod();
|
||||
if (validPeriod.getDuration() > 0) {
|
||||
trs.add(validPeriod);
|
||||
} else {
|
||||
trs.add(new TimeRange(grid.getDataTime()
|
||||
.getValidPeriod().getStart(), 3600 * 1000));
|
||||
|
||||
Integer fcstHour = grid.getDataTime().getFcstTime();
|
||||
TimeRange tr = db.getTimeRange(parmID, fcstHour);
|
||||
if (tr != null) {
|
||||
trs.add(tr);
|
||||
}
|
||||
|
||||
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
|
||||
List<GridUpdateNotification> guns = new ArrayList<GridUpdateNotification>();
|
||||
for (ParmID parmId : gridInv.keySet()) {
|
||||
try {
|
||||
List<TimeRange> trs = gridInv.get(parmId);
|
||||
|
|
|
@ -1,152 +1,437 @@
|
|||
<?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">
|
||||
<alias base="WGH">wgh</alias>
|
||||
<alias base="AV">av</alias>
|
||||
<alias base="CRAIN">crain</alias>
|
||||
<alias base="CFRZR">cfrzr</alias>
|
||||
<alias base="CICEP">cicep</alias>
|
||||
<alias base="CSNOW">csnow</alias>
|
||||
<alias base="CAPE">cape</alias>
|
||||
<alias base="CIn">cin</alias>
|
||||
<alias base="CP">cp</alias>
|
||||
<alias base="CP3hr">cp3hr</alias>
|
||||
<alias base="DpD">dpd</alias>
|
||||
<alias base="DpT">dpt</alias>
|
||||
<alias base="WVDIR">wvdir</alias>
|
||||
<alias base="SWDIR">swdir</alias>
|
||||
<alias base="EPT">ept</alias>
|
||||
<alias base="GeH">geh</alias>
|
||||
<alias base="GH">gh</alias>
|
||||
<alias base="HIdx">hidx</alias>
|
||||
<alias base="LgSP">lgsp</alias>
|
||||
<alias base="LgSP3hr">lgsp3hr</alias>
|
||||
<alias base="LHF">lhf</alias>
|
||||
<alias base="MnT">mnt</alias>
|
||||
<alias base="WVPER">wvper</alias>
|
||||
<alias base="SWPER">swper</alias>
|
||||
<alias base="MxT">mxt</alias>
|
||||
<alias base="PLI">pli</alias>
|
||||
<alias base="PoT">pot</alias>
|
||||
<alias base="P">p</alias>
|
||||
<alias base="PMSL">pmsl</alias>
|
||||
<alias base="EMSP">emsp</alias>
|
||||
<alias base="MMSP">mmsp</alias>
|
||||
<alias base="DIRPW">dirpw</alias>
|
||||
<alias base="PERPW">perpw</alias>
|
||||
<alias base="HTSGW">htsgw</alias>
|
||||
<alias base="PR">pr</alias>
|
||||
<alias base="CPOFP">cpofp</alias>
|
||||
<alias base="CPOZP">cpozp</alias>
|
||||
<alias base="PW">pw</alias>
|
||||
<alias base="RH">rh</alias>
|
||||
<alias base="SHF">shf</alias>
|
||||
<alias base="DIRSW">dirsw</alias>
|
||||
<alias base="PERSW">persw</alias>
|
||||
<alias base="WVHGT">wvhgt</alias>
|
||||
<alias base="SWELL">swell</alias>
|
||||
<alias base="SCP">scp</alias>
|
||||
<alias base="SnD">snd</alias>
|
||||
<alias base="SH">sh</alias>
|
||||
<alias base="Heli">heli</alias>
|
||||
<alias base="SLI">sli</alias>
|
||||
<alias base="BLI">bli</alias>
|
||||
<alias base="T">t</alias>
|
||||
<alias base="TCC">tcc</alias>
|
||||
<alias base="ThP">thp</alias>
|
||||
<alias base="TP">tp</alias>
|
||||
<alias base="TP3hr">tp3hr</alias>
|
||||
<alias base="TP6hr">tp6hr</alias>
|
||||
<alias base="TP12hr">tp12hr</alias>
|
||||
<alias base="TP24hr">tp24hr</alias>
|
||||
<alias base="TP48hr">tp48hr</alias>
|
||||
<alias base="USTM">ustm</alias>
|
||||
<alias base="VSTM">vstm</alias>
|
||||
<alias base="uW">uw</alias>
|
||||
<alias base="vW">vw</alias>
|
||||
<alias base="VAPP">vapp</alias>
|
||||
<alias base="PVV">pvv</alias>
|
||||
<alias base="Vis">vis</alias>
|
||||
<alias base="VPT">vpt</alias>
|
||||
<alias base="WEASD">weasd</alias>
|
||||
<alias base="WD">wd</alias>
|
||||
<alias base="WS">ws</alias>
|
||||
<alias base="WGS">wgs</alias>
|
||||
<alias base="MSG">msg</alias>
|
||||
<alias base="SVV">svv</alias>
|
||||
<alias base="GVV">gvv</alias>
|
||||
<alias base="KI">ki</alias>
|
||||
<alias base="TKE">tke</alias>
|
||||
<!-- Parameters below this point are not defined in parameter definition
|
||||
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.
|
||||
In the future more work should be done to merge these names into definition
|
||||
files. -->
|
||||
<alias base="CCP">ccpc</alias>
|
||||
<alias base="Pchg">pt3</alias>
|
||||
<alias base="VV">ww</alias>
|
||||
<alias base="TP-HPC">tp_HPC</alias>
|
||||
<alias base="TP-ACR">tp_ACR</alias>
|
||||
<alias base="TP-ALR">tp_ALR</alias>
|
||||
<alias base="TP-FWR">tp_FWR</alias>
|
||||
<alias base="TP-KRF">tp_KRF</alias>
|
||||
<alias base="TP-MSR">tp_MSR</alias>
|
||||
<alias base="TP-ORN">tp_ORN</alias>
|
||||
<alias base="TP-PTR">tp_PTR</alias>
|
||||
<alias base="TP-RHA">tp_RHA</alias>
|
||||
<alias base="TP-RSA">tp_RSA</alias>
|
||||
<alias base="TP-STR">tp_STR</alias>
|
||||
<alias base="TP-TAR">tp_TAR</alias>
|
||||
<alias base="TP-TIR">tp_TIR</alias>
|
||||
<alias base="TP-TUA">tp_TUA</alias>
|
||||
<alias base="TP3mean">tpmean3</alias>
|
||||
<alias base="TP6mean">tpmean6</alias>
|
||||
<alias base="TP12mean">tpmean12</alias>
|
||||
<alias base="TP24mean">tpmean24</alias>
|
||||
<alias base="SNOL12mean">snolmean12</alias>
|
||||
<alias base="TP3sprd">tpsprd3</alias>
|
||||
<alias base="TP6sprd">tpsprd6</alias>
|
||||
<alias base="TP12sprd">tpsprd12</alias>
|
||||
<alias base="TP24sprd">tpsprd24</alias>
|
||||
<alias base="SNOL12sprd">snolsprd12</alias>
|
||||
<alias base="QPE01">qpe1</alias>
|
||||
<alias base="QPE06">qpe6</alias>
|
||||
<alias base="TPCSG">Surge10Pct</alias>
|
||||
<alias base="TPCSG-305E2">PSurge10Ft</alias>
|
||||
<alias base="TPCSG-274E2">PSurge9Ft</alias>
|
||||
<alias base="TPCSG-244E2">PSurge8Ft</alias>
|
||||
<alias base="TPCSG-213E2">PSurge7Ft</alias>
|
||||
<alias base="TPCSG-183E2">PSurge6Ft</alias>
|
||||
<alias base="TPCSG-152E2">PSurge5Ft</alias>
|
||||
<alias base="TPCSG-122E2">PSurge4Ft</alias>
|
||||
<alias base="TPCSG-91E2">PSurge3Ft</alias>
|
||||
<alias base="TPCSG-61E2">PSurge2Ft</alias>
|
||||
<alias base="SIPD">sld</alias>
|
||||
<alias base="MAXRH3hr">maxRH3hr</alias>
|
||||
<alias base="MAXRH12hr">maxRH12hr</alias>
|
||||
<alias base="MINRH3hr">minRH3hr</alias>
|
||||
<alias base="MINRH12hr">minRH12hr</alias>
|
||||
<alias base="TPCSG-SLOSH">SloshSurge</alias>
|
||||
<alias base="TPCSG-20">Surge20Pct</alias>
|
||||
<alias base="TPCSG-30">Surge30Pct</alias>
|
||||
<alias base="TPCSG-40">Surge40Pct</alias>
|
||||
<alias base="TPCSG-50">Surge50Pct</alias>
|
||||
<alias base="TPCSG-60">Surge60Pct</alias>
|
||||
<alias base="TPCSG-70">Surge70Pct</alias>
|
||||
<alias base="TPCSG-80">Surge80Pct</alias>
|
||||
<alias base="TPCSG-90">Surge90Pct</alias>
|
||||
<alias base="TPCSG-335E2">PSurge11Ft</alias>
|
||||
<alias base="TPCSG-366E2">PSurge12Ft</alias>
|
||||
<alias base="TPCSG-396E2">PSurge13Ft</alias>
|
||||
<alias base="TPCSG-427E2">PSurge14Ft</alias>
|
||||
<alias base="TPCSG-457E2">PSurge15Ft</alias>
|
||||
<alias base="TPCSG-488E2">PSurge16Ft</alias>
|
||||
<alias base="TPCSG-518E2">PSurge17Ft</alias>
|
||||
<alias base="TPCSG-549E2">PSurge18Ft</alias>
|
||||
<alias base="TPCSG-579E2">PSurge19Ft</alias>
|
||||
<alias base="TPCSG-610E2">PSurge20Ft</alias>
|
||||
<alias base="TPCSG-640E2">PSurge21Ft</alias>
|
||||
<alias base="TPCSG-671E2">PSurge22Ft</alias>
|
||||
<alias base="TPCSG-701E2">PSurge23Ft</alias>
|
||||
<alias base="TPCSG-732E2">PSurge24Ft</alias>
|
||||
<alias base="TPCSG-762E2">PSurge25Ft</alias>
|
||||
<alias base="AV">av</alias>
|
||||
<alias base="CAPE">cape</alias>
|
||||
<alias base="CFRZR">cfrzr</alias>
|
||||
<alias base="CICEP">cicep</alias>
|
||||
<alias base="CIn">cin</alias>
|
||||
<alias base="CP3hr">cp3hr</alias>
|
||||
<alias base="CP">cp</alias>
|
||||
<alias base="CPOFP">cpofp</alias>
|
||||
<alias base="CPOZP">cpozp</alias>
|
||||
<alias base="CRAIN">crain</alias>
|
||||
<alias base="CSNOW">csnow</alias>
|
||||
<alias base="DIRPW">dirpw</alias>
|
||||
<alias base="DIRSW">dirsw</alias>
|
||||
<alias base="DpD">dpd</alias>
|
||||
<alias base="DpT">dpt</alias>
|
||||
<alias base="EMSP">emsp</alias>
|
||||
<alias base="EPT">ept</alias>
|
||||
<alias base="GeH">geh</alias>
|
||||
<alias base="GH">gh</alias>
|
||||
<alias base="GVV">gvv</alias>
|
||||
<alias base="Heli">heli</alias>
|
||||
<alias base="HIdx">hidx</alias>
|
||||
<alias base="HTSGW">htsgw</alias>
|
||||
<alias base="KI">ki</alias>
|
||||
<alias base="LgSP3hr">lgsp3hr</alias>
|
||||
<alias base="LgSP">lgsp</alias>
|
||||
<alias base="LHF">lhf</alias>
|
||||
<alias base="MMSP">mmsp</alias>
|
||||
<alias base="MnT">mnt</alias>
|
||||
<alias base="MSG">msg</alias>
|
||||
<alias base="MxT">mxt</alias>
|
||||
<alias base="PERPW">perpw</alias>
|
||||
<alias base="PERSW">persw</alias>
|
||||
<alias base="PLI">pli</alias>
|
||||
<alias base="PMSL">pmsl</alias>
|
||||
<alias base="PoT">pot</alias>
|
||||
<alias base="P">p</alias>
|
||||
<alias base="PR">pr</alias>
|
||||
<alias base="PVV">pvv</alias>
|
||||
<alias base="PW">pw</alias>
|
||||
<alias base="RH">rh</alias>
|
||||
<alias base="SCP">scp</alias>
|
||||
<alias base="SHF">shf</alias>
|
||||
<alias base="SH">sh</alias>
|
||||
<alias base="SLI">sli</alias>
|
||||
<alias base="SnD">snd</alias>
|
||||
<alias base="SVV">svv</alias>
|
||||
<alias base="SWDIR">swdir</alias>
|
||||
<alias base="SWELL">swell</alias>
|
||||
<alias base="SWPER">swper</alias>
|
||||
<alias base="TCC">tcc</alias>
|
||||
<alias base="ThP">thp</alias>
|
||||
<alias base="TKE">tke</alias>
|
||||
<alias base="TP12hr">tp12hr</alias>
|
||||
<alias base="TP24hr">tp24hr</alias>
|
||||
<alias base="TP3hr">tp3hr</alias>
|
||||
<alias base="TP48hr">tp48hr</alias>
|
||||
<alias base="TP6hr">tp6hr</alias>
|
||||
<alias base="TP">tp</alias>
|
||||
<alias base="T">t</alias>
|
||||
<alias base="USTM">ustm</alias>
|
||||
<alias base="uW">uw</alias>
|
||||
<alias base="VAPP">vapp</alias>
|
||||
<alias base="Vis">vis</alias>
|
||||
<alias base="VPT">vpt</alias>
|
||||
<alias base="VSTM">vstm</alias>
|
||||
<alias base="vW">vw</alias>
|
||||
<alias base="WD">wd</alias>
|
||||
<alias base="WEASD">weasd</alias>
|
||||
<alias base="WGH">wgh</alias>
|
||||
<alias base="WGS">wgs</alias>
|
||||
<alias base="WS">ws</alias>
|
||||
<alias base="WVDIR">wvdir</alias>
|
||||
<alias base="WVHGT">wvhgt</alias>
|
||||
<alias base="WVPER">wvper</alias>
|
||||
<!-- Parameters below this point are not defined in parameter definition
|
||||
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.
|
||||
In the future more work should be done to merge these names into definition
|
||||
files. -->
|
||||
<alias base="ADIMC">adimc</alias>
|
||||
<alias base="Alti">alti</alias>
|
||||
<alias base="BH">bh</alias>
|
||||
<alias base="BLI">bli</alias>
|
||||
<alias base="BPVV">bpvv</alias>
|
||||
<alias base="BWu">bwu</alias>
|
||||
<alias base="BWv">bwv</alias>
|
||||
<alias base="CAPEc1">capec1</alias>
|
||||
<alias base="CAPEc2">capec2</alias>
|
||||
<alias base="CAPEc3">capec3</alias>
|
||||
<alias base="CAPEc4">capec4</alias>
|
||||
<alias base="CAPEc5">capec5</alias>
|
||||
<alias base="CB">cb</alias>
|
||||
<alias base="CC">cc</alias>
|
||||
<alias base="CCOV">ccov</alias>
|
||||
<alias base="CCP">ccpc</alias>
|
||||
<alias base="CFRZRc1">cfrzrc1</alias>
|
||||
<alias base="CFRZRmean">cfrzrmean</alias>
|
||||
<alias base="CFRZRsprd">cfrzrsprd</alias>
|
||||
<alias base="CIce">cice</alias>
|
||||
<alias base="CICEPc1">cicepc1</alias>
|
||||
<alias base="CICEPmean">cicepmean</alias>
|
||||
<alias base="CICEPsprd">cicepsprd</alias>
|
||||
<alias base="Cigc1">cigc1</alias>
|
||||
<alias base="Cigc2">cigc2</alias>
|
||||
<alias base="Cigc3">cigc3</alias>
|
||||
<alias base="CP2hr">cp2hr</alias>
|
||||
<alias base="CPVV">cpvv</alias>
|
||||
<alias base="CRAINc1">crainc1</alias>
|
||||
<alias base="CRAINmean">crainmean</alias>
|
||||
<alias base="CRAINsprd">crainsprd</alias>
|
||||
<alias base="CSNOWc1">csnowc1</alias>
|
||||
<alias base="CSNOWmean">csnowmean</alias>
|
||||
<alias base="CSNOWsprd">csnowsprd</alias>
|
||||
<alias base="CSSI">cssi</alias>
|
||||
<alias base="CTop">ctop</alias>
|
||||
<alias base="CTSTM">ctstm</alias>
|
||||
<alias base="CTyp">ctyp</alias>
|
||||
<alias base="CW">cw</alias>
|
||||
<alias base="CXR">cxr</alias>
|
||||
<alias base="DpTerranl">dpterranl</alias>
|
||||
<alias base="DpTmean">dptmean</alias>
|
||||
<alias base="DpTsprd">dptsprd</alias>
|
||||
<alias base="ELON">elon</alias>
|
||||
<alias base="FD">fd</alias>
|
||||
<alias base="FZNP">fznp</alias>
|
||||
<alias base="GHmean">ghmean</alias>
|
||||
<alias base="GHsprd">ghsprd</alias>
|
||||
<alias base="HyC">hyc</alias>
|
||||
<alias base="ICEC">icec</alias>
|
||||
<alias base="ICEG">iceg</alias>
|
||||
<alias base="ICNG">icng</alias>
|
||||
<alias base="ICPRB">icprb</alias>
|
||||
<alias base="ICSEV">icsev</alias>
|
||||
<alias base="IIdx">iidx</alias>
|
||||
<alias base="ILW">ilw</alias>
|
||||
<alias base="IP">ip</alias>
|
||||
<alias base="LgSP2hr">lgsp2hr</alias>
|
||||
<alias base="LLIP">llip</alias>
|
||||
<alias base="LLR">llr</alias>
|
||||
<alias base="LZFPC">lzfpc</alias>
|
||||
<alias base="LZFSC">lzfsc</alias>
|
||||
<alias base="LZTWC">lztwc</alias>
|
||||
<alias base="MAdv">madv</alias>
|
||||
<alias base="MAXRH12hr">maxRH12hr</alias>
|
||||
<alias base="MAXRH3hr">maxRH3hr</alias>
|
||||
<alias base="MCDD">mcdd</alias>
|
||||
<alias base="MCon">mcon</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>
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Mar 20, 2013 #1774 randerso Fixed wx definition
|
||||
-->
|
||||
<gridParamInfo xmlns:ns2="group">
|
||||
<valtimeMINUSreftime>
|
||||
<fcst>302400</fcst>
|
||||
|
@ -124,13 +127,13 @@
|
|||
</levels>
|
||||
</gridParameterInfo>
|
||||
<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>
|
||||
<units/>
|
||||
<udunits/>
|
||||
<uiname>Weather</uiname>
|
||||
<valid_range>0.0</valid_range>
|
||||
<valid_range>12.0</valid_range>
|
||||
<valid_range>10.0</valid_range>
|
||||
<fillValue>-99999.0</fillValue>
|
||||
<n3D>0</n3D>
|
||||
<levelsDesc>SFC</levelsDesc>
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Mar 20, 2013 #1774 randerso Added forecast hours out to 18
|
||||
-->
|
||||
<gridParamInfo xmlns:ns2="group">
|
||||
<valtimeMINUSreftime>
|
||||
<fcst>0</fcst>
|
||||
|
@ -14,6 +17,12 @@
|
|||
<fcst>36000</fcst>
|
||||
<fcst>39600</fcst>
|
||||
<fcst>43200</fcst>
|
||||
<fcst>46800</fcst>
|
||||
<fcst>50400</fcst>
|
||||
<fcst>54000</fcst>
|
||||
<fcst>57600</fcst>
|
||||
<fcst>61200</fcst>
|
||||
<fcst>64800</fcst>
|
||||
</valtimeMINUSreftime>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
<short_name>weasd</short_name>
|
||||
|
|
|
@ -2,9 +2,7 @@ com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData
|
|||
com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID
|
||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord
|
||||
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.TimeConstraints
|
||||
com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation
|
||||
com.raytheon.uf.common.dataplugin.gfe.reference.ReferenceData
|
||||
com.raytheon.uf.common.dataplugin.gfe.sample.SampleData
|
||||
|
|
|
@ -28,10 +28,6 @@ import javax.measure.unit.NonSI;
|
|||
import javax.measure.unit.SI;
|
||||
import javax.measure.unit.Unit;
|
||||
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.discrete.DiscreteKey;
|
||||
|
@ -53,6 +49,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
* ------------ ---------- ----------- --------------------------
|
||||
* 02/05/2008 chammack Separated static attributes from GFERecord
|
||||
* 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>
|
||||
*
|
||||
|
@ -60,7 +58,6 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
|||
* @version 1.0
|
||||
*/
|
||||
|
||||
@XmlAccessorType(XmlAccessType.NONE)
|
||||
@DynamicSerialize
|
||||
public class GridParmInfo implements Cloneable, ISerializableObject {
|
||||
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 */
|
||||
@XmlElement
|
||||
@DynamicSerializeElement
|
||||
private ParmID parmID;
|
||||
|
||||
/** The grid location associated with this grid parm info */
|
||||
@XmlElement
|
||||
@DynamicSerializeElement
|
||||
private GridLocation gridLoc;
|
||||
|
||||
/** The grid type */
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private GridType gridType;
|
||||
|
||||
/** The parameter descriptive name */
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private String descriptiveName;
|
||||
|
||||
/** The units associated with the parameter */
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private String unitString;
|
||||
|
||||
private Unit<?> unitObject;
|
||||
|
||||
/** The minimum allowed value */
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private float minValue;
|
||||
|
||||
/** The maximum allowed value */
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private float maxValue;
|
||||
|
||||
/** The precision of the value */
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private int precision;
|
||||
|
||||
/** Is value a rate parameter */
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private boolean rateParm;
|
||||
|
||||
/** Time Constraints */
|
||||
@XmlElement
|
||||
@DynamicSerializeElement
|
||||
private TimeConstraints timeConstraints;
|
||||
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private boolean timeIndependentParm;
|
||||
|
||||
private void validCheck() {
|
||||
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");
|
||||
}
|
||||
}
|
||||
private String errorMessage;
|
||||
|
||||
public GridParmInfo() {
|
||||
gridType = GridType.NONE;
|
||||
|
@ -252,7 +195,10 @@ public class GridParmInfo implements Cloneable, ISerializableObject {
|
|||
this.timeConstraints = timeConstraints;
|
||||
this.rateParm = rateParm;
|
||||
|
||||
validCheck();
|
||||
if (!validCheck()) {
|
||||
statusHandler.warn(this.errorMessage);
|
||||
setDefaultValues();
|
||||
}
|
||||
}
|
||||
|
||||
public GridParmInfo(ParmID id, GridLocation gridLoc, GridType gridType,
|
||||
|
@ -263,6 +209,87 @@ public class GridParmInfo implements Cloneable, ISerializableObject {
|
|||
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
|
||||
*/
|
||||
|
|
|
@ -23,14 +23,15 @@ import java.util.ArrayList;
|
|||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlAttribute;
|
||||
|
||||
import com.raytheon.uf.common.dataplugin.gfe.serialize.TimeConstraintsAdapter;
|
||||
import com.raytheon.uf.common.serialization.ISerializableObject;
|
||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||
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.util.TimeUtil;
|
||||
|
||||
/**
|
||||
* 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
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 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>
|
||||
*
|
||||
|
@ -47,26 +50,22 @@ import com.raytheon.uf.common.time.TimeRange;
|
|||
* @version 1.0
|
||||
*/
|
||||
|
||||
@XmlAccessorType(XmlAccessType.NONE)
|
||||
@DynamicSerialize
|
||||
@DynamicSerializeTypeAdapter(factory = TimeConstraintsAdapter.class)
|
||||
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
|
||||
private int duration;
|
||||
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private int repeatInterval;
|
||||
|
||||
@XmlAttribute
|
||||
@DynamicSerializeElement
|
||||
private int startTime;
|
||||
|
||||
private static final int MilliSecInDay = (DAY * 1000);
|
||||
boolean valid;
|
||||
|
||||
/**
|
||||
* Default Constructor
|
||||
|
@ -75,23 +74,35 @@ public class TimeConstraints implements ISerializableObject {
|
|||
duration = 0;
|
||||
repeatInterval = 0;
|
||||
startTime = 0;
|
||||
valid = false;
|
||||
}
|
||||
|
||||
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.repeatInterval = repeatInterval;
|
||||
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
|
||||
*/
|
||||
public TimeRange constraintTime(Date absTime) {
|
||||
|
||||
if (!anyConstraints()) {
|
||||
if (!valid) {
|
||||
return new TimeRange();
|
||||
} else if (!anyConstraints()) {
|
||||
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;
|
||||
|
||||
|
@ -119,12 +132,12 @@ public class TimeConstraints implements ISerializableObject {
|
|||
tStart -= repeatInterval; // keep going until below 0
|
||||
}
|
||||
|
||||
while (tStart < DAY) {
|
||||
while (tStart < TimeUtil.SECONDS_PER_DAY) {
|
||||
int tEnd = tStart + duration;
|
||||
if ((tStart * 1000) <= secSinceMidnight
|
||||
&& secSinceMidnight < (tEnd * 1000)) {
|
||||
return new TimeRange(midnight + 1000 * tStart, midnight + 1000
|
||||
* tEnd);
|
||||
if ((tStart * TimeUtil.MILLIS_PER_SECOND) <= secSinceMidnight
|
||||
&& secSinceMidnight < (tEnd * TimeUtil.MILLIS_PER_SECOND)) {
|
||||
return new TimeRange(midnight + TimeUtil.MILLIS_PER_SECOND
|
||||
* tStart, midnight + TimeUtil.MILLIS_PER_SECOND * tEnd);
|
||||
}
|
||||
tStart += repeatInterval;
|
||||
}
|
||||
|
@ -150,17 +163,6 @@ public class TimeConstraints implements ISerializableObject {
|
|||
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
|
||||
*/
|
||||
|
@ -168,20 +170,6 @@ public class TimeConstraints implements ISerializableObject {
|
|||
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
|
||||
*/
|
||||
|
@ -190,14 +178,10 @@ public class TimeConstraints implements ISerializableObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param startTime
|
||||
* the startTime to set
|
||||
* @return true if valid
|
||||
*/
|
||||
public void setStartTime(int startTime) {
|
||||
if (startTime < 0 || startTime > DAY) {
|
||||
throw new IllegalArgumentException("Bad startTime");
|
||||
}
|
||||
this.startTime = startTime;
|
||||
public boolean isValid() {
|
||||
return valid;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -213,7 +197,7 @@ public class TimeConstraints implements ISerializableObject {
|
|||
|
||||
TimeConstraints rhs = (TimeConstraints) obj;
|
||||
|
||||
return (duration == rhs.duration
|
||||
return (valid == rhs.valid && duration == rhs.duration
|
||||
&& repeatInterval == rhs.repeatInterval && startTime == rhs.startTime);
|
||||
|
||||
}
|
||||
|
@ -232,7 +216,8 @@ public class TimeConstraints implements ISerializableObject {
|
|||
|
||||
// get the constraint times for the given time range
|
||||
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
|
||||
if (!tr1.isValid() || !tr2.isValid()) {
|
||||
|
@ -255,7 +240,7 @@ public class TimeConstraints implements ISerializableObject {
|
|||
* @return possible time ranges
|
||||
*/
|
||||
public TimeRange[] constraintTimes(final TimeRange timeRange) {
|
||||
if (!timeRange.isValid()) {
|
||||
if (!valid || !timeRange.isValid()) {
|
||||
return new TimeRange[0]; // return empty sequence
|
||||
} else if (!anyConstraints()) {
|
||||
TimeRange maxTR = TimeRange.allTimes();
|
||||
|
@ -266,7 +251,8 @@ public class TimeConstraints implements ISerializableObject {
|
|||
// is beyond the time range given
|
||||
List<TimeRange> sbs = new ArrayList<TimeRange>(); // returned value
|
||||
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()) {
|
||||
if (tr.overlaps(timeRange)) {
|
||||
sbs.add(tr);
|
||||
|
@ -286,8 +272,9 @@ public class TimeConstraints implements ISerializableObject {
|
|||
*/
|
||||
private TimeRange nextSB(final TimeRange timeRange) {
|
||||
long nextStart = timeRange.getStart().getTime()
|
||||
+ (repeatInterval * 1000);
|
||||
long nextEnd = timeRange.getEnd().getTime() + (repeatInterval * 1000);
|
||||
+ (repeatInterval * TimeUtil.MILLIS_PER_SECOND);
|
||||
long nextEnd = timeRange.getEnd().getTime()
|
||||
+ (repeatInterval * TimeUtil.MILLIS_PER_SECOND);
|
||||
return new TimeRange(nextStart, nextEnd);
|
||||
}
|
||||
|
||||
|
@ -300,15 +287,17 @@ public class TimeConstraints implements ISerializableObject {
|
|||
* @return first time constraint
|
||||
*/
|
||||
private TimeRange firstSB(Date searchTime) {
|
||||
long midnightMilliSeconds = (searchTime.getTime() / MilliSecInDay)
|
||||
* MilliSecInDay;
|
||||
long midnightMilliSeconds = (searchTime.getTime() / TimeUtil.MILLIS_PER_DAY)
|
||||
* TimeUtil.MILLIS_PER_DAY;
|
||||
|
||||
long ystdMidnight = midnightMilliSeconds - MilliSecInDay; // to catch
|
||||
// overlap
|
||||
// to catch overlap
|
||||
long ystdMidnight = midnightMilliSeconds - TimeUtil.MILLIS_PER_DAY;
|
||||
|
||||
// calculate the first time range
|
||||
Date startT = new Date(ystdMidnight + (startTime * 1000));
|
||||
Date endT = new Date(startT.getTime() + (duration * 1000));
|
||||
Date startT = new Date(ystdMidnight
|
||||
+ (startTime * TimeUtil.MILLIS_PER_SECOND));
|
||||
Date endT = new Date(startT.getTime()
|
||||
+ (duration * TimeUtil.MILLIS_PER_SECOND));
|
||||
return new TimeRange(startT, endT);
|
||||
}
|
||||
|
||||
|
@ -319,11 +308,21 @@ public class TimeConstraints implements ISerializableObject {
|
|||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
if (!anyConstraints()) {
|
||||
if (!valid) {
|
||||
return "<Invalid>";
|
||||
} else if (!anyConstraints()) {
|
||||
return "<NoConstraints>";
|
||||
} else {
|
||||
return "[s=" + startTime / 3600 + "h" + ",i=" + repeatInterval
|
||||
/ 3600 + "h" + ",d=" + duration / 3600 + "h]";
|
||||
StringBuilder sb = new StringBuilder();
|
||||
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) {
|
||||
|
||||
if (!timeRange.isValid()) {
|
||||
if (!valid || !timeRange.isValid()) {
|
||||
return new TimeRange();
|
||||
}
|
||||
|
||||
|
@ -353,7 +352,7 @@ public class TimeConstraints implements ISerializableObject {
|
|||
// <=)
|
||||
TimeRange tr1 = constraintTime(timeRange.getStart());
|
||||
TimeRange tr2 = constraintTime(new Date(timeRange.getEnd()
|
||||
.getTime() - 1000));
|
||||
.getTime() - TimeUtil.MILLIS_PER_SECOND));
|
||||
if (!tr1.isValid() || !tr2.isValid()) {
|
||||
return new TimeRange();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
* This software was developed and / or modified by Raytheon Company,
|
||||
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
*
|
||||
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||
* This software product contains export-restricted data whose
|
||||
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||
* to non-U.S. persons whether in the United States or abroad requires
|
||||
* an export license or other authorization.
|
||||
*
|
||||
* Contractor Name: Raytheon Company
|
||||
* Contractor Address: 6825 Pine Street, Suite 340
|
||||
* Mail Stop B8
|
||||
* Omaha, NE 68106
|
||||
* 402.291.0100
|
||||
*
|
||||
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||
* further licensing information.
|
||||
**/
|
||||
package com.raytheon.uf.common.dataplugin.gfe.serialize;
|
||||
|
||||
import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints;
|
||||
import com.raytheon.uf.common.serialization.IDeserializationContext;
|
||||
import com.raytheon.uf.common.serialization.ISerializationContext;
|
||||
import com.raytheon.uf.common.serialization.ISerializationTypeAdapter;
|
||||
import com.raytheon.uf.common.serialization.SerializationException;
|
||||
|
||||
/**
|
||||
* Thrift serialization adapter for TimeConstraints
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* SOFTWARE HISTORY
|
||||
*
|
||||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Mar 11, 2013 #1774 randerso Initial creation
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* @author randerso
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
public class TimeConstraintsAdapter implements
|
||||
ISerializationTypeAdapter<TimeConstraints> {
|
||||
|
||||
@Override
|
||||
public void serialize(ISerializationContext serializer,
|
||||
TimeConstraints object) throws SerializationException {
|
||||
serializer.writeI32(object.getDuration());
|
||||
serializer.writeI32(object.getRepeatInterval());
|
||||
serializer.writeI32(object.getStartTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimeConstraints deserialize(IDeserializationContext deserializer)
|
||||
throws SerializationException {
|
||||
return new TimeConstraints(deserializer.readI32(),
|
||||
deserializer.readI32(), deserializer.readI32());
|
||||
}
|
||||
}
|
|
@ -40,6 +40,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
|||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter;
|
||||
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
|
||||
* 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>
|
||||
*
|
||||
|
@ -100,15 +103,10 @@ import com.raytheon.uf.common.time.adapter.TimeRangeTypeAdapter;
|
|||
public class TimeRange implements Serializable, Comparable<TimeRange>,
|
||||
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()
|
||||
// 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() {
|
||||
long dur = getDuration();
|
||||
long days = dur / SEC_PER_DAY;
|
||||
long days = dur / TimeUtil.SECONDS_PER_DAY;
|
||||
|
||||
dur -= days * SEC_PER_DAY;
|
||||
long hours = dur / SEC_PER_HOUR;
|
||||
dur -= days * TimeUtil.SECONDS_PER_DAY;
|
||||
long hours = dur / TimeUtil.SECONDS_PER_HOUR;
|
||||
|
||||
dur -= hours * SEC_PER_HOUR;
|
||||
long min = dur / SEC_PER_MIN;
|
||||
dur -= hours * TimeUtil.SECONDS_PER_HOUR;
|
||||
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();
|
||||
|
||||
|
@ -534,17 +532,20 @@ public class TimeRange implements Serializable, Comparable<TimeRange>,
|
|||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
if (isValid()) {
|
||||
final DateFormat GMTFormat = new SimpleDateFormat(
|
||||
"MMM dd yy HH:mm:ss zzz");
|
||||
GMTFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||
final DateFormat GMTFormat = new SimpleDateFormat(
|
||||
"MMM dd yy HH:mm:ss zzz");
|
||||
GMTFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||
|
||||
return "(" + GMTFormat.format(getStart()) + ", "
|
||||
+ GMTFormat.format(getEnd()) + ")";
|
||||
} else {
|
||||
return "(Invalid)";
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("(");
|
||||
sb.append(GMTFormat.format(getStart()));
|
||||
sb.append(", ");
|
||||
sb.append(GMTFormat.format(getEnd()));
|
||||
if (!isValid()) {
|
||||
sb.append(", Invalid");
|
||||
}
|
||||
|
||||
sb.append(")");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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 1519 djohnson Add MINUTES_PER_DAY.
|
||||
* 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>
|
||||
*
|
||||
* @author njensen
|
||||
|
@ -97,11 +98,13 @@ public final class TimeUtil {
|
|||
|
||||
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;
|
||||
|
||||
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_QUARTER_DAY = HOURS_PER_HALF_DAY / 2;
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
##
|
||||
# This software was developed and / or modified by Raytheon Company,
|
||||
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||
#
|
||||
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||
# This software product contains export-restricted data whose
|
||||
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||
# to non-U.S. persons whether in the United States or abroad requires
|
||||
# an export license or other authorization.
|
||||
#
|
||||
# Contractor Name: Raytheon Company
|
||||
# Contractor Address: 6825 Pine Street, Suite 340
|
||||
# Mail Stop B8
|
||||
# Omaha, NE 68106
|
||||
# 402.291.0100
|
||||
#
|
||||
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||
# further licensing information.
|
||||
##
|
||||
|
||||
|
||||
#
|
||||
# Adapter for com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID
|
||||
#
|
||||
#
|
||||
# SOFTWARE HISTORY
|
||||
#
|
||||
# Date Ticket# Engineer Description
|
||||
# ------------ ---------- ----------- --------------------------
|
||||
# 03/20/13 #1774 randerso Initial Creation.
|
||||
#
|
||||
#
|
||||
#
|
||||
|
||||
from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe.db.objects import TimeConstraints
|
||||
|
||||
ClassAdapter = 'com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints'
|
||||
|
||||
def serialize(context, timeConstraints):
|
||||
context.writeI32(timeConstraints.getDuration());
|
||||
context.writeI32(timeConstraints.getRepeatInterval());
|
||||
context.writeI32(timeConstraints.getStartTime());
|
||||
|
||||
def deserialize(context):
|
||||
result = TimeConstraints(context.readI32(), context.readI32(), context.readI32())
|
||||
return result
|
|
@ -28,6 +28,7 @@
|
|||
# Date Ticket# Engineer Description
|
||||
# ------------ ---------- ----------- --------------------------
|
||||
# 08/31/10 njensen Initial Creation.
|
||||
# 03/20/13 #1774 randerso Added TimeConstraintsAdapter
|
||||
#
|
||||
#
|
||||
#
|
||||
|
@ -50,8 +51,9 @@ __all__ = [
|
|||
'TimestampAdapter',
|
||||
'EnumSetAdapter',
|
||||
'FloatBufferAdapter',
|
||||
'ByteBufferAdapter'
|
||||
# 'GridDataHistoryAdapter'
|
||||
'ByteBufferAdapter',
|
||||
'TimeConstraintsAdapter',
|
||||
# 'GridDataHistoryAdapter',
|
||||
]
|
||||
|
||||
classAdapterRegistry = {}
|
||||
|
|
|
@ -19,8 +19,11 @@
|
|||
##
|
||||
|
||||
# File auto-generated against equivalent DynamicSerialize Java class
|
||||
#
|
||||
# 03/20/2013 #1774 randerso Removed setters, added isValid.
|
||||
|
||||
|
||||
import logging
|
||||
|
||||
HOUR = 3600;
|
||||
DAY = 24 * HOUR;
|
||||
|
@ -31,13 +34,24 @@ class TimeConstraints(object):
|
|||
duration = int(duration)
|
||||
repeatInterval = int(repeatInterval)
|
||||
startTime = int(startTime)
|
||||
|
||||
if duration != 0 or repeatInterval != 0 or startTime != 0:
|
||||
if (repeatInterval <= 0 or repeatInterval > DAY) or \
|
||||
(DAY % repeatInterval != 0 or repeatInterval < duration) or \
|
||||
(startTime < 0 or startTime > DAY) or \
|
||||
(duration < 0 or duration > DAY):
|
||||
raise ValueError("Bad init values for TimeConstraints.")
|
||||
|
||||
self.valid = False;
|
||||
if duration == 0 and repeatInterval == 0 and startTime == 0:
|
||||
self.valid = True;
|
||||
else:
|
||||
if repeatInterval <= 0 or repeatInterval > DAY \
|
||||
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.repeatInterval = repeatInterval
|
||||
|
@ -47,12 +61,14 @@ class TimeConstraints(object):
|
|||
return self.__repr__()
|
||||
|
||||
def __repr__(self):
|
||||
if not self.anyConstraints():
|
||||
if not self.isValid():
|
||||
return "<Invalid>"
|
||||
elif not self.anyConstraints():
|
||||
return "<NoConstraints>"
|
||||
else:
|
||||
return "[s=" + str(self.startTime / HOUR) + "h,i=" + \
|
||||
str(self.repeatInterval / HOUR) + "h,d=" + \
|
||||
str(self.duration / 3600) + "h]"
|
||||
return "[s=" + str(self.startTime / HOUR) + "h, i=" + \
|
||||
str(self.repeatInterval / HOUR) + "h, d=" + \
|
||||
str(self.duration / HOUR) + "h]"
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, TimeConstraints):
|
||||
|
@ -72,29 +88,13 @@ class TimeConstraints(object):
|
|||
return (self.duration != 0)
|
||||
|
||||
def isValid(self):
|
||||
if self.duration != 0 or self.repeatInterval != 0 or self.startTime != 0:
|
||||
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
|
||||
return self.valid
|
||||
|
||||
def getDuration(self):
|
||||
return self.duration
|
||||
|
||||
def setDuration(self, duration):
|
||||
self.duration = duration
|
||||
|
||||
def getRepeatInterval(self):
|
||||
return self.repeatInterval
|
||||
|
||||
def setRepeatInterval(self, repeatInterval):
|
||||
self.repeatInterval = repeatInterval
|
||||
|
||||
def getStartTime(self):
|
||||
return self.startTime
|
||||
|
||||
def setStartTime(self, startTime):
|
||||
self.startTime = startTime
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue