diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GridDataRequestJob.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GridDataRequestJob.java index 1b38d28927..1a6556f028 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GridDataRequestJob.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GridDataRequestJob.java @@ -45,7 +45,9 @@ import com.raytheon.uf.viz.core.exception.VizException; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Mar 16, 2011 bsteffen Initial creation + * Mar 16, 2011 bsteffen Initial creation + * Jun 04, 2013 2041 bsteffen Improve exception handing in grid + * resources. * * * @@ -65,6 +67,12 @@ class GridDataRequestJob extends Job { public List gridData; + public VizException exception; + + // True only if exception has already been handled(i.e. the user has + // been notified.) + public boolean exceptionHandled = false; + public GridDataRequest(DataTime time, List pdos) { this.time = time; if (pdos == null) { @@ -75,6 +83,10 @@ class GridDataRequestJob extends Job { } + public boolean shouldRequest() { + return gridData == null && exception == null; + } + } private AbstractGridResource resource; @@ -97,14 +109,12 @@ class GridDataRequestJob extends Job { synchronized (requests) { requests.remove(request); } + } else { + resource.issueRefresh(); } - resource.issueRefresh(); } catch (VizException e) { - synchronized (requests) { - requests.remove(request); - } - statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), - e); + request.exception = e; + resource.issueRefresh(); } if (monitor.isCanceled()) { break; @@ -116,7 +126,7 @@ class GridDataRequestJob extends Job { protected GridDataRequest getNext() { synchronized (requests) { for (GridDataRequest request : requests) { - if (request.gridData == null) { + if (request.shouldRequest()) { return request; } } @@ -126,8 +136,8 @@ class GridDataRequestJob extends Job { public List requestData(DataTime time, List pdos) { + GridDataRequest request = new GridDataRequest(time, pdos); synchronized (requests) { - GridDataRequest request = new GridDataRequest(time, pdos); Iterator itr = requests.iterator(); while (itr.hasNext()) { GridDataRequest r = itr.next(); @@ -143,11 +153,87 @@ class GridDataRequestJob extends Job { } } requests.add(0, request); + if (request.exception != null && !request.exceptionHandled) { + handleExceptions(); + } + } + if (request.shouldRequest()) { + this.schedule(); } - this.schedule(); return null; } + private void handleExceptions() { + + List failedRequests = new ArrayList( + requests.size()); + synchronized (requests) { + for (GridDataRequest request : requests) { + if (request.exception != null && !request.exceptionHandled) { + failedRequests.add(request); + } + } + } + if (failedRequests.isEmpty()) { + return; + } + String safeResourceName = "Grid Resource"; + try { + safeResourceName = resource.getName(); + } catch (Throwable e) { + // This means they just won't get + // as useful of a message. + statusHandler.handle(Priority.DEBUG, e.getLocalizedMessage(), e); + } + boolean multiple = failedRequests.size() > 1; + GridDataRequest request = failedRequests.get(0); + // Only log one message as a PROBLEM + statusHandler.handle(Priority.PROBLEM, + getFailureMessage(safeResourceName, request, multiple), + request.exception); + if (multiple) { + // Log all other messages as INFO so that if there are differences + // they will be in the log. + for (GridDataRequest r : failedRequests) { + statusHandler.handle(Priority.INFO, + getFailureMessage(safeResourceName, r, false), + r.exception); + r.exceptionHandled = true; + } + } else { + request.exceptionHandled = true; + } + + } + + /** + * Attempt to generate a pretty message to display to the user. + * + * @param resourceName + * the name of the resource + * @param request + * a failed request + * @param multiple + * whether this message should be for the current request or + * multiple frames. + * @return + */ + private String getFailureMessage(String resourceName, + GridDataRequest request, boolean multiple) { + StringBuilder message = new StringBuilder("Error requesting data for "); + message.append(resourceName); + if (multiple) { + message.append(" Multiple frames"); + } else if (request.time != null) { + message.append(" ").append(request.time.getLegendString()); + } + if (request.exception != null) { + message.append(": "); + message.append(request.exception.getLocalizedMessage()); + } + return message.toString(); + } + public void remove(DataTime time) { synchronized (requests) { Iterator itr = requests.iterator(); diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GridDataCubeAdapter.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GridDataCubeAdapter.java index 2ceb81f418..41225c37fa 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GridDataCubeAdapter.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GridDataCubeAdapter.java @@ -78,7 +78,9 @@ import com.raytheon.viz.grid.record.RequestableDataRecord; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 16, 2009 brockwoo Initial creation - * Nov 21, 2009 #3576 rjpeter Refactored use of DerivParamDesc. + * Nov 21, 2009 3576 rjpeter Refactored use of DerivParamDesc. + * Jun 04, 2013 2041 bsteffen Improve exception handing in grid + * resources. * * * @author brockwoo @@ -367,7 +369,7 @@ public class GridDataCubeAdapter extends AbstractDataCubeAdapter { records = getRecord(obj, requests); } } catch (VizException e) { - throw new VizDataCubeException(e); + throw new VizDataCubeException(e.getMessage(), e); } } else { records = getRecord(obj, req, dataset);