From 63b55f454f14146ddde61f3c10e047acd641a0c6 Mon Sep 17 00:00:00 2001 From: Ben Steffensmeier Date: Wed, 20 Jun 2012 14:13:37 -0500 Subject: [PATCH] Issue #704 add INCOMPLETE PaintStatus to indicate a frame will require more painting later Former-commit-id: d317777ee61bc8792bce5777cec7fb52595dcd89 [formerly d317777ee61bc8792bce5777cec7fb52595dcd89 [formerly 65e7e8b2c891d1938f0b98c3c8737f18517fe27f]] Former-commit-id: 0c69731e18f75af6556497d0ab613a1d89c5f76a Former-commit-id: b55a4f026ccc0069dfffd23f5d9a86092af75af9 --- .../viz/core/maps/rsc/MapResourceGroup.java | 6 +++- .../uf/viz/core/drawables/PaintStatus.java | 28 ++++++++++++++++- .../raytheon/uf/viz/core/jobs/JobPool.java | 30 +++++++++++++++++++ .../uf/viz/core/rsc/AbstractVizResource.java | 17 +++++++---- .../grid/rsc/AbstractMapVectorResource.java | 3 ++ .../rsc/general/AbstractGridResource.java | 4 +++ .../viz/pointdata/PlotDataThreadPool.java | 9 ++++++ .../pointdata/PlotModelDataRequestJob.java | 9 ++++-- .../viz/pointdata/PlotModelGeneratorJob.java | 4 +++ .../viz/pointdata/rsc/PlotResource2.java | 6 ++++ .../rsc/progdisc/AbstractProgDisclosure.java | 4 +++ .../viz/satellite/rsc/SatBlendedResource.java | 6 +++- 12 files changed, 116 insertions(+), 10 deletions(-) diff --git a/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/MapResourceGroup.java b/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/MapResourceGroup.java index a7cf305eaa..bb9cad5309 100644 --- a/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/MapResourceGroup.java +++ b/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/MapResourceGroup.java @@ -26,6 +26,7 @@ import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.PaintStatus; import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.MapDescriptor; @@ -164,7 +165,10 @@ public class MapResourceGroup extends paintProps.setAlpha(resource.getCapability( ImagingCapability.class).getAlpha()); } - resource.paint(target, newProps); + PaintStatus paintStatus = resource.paint(target, newProps); + if (paintStatus != PaintStatus.PAINTED) { + updatePaintStatus(paintStatus); + } } } } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/PaintStatus.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/PaintStatus.java index c345f9187d..a10691acd2 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/PaintStatus.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/PaintStatus.java @@ -37,5 +37,31 @@ package com.raytheon.uf.viz.core.drawables; */ public enum PaintStatus { - PAINTED, REPAINT, ERROR; + /** + * indicates that a resource or renderable has successfully painted all + * available data. + */ + PAINTED, + + /** + * indicates that a resource is currently in the act of painting + */ + PAINTING, + + /** + * indicates that less than all the data has painted and more data will be + * arriving asynchronously, when that data arrives the PaintStatus will + * become REPAINT. + */ + INCOMPLETE, + + /** + * indicates a resource has new data that needs to be painted + */ + REPAINT, + + /** + * an uncaught error occured during the last paint event. + */ + ERROR; } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/jobs/JobPool.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/jobs/JobPool.java index 536ba25252..7b904c236d 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/jobs/JobPool.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/jobs/JobPool.java @@ -125,6 +125,36 @@ public class JobPool { return workQueue.remove(runnable); } + /** + * A JobPool is considered active if any of the jobs it contains are running + * or waiting to be run. When all scheduled work is run + * + * @return + */ + public boolean isActive() { + if (!workQueue.isEmpty()) { + return true; + } + for (Job job : jobList) { + int state = job.getState(); + if (state == Job.RUNNING || state == Job.WAITING) { + return true; + } + } + return false; + } + + /** + * get the number of tasks(Runnables) that are waiting to be run. This does + * not include tasks that are currently running so even if there are no + * waiting tasks the pool may still be active. + * + * @return + */ + public int getWorkRemaining() { + return workQueue.size(); + } + protected class PooledJob extends Job { public PooledJob(String name) { diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java index 36db035863..7f49b0cf36 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java @@ -337,6 +337,7 @@ public abstract class AbstractVizResource display = this.gdManagerJob diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/AbstractGridResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/AbstractGridResource.java index cb3a4d5e68..55fcd31aee 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/AbstractGridResource.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/AbstractGridResource.java @@ -54,6 +54,7 @@ import com.raytheon.uf.viz.core.drawables.ColorMapLoader; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IRenderable; import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.PaintStatus; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData; @@ -413,6 +414,7 @@ public abstract class AbstractGridResource GeneralGridData data = requestData(time); if (data == null) { + updatePaintStatus(PaintStatus.INCOMPLETE); return; } @@ -421,6 +423,8 @@ public abstract class AbstractGridResource if (renderable != null) { renderables.put(time, renderable); renderable.paint(target, paintProps); + } else { + updatePaintStatus(PaintStatus.INCOMPLETE); } } diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotDataThreadPool.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotDataThreadPool.java index c39d0482f4..9f168754b2 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotDataThreadPool.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotDataThreadPool.java @@ -174,6 +174,15 @@ public class PlotDataThreadPool { } } + public boolean isDone() { + for (PlotModelDataRequestJob job : jobList) { + if (!job.isDone()) { + return false; + } + } + return true; + } + public void shutdown() { stationQueue.clear(); for (PlotModelDataRequestJob job : jobList) { diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelDataRequestJob.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelDataRequestJob.java index 6203e1cfc5..6faa1d0d73 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelDataRequestJob.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelDataRequestJob.java @@ -186,8 +186,8 @@ public class PlotModelDataRequestJob extends Job { } } } - - if(!params.contains("dataURI")){ + + if (!params.contains("dataURI")) { params.add("dataURI"); } @@ -334,6 +334,11 @@ public class PlotModelDataRequestJob extends Job { this.plotCreator.setPlotMissingData(b); } + public boolean isDone() { + return getState() != Job.RUNNING && getState() != Job.WAITING + && generatorJob.isDone(); + } + public void shutdown() { this.cancel(); this.generatorJob.shutdown(); diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelGeneratorJob.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelGeneratorJob.java index 871dff4259..1790d6f791 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelGeneratorJob.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelGeneratorJob.java @@ -145,6 +145,10 @@ public class PlotModelGeneratorJob extends Job { imageCache.clear(); } + public boolean isDone() { + return getState() != Job.RUNNING && getState() != Job.WAITING; + } + protected void shutdown() { cancel(); taskQueue.clear(); diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java index a1f15de6e8..9d9fa9d580 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java @@ -48,6 +48,7 @@ import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.PixelExtent; import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.PaintStatus; import com.raytheon.uf.viz.core.drawables.ext.ISingleColorImageExtension.ISingleColorImage; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.jobs.JobPool; @@ -208,6 +209,11 @@ public class PlotResource2 extends descriptor.getCRS()), descriptor.getCRS()); } + if (!progressiveDisclosure.isDone() || !generator.isDone() + || frameRetrievalPool.isActive()) { + updatePaintStatus(PaintStatus.INCOMPLETE); + } + this.updateRecords(); List stationList = curFrame.lastComputed; diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/progdisc/AbstractProgDisclosure.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/progdisc/AbstractProgDisclosure.java index fd956db9a7..10c359181c 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/progdisc/AbstractProgDisclosure.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/progdisc/AbstractProgDisclosure.java @@ -188,6 +188,10 @@ public abstract class AbstractProgDisclosure extends Job { return nextTask.canvasWidth / nextTask.extent.getWidth(); } + public boolean isDone() { + return getState() != Job.RUNNING && getState() != Job.WAITING; + } + public void shutdown() { this.cancel(); nextTask = new Task(); diff --git a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatBlendedResource.java b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatBlendedResource.java index 5026d00aa2..17c04ab740 100644 --- a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatBlendedResource.java +++ b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatBlendedResource.java @@ -33,6 +33,7 @@ import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.PaintStatus; import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.drawables.ext.IOffscreenRenderingExtension; import com.raytheon.uf.viz.core.exception.VizException; @@ -190,7 +191,10 @@ public class SatBlendedResource extends paintProps); rscProps.setDataTime(timeForRsc); rscProps.setAlpha(1.0f); - rsc.paint(target, rscProps); + PaintStatus paintStatus = rsc.paint(target, rscProps); + if (paintStatus != PaintStatus.PAINTED) { + updatePaintStatus(paintStatus); + } } } }