Issue #1567 refactor updates of plots for efficiency/clarity
Change-Id: Id3d52ef2eb671138c078bc721c690867ba3dada3 Former-commit-id: b2788eb6bbc807d6fecc8e097e15dfbcb3ff8105
This commit is contained in:
parent
ea6dec5db8
commit
b9b730aac5
5 changed files with 104 additions and 100 deletions
|
@ -83,7 +83,8 @@ public class CoopPrecipPlotInfoRetriever extends AbstractPlotInfoRetriever {
|
||||||
info.add(stationInfo);
|
info.add(stationInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
listener.resourceChanged(ChangeType.DATA_UPDATE, info.toArray());
|
listener.resourceChanged(ChangeType.DATA_UPDATE,
|
||||||
|
info.toArray(new PlotInfo[0]));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,10 +30,10 @@ import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.eclipse.swt.graphics.RGB;
|
import org.eclipse.swt.graphics.RGB;
|
||||||
|
import org.opengis.coverage.grid.GridEnvelope;
|
||||||
import org.opengis.referencing.crs.CoordinateReferenceSystem;
|
import org.opengis.referencing.crs.CoordinateReferenceSystem;
|
||||||
|
|
||||||
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
|
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
|
||||||
|
@ -89,6 +89,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* 04/09/2009 952 jsanchez Plot acars.
|
* 04/09/2009 952 jsanchez Plot acars.
|
||||||
* 04/13/2009 2251 jsanchez Plot profilers.
|
* 04/13/2009 2251 jsanchez Plot profilers.
|
||||||
* 04/21/2009 chammack Refactor to common pointData model
|
* 04/21/2009 chammack Refactor to common pointData model
|
||||||
|
* 02/01/2013 1567 njensen Refactor handling of updates
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
|
@ -114,8 +115,6 @@ public class PlotResource2 extends
|
||||||
|
|
||||||
private Map<DataTime, FrameInformation> frameMap;
|
private Map<DataTime, FrameInformation> frameMap;
|
||||||
|
|
||||||
private ConcurrentLinkedQueue<PlotInfo> stationsToParse;
|
|
||||||
|
|
||||||
private DataTime displayedTime;
|
private DataTime displayedTime;
|
||||||
|
|
||||||
private RGB imageColor = null;
|
private RGB imageColor = null;
|
||||||
|
@ -174,7 +173,6 @@ public class PlotResource2 extends
|
||||||
data.setAlertParser(new PlotAlertParser());
|
data.setAlertParser(new PlotAlertParser());
|
||||||
}
|
}
|
||||||
this.dataTimes = new ArrayList<DataTime>();
|
this.dataTimes = new ArrayList<DataTime>();
|
||||||
this.stationsToParse = new ConcurrentLinkedQueue<PlotInfo>();
|
|
||||||
this.frameMap = new ConcurrentHashMap<DataTime, FrameInformation>();
|
this.frameMap = new ConcurrentHashMap<DataTime, FrameInformation>();
|
||||||
data.addChangeListener(this);
|
data.addChangeListener(this);
|
||||||
}
|
}
|
||||||
|
@ -213,8 +211,6 @@ public class PlotResource2 extends
|
||||||
issueRefresh();
|
issueRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updateRecords();
|
|
||||||
|
|
||||||
List<Station> stationList = curFrame.lastComputed;
|
List<Station> stationList = curFrame.lastComputed;
|
||||||
|
|
||||||
if (stationList.isEmpty()) {
|
if (stationList.isEmpty()) {
|
||||||
|
@ -285,7 +281,6 @@ public class PlotResource2 extends
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.updateRecords();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized FrameInformation startFrameInit(DataTime time) {
|
private synchronized FrameInformation startFrameInit(DataTime time) {
|
||||||
|
@ -298,16 +293,24 @@ public class PlotResource2 extends
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateRecords() throws VizException {
|
/**
|
||||||
if (stationsToParse.isEmpty()) {
|
* Checks the plots to ensure they are displayable, ie a frame exists that
|
||||||
return;
|
* matches their time and they are within the descriptor's world extent. If
|
||||||
}
|
* so, schedules them for disclosure. Also checks if a plot already exists
|
||||||
|
* and this is an update, and if so, updates the plot.
|
||||||
|
*
|
||||||
|
* @param stationsToParse
|
||||||
|
* stations to potentially process and display
|
||||||
|
* @throws VizException
|
||||||
|
*/
|
||||||
|
protected void updateRecords(PlotInfo[] stationsToParse)
|
||||||
|
throws VizException {
|
||||||
|
Validate.notNull(stationsToParse);
|
||||||
Map<DataTime, List<PlotInfo>> plots = new HashMap<DataTime, List<PlotInfo>>();
|
Map<DataTime, List<PlotInfo>> plots = new HashMap<DataTime, List<PlotInfo>>();
|
||||||
// Sort plots into datatimes
|
// Sort plots into normalized datatimes that should match frames
|
||||||
while (!stationsToParse.isEmpty()) {
|
for (PlotInfo info : stationsToParse) {
|
||||||
PlotInfo info = stationsToParse.poll();
|
|
||||||
DataTime normTime = getNormalizedTime(info.dataTime);
|
DataTime normTime = getNormalizedTime(info.dataTime);
|
||||||
|
if (frameMap.containsKey(normTime)) {
|
||||||
List<PlotInfo> list = plots.get(normTime);
|
List<PlotInfo> list = plots.get(normTime);
|
||||||
if (list == null) {
|
if (list == null) {
|
||||||
list = new ArrayList<PlotInfo>();
|
list = new ArrayList<PlotInfo>();
|
||||||
|
@ -315,81 +318,82 @@ public class PlotResource2 extends
|
||||||
}
|
}
|
||||||
list.add(info);
|
list.add(info);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PixelExtent worldExtent = new PixelExtent(0, descriptor
|
GridEnvelope range = descriptor.getGridGeometry().getGridRange();
|
||||||
.getGridGeometry().getGridRange().getHigh(0), 0, descriptor
|
PixelExtent worldExtent = new PixelExtent(range.getLow(0),
|
||||||
.getGridGeometry().getGridRange().getHigh(1));
|
range.getHigh(0), range.getLow(1), range.getHigh(1));
|
||||||
|
|
||||||
for (Entry<DataTime, List<PlotInfo>> entry : plots.entrySet()) {
|
for (Entry<DataTime, List<PlotInfo>> entry : plots.entrySet()) {
|
||||||
DataTime time = entry.getKey();
|
DataTime time = entry.getKey();
|
||||||
List<PlotInfo> info = entry.getValue();
|
List<PlotInfo> info = entry.getValue();
|
||||||
FrameInformation frameInfo = frameMap.get(time);
|
FrameInformation frameInfo = frameMap.get(time);
|
||||||
if (frameInfo == null) {
|
if (frameInfo != null) {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Map<String, Station> stationMap = frameInfo.stationMap;
|
Map<String, Station> stationMap = frameInfo.stationMap;
|
||||||
for (PlotInfo plot : info) {
|
for (PlotInfo plot : info) {
|
||||||
if (plot.stationId == null) {
|
if (plot.stationId == null) {
|
||||||
plot.stationId = plot.latitude + "#" + plot.longitude;
|
plot.stationId = plot.latitude + "#" + plot.longitude;
|
||||||
}
|
}
|
||||||
|
synchronized (stationMap) {
|
||||||
if (stationMap.containsKey(plot.stationId)) {
|
if (stationMap.containsKey(plot.stationId)) {
|
||||||
Station existingStation = stationMap.get(plot.stationId);
|
processUpdatedPlot(stationMap.get(plot.stationId),
|
||||||
|
plot);
|
||||||
|
} else {
|
||||||
|
double[] thisLocationPixel = descriptor
|
||||||
|
.worldToPixel(new double[] {
|
||||||
|
plot.longitude, plot.latitude });
|
||||||
|
if (thisLocationPixel != null
|
||||||
|
&& worldExtent.contains(
|
||||||
|
thisLocationPixel[0],
|
||||||
|
thisLocationPixel[1])) {
|
||||||
|
Station station = new Station();
|
||||||
|
station.info = new PlotInfo[] { plot };
|
||||||
|
station.pixelLocation = new Coordinate(
|
||||||
|
thisLocationPixel[0],
|
||||||
|
thisLocationPixel[1]);
|
||||||
|
stationMap.put(plot.stationId, station);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
progressiveDisclosure.update(stationMap.values(), time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
issueRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates an existing station with a new plot.
|
||||||
|
*
|
||||||
|
* @param existingStation
|
||||||
|
* the existing station
|
||||||
|
* @param plot
|
||||||
|
* the newly received plot
|
||||||
|
*/
|
||||||
|
protected void processUpdatedPlot(Station existingStation, PlotInfo plot) {
|
||||||
if (existingStation.plotImage != null) {
|
if (existingStation.plotImage != null) {
|
||||||
existingStation.plotImage.getImage().dispose();
|
existingStation.plotImage.getImage().dispose();
|
||||||
existingStation.plotImage = null;
|
existingStation.plotImage = null;
|
||||||
}
|
}
|
||||||
boolean dup = false;
|
boolean dup = false;
|
||||||
for (int i = 0; i < existingStation.info.length; i++) {
|
for (int i = 0; i < existingStation.info.length; i++) {
|
||||||
if (existingStation.info[i].dataURI
|
if (existingStation.info[i].dataURI.equals(plot.dataURI)) {
|
||||||
.equals(plot.dataURI)) {
|
|
||||||
// existingStation.info[i] = plot;
|
|
||||||
dup = true;
|
dup = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!dup) {
|
if (!dup) {
|
||||||
existingStation.info = Arrays.copyOf(
|
existingStation.info = Arrays.copyOf(existingStation.info,
|
||||||
existingStation.info,
|
|
||||||
existingStation.info.length + 1);
|
existingStation.info.length + 1);
|
||||||
existingStation.info[existingStation.info.length - 1] = plot;
|
existingStation.info[existingStation.info.length - 1] = plot;
|
||||||
Arrays.sort(existingStation.info,
|
Arrays.sort(existingStation.info, new Comparator<PlotInfo>() {
|
||||||
new Comparator<PlotInfo>() {
|
|
||||||
@Override
|
@Override
|
||||||
public int compare(PlotInfo o1, PlotInfo o2) {
|
public int compare(PlotInfo o1, PlotInfo o2) {
|
||||||
return o1.dataTime
|
return o1.dataTime.compareTo(o2.dataTime);
|
||||||
.compareTo(o2.dataTime);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Station station = new Station();
|
|
||||||
station.info = new PlotInfo[] { plot };
|
|
||||||
|
|
||||||
double[] thisLocationPixel = descriptor
|
|
||||||
.worldToPixel(new double[] { plot.longitude,
|
|
||||||
plot.latitude });
|
|
||||||
if (thisLocationPixel == null
|
|
||||||
|| !worldExtent.contains(thisLocationPixel[0],
|
|
||||||
thisLocationPixel[1])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
station.pixelLocation = new Coordinate(
|
|
||||||
thisLocationPixel[0], thisLocationPixel[1]);
|
|
||||||
stationMap.put(plot.stationId, station);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// if (time.equals(displayedTime)) {
|
|
||||||
progressiveDisclosure.update(stationMap.values(), time);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addRecord(Object[] objs) throws VizException {
|
|
||||||
Validate.notNull(objs);
|
|
||||||
for (Object obj : objs) {
|
|
||||||
this.stationsToParse.offer((PlotInfo) obj);
|
|
||||||
}
|
|
||||||
issueRefresh();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private DataTime getNormalizedTime(DataTime time) {
|
private DataTime getNormalizedTime(DataTime time) {
|
||||||
|
@ -449,6 +453,8 @@ public class PlotResource2 extends
|
||||||
resourceData.getMetadataMap());
|
resourceData.getMetadataMap());
|
||||||
metadataMap.put("dataTime", time);
|
metadataMap.put("dataTime", time);
|
||||||
|
|
||||||
|
// results will be sent to resourceChanged(DATA_UPDATE) on current
|
||||||
|
// thread
|
||||||
resourceData.getPlotInfoRetriever().getStations(this, thisFrameTime,
|
resourceData.getPlotInfoRetriever().getStations(this, thisFrameTime,
|
||||||
metadataMap);
|
metadataMap);
|
||||||
}
|
}
|
||||||
|
@ -536,10 +542,8 @@ public class PlotResource2 extends
|
||||||
@Override
|
@Override
|
||||||
public void resourceChanged(ChangeType type, Object object) {
|
public void resourceChanged(ChangeType type, Object object) {
|
||||||
if (type.equals(ChangeType.DATA_UPDATE)) {
|
if (type.equals(ChangeType.DATA_UPDATE)) {
|
||||||
Object[] pdos = (Object[]) object;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
addRecord(pdos);
|
updateRecords((PlotInfo[]) object);
|
||||||
} catch (VizException e) {
|
} catch (VizException e) {
|
||||||
statusHandler.handle(Priority.PROBLEM,
|
statusHandler.handle(Priority.PROBLEM,
|
||||||
"Error updating plot resource", e);
|
"Error updating plot resource", e);
|
||||||
|
@ -665,7 +669,7 @@ public class PlotResource2 extends
|
||||||
@Override
|
@Override
|
||||||
public void remove(DataTime dataTime) {
|
public void remove(DataTime dataTime) {
|
||||||
super.remove(dataTime);
|
super.remove(dataTime);
|
||||||
FrameInformation frameInfo = this.frameMap.get(dataTime);
|
FrameInformation frameInfo = this.frameMap.remove(dataTime);
|
||||||
if (frameInfo != null) {
|
if (frameInfo != null) {
|
||||||
for (Station s : frameInfo.stationMap.values()) {
|
for (Station s : frameInfo.stationMap.values()) {
|
||||||
if (s != null && s.plotImage != null) {
|
if (s != null && s.plotImage != null) {
|
||||||
|
@ -674,7 +678,6 @@ public class PlotResource2 extends
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
frameInfo.stationMap.clear();
|
frameInfo.stationMap.clear();
|
||||||
this.frameMap.remove(dataTime);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -133,7 +133,7 @@ public class FullDataPlotInfoRetriever extends AbstractPlotInfoRetriever {
|
||||||
result.add(info);
|
result.add(info);
|
||||||
}
|
}
|
||||||
listener.resourceChanged(ChangeType.DATA_UPDATE,
|
listener.resourceChanged(ChangeType.DATA_UPDATE,
|
||||||
result.toArray());
|
result.toArray(new PlotInfo[0]));
|
||||||
return Status.OK_STATUS;
|
return Status.OK_STATUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,7 @@ public class PointDataPlotInfoRetriever extends AbstractDbPlotInfoRetriever {
|
||||||
dq = getQueryObject(metadataMap);
|
dq = getQueryObject(metadataMap);
|
||||||
}
|
}
|
||||||
List<PlotInfo> info = runStationQuery(dq);
|
List<PlotInfo> info = runStationQuery(dq);
|
||||||
listener.resourceChanged(ChangeType.DATA_UPDATE, info.toArray());
|
listener.resourceChanged(ChangeType.DATA_UPDATE,
|
||||||
|
info.toArray(new PlotInfo[0]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,8 +46,6 @@ import com.raytheon.uf.viz.core.catalog.DbQuery;
|
||||||
import com.raytheon.uf.viz.core.exception.VizException;
|
import com.raytheon.uf.viz.core.exception.VizException;
|
||||||
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged;
|
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged;
|
||||||
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType;
|
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType;
|
||||||
import com.raytheon.uf.viz.core.status.StatusConstants;
|
|
||||||
import com.raytheon.viz.pointdata.Activator;
|
|
||||||
import com.raytheon.viz.pointdata.PlotInfo;
|
import com.raytheon.viz.pointdata.PlotInfo;
|
||||||
import com.vividsolutions.jts.geom.Coordinate;
|
import com.vividsolutions.jts.geom.Coordinate;
|
||||||
import com.vividsolutions.jts.geom.Envelope;
|
import com.vividsolutions.jts.geom.Envelope;
|
||||||
|
@ -69,7 +67,8 @@ import com.vividsolutions.jts.geom.Envelope;
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
*/
|
*/
|
||||||
public class ScatterometerPlotInfoRetriever extends PointDataPlotInfoRetriever {
|
public class ScatterometerPlotInfoRetriever extends PointDataPlotInfoRetriever {
|
||||||
private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(ScatterometerPlotInfoRetriever.class);
|
private static final transient IUFStatusHandler statusHandler = UFStatus
|
||||||
|
.getHandler(ScatterometerPlotInfoRetriever.class);
|
||||||
|
|
||||||
private static final int MAX_RESULT_SIZE = 2000;
|
private static final int MAX_RESULT_SIZE = 2000;
|
||||||
|
|
||||||
|
@ -135,7 +134,8 @@ public class ScatterometerPlotInfoRetriever extends PointDataPlotInfoRetriever {
|
||||||
List<PlotInfo> stations = getStations(request.metadataMap);
|
List<PlotInfo> stations = getStations(request.metadataMap);
|
||||||
if (stations != null && !stations.isEmpty()) {
|
if (stations != null && !stations.isEmpty()) {
|
||||||
request.listener.resourceChanged(
|
request.listener.resourceChanged(
|
||||||
ChangeType.DATA_UPDATE, stations.toArray());
|
ChangeType.DATA_UPDATE,
|
||||||
|
stations.toArray(new PlotInfo[0]));
|
||||||
}
|
}
|
||||||
if (stations != null && stations.size() == MAX_RESULT_SIZE) {
|
if (stations != null && stations.size() == MAX_RESULT_SIZE) {
|
||||||
for (PlotInfo station : stations) {
|
for (PlotInfo station : stations) {
|
||||||
|
@ -201,10 +201,11 @@ public class ScatterometerPlotInfoRetriever extends PointDataPlotInfoRetriever {
|
||||||
dq.addColumn("id");
|
dq.addColumn("id");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
/* (non-Javadoc)
|
*
|
||||||
* @see com.raytheon.viz.pointdata.rsc.retrieve.PointDataPlotInfoRetriever#getPlotInfo(java.lang.Object[])
|
* @see com.raytheon.viz.pointdata.rsc.retrieve.PointDataPlotInfoRetriever#
|
||||||
|
* getPlotInfo(java.lang.Object[])
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected PlotInfo getPlotInfo(Object[] data) {
|
protected PlotInfo getPlotInfo(Object[] data) {
|
||||||
|
@ -213,8 +214,6 @@ public class ScatterometerPlotInfoRetriever extends PointDataPlotInfoRetriever {
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void getStations(IResourceDataChanged listener, DataTime time,
|
public void getStations(IResourceDataChanged listener, DataTime time,
|
||||||
HashMap<String, RequestConstraint> metadataMap) throws VizException {
|
HashMap<String, RequestConstraint> metadataMap) throws VizException {
|
||||||
Request request = new Request(time, WORLD_ENVELOPE);
|
Request request = new Request(time, WORLD_ENVELOPE);
|
||||||
|
|
Loading…
Add table
Reference in a new issue