Issue #1554 initial implementation of GFE grid factory.

Change-Id: Id2ae308c0c13822dd6e5dd0195f7920df82ff994

Former-commit-id: 0b350f62b26c9f2154a1d7bd6ba9d18475012495
This commit is contained in:
Ben Steffensmeier 2013-02-06 11:53:33 -06:00
parent f204191837
commit f34751122a
9 changed files with 407 additions and 120 deletions

View file

@ -7,17 +7,11 @@ Bundle-Activator: com.raytheon.uf.viz.d2d.gfe.Activator
Bundle-Vendor: RAYTHEON
Eclipse-RegisterBuddy: com.raytheon.viz.core, com.raytheon.uf.viz.core
Require-Bundle: org.eclipse.core.runtime,
com.raytheon.uf.common.serialization;bundle-version="1.12.1174"
com.raytheon.uf.common.serialization;bundle-version="1.12.1174",
com.raytheon.uf.common.dataplugin.gfe;bundle-version="1.12.1174"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Import-Package: com.raytheon.uf.common.dataplugin,
com.raytheon.uf.common.dataplugin.gfe,
com.raytheon.uf.common.dataplugin.gfe.db.objects,
com.raytheon.uf.common.dataplugin.gfe.grid,
com.raytheon.uf.common.dataplugin.gfe.request,
com.raytheon.uf.common.dataplugin.gfe.server.message,
com.raytheon.uf.common.dataplugin.gfe.server.request,
com.raytheon.uf.common.dataplugin.gfe.slice,
com.raytheon.uf.common.dataquery.requests,
com.raytheon.uf.common.dataquery.responses,
com.raytheon.uf.common.datastorage.records,

View file

