From 667104c43e36f849e536a8b601bf5fd6f9cf4674 Mon Sep 17 00:00:00 2001 From: Roger Ferrel Date: Wed, 26 Jun 2013 06:56:08 -0500 Subject: [PATCH] Issue #1966 Fix race conditiona and delay in populating GUIs combo/spinner entries also minor code clean up. Change-Id: I4df5a5e4b1fb1e868ce9e8914116c2ae67c029c3 Former-commit-id: 713f39c429b0239887e981bd3b879082949b4122 [formerly 6f07f6f3bd2a733775357be824373b7250ac4b0d] [formerly ee409c08190ce1dd23c7d5a51070cea5970cb5a8] [formerly 713f39c429b0239887e981bd3b879082949b4122 [formerly 6f07f6f3bd2a733775357be824373b7250ac4b0d] [formerly ee409c08190ce1dd23c7d5a51070cea5970cb5a8] [formerly f66681f62b2e2faf29083ffe7f113fcfff7802ef [formerly ee409c08190ce1dd23c7d5a51070cea5970cb5a8 [formerly 3572d3b28e641446040ae8a6bc96a8770aea6ba5]]]] Former-commit-id: f66681f62b2e2faf29083ffe7f113fcfff7802ef Former-commit-id: 79c0bbb140be737f7408bb0b49527358106f35f4 [formerly 5f35643c2d0da8f5cc05647a7d025bd311d73b96] [formerly 91667b1a98b4d6dfebf3dbfd34ceea45670f8fe7 [formerly 45dcfe3ad840b233e00ccbfd79bc52b690c5a867]] Former-commit-id: d681469cf5de2614b883cebf316eab2fd929d808 [formerly bec6928ea97dc952199b9a2989357e1ce3b52121] Former-commit-id: 6261e65829e12957839e346798f2123665953290 --- .../uf/viz/archive/ui/AbstractArchiveDlg.java | 85 +++++++++++++------ .../archive/config/ArchiveConfigManager.java | 29 +++++-- 2 files changed, 82 insertions(+), 32 deletions(-) diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/AbstractArchiveDlg.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/AbstractArchiveDlg.java index c9784a1dd8..1d3f0df3ef 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/AbstractArchiveDlg.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/AbstractArchiveDlg.java @@ -24,6 +24,7 @@ import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -32,7 +33,6 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; @@ -96,10 +96,19 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements */ protected boolean setSelect = false; + /** + * Must be set by sub-class prior to creating table. + */ protected TableType tableType; + /** + * Job that computes sizes of table row entries off the UI thread. + */ protected final SizeJob sizeJob = new SizeJob(); + /** Keeps track of when it is safe to clear the busy cursor. */ + protected final AtomicInteger busyCnt = new AtomicInteger(0); + /** * @param parentShell */ @@ -270,15 +279,27 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements Job job = new Job("setup") { @Override protected IStatus run(IProgressMonitor monitor) { - initInfo(); - VizApp.runAsync(new Runnable() { + ArchiveConfigManager.getInstance().reset(); + if (!shell.isDisposed()) { + VizApp.runAsync(new Runnable() { - @Override - public void run() { - populateComboBoxes(); - updateTableComp(); - } - }); + @Override + public void run() { + populateComboBoxes(); + setCursorBusy(false); + } + }); + } + initDisplayData(); + if (!shell.isDisposed()) { + VizApp.runAsync(new Runnable() { + + @Override + public void run() { + updateTableComp(); + } + }); + } return Status.OK_STATUS; } }; @@ -360,12 +381,11 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements } /** - * Get information from manager for populating combo boxes and set up to get - * selected entries sizes. Intended for use on a non-UI thread. + * Set up all display data and queue getting sizes for any that are + * selected. */ - private void initInfo() { + private void initDisplayData() { ArchiveConfigManager manager = ArchiveConfigManager.getInstance(); - manager.reset(); Calendar startCal = getStart(); Calendar endCal = getEnd(); String[] archiveNames = manager.getArchiveDataNamesList(); @@ -401,18 +421,32 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements Calendar endCal = getEnd(); setCursorBusy(true); - sizeJob.clearQueue(); - ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); - CategoryInfo categoryInfo = archiveInfo.get(categoryName); + try { + sizeJob.clearQueue(); - for (DisplayData displayData : categoryInfo.getDisplayDataList()) { - sizeJob.queue(new SizeJobRequest(displayData, startCal, endCal)); + ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); + + // Not yet populated by background job. + if (archiveInfo == null) { + return; + } + + // Not yet populated by background job. + CategoryInfo categoryInfo = archiveInfo.get(categoryName); + if (categoryInfo == null) { + return; + } + + for (DisplayData displayData : categoryInfo.getDisplayDataList()) { + sizeJob.queue(new SizeJobRequest(displayData, startCal, endCal)); + } + sizeJob.requeueSelected(startCal, endCal); + + tableComp.populateTable(categoryInfo.getDisplayDataList()); + } finally { + setCursorBusy(false); } - sizeJob.requeueSelected(startCal, endCal); - - tableComp.populateTable(categoryInfo.getDisplayDataList()); - setCursorBusy(false); } /** @@ -421,11 +455,12 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements * @param state */ protected void setCursorBusy(boolean state) { - Cursor cursor = null; if (state) { - cursor = shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT); + busyCnt.addAndGet(1); + shell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT)); + } else if (busyCnt.addAndGet(-1) == 0) { + shell.setCursor(null); } - shell.setCursor(cursor); } /* diff --git a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfigManager.java b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfigManager.java index 7256175be2..b72ce5b1b0 100644 --- a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfigManager.java +++ b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfigManager.java @@ -526,7 +526,7 @@ public class ArchiveConfigManager { } /** - * Get a list of directories matching the categories directory pattern that + * Get a list of directories matching the categories directory patterns that * are sub-directories of the archive's root directory. * * @param archiveConfig @@ -537,13 +537,15 @@ public class ArchiveConfigManager { CategoryConfig categoryConfig) { List resultDirs = new ArrayList(); File rootFile = new File(archiveConfig.getRootDir()); + List dirs = new ArrayList(); + List tmpDirs = new ArrayList(); + List swpDirs = null; for (String dirPattern : categoryConfig.getDirPatternList()) { String[] subExpr = dirPattern.split(File.separator); - List dirs = new ArrayList(); + dirs.clear(); dirs.add(rootFile); - List tmpDirs = new ArrayList(); - List swpDirs = null; + tmpDirs.clear(); for (String regex : subExpr) { Pattern subPattern = Pattern.compile("^" + regex + "$"); @@ -582,6 +584,18 @@ public class ArchiveConfigManager { return getDisplayData(archiveName, categoryName, false); } + /** + * Get the Display labels matching the pattern for the archive data's + * category. Assumes the archive data's root directory is the mount point to + * start the search. + * + * @param archiveName + * @param categoryName + * @param setSelect + * - when true set the displayData selection base on category's + * selection list + * @return displayDataList + */ public List getDisplayData(String archiveName, String categoryName, boolean setSelect) { Map> displayMap = new HashMap>(); @@ -635,7 +649,8 @@ public class ArchiveConfigManager { } } - List displayInfoList = new ArrayList(); + List displayDataList = new ArrayList( + displays.size()); for (String displayLabel : displays) { DisplayData displayData = new DisplayData(archiveConfig, @@ -644,10 +659,10 @@ public class ArchiveConfigManager { displayData.setSelected(categoryConfig .getSelectedDisplayNames().contains(displayLabel)); } - displayInfoList.add(displayData); + displayDataList.add(displayData); } - return displayInfoList; + return displayDataList; } /**