From 753f19b309a0e941eb24d5af5f66dec09cf79245 Mon Sep 17 00:00:00 2001 From: Roger Ferrel Date: Tue, 11 Jun 2013 10:59:35 -0500 Subject: [PATCH] Issue #1966 Added hooks for ArchiveRetentionDlg and changed CaseCreationDlg to extend AbstractArchiveDlg. Change-Id: If485480b6d8727d830620464741c2e748f2209dd Former-commit-id: a9dd52d07b3eb8fd616e24374f40197c4df9b105 --- .../com/raytheon/uf/viz/RetentionHours.java | 108 ------ .../uf/viz/archive/data/CategoryInfo.java | 22 +- .../raytheon/uf/viz/archive/data/DirInfo.java | 217 ----------- .../uf/viz/archive/data/IArchiveTotals.java | 6 +- .../uf/viz/archive/data/IUpdateListener.java | 2 +- .../raytheon/uf/viz/archive/data/SizeJob.java | 206 +++++++++++ .../uf/viz/archive/data/SizeJobRequest.java | 82 +++++ .../uf/viz/archive/ui/AbstractArchiveDlg.java | 331 ++++++++++------- .../viz/archive/ui/ArchiveRetentionDlg.java | 227 ++++++------ .../uf/viz/archive/ui/ArchiveTableComp.java | 80 ++-- .../uf/viz/archive/ui/CaseCreationDlg.java | 343 +++++------------- .../uf/viz/archive/ui/GenerateCaseDlg.java | 2 +- .../uf/viz/archive/ui/RetentionHours.java | 188 ++++++++++ .../common/archive/config/ArchiveConfig.java | 6 +- .../archive/config/ArchiveConfigManager.java | 177 ++------- .../common/archive/config/CategoryConfig.java | 38 +- .../uf/common/archive/config/DisplayData.java | 189 ++++++++++ .../base/archive/PROCESSED_DATA.xml | 71 +++- .../common_static/base/archive/RAW_DATA.xml | 19 +- .../common_static/base/roles/userRoles.xml | 3 + .../archive/ArchiveConfigManagerTest.java | 6 +- 21 files changed, 1275 insertions(+), 1048 deletions(-) delete mode 100644 cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/RetentionHours.java delete mode 100644 cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/DirInfo.java create mode 100644 cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/SizeJob.java create mode 100644 cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/SizeJobRequest.java create mode 100644 cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/RetentionHours.java create mode 100644 edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/DisplayData.java diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/RetentionHours.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/RetentionHours.java deleted file mode 100644 index f2c61e53c2..0000000000 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/RetentionHours.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * 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.viz; - -import com.raytheon.uf.common.time.util.TimeUtil; - -/** - * Convenience class for taking retention hours and converting to days/hours. - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * May 2, 2013  1966       rferrel     Initial creation
- * 
- * 
- * - * @author rferrel - * @version 1.0 - */ - -public class RetentionHours { - - private int retentionHours; - - /** - * Constructor with default 7 day retention. - */ - public RetentionHours() { - this(7 * TimeUtil.HOURS_PER_DAY); - } - - /** - * Constructor specify retention hours. - * - * @param retentionHours - */ - public RetentionHours(int retentionHours) { - this.retentionHours = retentionHours; - } - - /** - * Set retention to this number of days. - * - * @param days - */ - public void setDays(int days) { - retentionHours = days * TimeUtil.HOURS_PER_DAY; - } - - /** - * Convert retention hours to days. Note values are truncated so a retention - * of 23 hours will return 0 days. - * - * @return days - */ - public int getDays() { - return retentionHours / TimeUtil.HOURS_PER_DAY; - } - - /** - * Get retention in hours. - * - * @return - */ - public int getHours() { - return retentionHours; - } - - /** - * Set number hours of retention. - * - * @param hours - */ - public void setHours(int hours) { - retentionHours = hours; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "RetentionHours [days:" + getDays() + ", hours:" + getHours() - + "]"; - } -} diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/CategoryInfo.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/CategoryInfo.java index d67cfa20d0..cc9b64735b 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/CategoryInfo.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/CategoryInfo.java @@ -21,7 +21,7 @@ package com.raytheon.uf.viz.archive.data; import java.util.List; -import com.raytheon.uf.common.archive.config.ArchiveConfigManager; +import com.raytheon.uf.common.archive.config.DisplayData; /** * This class used to maintain the state of a category so it can be restored @@ -42,17 +42,27 @@ import com.raytheon.uf.common.archive.config.ArchiveConfigManager; */ public class CategoryInfo { + /** Archive name for the category. */ private final String archiveName; + /** Category's name. */ private final String categoryName; - private final List displayInfoList; + /** List of display items for the category. */ + private final List displayDataList; + /** + * Contructor. + * + * @param archiveName + * @param categoryName + * @param displayInfoList + */ public CategoryInfo(String archiveName, String categoryName, - List displayInfoList) { + List displayInfoList) { this.archiveName = archiveName; this.categoryName = categoryName; - this.displayInfoList = displayInfoList; + this.displayDataList = displayInfoList; } public String getArchiveName() { @@ -63,7 +73,7 @@ public class CategoryInfo { return categoryName; } - public List getDisplayInfoList() { - return displayInfoList; + public List getDisplayDataList() { + return displayDataList; } } diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/DirInfo.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/DirInfo.java deleted file mode 100644 index b160797829..0000000000 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/DirInfo.java +++ /dev/null @@ -1,217 +0,0 @@ -/** - * 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.viz.archive.data; - -import java.io.File; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; - -import com.raytheon.uf.common.archive.config.ArchiveConfigManager; -import com.raytheon.uf.common.archive.config.ArchiveConfigManager.DisplayData; -import com.raytheon.uf.common.util.FileUtil; - -/** - * This class uses a obtains information on a File in a Job in order to remove - * from the UI thread. - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * May 15, 2013 1966       rferrel     Initial creation
- * 
- * 
- * - * @author rferrel - * @version 1.0 - */ - -public class DirInfo { - - private static final SizeJob sizeJob = new DirInfo.SizeJob(); - - final private DisplayData displayInfo; - - private final List files = new ArrayList(); - - private final Calendar startCal; - - private final Calendar endCal; - - public static void clearQueue() { - sizeJob.clearQueue(); - } - - public static void addUpdateListener(IUpdateListener listener) { - sizeJob.listeners.add(listener); - } - - public static void removeUpdateListener(IUpdateListener listener) { - sizeJob.listeners.remove(listener); - } - - public DirInfo(DisplayData displayInfo, Calendar startCal, Calendar endCal) { - this.displayInfo = displayInfo; - this.startCal = startCal; - this.endCal = endCal; - DirInfo.sizeJob.queue(this); - } - - public DisplayData getDisplayInfo() { - return displayInfo; - } - - /** - * Job to determine the size for a directory and its contents on a non-UI - * thread. - */ - static private class SizeJob extends Job { - private ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); - - private final ConcurrentLinkedQueue selectedQueue = new ConcurrentLinkedQueue(); - - private final AtomicBoolean stopComputeSize = new AtomicBoolean(false); - - List listeners = new ArrayList(); - - /** - * Add entry to queue and if pending selected entries add them to the - * queue with same start/end times. - * - * @param fileInfo - */ - protected void queue(DirInfo fileInfo) { - queue.add(fileInfo); - - if (getState() == Job.NONE) { - schedule(); - } - } - - /** - * Clear list off pending data but save selected entries still needing - * sizes. - */ - protected void clearQueue() { - List pending = new ArrayList(); - - // Drain queue queue.removeAll() doesn't work. - while (!queue.isEmpty()) { - pending.add(queue.remove()); - } - - if (getState() != NONE) { - cancel(); - } - - // Save selected items that do not have sizes. - for (DirInfo dirInfo : pending) { - DisplayData displayData = dirInfo.getDisplayInfo(); - - if (displayData.isSelected() && displayData.getSize() < 0L) { - if (!selectedQueue.contains(displayData)) { - selectedQueue.add(displayData); - } - } - } - } - - public SizeJob() { - super("Size Job"); - setSystem(true); - } - - @Override - protected IStatus run(IProgressMonitor monitor) { - if (monitor.isCanceled()) { - return Status.OK_STATUS; - } - - ArchiveConfigManager manager = ArchiveConfigManager.getInstance(); - - mainLoop: while (!queue.isEmpty()) { - DirInfo dirInfo = queue.remove(); - - stopComputeSize.set(false); - DisplayData displayData = dirInfo.displayInfo; - Calendar startCal = dirInfo.startCal; - Calendar endCal = dirInfo.endCal; - - List files = manager.getDisplayFiles(displayData, - startCal, endCal); - - // Is size still needed. - if (!displayData.isSelected() && stopComputeSize.get()) { - continue; - } - - dirInfo.files.clear(); - dirInfo.files.addAll(files); - long size = 0L; - for (File file : dirInfo.files) { - - // Skip when size no longer needed. - if (!displayData.isSelected() && stopComputeSize.get()) { - continue mainLoop; - } - - if (file.isDirectory()) { - size += FileUtil.sizeOfDirectory(file); - } else { - size += file.length(); - } - } - - displayData.setSize(size); - - List list = new ArrayList(); - list.add(dirInfo); - for (IUpdateListener listener : listeners) { - listener.update(list); - } - - if (!stopComputeSize.get()) { - // Place any pending selections at end of the queue. - while (!selectedQueue.isEmpty()) { - DisplayData data = selectedQueue.remove(); - new DirInfo(data, startCal, endCal); - } - } - } - - return Status.OK_STATUS; - } - - @Override - protected void canceling() { - stopComputeSize.set(true); - } - } -} diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/IArchiveTotals.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/IArchiveTotals.java index d4e8be9b00..8cc6cfc6a8 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/IArchiveTotals.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/IArchiveTotals.java @@ -19,6 +19,10 @@ **/ package com.raytheon.uf.viz.archive.data; +import java.util.List; + +import com.raytheon.uf.common.archive.config.DisplayData; + /** * Interface for methods for getting totals needed by the ArchiveTableComp. * @@ -40,5 +44,5 @@ public interface IArchiveTotals { /** * Update total selected items and sizes. */ - public void updateTotals(); + public void updateTotals(List displayDatas); } diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/IUpdateListener.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/IUpdateListener.java index 4e1c8099ac..1916b3c928 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/IUpdateListener.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/IUpdateListener.java @@ -43,5 +43,5 @@ public interface IUpdateListener { * * @param dirInfos */ - public void update(List dirInfos); + public void update(List request); } diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/SizeJob.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/SizeJob.java new file mode 100644 index 0000000000..92b2481e9e --- /dev/null +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/SizeJob.java @@ -0,0 +1,206 @@ +package com.raytheon.uf.viz.archive.data; + +import java.io.File; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; + +import com.raytheon.uf.common.archive.config.ArchiveConfigManager; +import com.raytheon.uf.common.archive.config.DisplayData; +import com.raytheon.uf.common.util.FileUtil; + +/** + * Job to determine the size for a directory and its contents on a non-UI + * thread. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Jun 13, 2013            rferrel     Initial creation
+ * 
+ * 
+ * + * @author rferrel + * @version 1.0 + */ +public class SizeJob extends Job { + + /** The queue for requested sizes. */ + private final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); + + /** + * Pending selected entries that still need to have the sizes determined. + */ + private final ConcurrentLinkedQueue selectedQueue = new ConcurrentLinkedQueue(); + + /** + * Indicates the job should stop computing the size of the current + * non-selected entry. + */ + private final AtomicBoolean stopComputeSize = new AtomicBoolean(false); + + /** + * The listeners to inform when job is done with an entry. + */ + private final List listeners = new ArrayList(); + + /** + * Constructor. + */ + public SizeJob() { + super("Size Job"); + setSystem(true); + } + + /** + * Add a Listener to inform when job has completed information on an entry. + * + * @param listener + */ + public void addUpdateListener(IUpdateListener listener) { + listeners.add(listener); + } + + /** + * Remove a listener. + * + * @param listener + */ + public void removeUpdateListener(IUpdateListener listener) { + listeners.remove(listener); + } + + /** + * Add entry to queue and if pending selected entries add them to the queue + * with same start/end times. + * + * @param fileInfo + */ + public void queue(SizeJobRequest fileInfo) { + queue.add(fileInfo); + + if (getState() == Job.NONE) { + schedule(); + } + } + + /** + * Clear queue but save selected entries still needing sizes. + */ + public void clearQueue() { + List pending = new ArrayList(); + + // Drain queue queue.removeAll() doesn't work. + while (!queue.isEmpty()) { + pending.add(queue.remove()); + } + + if (getState() != NONE) { + cancel(); + } + + // Save selected items that do not have sizes. + for (SizeJobRequest dirInfo : pending) { + DisplayData displayData = dirInfo.getDisplayData(); + + if (displayData.isSelected() && displayData.getSize() < 0L) { + if (!selectedQueue.contains(displayData)) { + selectedQueue.add(displayData); + } + } + } + } + + /** + * Requeue pending entries. + * + * @param startCal + * @param endCal + */ + public void requeueSelected(Calendar startCal, Calendar endCal) { + if (!selectedQueue.isEmpty()) { + DisplayData displayData = selectedQueue.remove(); + queue(new SizeJobRequest(displayData, startCal, endCal)); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime. + * IProgressMonitor) + */ + @Override + protected IStatus run(IProgressMonitor monitor) { + if (monitor.isCanceled()) { + return Status.OK_STATUS; + } + + ArchiveConfigManager manager = ArchiveConfigManager.getInstance(); + + mainLoop: while (!queue.isEmpty()) { + SizeJobRequest dirInfo = queue.remove(); + + stopComputeSize.set(false); + DisplayData displayData = dirInfo.displayData; + Calendar startCal = dirInfo.startCal; + Calendar endCal = dirInfo.endCal; + + List files = manager.getDisplayFiles(displayData, startCal, + endCal); + + // Size no longer needed. + if (!displayData.isSelected() && stopComputeSize.get()) { + continue; + } + + dirInfo.files.clear(); + dirInfo.files.addAll(files); + long size = 0L; + for (File file : dirInfo.files) { + + // Skip when size no longer needed. + if (!displayData.isSelected() && stopComputeSize.get()) { + continue mainLoop; + } + + if (file.isDirectory()) { + size += FileUtil.sizeOfDirectory(file); + } else { + size += file.length(); + } + } + + displayData.setSize(size); + + List list = new ArrayList(); + list.add(dirInfo); + for (IUpdateListener listener : listeners) { + listener.update(list); + } + } + + return Status.OK_STATUS; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.core.runtime.jobs.Job#canceling() + */ + @Override + protected void canceling() { + queue.clear(); + stopComputeSize.set(true); + } +} \ No newline at end of file diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/SizeJobRequest.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/SizeJobRequest.java new file mode 100644 index 0000000000..0de53cd1e8 --- /dev/null +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/data/SizeJobRequest.java @@ -0,0 +1,82 @@ +/** + * 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.viz.archive.data; + +import java.io.File; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.raytheon.uf.common.archive.config.DisplayData; + +/** + * This class obtains information on a File in a Job in order to remove it from + * the UI thread. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * May 15, 2013 1966       rferrel     Initial creation
+ * 
+ * 
+ * + * @author rferrel + * @version 1.0 + */ + +public class SizeJobRequest { + + /** Information from archive configuration manager. */ + final DisplayData displayData; + + /** Files or directories to obtain information on. */ + final List files = new ArrayList(); + + /** Start time inclusive. */ + final Calendar startCal; + + /** End time exclusive. */ + final Calendar endCal; + + /** + * Create and entry and place it on the queue. + * + * @param displayData + * @param startCal + * @param endCal + */ + public SizeJobRequest(DisplayData displayData, Calendar startCal, + Calendar endCal) { + this.displayData = displayData; + this.startCal = startCal; + this.endCal = endCal; + } + + /** + * + * @return displayData + */ + public DisplayData getDisplayData() { + return displayData; + } +} 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 1d4494800d..4b6d230b4c 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 @@ -25,6 +25,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -38,16 +42,18 @@ import org.eclipse.swt.widgets.Shell; import com.raytheon.uf.common.archive.config.ArchiveConfig; import com.raytheon.uf.common.archive.config.ArchiveConfigManager; -import com.raytheon.uf.common.archive.config.ArchiveConfigManager.DisplayData; import com.raytheon.uf.common.archive.config.CategoryConfig; +import com.raytheon.uf.common.archive.config.DisplayData; import com.raytheon.uf.common.util.SizeUtil; import com.raytheon.uf.viz.archive.data.ArchiveInfo; import com.raytheon.uf.viz.archive.data.CategoryInfo; -import com.raytheon.uf.viz.archive.data.DirInfo; import com.raytheon.uf.viz.archive.data.IArchiveTotals; +import com.raytheon.uf.viz.archive.data.IUpdateListener; +import com.raytheon.uf.viz.archive.data.SizeJob; +import com.raytheon.uf.viz.archive.data.SizeJobRequest; import com.raytheon.uf.viz.archive.ui.ArchiveTableComp.TableType; +import com.raytheon.uf.viz.core.VizApp; import com.raytheon.viz.ui.dialogs.CaveSWTDialog; -import com.raytheon.viz.ui.dialogs.ICloseCallback; /** * Abstract base class for Archive dialogs. Contains and manages information @@ -61,6 +67,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 30, 2013 1965 bgonzale Initial creation + * Jun 10, 2013 1966 rferrel Change to allow Case Creation to extend. * * * @@ -69,30 +76,35 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; */ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements - IArchiveTotals { - - private static final String UNKNOWN_SIZE_TEXT = "????MB"; + IArchiveTotals, IUpdateListener { /** Table composite that holds the table controls. */ private ArchiveTableComp tableComp; - /** Archive config combo box. */ + /** Archive configuration combo box. */ private Combo archCfgCbo; /** Category combo box. */ private Combo categoryCbo; /** Information for populating the various table displays. */ - private final Map archiveInfoMap = new HashMap(); + protected final Map archiveInfoMap = new HashMap(); - private Cursor busyCursor; + /** + * Boolean to indicate when DisplayData is created should its selection be + * set based on the information in the configuration files. + */ + protected boolean setSelect = false; + + protected TableType tableType; + + protected final SizeJob sizeJob = new SizeJob(); /** * @param parentShell */ public AbstractArchiveDlg(Shell parentShell) { super(parentShell); - setupCursor(); } /** @@ -101,7 +113,6 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements */ public AbstractArchiveDlg(Shell parentShell, int swtStyle) { super(parentShell, swtStyle); - setupCursor(); } /** @@ -111,41 +122,16 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements */ public AbstractArchiveDlg(Shell parentShell, int style, int caveStyle) { super(parentShell, style, caveStyle); - setupCursor(); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.archive.data.IArchiveTotals#getTotalSelectedItems() - */ - // @Override - public int getTotalSelectedItems() { - int totalSelected = 0; - for (ArchiveInfo archiveInfo : archiveInfoMap.values()) { - for (String categoryName : archiveInfo.getCategoryNames()) { - CategoryInfo categoryInfo = archiveInfo.get(categoryName); - for (DisplayData displayInfo : categoryInfo - .getDisplayInfoList()) { - if (displayInfo.isSelected()) { - ++totalSelected; - } - } - } - } - updateTotalSizeLabel(); - return totalSelected; } public List getAllSelected() { - List allSelected = new ArrayList(); + List allSelected = new ArrayList(); for (String archiveName : archiveInfoMap.keySet()) { ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); for (String categoryName : archiveInfo.getCategoryNames()) { CategoryInfo categoryInfo = archiveInfo.get(categoryName); for (DisplayData displayData : categoryInfo - .getDisplayInfoList()) { + .getDisplayDataList()) { if (displayData.isSelected()) { allSelected.add(displayData); } @@ -201,30 +187,6 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements return null; } - protected void updateTotalSizeLabel() { - long totalSize = 0; - for (String archiveName : archiveInfoMap.keySet()) { - ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); - for (String categoryName : archiveInfo.getCategoryNames()) { - CategoryInfo categoryInfo = archiveInfo.get(categoryName); - for (DisplayData displayData : categoryInfo - .getDisplayInfoList()) { - if (displayData.isSelected()) { - long size = displayData.getSize(); - if (size < 0) { - // Size still being computed. - setTotalSizeText(UNKNOWN_SIZE_TEXT); - return; - } else { - totalSize += size; - } - } - } - } - } - setTotalSizeText(SizeUtil.prettyByteSize(totalSize)); - } - /** * This method is called by the AbstractArchiveDlg to set the size text. * @@ -232,6 +194,8 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements */ protected abstract void setTotalSizeText(String sizeStringText); + protected abstract void setTotalSelectedItems(int totalSize); + /** * This method is called by the AbstractArchiveDlg to get the start of the * time frame that bounds the data for the dialog. @@ -248,19 +212,13 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements */ protected abstract Calendar getEnd(); - /** - * This method is called by the AbstractArchiveDlg when the combo boxes are - * updated. - */ - protected abstract void selectionsUpdated(); - /** * Create the Archive and Category combo controls. * * @param comp * Composite to put the controls in. */ - protected void createComboControls(Composite comp) { + protected Composite createComboControls(Composite comp) { Composite comboComp = new Composite(comp, SWT.NONE); GridLayout gl = new GridLayout(2, false); GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); @@ -277,9 +235,7 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements archCfgCbo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - String archiveName = archCfgCbo.getItem(archCfgCbo - .getSelectionIndex()); - populateCategoryCbo(archiveName); + archiveComboSelection(); } }); @@ -293,47 +249,68 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements categoryCbo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - String archiveName = archCfgCbo.getItem(archCfgCbo - .getSelectionIndex()); - String categoryName = categoryCbo.getItem(categoryCbo - .getSelectionIndex()); - populateTableComp(archiveName, categoryName); + categoryComboSelection(); } }); ArchiveConfigManager.getInstance().reset(); - createTable(); - populateComboBoxes(); - updateTableComp(); + return comboComp; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.ui.dialogs.CaveSWTDialog#preOpened() + */ + @Override + protected void preOpened() { + super.preOpened(); + + // Setup to display blank dialog with busy cursor while getting data. + Job job = new Job("setup") { + @Override + protected IStatus run(IProgressMonitor monitor) { + VizApp.runAsync(new Runnable() { + + @Override + public void run() { + setCursorBusy(true); + initInfo(); + populateComboBoxes(); + updateTableComp(); + } + }); + return Status.OK_STATUS; + } + }; + job.schedule(); } /** * Create the table control. */ protected void createTable() { - tableComp = new ArchiveTableComp(shell, TableType.Case, this); + tableComp = new ArchiveTableComp(shell, tableType, this); + sizeJob.addUpdateListener(this); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.ui.dialogs.CaveSWTDialogBase#disposed() + */ + @Override + protected void disposed() { + sizeJob.removeUpdateListener(this); + sizeJob.cancel(); } /** * Update table based on current item selections in archive and category. */ protected void updateTableComp() { - populateTableComp(getSelectedArchiveName(), getSelectedCategoryName()); - } - - /** - * Init busyCursor. On close, make sure that cursor reverts back to unbusy - * state if it isn't already. - */ - private void setupCursor() { - busyCursor = getParent().getDisplay().getSystemCursor(SWT.CURSOR_WAIT); - this.setCloseCallback(new ICloseCallback() { - @Override - public void dialogClosed(Object returnValue) { - setCursorBusy(false); - } - }); + populateTableComp(); } /** @@ -349,63 +326,173 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements if (doSelect) { archCfgCbo.select(0); - String archiveName = archCfgCbo.getItem(0); - populateCategoryCbo(archiveName); + archiveComboSelection(); } } + /** + * Method invoked when archive combo selection is changed. + */ + protected void archiveComboSelection() { + populateCategoryCbo(); + } + /** * Populate the category combo based on the archive name and populate the * table. * * @param archiveName */ - private void populateCategoryCbo(String archiveName) { + private void populateCategoryCbo() { + String archiveName = getSelectedArchiveName(); ArchiveConfigManager manager = ArchiveConfigManager.getInstance(); categoryCbo.removeAll(); for (String categoryName : manager.getCategoryNames(archiveName)) { categoryCbo.add(categoryName); } categoryCbo.select(0); - String categoryName = categoryCbo.getItem(0); - populateTableComp(archiveName, categoryName); + categoryComboSelection(); } - private void populateTableComp(String archiveName, String categoryName) { + /** + * Method invoked when the category combo selection is changed. + */ + protected void categoryComboSelection() { + populateTableComp(); + } + + /** + * Populates the archive/category combo boxes and obtains the display data. + */ + private void initInfo() { + ArchiveConfigManager manager = ArchiveConfigManager.getInstance(); + Calendar startCal = getStart(); + Calendar endCal = getEnd(); + String[] archiveNames = manager.getArchiveDataNamesList(); + for (String archiveName : archiveNames) { + ArchiveInfo archiveInfo = new ArchiveInfo(); + archiveInfoMap.put(archiveName, archiveInfo); + String[] categoryNames = manager.getCategoryNames(manager + .getArchive(archiveName)); + for (String categoryName : categoryNames) { + List displayDatas = manager.getDisplayData( + archiveName, categoryName, setSelect); + CategoryInfo categoryInfo = new CategoryInfo(archiveName, + categoryName, displayDatas); + archiveInfo.add(categoryInfo); + for (DisplayData displayData : displayDatas) { + if (displayData.isSelected()) { + sizeJob.queue(new SizeJobRequest(displayData, startCal, + endCal)); + } + } + } + } + } + + /** + * Populate the table based on the currently selected archive, category and + * adjust sizes on the display table. + */ + protected void populateTableComp() { + String archiveName = getSelectedArchiveName(); + String categoryName = getSelectedCategoryName(); + Calendar startCal = getStart(); + Calendar endCal = getEnd(); setCursorBusy(true); - DirInfo.clearQueue(); + sizeJob.clearQueue(); + ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); - if (archiveInfo == null) { - archiveInfo = new ArchiveInfo(); - archiveInfoMap.put(archiveName, archiveInfo); - } - CategoryInfo categoryInfo = archiveInfo.get(categoryName); - if (categoryInfo == null) { - ArchiveConfigManager manager = ArchiveConfigManager.getInstance(); - List displayInfos = manager.getDisplayInfo( - archiveName, categoryName); - categoryInfo = new CategoryInfo(archiveName, categoryName, - displayInfos); - archiveInfo.add(categoryInfo); - } - for (DisplayData displayInfo : categoryInfo.getDisplayInfoList()) { - new DirInfo(displayInfo, getStart(), getEnd()); + for (DisplayData displayData : categoryInfo.getDisplayDataList()) { + sizeJob.queue(new SizeJobRequest(displayData, startCal, endCal)); } + sizeJob.requeueSelected(startCal, endCal); - tableComp.populateTable(categoryInfo.getDisplayInfoList()); - selectionsUpdated(); + tableComp.populateTable(categoryInfo.getDisplayDataList()); setCursorBusy(false); } - private void setCursorBusy(boolean state) { + /** + * Set the shells cursor to the desire state. + * + * @param state + */ + protected void setCursorBusy(boolean state) { Cursor cursor = null; if (state) { - cursor = busyCursor; + cursor = shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT); } shell.setCursor(cursor); } + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.archive.data.IArchiveTotals#updateTotals(java.util + * .List) + */ + @Override + public void updateTotals(List displayDatas) { + long totalSize = 0; + int totalSelected = 0; + + for (String archiveName : archiveInfoMap.keySet()) { + ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); + for (String categoryName : archiveInfo.getCategoryNames()) { + CategoryInfo categoryInfo = archiveInfo.get(categoryName); + for (DisplayData displayData : categoryInfo + .getDisplayDataList()) { + if (displayData.isSelected()) { + ++totalSelected; + if (totalSize != DisplayData.UNKNOWN_SIZE) { + long size = displayData.getSize(); + if (size >= 0) { + totalSize += size; + } else { + totalSize = DisplayData.UNKNOWN_SIZE; + } + } + } + } + } + } + + String sizeMsg = null; + if (totalSize == DisplayData.UNKNOWN_SIZE) { + sizeMsg = DisplayData.UNKNOWN_SIZE_LABEL; + } else { + sizeMsg = SizeUtil.prettyByteSize(totalSize); + } + + setTotalSizeText(sizeMsg); + setTotalSelectedItems(totalSelected); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.archive.data.IUpdateListener#update(java.util.List) + */ + @Override + public void update(List dirInfos) { + final List displayDatas = new ArrayList( + dirInfos.size()); + for (SizeJobRequest request : dirInfos) { + displayDatas.add(request.getDisplayData()); + } + + VizApp.runAsync(new Runnable() { + + @Override + public void run() { + tableComp.updateSize(displayDatas); + updateTotals(null); + } + }); + } } diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveRetentionDlg.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveRetentionDlg.java index d7c0f221a6..ede4850344 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveRetentionDlg.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveRetentionDlg.java @@ -20,6 +20,7 @@ package com.raytheon.uf.viz.archive.ui; import java.util.Calendar; +import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; @@ -34,12 +35,10 @@ import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Spinner; -import com.raytheon.uf.common.archive.config.ArchiveConfig; import com.raytheon.uf.common.archive.config.ArchiveConfigManager; -import com.raytheon.uf.common.archive.config.CategoryConfig; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.archive.config.DisplayData; import com.raytheon.uf.viz.archive.data.IArchiveTotals; +import com.raytheon.uf.viz.archive.ui.ArchiveTableComp.TableType; /** * Archive retention dialog. @@ -52,6 +51,7 @@ import com.raytheon.uf.viz.archive.data.IArchiveTotals; * ------------ ---------- ----------- -------------------------- * May 23, 2013 #1964 lvenable Initial creation * May 31, 2013 #1965 bgonzale Initial work for updating retention configurations. + * Jun 10, 2013 #1966 rferrel Implemented hooks to get display and save to work. * * * @@ -61,12 +61,17 @@ import com.raytheon.uf.viz.archive.data.IArchiveTotals; public class ArchiveRetentionDlg extends AbstractArchiveDlg implements IArchiveTotals { - private final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(ArchiveRetentionDlg.class); + /** Current Archive/Category selection's minimum retention hours. */ + private RetentionHours minRetention; - private Spinner minRetentionSpnr; + /** Current Archive/Category selection's extended retention hours. */ + private RetentionHours extRetention; - private Spinner extRetentionSpnr; + /** Displays the total number of selected items for all tables. */ + private Label totalSelectedItems; + + /** Displays the total size of selected items. */ + private Label totalSizeLbl; // TODO in the future, get this value from a user text box protected static final String ARCHIVE_DIR = "/archive_dir"; @@ -80,6 +85,8 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements public ArchiveRetentionDlg(Shell parentShell) { super(parentShell, SWT.DIALOG_TRIM | SWT.MIN, CAVE.DO_NOT_BLOCK | CAVE.MODE_INDEPENDENT | CAVE.INDEPENDENT_SHELL); + this.setSelect = true; + this.tableType = TableType.Retention; } @Override @@ -100,6 +107,8 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements gl.marginWidth = 0; gl.horizontalSpacing = 0; mainComp.setLayout(gl); + ArchiveConfigManager.getInstance().reset(); + init(); } @@ -110,7 +119,6 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements createRetentionControls(); GuiUtil.addSeparator(shell, SWT.HORIZONTAL); createBottomActionButtons(); - selectionsUpdated(); } /** @@ -118,7 +126,7 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements */ private void createRetentionControls() { Composite retentionComp = new Composite(shell, SWT.NONE); - GridLayout gl = new GridLayout(5, false); + GridLayout gl = new GridLayout(2, false); GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); retentionComp.setLayout(gl); retentionComp.setLayoutData(gd); @@ -127,6 +135,7 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements * Top row of controls. */ createComboControls(retentionComp); + createTable(); // composite for retention time selection Composite selectionComp = new Composite(retentionComp, SWT.NONE); @@ -141,38 +150,27 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements minRetentionLbl.setLayoutData(gd); gd = new GridData(60, SWT.DEFAULT); - minRetentionSpnr = new Spinner(selectionComp, SWT.BORDER); + Spinner minRetentionSpnr = new Spinner(selectionComp, SWT.BORDER); minRetentionSpnr.setIncrement(1); minRetentionSpnr.setPageIncrement(5); minRetentionSpnr.setMaximum(Integer.MAX_VALUE); minRetentionSpnr.setMinimum(1); minRetentionSpnr.setLayoutData(gd); - final Combo minRetentionCbo = new Combo(selectionComp, SWT.VERTICAL + Combo minRetentionCbo = new Combo(selectionComp, SWT.VERTICAL | SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY); - minRetentionCbo.addSelectionListener(new SelectionAdapter() { + minRetention = new RetentionHours(1, minRetentionSpnr, minRetentionCbo) { + @Override - public void widgetSelected(SelectionEvent e) { - int retentionHours = handleRetentionSelection(minRetentionCbo, - minRetentionSpnr); - if (retentionHours != -1) { - ArchiveConfig archive = getSelectedArchive(); - if (archive != null) { - archive.setRetentionHours(retentionHours); - } - } + protected void handleTimeSelection() { + super.handleTimeSelection(); + getSelectedArchive().setRetentionHours(getHours()); } - }); - minRetentionCbo.add("Hours"); - minRetentionCbo.add("Days"); - minRetentionCbo.select(0); - minRetentionCbo.setData(minRetentionCbo.getItem(minRetentionCbo - .getSelectionIndex())); + }; /* * Bottom row of controls. */ - gd = new GridData(); gd.horizontalIndent = 20; Label extRetentionLbl = new Label(selectionComp, SWT.NONE); @@ -180,33 +178,23 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements extRetentionLbl.setLayoutData(gd); gd = new GridData(60, SWT.DEFAULT); - extRetentionSpnr = new Spinner(selectionComp, SWT.BORDER); + Spinner extRetentionSpnr = new Spinner(selectionComp, SWT.BORDER); extRetentionSpnr.setIncrement(1); extRetentionSpnr.setPageIncrement(5); extRetentionSpnr.setMaximum(Integer.MAX_VALUE); - extRetentionSpnr.setMinimum(1); + extRetentionSpnr.setMinimum(0); extRetentionSpnr.setLayoutData(gd); - final Combo extRetentionCbo = new Combo(selectionComp, SWT.VERTICAL + Combo extRetentionCbo = new Combo(selectionComp, SWT.VERTICAL | SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY); - extRetentionCbo.addSelectionListener(new SelectionAdapter() { + extRetention = new RetentionHours(1, extRetentionSpnr, extRetentionCbo) { + @Override - public void widgetSelected(SelectionEvent e) { - int retentionHours = handleRetentionSelection(extRetentionCbo, - extRetentionSpnr); - if (retentionHours != -1) { - CategoryConfig category = getSelectedCategory(); - if (category != null) { - category.setRetentionHours(retentionHours); - } - } + protected void handleTimeSelection() { + super.handleTimeSelection(); + getSelectedCategory().setRetentionHours(getHours()); } - }); - extRetentionCbo.add("Hours"); - extRetentionCbo.add("Days"); - extRetentionCbo.select(0); - extRetentionCbo.setData(extRetentionCbo.getItem(extRetentionCbo - .getSelectionIndex())); + }; } /** @@ -215,32 +203,31 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements private void createBottomActionButtons() { Composite actionControlComp = new Composite(shell, SWT.NONE); - GridLayout gl = new GridLayout(3, false); + GridLayout gl = new GridLayout(2, false); GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); actionControlComp.setLayout(gl); actionControlComp.setLayoutData(gd); - Button calcSizeBtn = new Button(actionControlComp, SWT.PUSH); - calcSizeBtn.setText(" Calculate Sizes "); - calcSizeBtn.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - // TODO : add calculate size functionality - // With Roger's automated size calculation code, this doesn't - // seem relevant unless it is for calculating compressed size - } - }); + // TODO - For the future ? + // Button calcSizeBtn = new Button(actionControlComp, SWT.PUSH); + // calcSizeBtn.setText(" Calculate Sizes "); + // calcSizeBtn.addSelectionListener(new SelectionAdapter() { + // @Override + // public void widgetSelected(SelectionEvent e) { + // // TODO : add calculate size functionality + // // With Roger's automated size calculation code, this doesn't + // // seem relevant unless it is for calculating compressed size + // } + // }); Button saveBtn = new Button(actionControlComp, SWT.PUSH); - saveBtn.setText(" Save... "); + saveBtn.setText(" Save "); saveBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent selectionEvent) { ArchiveConfigManager manager = ArchiveConfigManager .getInstance(); - // TODO - // List allSelected = getAllSelected(); - // manager.save(); + manager.save(); } }); @@ -256,58 +243,32 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements }); } - /** - * Handle the retention selection for both minimum and extended retention. + /* + * (non-Javadoc) * - * @param comboBox - * Retention combo box. - * @param spinner - * Retention spinner. - * @return hours entered if changed; -1 if not changed + * @see + * com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#setTotalSizeText(java + * .lang.String) */ - private int handleRetentionSelection(Combo comboBox, Spinner spinner) { - // If the selection didn't change then just return. - if (comboBox.getItem(comboBox.getSelectionIndex()).equals( - (String) comboBox.getData())) { - return -1; - } - - int time = 0; - - if (comboBox.getItem(comboBox.getSelectionIndex()).equals("Hours")) { - time = convertTime(true, spinner.getSelection()); - } else { - time = convertTime(false, spinner.getSelection()); - } - - spinner.setSelection(time); - comboBox.setData(comboBox.getItem(comboBox.getSelectionIndex())); - return time; - } - - /** - * Covert time from either hours to days or days to hours. - * - * @param daysToHours - * Flag indicating how to convert the time. - * @param time - * Time to be converted. - * @return The converted time. - */ - private int convertTime(boolean daysToHours, int time) { - int convertedTime = 0; - - if (daysToHours) { - convertedTime = time * 24; - } else { - convertedTime = time / 24; - } - return convertedTime; - } - @Override protected void setTotalSizeText(String sizeStringText) { - // TODO Auto-generated method stub + if (totalSizeLbl != null && !totalSizeLbl.isDisposed()) { + totalSizeLbl.setText(sizeStringText); + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#setTotalSelectedItems + * (int) + */ + @Override + protected void setTotalSelectedItems(int totalSize) { + if (totalSelectedItems != null && !totalSelectedItems.isDisposed()) { + totalSelectedItems.setText("" + totalSize); + } } /* @@ -332,23 +293,45 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg implements return null; } + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#updateTotals(java.util + * .List) + */ @Override - public void updateTotals() { - ArchiveConfig archive = getSelectedArchive(); - if (archive != null) { - if (minRetentionSpnr != null) { - minRetentionSpnr.setSelection(archive.getRetentionHours()); - CategoryConfig category = getSelectedCategory(); - if (category != null) { - extRetentionSpnr.setSelection(category.getRetentionHours()); - } + public void updateTotals(List displayDatas) { + super.updateTotals(displayDatas); + if (displayDatas != null) { + for (DisplayData displayData : displayDatas) { + displayData.updateCategory(); } } } + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#archiveComboSelection() + */ @Override - protected void selectionsUpdated() { - // Not used. + protected void archiveComboSelection() { + super.archiveComboSelection(); + minRetention.setHours(getSelectedArchive().getRetentionHours()); } + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#categoryComboSelection + * () + */ + @Override + protected void categoryComboSelection() { + super.categoryComboSelection(); + extRetention.setHours(getSelectedCategory().getRetentionHours()); + } } diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveTableComp.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveTableComp.java index b8e452b2f0..4bcdc1c3c3 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveTableComp.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/ArchiveTableComp.java @@ -19,6 +19,7 @@ **/ package com.raytheon.uf.viz.archive.ui; +import java.util.ArrayList; import java.util.List; import org.eclipse.swt.SWT; @@ -37,7 +38,7 @@ import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; -import com.raytheon.uf.common.archive.config.ArchiveConfigManager.DisplayData; +import com.raytheon.uf.common.archive.config.DisplayData; import com.raytheon.uf.common.util.SizeUtil; import com.raytheon.uf.viz.archive.data.IArchiveTotals; @@ -59,8 +60,8 @@ import com.raytheon.uf.viz.archive.data.IArchiveTotals; */ public class ArchiveTableComp extends Composite { - /** Key for getting Display Information state. */ - private final String DISPLAY_INFO_KEY = "displayInfo"; + /** Key for getting Display Data. */ + private final String DISPLAY_DATA_KEY = "displayData"; /** Table control. */ private Table table; @@ -80,9 +81,10 @@ public class ArchiveTableComp extends Composite { }; /** Current table type. */ - private TableType tableType = TableType.Retention; + private final TableType type; - private IArchiveTotals iArchiveTotals; + /** Allows the parent dialog log to update other total displays. */ + private final IArchiveTotals iArchiveTotals; /** * Constructor. @@ -96,7 +98,7 @@ public class ArchiveTableComp extends Composite { IArchiveTotals iTotalSelectedSize) { super(parent, 0); - tableType = type; + this.type = type; this.iArchiveTotals = iTotalSelectedSize; init(); } @@ -114,9 +116,10 @@ public class ArchiveTableComp extends Composite { this.setLayoutData(gd); createTable(); - createTableLabels(); - updateSelectionLabels(); + if (type != TableType.Retention) { + createTableLabels(); + } } /** @@ -138,9 +141,9 @@ public class ArchiveTableComp extends Composite { pathColumn.setText("Label"); TableColumn sizeColumn = new TableColumn(table, SWT.CENTER); - if (tableType == TableType.Retention) { + if (type == TableType.Retention) { sizeColumn.setText("Current Size"); - } else if (tableType == TableType.Case) { + } else if (type == TableType.Case) { sizeColumn.setText("Size"); } @@ -159,7 +162,9 @@ public class ArchiveTableComp extends Composite { table.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - updateSelectionLabels(); + if (e.detail == SWT.CHECK) { + updateSelectionLabels(); + } } }); } @@ -190,15 +195,17 @@ public class ArchiveTableComp extends Composite { TableItem[] itemArray = table.getItems(); int count = 0; long tableTotalSize = 0; + List displayDatas = new ArrayList( + itemArray.length); for (TableItem ti : itemArray) { - DisplayData displayInfo = (DisplayData) ti - .getData(DISPLAY_INFO_KEY); + DisplayData displayData = (DisplayData) ti + .getData(DISPLAY_DATA_KEY); if (ti.getChecked()) { ++count; - displayInfo.setSelected(true); + displayData.setSelected(true); if (tableTotalSize >= 0) { - long diSize = displayInfo.getSize(); + long diSize = displayData.getSize(); if (diSize < 0) { tableTotalSize = diSize; } else { @@ -206,18 +213,21 @@ public class ArchiveTableComp extends Composite { } } } else { - displayInfo.setSelected(false); + displayData.setSelected(false); } + displayDatas.add(displayData); } - selectedLbl.setText("Table Selected Items: " + count); + if (selectedLbl != null) { + selectedLbl.setText("Table Selected Items: " + count); - String sizeString = DisplayData.UNKNOWN_SIZE_LABEL; - if (tableTotalSize >= 0) { - sizeString = SizeUtil.prettyByteSize(tableTotalSize); + String sizeString = DisplayData.UNKNOWN_SIZE_LABEL; + if (tableTotalSize >= 0) { + sizeString = SizeUtil.prettyByteSize(tableTotalSize); + } + sizeLbl.setText("Table Selected Size: " + sizeString); } - sizeLbl.setText("Table Selected Size: " + sizeString); - iArchiveTotals.updateTotals(); + iArchiveTotals.updateTotals(displayDatas); } /** @@ -283,7 +293,6 @@ public class ArchiveTableComp extends Composite { */ private void handleCheckSelectedRow(boolean check) { TableItem[] itemArray = table.getSelection(); - System.out.println("handleCheckSelectedRow: " + check); for (TableItem ti : itemArray) { ti.setChecked(check); } @@ -307,12 +316,12 @@ public class ArchiveTableComp extends Composite { updateSelectionLabels(); } - public void updateSize(List displayInfos) { + public void updateSize(List displayDatas) { TableItem[] itemArray = table.getItems(); - for (DisplayData displayInfo : displayInfos) { + for (DisplayData displayData : displayDatas) { for (TableItem ti : itemArray) { - if (displayInfo.equals(ti.getData(DISPLAY_INFO_KEY))) { + if (displayData.equals(ti.getData(DISPLAY_DATA_KEY))) { setItemSize(ti); } } @@ -325,15 +334,15 @@ public class ArchiveTableComp extends Composite { * TODO : this is just for display purposes. This will go away when the * functionality is implemented. */ - protected void populateTable(List displayInfoArray) { + protected void populateTable(List displayDataArray) { table.removeAll(); - for (DisplayData displayInfo : displayInfoArray) { + for (DisplayData displayData : displayDataArray) { TableItem item = new TableItem(table, SWT.NONE); - item.setData(DISPLAY_INFO_KEY, displayInfo); - item.setChecked(displayInfo.isSelected()); - item.setText(0, displayInfo.getDisplayLabel()); + item.setData(DISPLAY_DATA_KEY, displayData); + item.setChecked(displayData.isSelected()); + item.setText(0, displayData.getDisplayLabel()); - item.setChecked(displayInfo.isSelected()); + item.setChecked(displayData.isSelected()); setItemSize(item); } for (int i = 0; i < 2; i++) { @@ -345,8 +354,13 @@ public class ArchiveTableComp extends Composite { updateSelectionLabels(); } + /** + * Update table items size column. + * + * @param item + */ private void setItemSize(TableItem item) { - long size = ((DisplayData) item.getData(DISPLAY_INFO_KEY)).getSize(); + long size = ((DisplayData) item.getData(DISPLAY_DATA_KEY)).getSize(); if (size < 0L) { item.setText(1, DisplayData.UNKNOWN_SIZE_LABEL); } else { diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/CaseCreationDlg.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/CaseCreationDlg.java index ce9d5bfba9..eb39bdc72c 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/CaseCreationDlg.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/CaseCreationDlg.java @@ -24,9 +24,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; @@ -35,7 +33,6 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; @@ -52,18 +49,17 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Spinner; import com.raytheon.uf.common.archive.config.ArchiveConfigManager; -import com.raytheon.uf.common.archive.config.ArchiveConfigManager.DisplayData; +import com.raytheon.uf.common.archive.config.DisplayData; import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.common.util.SizeUtil; import com.raytheon.uf.viz.archive.data.ArchiveInfo; import com.raytheon.uf.viz.archive.data.CategoryInfo; -import com.raytheon.uf.viz.archive.data.DirInfo; import com.raytheon.uf.viz.archive.data.IArchiveTotals; import com.raytheon.uf.viz.archive.data.IUpdateListener; +import com.raytheon.uf.viz.archive.data.SizeJobRequest; import com.raytheon.uf.viz.archive.ui.ArchiveTableComp.TableType; import com.raytheon.uf.viz.core.VizApp; import com.raytheon.viz.ui.dialogs.AwipsCalendar; -import com.raytheon.viz.ui.dialogs.CaveSWTDialog; import com.raytheon.viz.ui.dialogs.ICloseCallback; /** @@ -76,18 +72,17 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * May 23, 2013 #1964 lvenable Initial creation + * May 23, 2013 #1964 lvenable Initial creation + * Jun 10, 2013 #1966 rferrel Implemented back in hooks for display + * and generation of cases. * * * * @author lvenable * @version 1.0 */ -public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, - IUpdateListener { - - /** Table control */ - private ArchiveTableComp tableComp; +public class CaseCreationDlg extends AbstractArchiveDlg implements + IArchiveTotals, IUpdateListener { /** Start time label. */ private Label startTimeLbl; @@ -101,12 +96,6 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, /** End date. */ private Date endDate; - /** Archive configuration combo box. */ - private Combo archCfgCbo; - - /** Category combo box. */ - private Combo categoryCbo; - /** Action to bring up the case name dialog. */ private Button caseNameCreate; @@ -150,9 +139,6 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, /** Archive configuration manager */ private ArchiveConfigManager manager = ArchiveConfigManager.getInstance(); - /** Information for populating the various table displays. */ - private final Map archiveInfoMap = new HashMap(); - /** Number of selected items. */ private int selectedItemsSize = 0; @@ -165,8 +151,15 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, public CaseCreationDlg(Shell parentShell) { super(parentShell, SWT.DIALOG_TRIM | SWT.MIN, CAVE.DO_NOT_BLOCK | CAVE.MODE_INDEPENDENT | CAVE.INDEPENDENT_SHELL); + this.setSelect = false; + this.tableType = TableType.Case; } + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.ui.dialogs.CaveSWTDialogBase#constructShellLayout() + */ @Override protected Layout constructShellLayout() { // Create the main layout for the shell. @@ -177,6 +170,13 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, return mainLayout; } + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.ui.dialogs.CaveSWTDialogBase#initializeComponents(org + * .eclipse.swt.widgets.Shell) + */ @Override protected void initializeComponents(Shell shell) { setText("Archive Case Creation"); @@ -192,16 +192,10 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, init(); } - @Override - protected void disposed() { - DirInfo.removeUpdateListener(this); - } - /** * Initialize method to create all of the composite & controls. */ private void init() { - DirInfo.addUpdateListener(this); createTimeControls(); GuiUtil.addSeparator(shell, SWT.HORIZONTAL); createCaseCompressionControls(); @@ -210,8 +204,6 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, createTable(); GuiUtil.addSeparator(shell, SWT.HORIZONTAL); createBottomActionButtons(); - - populateComboBoxes(); } /** @@ -276,46 +268,15 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, createCompressionControls(caseCompressionComp); } - /** - * Create the Archive and Category combo controls. + /* + * (non-Javadoc) * - * @param comp - * Composite to put the controls in. + * @see + * com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#createComboControls + * (org.eclipse.swt.widgets.Composite) */ - private void createComboControls(Composite comp) { - Composite comboComp = new Composite(comp, SWT.NONE); - GridLayout gl = new GridLayout(2, false); - GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); - comboComp.setLayout(gl); - comboComp.setLayoutData(gd); - - Label archCfgLbl = new Label(comboComp, SWT.NONE); - archCfgLbl.setText("Archive Config: "); - - gd = new GridData(200, SWT.DEFAULT); - archCfgCbo = new Combo(comboComp, SWT.VERTICAL | SWT.DROP_DOWN - | SWT.BORDER | SWT.READ_ONLY); - archCfgCbo.setLayoutData(gd); - archCfgCbo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - populateCategoryCbo(getSelectedArchiveName()); - } - }); - - Label catLbl = new Label(comboComp, SWT.NONE); - catLbl.setText("Category: "); - - gd = new GridData(200, SWT.DEFAULT); - categoryCbo = new Combo(comboComp, SWT.VERTICAL | SWT.DROP_DOWN - | SWT.BORDER | SWT.READ_ONLY); - categoryCbo.setLayoutData(gd); - categoryCbo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - populateTableComp(); - } - }); + protected Composite createComboControls(Composite comp) { + Composite comboComp = super.createComboControls(comp); caseNameCreate = new Button(comboComp, SWT.PUSH); caseNameCreate.setText(" Case Name... "); @@ -328,9 +289,10 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, }); caseNameCreate.setToolTipText("Must first select \"Case Location\"."); - gd = new GridData(SWT.FILL, SWT.CENTER, true, false); + GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); caseNameLbl = new Label(comboComp, SWT.BORDER); caseNameLbl.setLayoutData(gd); + return comboComp; } /** @@ -423,6 +385,9 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, handleFileSizeChangeSelection(); } }); + fileSizeCbo.add("MB"); + fileSizeCbo.add("GB"); + fileSizeCbo.select(0); } /** @@ -460,13 +425,6 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, locationStateLbl.setLayoutData(gd); } - /** - * Create the table control. - */ - private void createTable() { - tableComp = new ArchiveTableComp(shell, TableType.Case, this); - } - /** * Create the bottom action buttons. */ @@ -478,15 +436,16 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, actionControlComp.setLayout(gl); actionControlComp.setLayoutData(gd); - Button exportBtn = new Button(actionControlComp, SWT.PUSH); - exportBtn.setText(" Export Case Config... "); - exportBtn.addSelectionListener(new SelectionAdapter() { - - @Override - public void widgetSelected(SelectionEvent e) { - - } - }); + // TODO - Future implementation. + // Button exportBtn = new Button(actionControlComp, SWT.PUSH); + // exportBtn.setText(" Export Case Config... "); + // exportBtn.addSelectionListener(new SelectionAdapter() { + // + // @Override + // public void widgetSelected(SelectionEvent e) { + // + // } + // }); generateBtn = new Button(actionControlComp, SWT.PUSH); generateBtn.setText(" Generate "); @@ -514,14 +473,11 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, * Display modal dialog that performs the Generation of the case. */ private void generateCase() { - setBusy(true); + setCursorBusy(true); File targetDir = (File) locationLbl.getData(); File caseDir = (File) caseNameLbl.getData(); - // TODO investigate using just Date or long values for start/end - Calendar startCal = TimeUtil.newCalendar(); - startCal.setTimeInMillis(startDate.getTime()); - Calendar endCal = TimeUtil.newCalendar(); - endCal.setTimeInMillis(endDate.getTime()); + Calendar startCal = getStart(); + Calendar endCal = getEnd(); List displayDatas = getSelectedData(); boolean doCompress = compressChk.getSelection(); @@ -549,7 +505,7 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, @Override public void dialogClosed(Object returnValue) { - setBusy(false); + setCursorBusy(false); } }); dialog.open(); @@ -791,170 +747,12 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, return str; } - /** - * Initial set up of the combo boxes. - */ - private void populateComboBoxes() { - boolean doSelect = false; - for (String archiveName : manager.getArchiveDataNamesList()) { - archCfgCbo.add(archiveName); - doSelect = true; - } - - if (doSelect) { - archCfgCbo.select(0); - String archiveName = archCfgCbo.getItem(0); - populateCategoryCbo(archiveName); - } - - fileSizeCbo.add("MB"); - fileSizeCbo.add("GB"); - fileSizeCbo.select(0); - fileSizeCbo - .setData(fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex())); + protected void setTotalSizeText(String text) { + uncompressSizeLbl.setText(text); } - /** - * Populate the category combo based on the archive name and populate the - * table. - * - * @param archiveName - */ - private void populateCategoryCbo(String archiveName) { - categoryCbo.removeAll(); - for (String categoryName : manager.getCategoryNames(archiveName)) { - categoryCbo.add(categoryName); - } - categoryCbo.select(0); - populateTableComp(); - } - - private void populateTableComp() { - String archiveName = getSelectedArchiveName(); - String categoryName = getSelectedCategoryName(); - setBusy(true); - DirInfo.clearQueue(); - ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); - if (archiveInfo == null) { - archiveInfo = new ArchiveInfo(); - archiveInfoMap.put(archiveName, archiveInfo); - } - - CategoryInfo categoryInfo = archiveInfo.get(categoryName); - if (categoryInfo == null) { - List displayInfos = manager.getDisplayInfo( - archiveName, categoryName); - categoryInfo = new CategoryInfo(archiveName, categoryName, - displayInfos); - archiveInfo.add(categoryInfo); - } - - // TODO investigate using just Date or long values for start/end - Calendar startCal = TimeUtil.newCalendar(); - startCal.setTimeInMillis(startDate.getTime()); - Calendar endCal = TimeUtil.newCalendar(); - endCal.setTimeInMillis(endDate.getTime()); - List recomputList = new ArrayList(); - for (DisplayData displayInfo : categoryInfo.getDisplayInfoList()) { - // Queue unknown sizes first - if (displayInfo.getSize() < 0L) { - new DirInfo(displayInfo, startCal, endCal); - } else { - recomputList.add(displayInfo); - } - } - - // Recompute sizes - for (DisplayData displayData : recomputList) { - new DirInfo(displayData, startCal, endCal); - } - - tableComp.populateTable(categoryInfo.getDisplayInfoList()); - updateTotals(); - setBusy(false); - } - - private void setBusy(boolean state) { - Cursor cursor = null; - if (state) { - cursor = getDisplay().getSystemCursor(SWT.CURSOR_WAIT); - } - shell.setCursor(cursor); - } - - @Override - public void update(List dirInfos) { - final List displayInfos = new ArrayList(); - for (DirInfo dirInfo : dirInfos) { - displayInfos.add(dirInfo.getDisplayInfo()); - } - - VizApp.runAsync(new Runnable() { - - @Override - public void run() { - tableComp.updateSize(displayInfos); - updateTotals(); - } - }); - } - - /** - * Obtain the selected archive name. - * - * @return archiveName - */ - private String getSelectedArchiveName() { - return archCfgCbo.getItem(archCfgCbo.getSelectionIndex()); - } - - /** - * Obtain the selected category name. - * - * @return categoryName - */ - private String getSelectedCategoryName() { - return categoryCbo.getItem(categoryCbo.getSelectionIndex()); - } - - /** - * Updates the estimated uncompressed size of selected entries. - */ - public void updateTotals() { - long totalSize = 0; - int totalSelected = 0; - boolean unknownSize = false; - - for (String archiveName : archiveInfoMap.keySet()) { - ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); - for (String categoryName : archiveInfo.getCategoryNames()) { - CategoryInfo categoryInfo = archiveInfo.get(categoryName); - for (DisplayData displayData : categoryInfo - .getDisplayInfoList()) { - if (displayData.isSelected()) { - ++totalSelected; - if (!unknownSize) { - long size = displayData.getSize(); - if (size >= 0) { - totalSize += size; - } else { - unknownSize = true; - } - } - } - } - } - } - + protected void setTotalSelectedItems(int totalSelected) { selectedItemsSize = totalSelected; - String sizeMsg = null; - if (unknownSize) { - sizeMsg = DisplayData.UNKNOWN_SIZE_LABEL; - } else { - sizeMsg = SizeUtil.prettyByteSize(totalSize); - } - - uncompressSizeLbl.setText(sizeMsg); totalSelectedItemsLbl.setText("" + totalSelected); checkGenerateButton(); } @@ -964,13 +762,13 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, * display table and and other selected entries. */ private void resetSizes() { - List selectedDatas = new ArrayList(); + List selectedDatas = new ArrayList(); for (String archiveName : archiveInfoMap.keySet()) { ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); for (String categoryName : archiveInfo.getCategoryNames()) { CategoryInfo categoryInfo = archiveInfo.get(categoryName); for (DisplayData displayData : categoryInfo - .getDisplayInfoList()) { + .getDisplayDataList()) { displayData.setSize(DisplayData.UNKNOWN_SIZE); if (displayData.isSelected()) { selectedDatas.add(displayData); @@ -984,15 +782,14 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, if (selectedDatas.size() > 0) { String archiveName = getSelectedArchiveName(); String categoryName = getSelectedCategoryName(); - Calendar startCal = TimeUtil.newCalendar(); - startCal.setTimeInMillis(startDate.getTime()); - Calendar endCal = TimeUtil.newCalendar(); - startCal.setTimeInMillis(endDate.getTime()); + Calendar startCal = getStart(); + Calendar endCal = getEnd(); for (DisplayData displayData : selectedDatas) { if (!displayData.isArchive(archiveName) || !displayData.isCategory(categoryName)) { - new DirInfo(displayData, startCal, endCal); + sizeJob.queue(new SizeJobRequest(displayData, startCal, + endCal)); } } } @@ -1005,13 +802,13 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, * @return selectedDatas */ private List getSelectedData() { - List selectedDatas = new ArrayList(); + List selectedDatas = new ArrayList(); for (String archiveName : archiveInfoMap.keySet()) { ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); for (String categoryName : archiveInfo.getCategoryNames()) { CategoryInfo categoryInfo = archiveInfo.get(categoryName); for (DisplayData displayData : categoryInfo - .getDisplayInfoList()) { + .getDisplayDataList()) { if (displayData.isSelected()) { selectedDatas.add(displayData); } @@ -1020,4 +817,28 @@ public class CaseCreationDlg extends CaveSWTDialog implements IArchiveTotals, } return selectedDatas; } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#getStart() + */ + // @Override + protected Calendar getStart() { + Calendar startCal = TimeUtil.newCalendar(); + startCal.setTimeInMillis(startDate.getTime()); + return startCal; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#getEnd() + */ + // @Override + protected Calendar getEnd() { + Calendar endCal = TimeUtil.newCalendar(); + endCal.setTimeInMillis(endDate.getTime()); + return endCal; + } } diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/GenerateCaseDlg.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/GenerateCaseDlg.java index 0115e9032d..434ff7b8af 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/GenerateCaseDlg.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/GenerateCaseDlg.java @@ -45,7 +45,7 @@ import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; import com.raytheon.uf.common.archive.config.ArchiveConfigManager; -import com.raytheon.uf.common.archive.config.ArchiveConfigManager.DisplayData; +import com.raytheon.uf.common.archive.config.DisplayData; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/RetentionHours.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/RetentionHours.java new file mode 100644 index 0000000000..95037cde75 --- /dev/null +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/RetentionHours.java @@ -0,0 +1,188 @@ +/** + * 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.viz.archive.ui; + +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Spinner; + +import com.raytheon.uf.common.time.util.TimeUtil; + +/** + * Convenience class for taking retention hours and converting to days/hours. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * May 2, 2013  1966       rferrel     Initial creation
+ * 
+ * 
+ * + * @author rferrel + * @version 1.0 + */ + +public class RetentionHours { + + /** Minimum value for the spinner. */ + private final int minUnit; + + /** The retention hours. */ + private int retentionHours; + + /** Spinner for the time assume hours or days. */ + private Spinner timeSpnr; + + /** Combo box assume to determine use of Hours or Days. */ + private Combo timeUnitCombo; + + /** + * Constructor with default 7 day retention. + */ + public RetentionHours(int minUnit, Spinner timeSpnr, Combo timeUnitCombo) { + this.minUnit = minUnit; + this.timeSpnr = timeSpnr; + this.timeUnitCombo = timeUnitCombo; + init(); + } + + /** + * Set up Listeners on the combo boxes for time conversion. + */ + private void init() { + timeSpnr.setMinimum(minUnit); + timeSpnr.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + handleTimeSelection(); + } + }); + + timeUnitCombo.removeAll(); + timeUnitCombo.add("Hours"); + timeUnitCombo.add("Days"); + timeUnitCombo.select(0); + + timeUnitCombo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + handleTimeUnitSelection(); + handleTimeSelection(); + } + }); + timeUnitCombo.setData(timeUnitCombo.getItem(timeUnitCombo + .getSelectionIndex())); + } + + /** + * Get retention in hours. + * + * @return + */ + public int getHours() { + return retentionHours; + } + + /** + * Set number hours of retention. + * + * @param hours + */ + public void setHours(int hours) { + if (hours < minUnit) { + hours = minUnit; + } + + retentionHours = hours; + int time = retentionHours; + if (timeUnitCombo.getItem(timeUnitCombo.getSelectionIndex()).equals( + "Days")) { + time /= TimeUtil.HOURS_PER_DAY; + } + + timeSpnr.setSelection(time); + + // Based on the time unit retentionHours and GUI may need updating. + handleTimeSelection(); + } + + /** + * Handle the retention selection for both minimum and extended retention. + * + * @param timeUnitCombo + * Retention combo box. + * @param timeSpinner + * Retention spinner. + * @return hours entered if changed; -1 if not changed + */ + private void handleTimeUnitSelection() { + int time = 0; + + if (timeUnitCombo.getItem(timeUnitCombo.getSelectionIndex()).equals( + "Hours")) { + time = convertTime(true, timeSpnr.getSelection()); + } else { + time = convertTime(false, timeSpnr.getSelection()); + } + + timeSpnr.setSelection(time); + timeUnitCombo.setData(timeUnitCombo.getItem(timeUnitCombo + .getSelectionIndex())); + } + + /** + * Covert time from either hours to days or days to hours. + * + * @param daysToHours + * Flag indicating how to convert the time. + * @param time + * Time to be converted. + * @return The converted time. + */ + private int convertTime(boolean daysToHours, int time) { + int convertedTime = 0; + + if (daysToHours) { + convertedTime = time * TimeUtil.HOURS_PER_DAY; + retentionHours = convertedTime; + } else { + convertedTime = time / TimeUtil.HOURS_PER_DAY; + retentionHours = convertedTime * TimeUtil.HOURS_PER_DAY; + } + return convertedTime; + } + + /** + * Adjust retention hours based on combo boxes current values. + */ + protected void handleTimeSelection() { + int time = timeSpnr.getSelection(); + if (timeUnitCombo.getItem(timeUnitCombo.getSelectionIndex()).equals( + "Days")) { + time *= TimeUtil.HOURS_PER_DAY; + } + retentionHours = time; + } +} diff --git a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfig.java b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfig.java index 4203e6cb38..1341019405 100644 --- a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfig.java +++ b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfig.java @@ -36,7 +36,7 @@ import javax.xml.bind.annotation.XmlRootElement; * <name>Raw</name> * <rootDir>/data_store/</rootDir> * <!-- default retention hours for a category. --> - * <retentionHours>168</retentionHours> + * <minRetentionHours>168</minRetentionHours> * <category> * <name>Model grib</name> * ... @@ -83,7 +83,7 @@ public class ArchiveConfig implements Comparable { * Minimum number of hours the purger should retain data. May be overridden * for a given category. */ - @XmlElement(name = "retentionHours") + @XmlElement(name = "minRetentionHours") private int retentionHours; /** @@ -168,7 +168,7 @@ public class ArchiveConfig implements Comparable { public List getCategoryList() { return new ArrayList(categoryList); } - + /** * @param categoryName * @return The named CategoryConfig; null if not found 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 0694d853e7..08cee02ea1 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 @@ -46,6 +46,9 @@ import org.apache.commons.io.filefilter.RegexFileFilter; import com.raytheon.uf.common.archive.exception.ArchiveException; import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationContext; +import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel; +import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType; import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.LocalizationFileInputStream; import com.raytheon.uf.common.localization.LocalizationFileOutputStream; @@ -270,8 +273,8 @@ public class ArchiveConfigManager { for (CategoryConfig category : archive.getCategoryList()) { Calendar purgeTime = calculateExpiration(archive, category); - for (DisplayData display : getDisplayInfo(archive.getName(), - category.getName())) { + for (DisplayData display : getDisplayData(archive.getName(), + category.getName(), true)) { List displayFiles = getDisplayFiles(display, null, purgeTime); for (File file : displayFiles) { @@ -355,10 +358,18 @@ public class ArchiveConfigManager { * Save the cached configuration. */ public void save() { + LocalizationContext siteContext = pathMgr.getContext( + LocalizationType.COMMON_STATIC, LocalizationLevel.SITE); for (String archiveName : archiveMap.keySet()) { ArchiveConfig archiveConfig = archiveMap.get(archiveName); LocalizationFile lFile = archiveNameToLocalizationFileMap .get(archiveName); + if (lFile.getContext().getLocalizationLevel() != LocalizationLevel.SITE) { + // Modify the site not the base file. + LocalizationFile tlFile = pathMgr.getLocalizationFile( + siteContext, lFile.getName()); + lFile = tlFile; + } saveArchiveConfig(lFile, archiveConfig); } } @@ -555,8 +566,13 @@ public class ArchiveConfigManager { * @param categoryName * @return displayInfoList order by display label */ - public List getDisplayInfo(String archiveName, + public List getDisplayData(String archiveName, String categoryName) { + return getDisplayData(archiveName, categoryName, false); + } + + public List getDisplayData(String archiveName, + String categoryName, boolean setSelect) { Map> displayMap = new HashMap>(); ArchiveConfig archiveConfig = archiveMap.get(archiveName); @@ -598,12 +614,16 @@ public class ArchiveConfigManager { } } - List displayInfoList = new ArrayList(); + List displayInfoList = new ArrayList(); for (String displayLabel : displays) { - DisplayData displayInfo = new DisplayData(archiveConfig, + DisplayData displayData = new DisplayData(archiveConfig, categoryConfig, displayLabel, displayMap.get(displayLabel)); - displayInfoList.add(displayInfo); + if (setSelect) { + displayData.setSelected(categoryConfig + .getSelectedDisplayNames().contains(displayLabel)); + } + displayInfoList.add(displayData); } return displayInfoList; @@ -671,149 +691,4 @@ public class ArchiveConfigManager { return archiveConfig; } - /** - * This class contains the information on directories that are associated - * with a display label. Allows a GUI to maintain the state of the display - * instead of the manager. - */ - public static class DisplayData { - - /** Label to use when size not yet known. */ - public static final String UNKNOWN_SIZE_LABEL = "????"; - - /** A negative value to indicate unknown size. */ - public static final long UNKNOWN_SIZE = -1L; - - /** The data's archive configuration. */ - protected final ArchiveConfig archiveConfig; - - /** The data's category configration. */ - protected final CategoryConfig categoryConfig; - - /** The display label for this data. */ - protected final String displayLabel; - - /** - * List of directories for the display label matching the category's - * directory pattern and found under the archive's root directory. - */ - protected final List dirs; - - /** - * For use by GUI to indicate. Use to indicate selected for retention or - * for placing in a case. - */ - private boolean selected = false; - - /** For use by GUI for indicating the size of the directories' contents. */ - private long size = UNKNOWN_SIZE; - - /** - * Constructor. - * - * @param archiveConfig - * @param categoryConfig - * @param displayLabel - * @param dirs - */ - public DisplayData(ArchiveConfig archiveConfig, - CategoryConfig categoryConfig, String displayLabel, - List dirs) { - this.archiveConfig = archiveConfig; - this.categoryConfig = categoryConfig; - this.displayLabel = displayLabel; - this.dirs = dirs; - } - - /** - * Is instance selected. - * - * @return selected - */ - public boolean isSelected() { - return selected; - } - - /** - * Set selected state. - * - * @param selected - */ - public void setSelected(boolean selected) { - this.selected = selected; - } - - /** - * - * @return displayLabel. - */ - public String getDisplayLabel() { - return displayLabel; - } - - /** - * The size of the directories' contents. - * - * @return size - */ - public long getSize() { - return size; - } - - /** - * Set the size of the directories' contents. - * - * @param size - */ - public void setSize(long size) { - this.size = size; - } - - /** - * The archive's root directory name. - * - * @return rootDir - */ - public String getRootDir() { - return archiveConfig.getRootDir(); - } - - /** - * Determine if this is the name of the archive. - * - * @param archiveName - * @return - */ - public boolean isArchive(String archiveName) { - return archiveConfig.getName().equals(archiveName); - } - - /** - * Determine if this is the name of the category. - * - * @param categoryName - * @return - */ - public boolean isCategory(String categoryName) { - return categoryConfig.getName().equals(categoryName); - } - - /** - * Determine if the object contains the same data as the instance. - */ - public boolean equals(Object object) { - if (this == object) { - return true; - } - - if (object instanceof DisplayData) { - DisplayData displayData = (DisplayData) object; - return (archiveConfig == displayData.archiveConfig - && categoryConfig == displayData.categoryConfig && displayLabel - .equals(displayData.displayLabel)); - } - return false; - } - } - } diff --git a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/CategoryConfig.java b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/CategoryConfig.java index 51c817bba8..a086aa1a6b 100644 --- a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/CategoryConfig.java +++ b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/CategoryConfig.java @@ -19,6 +19,9 @@ **/ package com.raytheon.uf.common.archive.config; +import java.util.Collection; +import java.util.TreeSet; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -80,7 +83,7 @@ public class CategoryConfig implements Comparable { * Minimum number of hours the purger should retain data. When 0 use the * parent archive's value. */ - @XmlElement(name = "retentionHours") + @XmlElement(name = "extRetentionHours") private int retentionHours; /** @@ -141,6 +144,9 @@ public class CategoryConfig implements Comparable { @XmlElement(name = "filePattern") private String filePattern; + @XmlElement(name = "selectedDisplayName") + private final Collection selectedDisplayNames = new TreeSet(); + /* * Constructor. */ @@ -252,6 +258,24 @@ public class CategoryConfig implements Comparable { this.filePattern = filePattern; } + public Collection getSelectedDisplayNames() { + return selectedDisplayNames; + } + + public void setSelectedDisplayNames( + Collection selectedDisplayNameList) { + selectedDisplayNames.clear(); + selectedDisplayNameList.addAll(selectedDisplayNameList); + } + + public void addSelectedDisplayName(String displayName) { + selectedDisplayNames.add(displayName); + } + + public void removeSelectedDisplayName(String displayName) { + selectedDisplayNames.remove(displayName); + } + /* * (non-Javadoc) * @@ -276,6 +300,18 @@ public class CategoryConfig implements Comparable { sb.append(", filePattern: ").append(getFilePattern()); sb.append(", displayLabel: ").append(getDisplay()); sb.append(", dateGroupIndices: ").append(getDateGroupIndices()); + sb.append(", selectedDisplayNames: "); + if (selectedDisplayNames == null) { + sb.append("null"); + } else { + sb.append("["); + String prefix = "\""; + for (String displayName : selectedDisplayNames) { + sb.append(prefix).append(displayName).append("\""); + prefix = " ,\""; + } + sb.append("]"); + } sb.append("]"); return sb.toString(); } diff --git a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/DisplayData.java b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/DisplayData.java new file mode 100644 index 0000000000..a44a5deeb0 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/DisplayData.java @@ -0,0 +1,189 @@ +package com.raytheon.uf.common.archive.config; + +import java.io.File; +import java.util.List; + +/** + * This class contains the information on directories that are associated with a + * display label. Allows a GUI to maintain the state of the display instead of + * the manager. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Jun 7, 2013  1966       rferrel     Initial creation
+ * 
+ * 
+ * + * @author rferrel + * @version 1.0 + */ +public class DisplayData implements Comparable { + + /** Label to use when size not yet known. */ + public static final String UNKNOWN_SIZE_LABEL = "????"; + + /** A negative value to indicate unknown size. */ + public static final long UNKNOWN_SIZE = -1L; + + /** The data's archive configuration. */ + protected final ArchiveConfig archiveConfig; + + /** The data's category configuration. */ + protected final CategoryConfig categoryConfig; + + /** The display label for this data. */ + protected final String displayLabel; + + /** + * List of directories for the display label matching the category's + * directory pattern and found under the archive's root directory. + */ + protected final List dirs; + + /** + * For use by GUI to indicate. Use to indicate selected for retention or for + * placing in a case. + */ + private boolean selected = false; + + /** For use by GUI for indicating the size of the directories' contents. */ + private long size = UNKNOWN_SIZE; + + /** + * Constructor. + * + * @param archiveConfig + * @param categoryConfig + * @param displayLabel + * @param dirs + */ + public DisplayData(ArchiveConfig archiveConfig, + CategoryConfig categoryConfig, String displayLabel, List dirs) { + this.archiveConfig = archiveConfig; + this.categoryConfig = categoryConfig; + this.displayLabel = displayLabel; + this.dirs = dirs; + } + + /** + * Is instance selected. + * + * @return selected + */ + public boolean isSelected() { + return selected; + } + + /** + * Set selected state. + * + * @param selected + */ + public void setSelected(boolean selected) { + this.selected = selected; + } + + /** + * + * @return displayLabel. + */ + public String getDisplayLabel() { + return displayLabel; + } + + /** + * The size of the directories' contents. + * + * @return size + */ + public long getSize() { + return size; + } + + /** + * Set the size of the directories' contents. + * + * @param size + */ + public void setSize(long size) { + this.size = size; + } + + /** + * The archive's root directory name. + * + * @return rootDir + */ + public String getRootDir() { + return archiveConfig.getRootDir(); + } + + /** + * Determine if this is the name of the archive. + * + * @param archiveName + * @return + */ + public boolean isArchive(String archiveName) { + return archiveConfig.getName().equals(archiveName); + } + + /** + * Determine if this is the name of the category. + * + * @param categoryName + * @return + */ + public boolean isCategory(String categoryName) { + return categoryConfig.getName().equals(categoryName); + } + + /** + * Update the information for the category. + */ + public void updateCategory() { + if (isSelected()) { + categoryConfig.addSelectedDisplayName(displayLabel); + } else { + categoryConfig.removeSelectedDisplayName(displayLabel); + } + } + + /** + * Determine if the object contains the same data as the instance. + */ + public boolean equals(Object object) { + if (this == object) { + return true; + } + + if (object instanceof DisplayData) { + DisplayData displayData = (DisplayData) object; + return compareTo(displayData) == 0; + } + return false; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + @Override + public int compareTo(DisplayData o) { + int result = archiveConfig.getName().compareTo( + o.archiveConfig.getName()); + if (result == 0) { + result = categoryConfig.getName().compareTo( + o.categoryConfig.getName()); + if (result == 0) { + result = displayLabel.compareTo(o.displayLabel); + } + } + return result; + } +} \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.archive/utility/common_static/base/archive/PROCESSED_DATA.xml b/edexOsgi/com.raytheon.uf.edex.archive/utility/common_static/base/archive/PROCESSED_DATA.xml index b9ac797cd1..b719f63b81 100644 --- a/edexOsgi/com.raytheon.uf.edex.archive/utility/common_static/base/archive/PROCESSED_DATA.xml +++ b/edexOsgi/com.raytheon.uf.edex.archive/utility/common_static/base/archive/PROCESSED_DATA.xml @@ -23,14 +23,14 @@ - Required tag. The id for the archive such as Raw or Processed. Used in the GUIs to filter which archive to display. - Required tag. The root directory on the edex server for the archive. - - Required tag. The default number of hours to retain data in the + - Required tag. The default number of hours to retain data in the - Logical grouping of archive's sub-directories. The has six types of tags: - Required tag. The id for the category such as grib2 or redbook. Used in the GUIs to filter what is the display in the table. - - Optional tag. The retentionHours for this category. - Default is the archive's . + - Optional tag. The extended retentionHours for selected directories of this category. + Default is the archive's . - Required tag. A regex pattern for finding directories for this category. The pattern is relative to the archive's . Wildcard patterns do not cross directory delimiter /. Thus to match 3 levels of directories you would need .*/.*/.* . @@ -47,6 +47,9 @@ This is used to determine what files/directories to retain or a range of directories/files to copy for case creation. Note to get the group's index the and are combined. Thus if there are 5 groups in the then the first group in the is index 6. + - A directory matching . These are selected directories from the Retention GUI. The purger + will used the category's instead of the Arhivie's . + An optional tag; may have more then one. Patterns and groups. The and use Java regex expressions; similar to the ldm's pqact.conf file. For more details see http://docs.oracle.com/javase/tutorial/essential/regex/ @@ -81,21 +84,69 @@ Processed /awips2/edex/data/archive/ - 168 + 24 + + binlightning + 168 + (binlightning) + {1} + 2,3,4,5 + .*-(\d{4})-(\d{2})-(\d{2})-(\d{2})\..* + + + bufr + 168 + (bufrascat|bufrhdw|bufrmosLAMP|bufrncwf|bufrsigwx|bufrssmi|bufrua) + {1} + 2,3,4,5 + .*-(\d{4})-(\d{2})-(\d{2})-(\d{2})\..* + + + bufrsigwx + 168 + (bufrsigwx)/(.*) + {1} : {2} + 3,4,5,6 + .*-(\d{4})-(\d{2})-(\d{2})-(\d{2})\..* + + + group + 168 + (acars|airmet|airep|cwa|cwat) + {1} + 2,3,4,5 + [^/]*-(\d{4})-(\d{2})-(\d{2})-(\d{2})\..* + + + grib + 168 + grib/(.*)/(.*) + {1} : {2} + 3,4,5,6 + [^/]*-(\d{4})-(\d{2})-(\d{2})-(\d{2})-.* + + + grid + 168 + grid/(.*)/(.*) + {1} : {2} + 3,4,5,6 + [^/]*-(\d{4})-(\d{2})-(\d{2})-(\d{2})-.* + redbook - 0 - hdf5/(redbook) + 168 + redbook/(.*) {1} - redbook-(\d{4})-(\d{2})-(\d{2})-(\d{2})\..* 2,3,4,5 + [^/]*-(\d{4})-(\d{2})-(\d{2})-(\d{2})\..* obs - 0 - hdf5/(obs) + 168 + (fssobs|obs) {1} - metar-(\d{4})-(\d{2})-(\d{2})-(\d{2})\.* 2,3,4,5 + [^/]*-(\d{4})-(\d{2})-(\d{2})-(\d{2})\..* diff --git a/edexOsgi/com.raytheon.uf.edex.archive/utility/common_static/base/archive/RAW_DATA.xml b/edexOsgi/com.raytheon.uf.edex.archive/utility/common_static/base/archive/RAW_DATA.xml index cda84e8256..f5d0146b1a 100644 --- a/edexOsgi/com.raytheon.uf.edex.archive/utility/common_static/base/archive/RAW_DATA.xml +++ b/edexOsgi/com.raytheon.uf.edex.archive/utility/common_static/base/archive/RAW_DATA.xml @@ -23,14 +23,14 @@ - Required tag. The id for the archive such as Raw or Processed. Used in the GUIs to filter which archive to display. - Required tag. The root directory on the edex server for the archive. - - Required tag. The default number of hours to retain data in the + - Required tag. The default number of hours to retain data in the - Logical grouping of archive's sub-directories. The has six types of tags: - Required tag. The id for the category such as grib2 or redbook. Used in the GUIs to filter what is the display in the table. - - Optional tag. The retentionHours for this category. - Default is the archive's . + - Optional tag. The extended retentionHours for selected directories of this category. + Default is the archive's . - Required tag. A regex pattern for finding directories for this category. The pattern is relative to the archive's . Wildcard patterns do not cross directory delimiter /. Thus to match 3 levels of directories you would need .*/.*/.* . @@ -47,6 +47,9 @@ This is used to determine what files/directories to retain or a range of directories/files to copy for case creation. Note to get the group's index the and are combined. Thus if there are 5 groups in the then the first group in the is index 6. + - A directory matching . These are selected directories from the Retention GUI. The purger + will used the category's instead of the Arhivie's . + An optional tag; may have more then one. Patterns and groups. The and use Java regex expressions; similar to the ldm's pqact.conf file. For more details see http://docs.oracle.com/javase/tutorial/essential/regex/ @@ -81,31 +84,31 @@ Raw /data_store/ - 168 + 24 Model grib - 0 + 168 grib/(\d{4})(\d{2})(\d{2})/(\d{2})/(.*) {5} 1,2,3,4 Model grib2 - 0 + 168 (grib2)/(\d{4})(\d{2})(\d{2})/(\d{2})/(.*) {1} - {6} 2,3,4,5 Model other - 0 + 168 (acars|airmet|binlightning|bufrmos|bufrua|bufrsigwx|convsigmet|goessndg|manual|mdlsndg|poessndg|profiler|shef|text)/(\d{4})(\d{2})(\d{2})/(\d{2}) {1} 2,3,4,5 Satellite - 101 + 168 sat/(\d{4})(\d{2})(\d{2})/(\d{2})/(.*) {5} 1,2,3,4 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/utility/common_static/base/roles/userRoles.xml b/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/utility/common_static/base/roles/userRoles.xml index 61c231cbea..77a61c3f3f 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/utility/common_static/base/roles/userRoles.xml +++ b/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/utility/common_static/base/roles/userRoles.xml @@ -91,6 +91,8 @@ + + com.raytheon.localization.site/common_static/purge com.raytheon.localization.site/cave_static/colormaps @@ -122,6 +124,7 @@ com.raytheon.localization.site/common_static/shef com.raytheon.localization.site/common_static/roles com.raytheon.localization.site/common_static/datadelivery + com.raytheon.localization.site/common_static/archive diff --git a/tests/unit/com/raytheon/uf/common/archive/ArchiveConfigManagerTest.java b/tests/unit/com/raytheon/uf/common/archive/ArchiveConfigManagerTest.java index 1157acbc62..1853f5ec7d 100644 --- a/tests/unit/com/raytheon/uf/common/archive/ArchiveConfigManagerTest.java +++ b/tests/unit/com/raytheon/uf/common/archive/ArchiveConfigManagerTest.java @@ -43,8 +43,8 @@ import org.junit.Test; import com.raytheon.uf.common.archive.config.ArchiveConfig; import com.raytheon.uf.common.archive.config.ArchiveConfigManager; -import com.raytheon.uf.common.archive.config.ArchiveConfigManager.DisplayData; import com.raytheon.uf.common.archive.config.CategoryConfig; +import com.raytheon.uf.common.archive.config.DisplayData; import com.raytheon.uf.common.archive.exception.ArchiveException; import com.raytheon.uf.common.localization.PathManagerFactoryTest; import com.raytheon.uf.common.time.util.TimeUtil; @@ -294,8 +294,8 @@ public class ArchiveConfigManagerTest { ArchiveException { CategoryConfig satCategory = getCategory(archive, SAT_CAT_NAME); List displays = - manager.getDisplayInfo(archive.getName(), satCategory.getName()); - List selectedDisplays = new ArrayList(); + manager.getDisplayData(archive.getName(), satCategory.getName()); + List selectedDisplays = new ArrayList(); for (DisplayData displayData : displays) { if (displayData.getDisplayLabel().equals(satNameForArchive)) { selectedDisplays.add(displayData);