@ -27,13 +27,12 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import com.raytheon.uf.common.dataplugin.gfe.dataaccess.GFEDataAccessUtil;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
import com.raytheon.uf.viz.core.rsc.DisplayType;
import com.raytheon.uf.viz.core.rsc.ResourceType;
import com.raytheon.uf.viz.core.rsc.capabilities.DisplayTypeCapability;
import com.raytheon.uf.viz.d2d.gfe.GFEUtil;
import com.raytheon.uf.viz.d2d.gfe.rsc.GFEGridResourceData;
import com.raytheon.uf.viz.productbrowser.AbstractRequestableProductBrowserDataDefinition;
import com.raytheon.uf.viz.productbrowser.ProductBrowserLabel;
@ -60,22 +59,11 @@ import com.raytheon.viz.grid.rsc.GridLoadProperties;
public class GFEDataDefinition extends
AbstractRequestableProductBrowserDataDefinition<GFEGridResourceData> {
public static final String SITE_ID = "siteId";
public static final String DB_TYPE = "dbType";
public static final String MODEL_NAME = "modelName";
public static final String MODEL_TIME = "modelTime";
public static final String PARM_NAME = "parmName";
public static final String PARM_LEVEL = "parmLevel";
public GFEDataDefinition() {
productName = "gfe";
displayName = "GFE";
order = new String[] { SITE_ID, MODEL_NAME, PARM_NAME, PARM_LEVEL };
order = new String[] { GFEDataAccessUtil.SITE_ID, GFEDataAccessUtil.MODEL_NAME,
GFEDataAccessUtil.PARM_NAME, GFEDataAccessUtil.PARM_LEVEL };
order = getOrder();
loadProperties = new GridLoadProperties();
loadProperties.setResourceType(getResourceType());
@ -111,7 +99,7 @@ public class GFEDataDefinition extends
*/
@Override
public List<String> buildProductList(List<String> historyList) {
String[] parameters = queryData(GFEUtil.PARM_ID,
String[] parameters = queryData(GFEDataAccessUtil.PARM_ID,
getProductParameters(new String[0], null));
List<String> result = new ArrayList<String>();
for (String orderString : order) {
@ -131,7 +119,7 @@ public class GFEDataDefinition extends
if (!isEnabled()) {
return null;
}
String[] parameters = queryData(GFEUtil.PARM_ID,
String[] parameters = queryData(GFEDataAccessUtil.PARM_ID,
getProductParameters(new String[0], null));
if (parameters != null) {
@ -149,7 +137,7 @@ public class GFEDataDefinition extends
@Override
protected String[] queryData(String param,
HashMap<String, RequestConstraint> queryList) {
return super.queryData(GFEUtil.PARM_ID, queryList);
return super.queryData(GFEDataAccessUtil.PARM_ID, queryList);
}
@Override
@ -160,17 +148,17 @@ public class GFEDataDefinition extends
String label = value;
try {
ParmID parmId = new ParmID(value);
if (param.equals(SITE_ID)) {
if (param.equals(GFEDataAccessUtil.SITE_ID)) {
label = parmId.getDbId().getSiteId();
} else if (param.equals(MODEL_NAME)) {
} else if (param.equals(GFEDataAccessUtil.MODEL_NAME)) {
label = parmId.getDbId().getModelName();
} else if (param.equals(MODEL_TIME)) {
} else if (param.equals(GFEDataAccessUtil.MODEL_TIME)) {
label = parmId.getDbId().getModelTime();
} else if (param.equals(DB_TYPE)) {
} else if (param.equals(GFEDataAccessUtil.DB_TYPE)) {
label = parmId.getDbId().getDbType();
} else if (param.equals(PARM_NAME)) {
} else if (param.equals(GFEDataAccessUtil.PARM_NAME)) {
label = parmId.getParmName();
} else if (param.equals(PARM_LEVEL)) {
} else if (param.equals(GFEDataAccessUtil.PARM_LEVEL)) {
label = parmId.getParmLevel();
}
} catch (Exception e) {
@ -190,37 +178,20 @@ public class GFEDataDefinition extends
if (order == null) {
order = this.order;
}
String siteId = "%";
String modelName = "%";
String modelTime = "%";
String dbType = "%";
String parmName = "%";
String parmLevel = "%";
HashMap<String, RequestConstraint> queryList = new HashMap<String, RequestConstraint>();
queryList.put(PLUGIN_NAME, new RequestConstraint(productName));
Map<String, String> parmIdComponents = new HashMap<String, String>();
if (selection.length > 1) {
String[] usedSelection = realignSelection(selection);
for (int i = 0; i < usedSelection.length; i++) {
if (order[i].equals(SITE_ID)) {
siteId = usedSelection[i];
} else if (order[i].equals(MODEL_NAME)) {
modelName = usedSelection[i];
} else if (order[i].equals(MODEL_TIME)) {
modelTime = usedSelection[i];
} else if (order[i].equals(DB_TYPE)) {
dbType = usedSelection[i];
} else if (order[i].equals(PARM_NAME)) {
parmName = usedSelection[i];
} else if (order[i - 1].equals(PARM_LEVEL)) {
parmLevel = usedSelection[i];
parmIdComponents.put(order[i], usedSelection[i]);
}
}
}
String parmId = String.format(GFEUtil.PARM_ID_FORMAT, parmName,
parmLevel, siteId, dbType, modelName, modelTime);
queryList.put(GFEUtil.PARM_ID, new RequestConstraint(parmId,
ConstraintType.LIKE));
HashMap<String, RequestConstraint> queryList = new HashMap<String, RequestConstraint>();
queryList.put(PLUGIN_NAME, new RequestConstraint(productName));
queryList.put(GFEDataAccessUtil.PARM_ID,
GFEDataAccessUtil.createParmIdConstraint(parmIdComponents));
return queryList;
}

View file

@ -23,12 +23,13 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.measure.unit.UnitFormat;
import com.raytheon.uf.common.dataplugin.gfe.dataaccess.GFEDataAccessUtil;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
@ -43,7 +44,7 @@ import com.raytheon.uf.viz.core.style.ParamLevelMatchCriteria;
import com.raytheon.uf.viz.core.style.StyleManager;
import com.raytheon.uf.viz.core.style.StyleRule;
import com.raytheon.uf.viz.core.style.VizStyleException;
import com.raytheon.uf.viz.d2d.gfe.GFEUtil;
import com.raytheon.uf.viz.d2d.gfe.rsc.GFEGridResource;
import com.raytheon.uf.viz.d2d.gfe.rsc.GFEGridResourceData;
import com.raytheon.viz.volumebrowser.datacatalog.AbstractDataCatalog;
import com.raytheon.viz.volumebrowser.datacatalog.AvailableDataRequest;
@ -54,7 +55,9 @@ import com.raytheon.viz.volumebrowser.vbui.VBMenuBarItemsMgr.ViewMenu;
/**
*
* TODO Add Description
* Data Catalog for using gfe data in the volume browser. This works by using
* selected model, field, and plane to create ParmId LIKE constraints that can
* be used to narrow down the selection.
*
* <pre>
*
@ -76,10 +79,10 @@ public class GFEVbDataCatalog extends AbstractDataCatalog {
@Override
public IDataCatalogEntry getCatalogEntry(SelectedData selectedData) {
HashMap<String, RequestConstraint> queryList = new HashMap<String, RequestConstraint>();
queryList.put(GFEUtil.PLUGIN_NAME, new RequestConstraint("gfe"));
queryList.put(GFEUtil.PARM_ID, getParmIdConstraint(selectedData));
queryList.put(GFEDataAccessUtil.PLUGIN_NAME, new RequestConstraint("gfe"));
queryList.put(GFEDataAccessUtil.PARM_ID, getParmIdConstraint(selectedData));
try {
String[] result = CatalogQuery.performQuery(GFEUtil.PARM_ID,
String[] result = CatalogQuery.performQuery(GFEDataAccessUtil.PARM_ID,
queryList);
if (result != null && result.length > 0) {
ParmID sampleId = new ParmID(result[0]);
@ -204,15 +207,15 @@ public class GFEVbDataCatalog extends AbstractDataCatalog {
@Override
protected void addProductParameters(IDataCatalogEntry catalogEntry,
HashMap<String, RequestConstraint> productParameters) {
productParameters.put(GFEUtil.PARM_ID,
productParameters.put(GFEDataAccessUtil.PARM_ID,
getParmIdConstraint(catalogEntry.getSelectedData()));
}
private String[] getParmIds() {
HashMap<String, RequestConstraint> queryList = new HashMap<String, RequestConstraint>();
queryList.put(GFEUtil.PLUGIN_NAME, new RequestConstraint("gfe"));
queryList.put(GFEDataAccessUtil.PLUGIN_NAME, new RequestConstraint("gfe"));
try {
return CatalogQuery.performQuery(GFEUtil.PARM_ID, queryList);
return CatalogQuery.performQuery(GFEDataAccessUtil.PARM_ID, queryList);
} catch (VizException e) {
throw new RuntimeException(e);
}
@ -248,7 +251,7 @@ public class GFEVbDataCatalog extends AbstractDataCatalog {
DisplayType displayType) {
if (catalogEntry instanceof GFECatalogEntry) {
ParmID sampleId = ((GFECatalogEntry) catalogEntry).getSampleId();
ParamLevelMatchCriteria criteria = GFEUtil
ParamLevelMatchCriteria criteria = GFEGridResource
.getMatchCriteria(sampleId);
StyleRule sr = null;
try {
@ -277,8 +280,8 @@ public class GFEVbDataCatalog extends AbstractDataCatalog {
} else {
try {
return UnitFormat.getUCUMInstance().format(
GFEUtil.getGridParmInfo(sampleId).getUnitObject());
} catch (VizException e) {
GFEDataAccessUtil.getGridParmInfo(sampleId).getUnitObject());
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
"Unable to obtain a unit information for"
+ catalogEntry.getSelectedData()
@ -297,9 +300,12 @@ public class GFEVbDataCatalog extends AbstractDataCatalog {
.getGfeLevel(selectedData.getPlanesKey());
String modelName = VbGFEMapping.getGfeSource(selectedData
.getSourcesKey());
String parmId = String.format(GFEUtil.PARM_ID_FORMAT, parmName,
parmLevel, "%", "%", modelName, "%");
return new RequestConstraint(parmId, ConstraintType.LIKE);
Map<String, String> parmIdComponents = new HashMap<String, String>();
parmIdComponents.put(GFEDataAccessUtil.PARM_NAME, parmName);
parmIdComponents.put(GFEDataAccessUtil.PARM_LEVEL, parmLevel);
parmIdComponents.put(GFEDataAccessUtil.MODEL_NAME, modelName);
return GFEDataAccessUtil.createParmIdConstraint(parmIdComponents);
}
private static class GFECatalogEntry extends DataCatalogEntry {

View file

@ -19,12 +19,14 @@
**/
package com.raytheon.uf.viz.d2d.gfe.rsc;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.geotools.coverage.grid.GridGeometry2D;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.gfe.dataaccess.GFEDataAccessUtil;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice;
@ -36,7 +38,8 @@ import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.DisplayType;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.style.ParamLevelMatchCriteria;
import com.raytheon.uf.viz.d2d.gfe.GFEUtil;
import com.raytheon.uf.viz.core.style.level.Level;
import com.raytheon.uf.viz.core.style.level.SingleLevel;
import com.raytheon.viz.grid.rsc.general.AbstractGridResource;
import com.raytheon.viz.grid.rsc.general.GeneralGridData;
@ -90,15 +93,15 @@ public class GFEGridResource extends AbstractGridResource<GFEGridResourceData> {
}
try {
gfeRecord
.setGridInfo(GFEUtil.getGridParmInfo(gfeRecord.getParmId()));
} catch (VizException e) {
.setGridInfo(GFEDataAccessUtil.getGridParmInfo(gfeRecord.getParmId()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public ParamLevelMatchCriteria getMatchCriteria() {
return GFEUtil.getMatchCriteria(parmId);
return getMatchCriteria(parmId);
}
@Override
@ -108,7 +111,12 @@ public class GFEGridResource extends AbstractGridResource<GFEGridResourceData> {
return null;
}
GFERecord gfeRecord = (GFERecord) pdos.get(0);
IGridSlice slice = GFEUtil.getSlice(gfeRecord);
IGridSlice slice = null;
try {
slice = GFEDataAccessUtil.getSlice(gfeRecord);
} catch (Exception e) {
throw new VizException(e);
}
populateGridParmInfo(gfeRecord);
GridGeometry2D gridGeometry = MapUtil.getGridGeometry(gfeRecord
.getGridInfo().getGridLoc());
@ -160,4 +168,23 @@ public class GFEGridResource extends AbstractGridResource<GFEGridResourceData> {
parmName, displayTypeString, unitLabel);
}
public static ParamLevelMatchCriteria getMatchCriteria(ParmID parmId) {
ParamLevelMatchCriteria criteria = new ParamLevelMatchCriteria();
criteria.setParameterName(new ArrayList<String>());
criteria.setLevels(new ArrayList<Level>());
criteria.setCreatingEntityNames(new ArrayList<String>());
String parameter = "GFE:" + parmId.getParmName();
SingleLevel level = new SingleLevel(Level.LevelType.SURFACE);
String model = "GFE:" + parmId.getDbId().getModelName();
if (!criteria.getParameterNames().contains(parameter)) {
criteria.getParameterNames().add(parameter);
}
if (!criteria.getLevels().contains(level)) {
criteria.getLevels().add(level);
}
if (!criteria.getCreatingEntityNames().contains(model)) {
criteria.getCreatingEntityNames().add(model);
}
return criteria;
}
}

View file

@ -12,6 +12,7 @@ import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.gfe.dataaccess.GFEDataAccessUtil;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord;
import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice;
import com.raytheon.uf.common.dataplugin.gfe.slice.ScalarGridSlice;
@ -20,7 +21,6 @@ import com.raytheon.uf.common.geospatial.MapUtil;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.style.level.Level;
import com.raytheon.uf.viz.core.style.level.SingleLevel;
import com.raytheon.uf.viz.d2d.gfe.GFEUtil;
import com.raytheon.uf.viz.xy.timeseries.adapter.AbstractTimeSeriesAdapter;
import com.raytheon.viz.core.graphing.xy.XYData;
import com.raytheon.viz.core.graphing.xy.XYDataList;
@ -50,7 +50,12 @@ public class GfeTimeSeriesAdapter extends AbstractTimeSeriesAdapter<GFERecord> {
DirectPosition2D point = null;
for (GFERecord gfeRecord : recordsToLoad) {
IGridSlice slice = GFEUtil.getSlice(gfeRecord);
IGridSlice slice = null;
try {
slice = GFEDataAccessUtil.getSlice(gfeRecord);
} catch (Exception e) {
throw new VizException(e);
}
if (slice != null) {
unit = slice.getGridInfo().getUnitObject();
if (point == null) {

View file

@ -16,9 +16,13 @@ Require-Bundle: org.geotools,
com.raytheon.uf.common.serialization,
org.hibernate,
com.raytheon.uf.common.auth;bundle-version="1.12.1174",
com.raytheon.uf.common.cache
com.raytheon.uf.common.cache,
com.raytheon.uf.common.dataaccess;bundle-version="1.0.0",
com.raytheon.uf.common.dataquery;bundle-version="1.0.0",
com.raytheon.uf.common.datastorage;bundle-version="1.12.1174"
Export-Package: com.raytheon.uf.common.dataplugin.gfe,
com.raytheon.uf.common.dataplugin.gfe.config,
com.raytheon.uf.common.dataplugin.gfe.dataaccess,
com.raytheon.uf.common.dataplugin.gfe.db.objects,
com.raytheon.uf.common.dataplugin.gfe.db.type,
com.raytheon.uf.common.dataplugin.gfe.discrete,

View file

@ -0,0 +1,13 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="gfeGridFactory" class="com.raytheon.uf.common.dataplugin.gfe.dataaccess.GFEGridFactory" />
<bean factory-bean="dataAccessRegistry" factory-method="register">
<constructor-arg value="gfe"/>
<constructor-arg value="com.raytheon.uf.common.dataaccess.grid.IGridRequest"/>
<constructor-arg ref="gfeGridFactory"/>
</bean>
</beans>

View file

@ -17,11 +17,11 @@
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.d2d.gfe;
package com.raytheon.uf.common.dataplugin.gfe.dataaccess;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
@ -31,16 +31,13 @@ import com.raytheon.uf.common.dataplugin.gfe.request.GetGridParmInfoRequest;
import com.raytheon.uf.common.dataplugin.gfe.server.message.ServerResponse;
import com.raytheon.uf.common.dataplugin.gfe.server.request.GetGridRequest;
import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice;
import com.raytheon.uf.viz.core.VizApp;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.requests.ThriftClient;
import com.raytheon.uf.viz.core.style.ParamLevelMatchCriteria;
import com.raytheon.uf.viz.core.style.level.Level;
import com.raytheon.uf.viz.core.style.level.SingleLevel;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
import com.raytheon.uf.common.serialization.comm.RequestRouter;
/**
*
* TODO Add Description
* Some utility methods for querying and retrieving GFE data.
*
* <pre>
*
@ -55,60 +52,110 @@ import com.raytheon.uf.viz.core.style.level.SingleLevel;
* @author bsteffen
* @version 1.0
*/
public class GFEUtil {
public class GFEDataAccessUtil {
public static final String PARM_ID_FORMAT = "%s_%s:%s_GRID_%s_%s_%s";
private static final String PARM_ID_FORMAT = "%s_%s:%s_GRID_%s_%s_%s";
public static final String PARM_ID = "parmId";
public static final String PLUGIN_NAME = "pluginName";
public static GridParmInfo getGridParmInfo(ParmID parmId)
throws VizException {
public static final String SITE_ID = "siteId";
public static final String DB_TYPE = "dbType";
public static final String MODEL_NAME = "modelName";
public static final String MODEL_TIME = "modelTime";
public static final String PARM_NAME = "parmName";
public static final String PARM_LEVEL = "parmLevel";
/**
* Retrieve the GridParmInfo for a ParmID
*
* @param parmId
* @return
* @throws Exception
*/
public static GridParmInfo getGridParmInfo(ParmID parmId) throws Exception {
GetGridParmInfoRequest request = new GetGridParmInfoRequest();
request.setParmIds(Arrays.asList(parmId));
request.setSiteID(parmId.getDbId().getSiteId());
request.setWorkstationID(VizApp.getWsId());
@SuppressWarnings("unchecked")
ServerResponse<List<GridParmInfo>> response = (ServerResponse<List<GridParmInfo>>) ThriftClient
.sendRequest(request);
ServerResponse<List<GridParmInfo>> response = (ServerResponse<List<GridParmInfo>>) RequestRouter
.route(request);
return response.getPayload().get(0);
}
public static ParamLevelMatchCriteria getMatchCriteria(ParmID parmId) {
ParamLevelMatchCriteria criteria = new ParamLevelMatchCriteria();
criteria.setParameterName(new ArrayList<String>());
criteria.setLevels(new ArrayList<Level>());
criteria.setCreatingEntityNames(new ArrayList<String>());
String parameter = "GFE:" + parmId.getParmName();
SingleLevel level = new SingleLevel(Level.LevelType.SURFACE);
String model = "GFE:" + parmId.getDbId().getModelName();
if (!criteria.getParameterNames().contains(parameter)) {
criteria.getParameterNames().add(parameter);
}
if (!criteria.getLevels().contains(level)) {
criteria.getLevels().add(level);
}
if (!criteria.getCreatingEntityNames().contains(model)) {
criteria.getCreatingEntityNames().add(model);
}
return criteria;
}
public static IGridSlice getSlice(GFERecord gfeRecord) throws VizException {
/**
* Send a GetGridDataRequest through the requestRouter to grab a single
* slice of grid data.
*
* @param gfeRecord
* @return
* @throws Exception
*/
public static IGridSlice getSlice(GFERecord gfeRecord) throws Exception {
GetGridRequest gridRequest = new GetGridRequest();
gridRequest.setParmId(gfeRecord.getParmId());
gridRequest.setRecords(Arrays.asList(gfeRecord));
GetGridDataRequest request = new GetGridDataRequest();
request.setSiteID(gfeRecord.getDbId().getSiteId());
request.setWorkstationID(VizApp.getWsId());
request.setRequests(Arrays.asList(gridRequest));
@SuppressWarnings("unchecked")
ServerResponse<List<IGridSlice>> response = (ServerResponse<List<IGridSlice>>) ThriftClient
.sendRequest(request);
ServerResponse<List<IGridSlice>> response = (ServerResponse<List<IGridSlice>>) RequestRouter
.route(request);
return response.getPayload().get(0);
}
/**
* Take a map of value for various fields that make up the ParmId and
* convert it into a single like constraint for ParmId. ANd fields not in
* the map will accept any value.
*
* @param components
* @return
*/
public static RequestConstraint createParmIdConstraint(
Map<String, String> components) {
String siteId = "%";
String modelName = "%";
String modelTime = "%";
String dbType = "%";
String parmName = "%";
String parmLevel = "%";
if (components.containsKey(SITE_ID)) {
siteId = components.get(SITE_ID);
}
if (components.containsKey(MODEL_NAME)) {
modelName = components.get(MODEL_NAME);
}
if (components.containsKey(MODEL_TIME)) {
modelTime = components.get(MODEL_TIME);
}
if (components.containsKey(DB_TYPE)) {
dbType = components.get(DB_TYPE);
}
if (components.containsKey(PARM_NAME)) {
parmName = components.get(PARM_NAME);
}
if (components.containsKey(PARM_LEVEL)) {
parmLevel = components.get(PARM_LEVEL);
}
String parmId = String.format(PARM_ID_FORMAT, parmName,
parmLevel, siteId, dbType, modelName, modelTime);
return new RequestConstraint(parmId, ConstraintType.LIKE);
}
}

View file

@ -0,0 +1,220 @@
/**
* 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.dataaccess;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.geotools.coverage.grid.GridGeometry2D;
import com.raytheon.uf.common.dataaccess.exception.DataRetrievalException;
import com.raytheon.uf.common.dataaccess.grid.IGridData;
import com.raytheon.uf.common.dataaccess.grid.IGridDataFactory;
import com.raytheon.uf.common.dataaccess.grid.IGridRequest;
import com.raytheon.uf.common.dataaccess.impl.AbstractGridDataPluginFactory;
import com.raytheon.uf.common.dataaccess.impl.DefaultGridData;
import com.raytheon.uf.common.dataaccess.util.DataWrapperUtil;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord;
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.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.dataplugin.level.Level;
import com.raytheon.uf.common.dataplugin.level.MasterLevel;
import com.raytheon.uf.common.dataquery.requests.DbQueryRequest;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
import com.raytheon.uf.common.dataquery.responses.DbQueryResponse;
import com.raytheon.uf.common.datastorage.Request;
import com.raytheon.uf.common.datastorage.records.FloatDataRecord;
import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.common.geospatial.MapUtil;
/**
* A data factory for getting gfe data from the metadata database. There are
* currently not any required identifiers.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 4, 2013 bsteffen Initial creation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class GFEGridFactory extends AbstractGridDataPluginFactory implements
IGridDataFactory {
private static final String[] VALID_IDENTIFIERS = { GFEDataAccessUtil.MODEL_NAME,
GFEDataAccessUtil.MODEL_TIME, GFEDataAccessUtil.SITE_ID };
@Override
public String[] getValidIdentifiers() {
return VALID_IDENTIFIERS;
}
@Override
protected IGridData constructGridDataResponse(IGridRequest request,
PluginDataObject pdo, GridGeometry2D gridGeometry,
IDataRecord dataRecord) {
GFERecord gfeRecord = asGFERecord(pdo);
DefaultGridData defaultGridData = new DefaultGridData(
DataWrapperUtil.constructArrayWrapper(dataRecord, false),
gridGeometry);
defaultGridData.setDataTime(pdo.getDataTime());
defaultGridData.setParameter(gfeRecord.getParmName());
Level level = new Level();
level.setMasterLevel(new MasterLevel(gfeRecord.getParmLevel()));
defaultGridData.setLevel(level);
defaultGridData.setUnit(gfeRecord.getGridInfo().getUnitObject());
Map<String, Object> attrs = new HashMap<String, Object>();
attrs.put(GFEDataAccessUtil.MODEL_NAME, gfeRecord.getDbId()
.getModelName());
attrs.put(GFEDataAccessUtil.MODEL_TIME, gfeRecord.getDbId()
.getModelTime());
attrs.put(GFEDataAccessUtil.SITE_ID, gfeRecord.getDbId().getSiteId());
defaultGridData.setAttributes(attrs);
return defaultGridData;
}
@Override
protected Map<String, RequestConstraint> buildConstraintsFromRequest(
IGridRequest request) {
HashMap<String, RequestConstraint> constraints = new HashMap<String, RequestConstraint>();
Map<String, String> parmIdComponents = new HashMap<String, String>();
Map<String, Object> identifiers = request.getIdentifiers();
if (identifiers != null) {
for (Entry<String, Object> entry : identifiers.entrySet()) {
parmIdComponents.put(entry.getKey(), entry.getValue()
.toString());
}
}
String[] parameters = request.getParameters();
if (parameters != null) {
if (parameters.length == 1) {
parmIdComponents.put(GFEDataAccessUtil.PARM_NAME, parameters[0]);
} else if (parameters.length > 1) {
RequestConstraint paramNameConstraint = new RequestConstraint(
null, ConstraintType.IN);
paramNameConstraint.setConstraintValueList(parameters);
constraints.put(GFEDataAccessUtil.PARM_NAME, paramNameConstraint);
}
}
Level[] levels = request.getLevels();
if (levels != null) {
if (levels.length == 1) {
parmIdComponents.put(GFEDataAccessUtil.PARM_LEVEL, levels[0]
.getMasterLevel().getName());
} else if (levels.length > 1) {
RequestConstraint paramLevelConstraint = new RequestConstraint(
null, ConstraintType.IN);
for (Level level : levels) {
paramLevelConstraint.addToConstraintValueList(level
.getMasterLevel().getName());
}
constraints.put(GFEDataAccessUtil.PARM_LEVEL, paramLevelConstraint);
}
}
constraints.put(GFEDataAccessUtil.PLUGIN_NAME, new RequestConstraint("gfe"));
constraints.put(GFEDataAccessUtil.PARM_ID,
GFEDataAccessUtil.createParmIdConstraint(parmIdComponents));
return constraints;
}
@Override
protected IDataRecord getDataRecord(PluginDataObject pdo,
Request storageRequest) {
GFERecord gfeRecord = asGFERecord(pdo);
try {
IGridSlice slice = GFEDataAccessUtil
.getSlice(gfeRecord);
GridLocation loc = slice.getGridInfo().getGridLoc();
gfeRecord.setGridInfo(slice.getGridInfo());
Grid2DFloat data = null;
if(slice instanceof ScalarGridSlice){
// This also grabs vector data.
data = ((ScalarGridSlice) slice).getScalarGrid();
} else {
throw new DataRetrievalException("UNknown slice of type "
+ slice.getClass().getSimpleName());
}
return new FloatDataRecord("Data", gfeRecord.getDataURI(), data.getFloats(), 2, new long[] {
loc.getNx(), loc.getNy() });
} catch (Exception e) {
throw new DataRetrievalException(e);
}
}
@Override
protected GridGeometry2D getGridGeometry(PluginDataObject pdo) {
GFERecord gfeRecord = asGFERecord(pdo);
GridParmInfo info = gfeRecord.getGridInfo();
if (info == null) {
try {
info = GFEDataAccessUtil.getGridParmInfo(gfeRecord.getParmId());
} catch (Exception e) {
throw new DataRetrievalException(e);
}
gfeRecord.setGridInfo(info);
}
return MapUtil.getGridGeometry(info.getGridLoc());
}
@Override
public GridGeometry2D getGeometry(IGridRequest request) {
DbQueryRequest dbRequest = buildDbQueryRequest(request);
dbRequest.setLimit(1);
DbQueryResponse dbResonse = executeDbQueryRequest(dbRequest,
request.toString());
for (Map<String, Object> resultMap : dbResonse.getResults()) {
GFERecord gfeRecord = asGFERecord(resultMap.get(null));
return getGridGeometry(gfeRecord);
}
return null;
}
private GFERecord asGFERecord(Object obj) {
if (obj instanceof GFERecord == false) {
throw new DataRetrievalException(this.getClass().getSimpleName()
+ " cannot handle " + obj.getClass().getSimpleName());
}
return (GFERecord) obj;
}
}