Merge "Issue #2386 - DD Front end refactor Peer review comments Change-Id: Ie3d503dca37af3eda917c096119d1c6d40488e0f" into development

Former-commit-id: c3550fa64755f73ee2a23080a0f786a2f170e6ae
This commit is contained in:
Nate Jensen 2013-10-14 16:26:47 -05:00 committed by Gerrit Code Review
commit baac431d85
32 changed files with 1785 additions and 3940 deletions

View file

@ -61,6 +61,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* Oct 03, 2012 1241 djohnson Use {@link DataDeliveryPermission}. * Oct 03, 2012 1241 djohnson Use {@link DataDeliveryPermission}.
* Jul 26, 2013 2232 mpduff Refactored Data Delivery permissions. * Jul 26, 2013 2232 mpduff Refactored Data Delivery permissions.
* Sep 04, 2013 2314 mpduff LoadSave dialog now non-blocking. * Sep 04, 2013 2314 mpduff LoadSave dialog now non-blocking.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -78,7 +79,7 @@ public class SubsetAction extends AbstractHandler {
+ "subset" + File.separator; + "subset" + File.separator;
/** Dialog instance */ /** Dialog instance */
private SubsetManagerDlg<?, ?, ?> dlg = null; private SubsetManagerDlg dlg = null;
/** Dialog instance */ /** Dialog instance */
private LoadSaveConfigDlg loadDlg = null; private LoadSaveConfigDlg loadDlg = null;
@ -106,7 +107,7 @@ public class SubsetAction extends AbstractHandler {
public void dialogClosed(Object returnValue) { public void dialogClosed(Object returnValue) {
if (returnValue instanceof LocalizationFile) { if (returnValue instanceof LocalizationFile) {
LocalizationFile locFile = (LocalizationFile) returnValue; LocalizationFile locFile = (LocalizationFile) returnValue;
SubsetXML<?> subset = SubsetFileManager SubsetXML subset = SubsetFileManager
.getInstance().loadSubset( .getInstance().loadSubset(
locFile.getFile().getName()); locFile.getFile().getName());

View file

@ -123,6 +123,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Sep 04, 2013 2314 mpduff Load/save config dialog now non-blocking. * Sep 04, 2013 2314 mpduff Load/save config dialog now non-blocking.
* Sep 26, 2013 2412 mpduff Handle auto selecting data type. * Sep 26, 2013 2412 mpduff Handle auto selecting data type.
* Sep 26, 2013 2413 mpduff Added isDirty check to New Configuration menu selection. * Sep 26, 2013 2413 mpduff Added isDirty check to New Configuration menu selection.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -684,8 +685,8 @@ public class DataBrowserDlg extends CaveSWTDialog implements IDataTableUpdate,
return; return;
} }
SubsetManagerDlg<?, ?, ?> dlg = SubsetManagerDlg.fromDataSet( SubsetManagerDlg dlg = SubsetManagerDlg
shell, data); .fromDataSet(shell, data);
dlg.open(); dlg.open();
} }
} catch (AuthException e) { } catch (AuthException e) {

View file

@ -92,6 +92,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Jun 21, 2013 2132 mpduff Swap target and source envelopes. * Jun 21, 2013 2132 mpduff Swap target and source envelopes.
* Jul 12, 2013 2141 mpduff Valid envelope test happens as needed instead of when changes are made. * Jul 12, 2013 2141 mpduff Valid envelope test happens as needed instead of when changes are made.
* Oct 10, 2013 2104 mschenke Switched to use MapScalesManager * Oct 10, 2013 2104 mschenke Switched to use MapScalesManager
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -570,9 +571,6 @@ public class AreaComp extends Composite implements ISubset {
regionLbl.setEnabled(flag); regionLbl.setEnabled(flag);
regionCombo.setEnabled(flag); regionCombo.setEnabled(flag);
selectCombo.setEnabled(flag); selectCombo.setEnabled(flag);
if (flag) {
handleRegionSelection(true);
}
} }
/** /**

View file

@ -49,7 +49,7 @@ import com.raytheon.viz.ui.presenter.components.ComboBoxConf;
* Aug 29, 2012 223 mpduff REfactor change. * Aug 29, 2012 223 mpduff REfactor change.
* Dec 18, 2012 1440 mpduff Ignore "None" group. * Dec 18, 2012 1440 mpduff Ignore "None" group.
* Jan 02, 2013 1441 djohnson Add isGroupSelected(), separate NO_GROUP constant to reusable location. * Jan 02, 2013 1441 djohnson Add isGroupSelected(), separate NO_GROUP constant to reusable location.
* * Oct 14, 2013 2386 mpduff Added NONE_AVAILABLE constant.
* </pre> * </pre>
* *
* @author jpiatt * @author jpiatt
@ -57,6 +57,8 @@ import com.raytheon.viz.ui.presenter.components.ComboBoxConf;
*/ */
public class GroupSelectComp extends Composite { public class GroupSelectComp extends Composite {
public final static String NONE_AVAILABLE = "None Available";
/** Group Name combo box. */ /** Group Name combo box. */
private Combo groupNameCombo; private Combo groupNameCombo;

View file

@ -104,7 +104,8 @@ import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils.TABLE_TYPE;
* May 28, 2013 1650 djohnson More information when failing to schedule subscriptions. * May 28, 2013 1650 djohnson More information when failing to schedule subscriptions.
* Jun 14, 2013 2064 mpduff Null check for sorted column. * Jun 14, 2013 2064 mpduff Null check for sorted column.
* Jul 29, 2013 2232 mpduff IndexOutOfBoundsException check. * Jul 29, 2013 2232 mpduff IndexOutOfBoundsException check.
* Jul 26, 2031 2232 mpduff Refactored Data Delivery permissions. * Jul 26, 2031 2232 mpduff Refactored Data Delivery permissions.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* @version 1.0 * @version 1.0
*/ */
@ -227,8 +228,8 @@ public class SubscriptionTableComp extends TableComp implements IGroupAction {
try { try {
if (DataDeliveryServices.getPermissionsService() if (DataDeliveryServices.getPermissionsService()
.checkPermissions(user, msg, permission).isAuthorized()) { .checkPermissions(user, msg, permission).isAuthorized()) {
SubsetManagerDlg<?, ?, ?> dlg = SubsetManagerDlg SubsetManagerDlg dlg = SubsetManagerDlg.fromSubscription(
.fromSubscription(this.getShell(), true, subscription); this.getShell(), true, subscription);
dlg.open(); dlg.open();
} }

View file

@ -19,13 +19,10 @@
**/ **/
package com.raytheon.uf.viz.datadelivery.subscription.subset; package com.raytheon.uf.viz.datadelivery.subscription.subset;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Shell;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet; import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.IDataTimingSubsetView;
import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils;
import com.raytheon.viz.ui.widgets.duallist.IUpdate; import com.raytheon.viz.ui.widgets.duallist.IUpdate;
/** /**
@ -49,7 +46,8 @@ import com.raytheon.viz.ui.widgets.duallist.IUpdate;
* Aug 20, 2012 0743 djohnson Add support for doing a specific date adhoc query, sub-class for data type specific operations. * Aug 20, 2012 0743 djohnson Add support for doing a specific date adhoc query, sub-class for data type specific operations.
* Aug 29, 2012 0223 mpduff Overrode new method from interface. * Aug 29, 2012 0223 mpduff Overrode new method from interface.
* Sep 24, 2012 1209 djohnson Remove isValid(). * Sep 24, 2012 1209 djohnson Remove isValid().
* Nov 20, 2012 1286 djohnson Implement displayYesNoPopup. * Nov 20, 2012 1286 djohnson Implement displayYesNoPopup.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -57,8 +55,7 @@ import com.raytheon.viz.ui.widgets.duallist.IUpdate;
* @version 1.0 * @version 1.0
*/ */
public class DataTimingSubsetTab extends SubsetTab public class DataTimingSubsetTab extends SubsetTab implements IUpdate {
implements IUpdate, IDataTimingSubsetView {
/** Parent composite */ /** Parent composite */
protected final Composite parentComp; protected final Composite parentComp;
@ -73,7 +70,7 @@ public class DataTimingSubsetTab extends SubsetTab
/** /**
* Constructor. * Constructor.
* *
* @param parentComp * @param parentComp
* @param callback * @param callback
* @param shell * @param shell
@ -86,26 +83,20 @@ public class DataTimingSubsetTab extends SubsetTab
} }
/** /**
* {@inheritDoc} * Set whether the date cycle is dirty.
*
* @param dirty
* the boolean value
*/ */
@Override
public void init() {
}
/**
* {@inheritDoc}
*/
@Override
public void setDirty(boolean dirty) { public void setDirty(boolean dirty) {
this.dirty = dirty; this.dirty = dirty;
} }
/** /**
* * Check whether the date cycle is dirty.
* {@inheritDoc} *
* @return true if the date cycle is dirty
*/ */
@Override
public boolean isDirty() { public boolean isDirty() {
return dirty; return dirty;
} }
@ -120,38 +111,4 @@ public class DataTimingSubsetTab extends SubsetTab
callback.updateDataSize(); callback.updateDataSize();
this.dirty = true; this.dirty = true;
} }
}
/**
* {@inheritDoc}
*/
@Override
public void displayPopup(String title, String message) {
DataDeliveryUtils.showMessage(shell, SWT.OK, title, message);
}
/**
* {@inheritDoc}
*/
@Override
public boolean displayOkCancelPopup(String title, String message) {
return DataDeliveryUtils.showMessage(shell, SWT.CANCEL | SWT.OK, title,
message) == SWT.OK;
}
/**
* {@inheritDoc}
*/
@Override
public void displayErrorPopup(String title, String message) {
DataDeliveryUtils.showMessage(shell, SWT.ERROR,
title, message);
}
/**
* {@inheritDoc}
*/
@Override
public boolean displayYesNoPopup(String title, String message) {
return DataDeliveryUtils.showYesNoMessage(shell, title, message) == SWT.YES;
}
}

View file

@ -40,8 +40,7 @@ import com.raytheon.viz.ui.widgets.duallist.DualListConfig;
import com.raytheon.viz.ui.widgets.duallist.IUpdate; import com.raytheon.viz.ui.widgets.duallist.IUpdate;
/** /**
* * Gridded ensemble subset tab.
* TODO Add Description
* *
* <pre> * <pre>
* *
@ -49,7 +48,8 @@ import com.raytheon.viz.ui.widgets.duallist.IUpdate;
* *
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Jan 3, 2013 bsteffen Initial creation * Jan 03, 2013 bsteffen Initial creation
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -58,7 +58,7 @@ import com.raytheon.viz.ui.widgets.duallist.IUpdate;
*/ */
public class GriddedEnsembleSubsetTab { public class GriddedEnsembleSubsetTab {
private static final String NAME = "Ensemble Members"; private final String NAME = "Ensemble Members";
private final Set<IDataSize> listeners = new HashSet<IDataSize>(); private final Set<IDataSize> listeners = new HashSet<IDataSize>();
@ -68,6 +68,14 @@ public class GriddedEnsembleSubsetTab {
private boolean modified; private boolean modified;
/**
* Constructor.
*
* @param parentComp
* Parent composite
* @param ensemble
* Ensemble object
*/
public GriddedEnsembleSubsetTab(Composite parentComp, Ensemble ensemble) { public GriddedEnsembleSubsetTab(Composite parentComp, Ensemble ensemble) {
this.ensemble = ensemble; this.ensemble = ensemble;
init(parentComp); init(parentComp);
@ -94,9 +102,7 @@ public class GriddedEnsembleSubsetTab {
dualListConfig.setListWidth(175); dualListConfig.setListWidth(175);
dualListConfig.setShowUpDownBtns(false); dualListConfig.setShowUpDownBtns(false);
dualListConfig.setFullList(ensemble.getMembers()); dualListConfig.setFullList(ensemble.getMembers());
dualList = new DualList(group, SWT.NONE, dualListConfig, dualList = new DualList(group, SWT.NONE, dualListConfig, new IUpdate() {
new IUpdate() {
@Override @Override
public void selectionChanged() { public void selectionChanged() {
modified = true; modified = true;
@ -110,10 +116,20 @@ public class GriddedEnsembleSubsetTab {
}); });
} }
/**
* Get the tab name.
*
* @return the tab name
*/
public String getName() { public String getName() {
return NAME; return NAME;
} }
/**
* Get the ensemble object representing the selections in this tab.
*
* @return The populated ensemble object
*/
public Ensemble getEnsembleWithSelection() { public Ensemble getEnsembleWithSelection() {
Ensemble ensemble = new Ensemble(this.ensemble); Ensemble ensemble = new Ensemble(this.ensemble);
ensemble.setSelectedMembers(Arrays.asList(dualList ensemble.setSelectedMembers(Arrays.asList(dualList
@ -129,45 +145,92 @@ public class GriddedEnsembleSubsetTab {
} }
} }
/**
* Add the ensemble data to the provided subscription.
*
* @param subscription
* The subscription getting the ensemble data
*/
public void populateSubscription(Subscription subscription) { public void populateSubscription(Subscription subscription) {
subscription.setEnsemble(getEnsembleWithSelection()); subscription.setEnsemble(getEnsembleWithSelection());
} }
/**
* Load ensemble data from the provided subscription.
*
* @param subscription
* The subscription with ensemble data
*/
public void loadFromSubscription(Subscription subscription) { public void loadFromSubscription(Subscription subscription) {
loadFromEnsemble(subscription.getEnsemble()); loadFromEnsemble(subscription.getEnsemble());
} }
public void populateSubsetXML(SubsetXML<?> subsetXml) { /**
* Load subset object with the ensemble data from this tab.
*
* @param subsetXml
* The subset object
*/
public void populateSubsetXML(SubsetXML subsetXml) {
subsetXml.setEnsemble(getEnsembleWithSelection()); subsetXml.setEnsemble(getEnsembleWithSelection());
} }
public void loadFromSubsetXML(SubsetXML<?> subsetXml) { /**
* Load ensemble data from the provided subset object.
*
* @param subsetXml
*/
public void loadFromSubsetXML(SubsetXML subsetXml) {
loadFromEnsemble(subsetXml.getEnsemble()); loadFromEnsemble(subsetXml.getEnsemble());
} }
/**
* Does a valid selection exist?
*
* @return true if a valid selection
*/
public boolean isValid() { public boolean isValid() {
return !CollectionUtil.isNullOrEmpty(dualList.getSelectedListItems()); return !CollectionUtil.isNullOrEmpty(dualList.getSelectedListItems());
} }
/**
* Get the modified flag
*
* @return the modified flag
*/
public boolean isModified() { public boolean isModified() {
return modified; return modified;
} }
/**
* Set the modified flag
*
* @param modified
* true for modified
*/
public void setModified(boolean modified) { public void setModified(boolean modified) {
this.modified = modified; this.modified = modified;
} }
/**
* Add a listener.
*
* @param listener
* The listener
*/
public void addListener(IDataSize listener) { public void addListener(IDataSize listener) {
synchronized (this.listeners) { synchronized (this.listeners) {
listeners.add(listener); listeners.add(listener);
} }
} }
/**
* Notifiy the listeners.
*/
protected void notifyListeners() { protected void notifyListeners() {
Collection<IDataSize> listeners; Collection<IDataSize> listeners;
synchronized (this.listeners) { synchronized (this.listeners) {
listeners = new ArrayList<IDataSize>( listeners = new ArrayList<IDataSize>(this.listeners);
this.listeners);
} }
for (IDataSize listener : listeners) { for (IDataSize listener : listeners) {
listener.updateDataSize(); listener.updateDataSize();

View file

@ -43,7 +43,6 @@ import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.TabItem;
import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.geometry.jts.ReferencedEnvelope;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Ordering; import com.google.common.collect.Ordering;
import com.raytheon.uf.common.datadelivery.registry.AdhocSubscription; import com.raytheon.uf.common.datadelivery.registry.AdhocSubscription;
import com.raytheon.uf.common.datadelivery.registry.DataLevelType; import com.raytheon.uf.common.datadelivery.registry.DataLevelType;
@ -70,10 +69,12 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.util.ImmutableDate; import com.raytheon.uf.common.time.util.ImmutableDate;
import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.common.util.CollectionUtil;
import com.raytheon.uf.common.util.SizeUtil; import com.raytheon.uf.common.util.SizeUtil;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.GriddedTimingSelectionPresenter; import com.raytheon.uf.viz.datadelivery.common.xml.AreaXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.GriddedTimingSubsetPresenter; import com.raytheon.uf.viz.datadelivery.filter.MetaDataManager;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.GriddedTimeXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SpecificDateTimeXML; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SpecificDateTimeXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.TimeXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.VerticalXML; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.VerticalXML;
import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils; import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils;
@ -104,6 +105,7 @@ import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils;
* Jun 14, 2013 2108 mpduff Refactored DataSizeUtils. * Jun 14, 2013 2108 mpduff Refactored DataSizeUtils.
* Jul 18, 2013 2205 djohnson If null time is selected from the dialog, return null for the adhoc. * Jul 18, 2013 2205 djohnson If null time is selected from the dialog, return null for the adhoc.
* Sept 25, 2013 1797 dhladky Separated Time from GriddedTime * Sept 25, 2013 1797 dhladky Separated Time from GriddedTime
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* *
* </pre> * </pre>
@ -112,16 +114,12 @@ import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils;
* @version 1.0 * @version 1.0
*/ */
public class GriddedSubsetManagerDlg public class GriddedSubsetManagerDlg extends SubsetManagerDlg {
extends private final String TIMING_TAB_GRID = "Forecast Hours";
SubsetManagerDlg<GriddedDataSet, GriddedTimingSubsetPresenter, SpecificDateTimeXML> {
private static final String TIMING_TAB_GRID = "Forecast Hours";
@VisibleForTesting private final String POPUP_TITLE = "Notice";
final String POPUP_TITLE = "Notice";
@VisibleForTesting private final String NO_DATA_FOR_DATE_AND_CYCLE = "No data is available for the specified date and cycle combination.";
final String NO_DATA_FOR_DATE_AND_CYCLE = "No data is available for the specified date and cycle combination.";
/** Status Handler */ /** Status Handler */
private final IUFStatusHandler statusHandler = UFStatus private final IUFStatusHandler statusHandler = UFStatus
@ -138,8 +136,7 @@ public class GriddedSubsetManagerDlg
private final List<String> asString = new ArrayList<String>(); private final List<String> asString = new ArrayList<String>();
@VisibleForTesting private final Map<String, ImmutableDate> dateStringToDateMap = new HashMap<String, ImmutableDate>();
final Map<String, ImmutableDate> dateStringToDateMap = new HashMap<String, ImmutableDate>();
private boolean useLatestDate = true; private boolean useLatestDate = true;
@ -152,41 +149,74 @@ public class GriddedSubsetManagerDlg
/** Gridded data size utility */ /** Gridded data size utility */
private GriddedDataSizeUtils dataSize; private GriddedDataSizeUtils dataSize;
private final GriddedDataSet dataSet;
private GriddedTimingSubsetTab timingTabControls;
/** /**
* Constructor. * Constructor.
* *
* @param shell * @param shell
* parent shell
* @param loadDataSet * @param loadDataSet
* true if loading data set
* @param subscription * @param subscription
* the subscription object
*/ */
public GriddedSubsetManagerDlg(Shell shell, boolean loadDataSet, public GriddedSubsetManagerDlg(Shell shell, boolean loadDataSet,
Subscription subscription) { Subscription subscription) {
super(shell, loadDataSet, subscription); super(shell, loadDataSet, subscription);
this.dataSet = (GriddedDataSet) MetaDataManager.getInstance()
.getDataSet(subscription.getDataSetName(),
subscription.getProvider());
setTitle();
} }
/** /**
* Constructor. * Constructor.
* *
* @param shell * @param shell
* parent shell
* @param dataSet * @param dataSet
* The dataset object
* @param loadDataSet * @param loadDataSet
* true if loading data set
* @param subsetXml * @param subsetXml
* The subset object
*/ */
public GriddedSubsetManagerDlg(Shell shell, GriddedDataSet dataSet, public GriddedSubsetManagerDlg(Shell shell, GriddedDataSet dataSet,
boolean loadDataSet, SubsetXML<SpecificDateTimeXML> subsetXml) { boolean loadDataSet, SubsetXML subsetXml) {
super(shell, dataSet, loadDataSet, subsetXml); super(shell, loadDataSet, dataSet);
this.dataSet = dataSet;
this.subsetXml = subsetXml;
setTitle();
} }
/** /**
* Constructor. * Constructor.
* *
* @param shell * @param shell
* parent shell
* @param dataSet * @param dataSet
* The dataset object
*/ */
public GriddedSubsetManagerDlg(Shell shell, GriddedDataSet dataSet) { public GriddedSubsetManagerDlg(Shell shell, GriddedDataSet dataSet) {
super(shell, dataSet); super(shell, dataSet);
this.dataSet = dataSet;
setTitle();
} }
/**
* {@inheritDoc}
*/
@Override
protected void setTitle() {
setText(DD_SUBSET_MANAGER + dataSet.getDataSetName());
}
/**
* {@inheritDoc}
*/
@Override @Override
protected void createTabs(TabFolder tabFolder) { protected void createTabs(TabFolder tabFolder) {
GridData gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false); GridData gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
@ -211,9 +241,7 @@ public class GriddedSubsetManagerDlg
timingComp.setLayout(gl); timingComp.setLayout(gl);
timingComp.setLayoutData(gd); timingComp.setLayoutData(gd);
timingTab.setControl(timingComp); timingTab.setControl(timingComp);
timingTabControls = getDataTimingSubsetPresenter(timingComp, dataSet, timingTabControls = new GriddedTimingSubsetTab(timingComp, this, shell);
this, shell);
timingTabControls.init();
Ensemble e = dataSet.getEnsemble(); Ensemble e = dataSet.getEnsemble();
if (e != null && e.getMembers() != null) { if (e != null && e.getMembers() != null) {
@ -228,6 +256,24 @@ public class GriddedSubsetManagerDlg
ensembleTab.addListener(this); ensembleTab.addListener(this);
ensembleTabItem.setText(ensembleTab.getName()); ensembleTabItem.setText(ensembleTab.getName());
} }
TabItem spatialTab = new TabItem(tabFolder, SWT.NONE);
spatialTab.setText(SPATIAL_TAB);
Composite spatialComp = new Composite(tabFolder, SWT.NONE);
spatialComp.setLayout(gl);
spatialComp.setLayoutData(gd);
spatialTab.setControl(spatialComp);
spatialTabControls = new SpatialSubsetTab(spatialComp, dataSet, this);
SortedSet<Integer> forecastHours = new TreeSet<Integer>(
dataSet.getForecastHours());
List<String> forecastHoursAsString = new ArrayList<String>();
for (Integer integer : forecastHours) {
forecastHoursAsString.add(Integer.toString(integer));
}
timingTabControls.setAvailableForecastHours(forecastHoursAsString);
} }
@Override @Override
@ -248,16 +294,22 @@ public class GriddedSubsetManagerDlg
return invalidTabs; return invalidTabs;
} }
/**
* {@inheritDoc}
*/
@Override @Override
protected void populateSubsetXML(SubsetXML<SpecificDateTimeXML> subset) { protected void populateSubsetXML(SubsetXML subset) {
super.populateSubsetXML(subset); super.populateSubsetXML(subset);
if (ensembleTab != null) { if (ensembleTab != null) {
ensembleTab.populateSubsetXML(subset); ensembleTab.populateSubsetXML(subset);
} }
} }
/**
* {@inheritDoc}
*/
@Override @Override
protected void loadFromSubsetXML(SubsetXML<SpecificDateTimeXML> subsetXml) { protected void loadFromSubsetXML(SubsetXML subsetXml) {
super.loadFromSubsetXML(subsetXml); super.loadFromSubsetXML(subsetXml);
if (ensembleTab != null) { if (ensembleTab != null) {
ensembleTab.loadFromSubsetXML(subsetXml); ensembleTab.loadFromSubsetXML(subsetXml);
@ -266,8 +318,9 @@ public class GriddedSubsetManagerDlg
ArrayList<VerticalXML> vertList = subsetXml.getVerticalList(); ArrayList<VerticalXML> vertList = subsetXml.getVerticalList();
vTab.populate(vertList, dataSet); vTab.populate(vertList, dataSet);
SpecificDateTimeXML time = subsetXml.getTime(); TimeXML time = subsetXml.getTime();
this.timingTabControls.populate(time, dataSet); this.timingTabControls.setSelectedForecastHours(((GriddedTimeXML) time)
.getFcstHours());
updateDataSize(); updateDataSize();
} }
@ -292,7 +345,7 @@ public class GriddedSubsetManagerDlg
timeXml.setLatestData(true); timeXml.setLatestData(true);
this.timingTabControls.populate(timeXml, dataSet); this.timingTabControls.setSelectedForecastHours(timeXml.getFcstHours());
// Vertical/Parameters // Vertical/Parameters
Map<String, VerticalXML> levelMap = new HashMap<String, VerticalXML>(); Map<String, VerticalXML> levelMap = new HashMap<String, VerticalXML>();
@ -332,6 +385,23 @@ public class GriddedSubsetManagerDlg
ArrayList<VerticalXML> vertList = new ArrayList<VerticalXML>( ArrayList<VerticalXML> vertList = new ArrayList<VerticalXML>(
levelMap.values()); levelMap.values());
vTab.populate(vertList, dataSet); vTab.populate(vertList, dataSet);
// Area
AreaXML area = new AreaXML();
ReferencedEnvelope envelope = this.subscription.getCoverage()
.getEnvelope();
ReferencedEnvelope requestEnvelope = this.subscription.getCoverage()
.getRequestEnvelope();
if (requestEnvelope != null && !requestEnvelope.isEmpty()) {
area.setEnvelope(requestEnvelope);
} else {
area.setEnvelope(envelope);
}
spatialTabControls.setDataSet(this.dataSet);
spatialTabControls.populate(area);
} }
@Override @Override
@ -340,6 +410,11 @@ public class GriddedSubsetManagerDlg
if (!modified && ensembleTab != null) { if (!modified && ensembleTab != null) {
modified = ensembleTab.isModified(); modified = ensembleTab.isModified();
} }
if (!modified && timingTabControls.isDirty()) {
return true;
}
return modified; return modified;
} }
@ -349,18 +424,7 @@ public class GriddedSubsetManagerDlg
if (ensembleTab != null) { if (ensembleTab != null) {
ensembleTab.setModified(false); ensembleTab.setModified(false);
} }
} timingTabControls.setDirty(false);
/**
* {@inheritDoc}
*/
@Override
protected GriddedTimingSubsetPresenter getDataTimingSubsetPresenter(
Composite parentComp, GriddedDataSet dataSet, IDataSize callback,
Shell shell) {
GriddedTimingSubsetTab view = new GriddedTimingSubsetTab(parentComp,
callback, shell);
return new GriddedTimingSubsetPresenter(dataSet, view);
} }
/** /**
@ -383,7 +447,7 @@ public class GriddedSubsetManagerDlg
@Override @Override
protected SpecificDateTimeXML getTimeXmlFromSubscription() { protected SpecificDateTimeXML getTimeXmlFromSubscription() {
SpecificDateTimeXML timeXml = new SpecificDateTimeXML(); SpecificDateTimeXML timeXml = new SpecificDateTimeXML();
GriddedTime time = (GriddedTime)this.subscription.getTime(); GriddedTime time = (GriddedTime) this.subscription.getTime();
List<Integer> cycleTimes = time.getCycleTimes(); List<Integer> cycleTimes = time.getCycleTimes();
if (!CollectionUtil.isNullOrEmpty(cycleTimes)) { if (!CollectionUtil.isNullOrEmpty(cycleTimes)) {
for (int cycle : cycleTimes) { for (int cycle : cycleTimes) {
@ -476,9 +540,8 @@ public class GriddedSubsetManagerDlg
*/ */
@Override @Override
protected GriddedTime setupDataSpecificTime(Time subTime, Subscription sub) { protected GriddedTime setupDataSpecificTime(Time subTime, Subscription sub) {
GriddedTime newTime = (GriddedTime) subTime;
GriddedTime newTime = (GriddedTime)subTime;
if (asString.isEmpty()) { if (asString.isEmpty()) {
SortedSet<ImmutableDate> newestToOldest = new TreeSet<ImmutableDate>( SortedSet<ImmutableDate> newestToOldest = new TreeSet<ImmutableDate>(
Ordering.natural().reverse()); Ordering.natural().reverse());
@ -496,7 +559,7 @@ public class GriddedSubsetManagerDlg
asString.add("No Data Available"); asString.add("No Data Available");
} else { } else {
for (ImmutableDate date : newestToOldest) { for (ImmutableDate date : newestToOldest) {
this.dataSet.getTime().getCycleTimes(); // this.dataSet.getTime().getCycleTimes();
String displayString = dateFormat.get().format(date); String displayString = dateFormat.get().format(date);
if (!asString.contains(displayString)) { if (!asString.contains(displayString)) {
@ -507,42 +570,39 @@ public class GriddedSubsetManagerDlg
} }
} }
GriddedTimingSelectionPresenter presenter = new GriddedTimingSelectionPresenter( GriddedTimingSelectionDlg dlg = new GriddedTimingSelectionDlg(
new GriddedTimingSelectionDlg(getShell(), dataSet.getCycles(), getShell(), dataSet, sub, asString);
sub), dataSet, asString);
Integer cycle = presenter.open();
if (presenter.isCancel()) { GriddedTimeSelection selection = dlg.openDlg();
if (selection.isCancel()) {
return null; return null;
} }
if (cycle != null) { GriddedTime time;
GriddedTime time; int cycle = selection.getCycle();
this.useLatestDate = (cycle == -999 ? true : false); this.useLatestDate = (cycle == -999 ? true : false);
if (!useLatestDate) { if (!selection.isLatest()) {
newTime.addCycleTime(cycle); newTime.addCycleTime(cycle);
String selectedDate = presenter.getDate(); String selectedDate = selection.getDate();
metaData = retrieveFilteredDataSetMetaData(selectedDate, cycle); metaData = retrieveFilteredDataSetMetaData(selectedDate, cycle);
if (metaData == null) { if (metaData == null) {
return null; return null;
} else {
time = (GriddedTime)metaData.getTime();
time.addCycleTime(cycle);
return time;
}
} else { } else {
// If ulse latest data is selected then add all cycle times, the time = (GriddedTime) metaData.getTime();
// retrieval generator will determine which one to use. time.addCycleTime(cycle);
time = (GriddedTime)dataSet.getTime(); return time;
for (Integer c : new TreeSet<Integer>(dataSet.getCycles())) { }
time.addCycleTime(c); } else {
} // If use latest data is selected then add all cycle times, the
// retrieval generator will determine which one to use.
time = dataSet.getTime();
for (Integer c : new TreeSet<Integer>(dataSet.getCycles())) {
time.addCycleTime(c);
} }
return time;
} }
return null; return time;
} }
/** /**
@ -588,8 +648,12 @@ public class GriddedSubsetManagerDlg
boolean create) { boolean create) {
ArrayList<Parameter> selectedParameterObjs = vTab.getParameters(); ArrayList<Parameter> selectedParameterObjs = vTab.getParameters();
sub.setParameter(selectedParameterObjs); sub.setParameter(selectedParameterObjs);
sub.setProvider(dataSet.getProviderName());
sub.setDataSetName(dataSet.getDataSetName());
sub.setDataSetType(dataSet.getDataSetType());
sub.setDataSetName(dataSet.getDataSetName());
GriddedTime dataSetTime = (GriddedTime)dataSet.getTime(); GriddedTime dataSetTime = dataSet.getTime();
GriddedTime newTime = new GriddedTime(); GriddedTime newTime = new GriddedTime();
@ -600,7 +664,7 @@ public class GriddedSubsetManagerDlg
} }
sub.setTime(newTime); sub.setTime(newTime);
} else if (!create) { } else if (!create) {
GriddedTime time = (GriddedTime)sub.getTime(); GriddedTime time = (GriddedTime) sub.getTime();
List<String> fcstHours = time.getFcstHours(); List<String> fcstHours = time.getFcstHours();
String[] selectedItems = this.timingTabControls String[] selectedItems = this.timingTabControls
.getSelectedFcstHours(); .getSelectedFcstHours();
@ -623,7 +687,7 @@ public class GriddedSubsetManagerDlg
sub.setTime(newTime); sub.setTime(newTime);
} }
GriddedCoverage cov = (GriddedCoverage) dataSet.getCoverage(); GriddedCoverage cov = dataSet.getCoverage();
cov.setModelName(dataSet.getDataSetName()); cov.setModelName(dataSet.getDataSetName());
cov.setGridName(getNameText()); cov.setGridName(getNameText());
GridCoverage coverage = cov.getGridCoverage(); GridCoverage coverage = cov.getGridCoverage();
@ -655,4 +719,12 @@ public class GriddedSubsetManagerDlg
return sub; return sub;
} }
/**
* {@inheritDoc}
*/
@Override
protected TimeXML getDataTimeInfo() {
return timingTabControls.getSaveInfo();
}
} }

View file

@ -0,0 +1,111 @@
/**
* 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.datadelivery.subscription.subset;
/**
* Data object to hold the gridded data timing information.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Oct 14, 2013 2386 mpduff Initial creation
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public class GriddedTimeSelection {
/** Selected cycle */
private int cycle;
/** Latest time flag */
private boolean latest;
/** Selected data date */
private String date;
/** Cancel flag */
private boolean cancel;
/**
* @return the cycle
*/
public int getCycle() {
return cycle;
}
/**
* @param cycle
* the cycle to set
*/
public void setCycle(int cycle) {
this.cycle = cycle;
}
/**
* @return the latest
*/
public boolean isLatest() {
return latest;
}
/**
* @param latest
* the latest to set
*/
public void setLatest(boolean latest) {
this.latest = latest;
}
/**
* @return the date
*/
public String getDate() {
return date;
}
/**
* @param date
* the date to set
*/
public void setDate(String date) {
this.date = date;
}
/**
* @return the cancel
*/
public boolean isCancel() {
return cancel;
}
/**
* @param cancel
* the cancel to set
*/
public void setCancel(boolean cancel) {
this.cancel = cancel;
}
}

View file

@ -19,13 +19,13 @@
**/ **/
package com.raytheon.uf.viz.datadelivery.subscription.subset; package com.raytheon.uf.viz.datadelivery.subscription.subset;
import static com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils.getMaxLatency;
import java.util.Set; import java.util.Set;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Button;
@ -34,16 +34,13 @@ import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Shell;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.Subscription;
import com.raytheon.uf.common.datadelivery.registry.Subscription.SubscriptionPriority; import com.raytheon.uf.common.datadelivery.registry.Subscription.SubscriptionPriority;
import com.raytheon.uf.viz.datadelivery.common.ui.PriorityComp; import com.raytheon.uf.viz.datadelivery.common.ui.PriorityComp;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.IGriddedTimingSelectionDlgView;
import com.raytheon.uf.viz.datadelivery.system.SystemRuleManager; import com.raytheon.uf.viz.datadelivery.system.SystemRuleManager;
import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils; import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryGUIUtils;
import com.raytheon.viz.ui.dialogs.CaveSWTDialog; import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
import com.raytheon.viz.ui.presenter.components.ButtonConf;
import com.raytheon.viz.ui.presenter.components.CheckBoxConf;
import com.raytheon.viz.ui.presenter.components.ListConf;
/** /**
* Gridded data/cycle selection dialog for adhoc queries. * Gridded data/cycle selection dialog for adhoc queries.
@ -61,6 +58,7 @@ import com.raytheon.viz.ui.presenter.components.ListConf;
* Jan 25, 2013 1528 djohnson Subscription priority is now an enum. * Jan 25, 2013 1528 djohnson Subscription priority is now an enum.
* Feb 26, 2013 1592 djohnson When the shell is closed, don't submit the query. * Feb 26, 2013 1592 djohnson When the shell is closed, don't submit the query.
* Jun 04, 2013 223 mpduff PriorityComp constructor changed. * Jun 04, 2013 223 mpduff PriorityComp constructor changed.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -68,8 +66,7 @@ import com.raytheon.viz.ui.presenter.components.ListConf;
* @version 1.0 * @version 1.0
*/ */
public class GriddedTimingSelectionDlg extends CaveSWTDialog implements public class GriddedTimingSelectionDlg extends CaveSWTDialog {
IGriddedTimingSelectionDlgView {
/** The Main Composite */ /** The Main Composite */
private Composite dateComp; private Composite dateComp;
@ -98,26 +95,35 @@ public class GriddedTimingSelectionDlg extends CaveSWTDialog implements
/** Cycle times */ /** Cycle times */
private final Set<Integer> cycleTimes; private final Set<Integer> cycleTimes;
private final GriddedDataSet dataset;
private final java.util.List<String> dateList;
/** /**
* Constructor * Constructor
* *
* @param parentShell * @param parentShell
* @param cycleTimes * @param dataset
* @param subscription
* @param dateStringToDateMap
*/ */
protected GriddedTimingSelectionDlg(Shell parentShell, public GriddedTimingSelectionDlg(Shell parentShell, GriddedDataSet dataset,
Set<Integer> cycleTimes, Subscription subscription) { Subscription subscription, java.util.List<String> dateList) {
super(parentShell); super(parentShell);
setText("Select Date/Cycle"); setText("Select Date/Cycle");
this.cycleTimes = cycleTimes; this.cycleTimes = dataset.getCycles();
this.subscription = subscription; this.subscription = subscription;
this.dataset = dataset;
this.dateList = dateList;
} }
/** /**
* {@inheritDoc} * Open the dialog.
*
* @return the selection
*/ */
@Override public GriddedTimeSelection openDlg() {
public Integer openDlg() { return (GriddedTimeSelection) this.open();
return (Integer) this.open();
} }
/** /**
@ -134,14 +140,26 @@ public class GriddedTimingSelectionDlg extends CaveSWTDialog implements
useLatestChk = new Button(dateComp, SWT.CHECK); useLatestChk = new Button(dateComp, SWT.CHECK);
useLatestChk.setLayoutData(gd); useLatestChk.setLayoutData(gd);
useLatestChk.setText("Get Latest Data");
useLatestChk.setSelection(true);
useLatestChk.setToolTipText("Use the latest time");
useLatestChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
dateCycleList.setEnabled(!useLatestChk.getSelection());
}
});
gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
gd.heightHint = 150;
this.dateCycleList = new List(dateComp, SWT.SINGLE | SWT.BORDER this.dateCycleList = new List(dateComp, SWT.SINGLE | SWT.BORDER
| SWT.V_SCROLL); | SWT.V_SCROLL);
dateCycleList.setLayoutData(gd); dateCycleList.setLayoutData(gd);
dateCycleList.setEnabled(false);
// Get latency value // Get latency value
SystemRuleManager ruleManager = SystemRuleManager.getInstance(); SystemRuleManager ruleManager = SystemRuleManager.getInstance();
int latency = ruleManager.getLatency(this.subscription, cycleTimes); int latency = ruleManager.getLatency(this.subscription, cycleTimes);
SubscriptionPriority priority = ruleManager.getPriority( SubscriptionPriority priority = ruleManager.getPriority(
this.subscription, cycleTimes); this.subscription, cycleTimes);
@ -157,10 +175,28 @@ public class GriddedTimingSelectionDlg extends CaveSWTDialog implements
gd = new GridData(btnWidth, SWT.DEFAULT); gd = new GridData(btnWidth, SWT.DEFAULT);
okBtn = new Button(buttonComp, SWT.PUSH); okBtn = new Button(buttonComp, SWT.PUSH);
okBtn.setLayoutData(gd); okBtn.setLayoutData(gd);
okBtn.setText("OK");
okBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleOk();
close();
}
});
gd = new GridData(btnWidth, SWT.DEFAULT); gd = new GridData(btnWidth, SWT.DEFAULT);
cancelBtn = new Button(buttonComp, SWT.PUSH); cancelBtn = new Button(buttonComp, SWT.PUSH);
cancelBtn.setLayoutData(gd); cancelBtn.setLayoutData(gd);
cancelBtn.setText("Cancel");
cancelBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
GriddedTimeSelection gts = new GriddedTimeSelection();
gts.setCancel(true);
setReturnValue(gts);
close();
}
});
} }
/** /**
@ -181,177 +217,56 @@ public class GriddedTimingSelectionDlg extends CaveSWTDialog implements
*/ */
@Override @Override
protected void preOpened() { protected void preOpened() {
preOpenCallback.run(); populate();
shell.layout(); shell.layout();
shell.pack(); shell.pack();
} }
/** /**
* {@inheritDoc} * Check if the latest data checkbox is enabled.
*
* @return true if enabled.
*/ */
@Override
public void setLatestDataCheckBox(final CheckBoxConf checkBoxConf) {
useLatestChk.setText(checkBoxConf.getDisplayText());
useLatestChk.setSelection(checkBoxConf.isInitiallyChecked());
useLatestChk.setToolTipText(checkBoxConf.getToolTipText());
useLatestChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
checkBoxConf.getOnCheckedChangeAction().run();
}
});
}
/**
* {@inheritDoc}
*/
@Override
public void setDateCycleList(ListConf dateCycleListConf) {
GridData gd = new GridData(dateCycleListConf.getWidth(),
dateCycleListConf.getHeight());
dateCycleList.setItems(dateCycleListConf.getItems());
dateCycleList.setLayoutData(gd);
dateCycleList.setEnabled(false);
}
/**
* {@inheritDoc}
*/
@Override
public void setOkButton(final ButtonConf okBtnConf) {
okBtn.setText(okBtnConf.getDisplayText());
okBtn.setToolTipText(okBtnConf.getToolTipText());
okBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
okBtnConf.getOnClickAction().run();
}
});
}
/**
* {@inheritDoc}
*/
@Override
public void setCancelButton(final ButtonConf cancelBtnConf) {
cancelBtn.setText(cancelBtnConf.getDisplayText());
cancelBtn.setToolTipText(cancelBtnConf.getToolTipText());
cancelBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
close();
cancelBtnConf.getOnClickAction().run();
}
});
shell.addShellListener(new ShellAdapter() {
@Override
public void shellClosed(ShellEvent event) {
cancelBtnConf.getOnClickAction().run();
}
});
}
/**
* {@inheritDoc}
*/
@Override
public void setPreOpenCallback(Runnable callback) {
this.preOpenCallback = callback;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isLatestDataEnabled() { public boolean isLatestDataEnabled() {
return useLatestChk.getSelection(); return useLatestChk.getSelection();
} }
/** /**
* {@inheritDoc} * Set the date/cycle list enabled.
*/ */
@Override
public void setDateCycleListEnabled() { public void setDateCycleListEnabled() {
this.dateCycleList.setEnabled(!this.useLatestChk.getSelection()); this.dateCycleList.setEnabled(!this.useLatestChk.getSelection());
} }
private void populate() {
for (String date : this.dateList) {
dateCycleList.add(date);
}
}
/** /**
* {@inheritDoc} * OK Button action method.
*/ */
@Override private void handleOk() {
public String getSelection() { GriddedTimeSelection data = new GriddedTimeSelection();
if (dateCycleList.isEnabled()) { if (!isLatestDataEnabled()) {
return dateCycleList.getItem(dateCycleList.getSelectionIndex()); String selection = dateCycleList.getItem(dateCycleList
.getSelectionIndex());
DataDeliveryGUIUtils.latencyValidChk(
priorityComp.getLatencyValue(), getMaxLatency(dataset));
// parse off the date/cycle time selected
String[] parts = selection.split(" - ");
String selectedDate = parts[0];
String cycleStr = parts[1];
cycleStr = cycleStr.substring(0, cycleStr.indexOf(" Z"));
data.setCycle(Integer.parseInt(cycleStr));
data.setDate(selection);
} else {
data.setCycle(-999);
data.setLatest(true);
} }
return null; setReturnValue(data);
}
/**
* {@inheritDoc}
*/
@Override
public void init() {
// not used
}
/**
* {@inheritDoc}
*/
@Override
public void displayPopup(String title, String message) {
DataDeliveryUtils.showMessage(getShell(), SWT.OK, title, message);
}
/**
* {@inheritDoc}
*/
@Override
public void displayErrorPopup(String title, String message) {
DataDeliveryUtils.showMessage(shell, SWT.ERROR, title, message);
}
/**
* {@inheritDoc}
*/
@Override
public boolean displayOkCancelPopup(String title, String message) {
return DataDeliveryUtils.showMessage(shell, SWT.CANCEL | SWT.OK, title,
message) == SWT.OK;
}
/**
* {@inheritDoc}
*/
@Override
public boolean displayYesNoPopup(String title, String message) {
return DataDeliveryUtils.showYesNoMessage(shell, title, message) == SWT.YES;
}
/**
* {@inheritDoc}
*/
@Override
public void closeDlg() {
close();
}
/**
* {@inheritDoc}
*/
@Override
public int getLatency() {
return priorityComp.getLatencyValue();
}
/**
* {@inheritDoc}
*/
@Override
public SubscriptionPriority getPriority() {
return priorityComp.getPriority();
} }
} }

View file

@ -32,13 +32,13 @@ import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Shell;
import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.common.util.CollectionUtil;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.IDataTimingSubsetView; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SpecificDateTimeXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.IGriddedDataTimingSubsetView; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.TimeXML;
import com.raytheon.viz.ui.widgets.duallist.DualList; import com.raytheon.viz.ui.widgets.duallist.DualList;
import com.raytheon.viz.ui.widgets.duallist.DualListConfig; import com.raytheon.viz.ui.widgets.duallist.DualListConfig;
/** /**
* {@link IDataTimingSubsetView} implementation for Gridded data. * Implementation for Gridded data.
* *
* <pre> * <pre>
* *
@ -51,6 +51,7 @@ import com.raytheon.viz.ui.widgets.duallist.DualListConfig;
* Sep 07, 2012 0684 mpduff Clear fcstHour selection before setting new selection. * Sep 07, 2012 0684 mpduff Clear fcstHour selection before setting new selection.
* Sep 24, 2012 1209 djohnson Display text when there are no available cycles, move validation to presenter. * Sep 24, 2012 1209 djohnson Display text when there are no available cycles, move validation to presenter.
* Jan 10, 2013 1444 mpduff Add updateSelectedForecastHours method. * Jan 10, 2013 1444 mpduff Add updateSelectedForecastHours method.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -58,8 +59,8 @@ import com.raytheon.viz.ui.widgets.duallist.DualListConfig;
* @version 1.0 * @version 1.0
*/ */
public class GriddedTimingSubsetTab extends DataTimingSubsetTab implements public class GriddedTimingSubsetTab extends DataTimingSubsetTab {// implements
IGriddedDataTimingSubsetView { // IGriddedDataTimingSubsetView {
/** Forecast dual list */ /** Forecast dual list */
private DualList fcstDualList; private DualList fcstDualList;
@ -67,27 +68,27 @@ public class GriddedTimingSubsetTab extends DataTimingSubsetTab implements
/** Forecast dual configuration */ /** Forecast dual configuration */
private final DualListConfig forecastHoursDualConfig = new DualListConfig(); private final DualListConfig forecastHoursDualConfig = new DualListConfig();
/** Forecast Group */
private Group forecastGrp; private Group forecastGrp;
/** /**
* Constructor. * Constructor.
* *
* @param parentComp * @param parentComp
* @param dataSet * Parent composite
* @param callback * @param callback
* The callback class
* @param shell * @param shell
* the shell
*/ */
public GriddedTimingSubsetTab(Composite parentComp, IDataSize callback, public GriddedTimingSubsetTab(Composite parentComp, IDataSize callback,
Shell shell) { Shell shell) {
super(parentComp, callback, shell); super(parentComp, callback, shell);
init();
} }
/** private void init() {
* {@inheritDoc}
*/
@Override
public void init() {
super.init();
GridLayout gl = new GridLayout(1, false); GridLayout gl = new GridLayout(1, false);
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
@ -114,18 +115,20 @@ public class GriddedTimingSubsetTab extends DataTimingSubsetTab implements
} }
/** /**
* Get the selected forecast hours
* *
* {@inheritDoc} * @return the selected forecast hours
*/ */
@Override
public String[] getSelectedFcstHours() { public String[] getSelectedFcstHours() {
return this.fcstDualList.getSelectedListItems(); return this.fcstDualList.getSelectedListItems();
} }
/** /**
* {@inheritDoc} * List of hours to set
*
* @param fcstHours
* list of fcst hours
*/ */
@Override
public void setSelectedForecastHours(List<String> fcstHours) { public void setSelectedForecastHours(List<String> fcstHours) {
fcstDualList.clearSelection(); fcstDualList.clearSelection();
@ -136,17 +139,21 @@ public class GriddedTimingSubsetTab extends DataTimingSubsetTab implements
} }
/** /**
* {@inheritDoc} * Set the available forecast hours
*
* @param forecastHours
* list of fcst hours
*/ */
@Override
public void setAvailableForecastHours(List<String> forecastHours) { public void setAvailableForecastHours(List<String> forecastHours) {
fcstDualList.setFullList(new ArrayList<String>(forecastHours)); fcstDualList.setFullList(new ArrayList<String>(forecastHours));
} }
/** /**
* {@inheritDoc} * Update the selected forecast hours.
*
* @param fcstHours
* list of fcst hours
*/ */
@Override
public void updateSelectedForecastHours(List<String> fcstHours) { public void updateSelectedForecastHours(List<String> fcstHours) {
List<String> selectedHrs = new ArrayList<String>(); List<String> selectedHrs = new ArrayList<String>();
String[] selectedItems = fcstDualList.getSelectedSelection(); String[] selectedItems = fcstDualList.getSelectedSelection();
@ -176,4 +183,28 @@ public class GriddedTimingSubsetTab extends DataTimingSubsetTab implements
fcstDualList.selectItems(selectedHrs.toArray(new String[selectedHrs fcstDualList.selectItems(selectedHrs.toArray(new String[selectedHrs
.size()])); .size()]));
} }
/**
* Are the data valid?
*
* @return true if valid
*/
public boolean isValid() {
if (fcstDualList.getSelectedListItems().length > 0) {
return true;
}
return false;
}
/**
* Get the save info for the tab.
*
* @return TimeXML object
*/
public TimeXML getSaveInfo() {
SpecificDateTimeXML time = new SpecificDateTimeXML();
time.setFcstHours(new ArrayList<String>(Arrays.asList(fcstDualList
.getSelectedListItems())));
return time;
}
} }

View file

@ -42,11 +42,14 @@ import com.raytheon.uf.common.datadelivery.registry.PointTime;
import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.Subscription;
import com.raytheon.uf.common.datadelivery.registry.Time; import com.raytheon.uf.common.datadelivery.registry.Time;
import com.raytheon.uf.common.datadelivery.retrieval.util.PointDataSizeUtils; import com.raytheon.uf.common.datadelivery.retrieval.util.PointDataSizeUtils;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.common.util.SizeUtil; import com.raytheon.uf.common.util.SizeUtil;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.PointTimeSubsetPresenter; import com.raytheon.uf.viz.datadelivery.common.xml.AreaXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.PointTimeXML; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.PointTimeXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.TimeXML;
/** /**
* {@link SubsetManagerDlg} for point data sets. * {@link SubsetManagerDlg} for point data sets.
@ -65,6 +68,7 @@ import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML;
* Sep 10, 2013 2351 dhladky Finished adhoc queries * Sep 10, 2013 2351 dhladky Finished adhoc queries
* Sep 16, 2013 2383 bgonzale Start time precedes end time. * Sep 16, 2013 2383 bgonzale Start time precedes end time.
* Oct 10, 2013 1797 bgonzale Refactored registry Time objects. * Oct 10, 2013 1797 bgonzale Refactored registry Time objects.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -72,14 +76,22 @@ import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML;
* @version 1.0 * @version 1.0
*/ */
public class PointSubsetManagerDlg extends public class PointSubsetManagerDlg extends SubsetManagerDlg {
SubsetManagerDlg<PointDataSet, PointTimeSubsetPresenter, PointTimeXML> { /** Status Handler */
private final IUFStatusHandler statusHandler = UFStatus
.getHandler(PointSubsetManagerDlg.class);
private static final String TIMING_TAB_TEXT = "Retrieval Interval"; private final String TIMING_TAB_TEXT = "Retrieval Interval";
/** Point data size utility */ /** Point data size utility */
private PointDataSizeUtils dataSize; private PointDataSizeUtils dataSize;
/** The data set */
private PointDataSet dataSet;
/** The point subset tab */
private PointTimeSubsetTab timingTabControls;
/** /**
* Constructor. * Constructor.
* *
@ -93,6 +105,7 @@ public class PointSubsetManagerDlg extends
public PointSubsetManagerDlg(Shell shell, boolean loadDataSet, public PointSubsetManagerDlg(Shell shell, boolean loadDataSet,
Subscription subscription) { Subscription subscription) {
super(shell, loadDataSet, subscription); super(shell, loadDataSet, subscription);
setTitle();
} }
/** /**
@ -108,8 +121,11 @@ public class PointSubsetManagerDlg extends
* the subset xml object * the subset xml object
*/ */
public PointSubsetManagerDlg(Shell shell, PointDataSet dataSet, public PointSubsetManagerDlg(Shell shell, PointDataSet dataSet,
boolean loadDataSet, SubsetXML<PointTimeXML> subsetXml) { boolean loadDataSet, SubsetXML subsetXml) {
super(shell, dataSet, loadDataSet, subsetXml); super(shell, loadDataSet, dataSet);
this.dataSet = dataSet;
this.subsetXml = subsetXml;
setTitle();
} }
/** /**
@ -122,8 +138,21 @@ public class PointSubsetManagerDlg extends
*/ */
public PointSubsetManagerDlg(Shell shell, PointDataSet dataSet) { public PointSubsetManagerDlg(Shell shell, PointDataSet dataSet) {
super(shell, dataSet); super(shell, dataSet);
this.dataSet = dataSet;
setTitle();
} }
/**
* {@inheritDoc}
*/
@Override
protected void setTitle() {
setText(DD_SUBSET_MANAGER + dataSet.getDataSetName());
}
/**
* {@inheritDoc}
*/
@Override @Override
void createTabs(TabFolder tabFolder) { void createTabs(TabFolder tabFolder) {
GridData gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false); GridData gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
@ -136,9 +165,15 @@ public class PointSubsetManagerDlg extends
timingComp.setLayout(gl); timingComp.setLayout(gl);
timingComp.setLayoutData(gd); timingComp.setLayoutData(gd);
timingTab.setControl(timingComp); timingTab.setControl(timingComp);
timingTabControls = getDataTimingSubsetPresenter(timingComp, dataSet, timingTabControls = new PointTimeSubsetTab(timingComp, this, shell);
this, shell);
timingTabControls.init(); TabItem spatialTab = new TabItem(tabFolder, SWT.NONE);
spatialTab.setText(SPATIAL_TAB);
Composite spatialComp = new Composite(tabFolder, SWT.NONE);
spatialComp.setLayout(gl);
spatialComp.setLayoutData(gd);
spatialTab.setControl(spatialComp);
spatialTabControls = new SpatialSubsetTab(spatialComp, dataSet, this);
} }
/** /**
@ -162,18 +197,6 @@ public class PointSubsetManagerDlg extends
.getDataSetSizeInBytes(env, interval))); .getDataSetSizeInBytes(env, interval)));
} }
/**
* {@inheritDoc}
*/
@Override
protected PointTimeSubsetPresenter getDataTimingSubsetPresenter(
Composite parentComp, PointDataSet dataSet, IDataSize callback,
Shell shell) {
PointTimeSubsetTab view = new PointTimeSubsetTab(parentComp, callback,
shell);
return new PointTimeSubsetPresenter(dataSet, view);
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@ -209,8 +232,11 @@ public class PointSubsetManagerDlg extends
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
protected <T extends Subscription> T populateSubscription(T sub, protected Subscription populateSubscription(Subscription sub, boolean create) {
boolean create) { sub.setProvider(dataSet.getProviderName());
sub.setDataSetName(dataSet.getDataSetName());
sub.setDataSetType(dataSet.getDataSetType());
sub.setDataSetName(dataSet.getDataSetName());
Time newTime = new PointTime(); Time newTime = new PointTime();
newTime = setupDataSpecificTime(newTime, sub); newTime = setupDataSpecificTime(newTime, sub);
@ -242,21 +268,16 @@ public class PointSubsetManagerDlg extends
return sub; return sub;
} }
/* /**
* (non-Javadoc) * {@inheritDoc}
*
* @see
* com.raytheon.uf.viz.datadelivery.subscription.subset.SubsetManagerDlg
* #loadFromSubsetXML
* (com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML)
*/ */
@Override @Override
protected void loadFromSubsetXML(SubsetXML<PointTimeXML> subsetXml) { protected void loadFromSubsetXML(SubsetXML subsetXml) {
super.loadFromSubsetXML(subsetXml); super.loadFromSubsetXML(subsetXml);
PointTimeXML time = subsetXml.getTime(); PointTimeXML time = (PointTimeXML) subsetXml.getTime();
this.timingTabControls.populate(time, dataSet); this.timingTabControls.setDataRetrievalInterval(time
.getDataRetrievalInterval());
} }
/* /*
@ -275,6 +296,29 @@ public class PointSubsetManagerDlg extends
time.setDataRetrievalInterval(((PointTime) subscription.getTime()) time.setDataRetrievalInterval(((PointTime) subscription.getTime())
.getInterval()); .getInterval());
this.timingTabControls.populate(time, dataSet); this.timingTabControls.setDataRetrievalInterval(time
.getDataRetrievalInterval());
AreaXML area = new AreaXML();
ReferencedEnvelope envelope = this.subscription.getCoverage()
.getEnvelope();
ReferencedEnvelope requestEnvelope = this.subscription.getCoverage()
.getRequestEnvelope();
if (requestEnvelope != null && !requestEnvelope.isEmpty()) {
area.setEnvelope(requestEnvelope);
} else {
area.setEnvelope(envelope);
}
spatialTabControls.setDataSet(this.dataSet);
spatialTabControls.populate(area);
}
/**
* {@inheritDoc}
*/
@Override
protected TimeXML getDataTimeInfo() {
return timingTabControls.getSaveInfo();
} }
} }

View file

@ -35,7 +35,7 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Shell;
import com.raytheon.uf.common.datadelivery.registry.PointTime; import com.raytheon.uf.common.datadelivery.registry.PointTime;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.IPointDataTimingSubsetView; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.PointTimeXML;
/** /**
* Point Time Subset Tab. Sets the data retrieval interval. * Point Time Subset Tab. Sets the data retrieval interval.
@ -49,6 +49,7 @@ import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.IPointData
* May 29, 2013 223 mpduff Initial creation. * May 29, 2013 223 mpduff Initial creation.
* Jun 06, 2013 2038 djohnson Place refresh intervals into PointTime so BandwidthManager has access. * Jun 06, 2013 2038 djohnson Place refresh intervals into PointTime so BandwidthManager has access.
* Jun 13, 2013 2108 mpduff Update data set size on change. * Jun 13, 2013 2108 mpduff Update data set size on change.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -56,8 +57,7 @@ import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.IPointData
* @version 1.0 * @version 1.0
*/ */
public class PointTimeSubsetTab extends DataTimingSubsetTab implements public class PointTimeSubsetTab extends DataTimingSubsetTab {
IPointDataTimingSubsetView {
/** Data Retrieval Intervals */ /** Data Retrieval Intervals */
private final String[] INTERVALS; private final String[] INTERVALS;
@ -87,18 +87,11 @@ public class PointTimeSubsetTab extends DataTimingSubsetTab implements
} }
INTERVALS = allowedRefreshIntervals INTERVALS = allowedRefreshIntervals
.toArray(new String[allowedRefreshIntervals.size()]); .toArray(new String[allowedRefreshIntervals.size()]);
init();
} }
/* private void init() {
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.datadelivery.subscription.subset.DataTimingSubsetTab
* #init()
*/
@Override
public void init() {
super.init();
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
GridLayout gl = new GridLayout(2, false); GridLayout gl = new GridLayout(2, false);
@ -124,9 +117,11 @@ public class PointTimeSubsetTab extends DataTimingSubsetTab implements
} }
/** /**
* {@inheritDoc} * Set the data retrieval interval
*
* @param interval
* the retrieval interval
*/ */
@Override
public void setDataRetrievalInterval(int interval) { public void setDataRetrievalInterval(int interval) {
int idx = 0; int idx = 0;
for (String s : INTERVALS) { for (String s : INTERVALS) {
@ -139,9 +134,10 @@ public class PointTimeSubsetTab extends DataTimingSubsetTab implements
} }
/** /**
* {@inheritDoc} * Get the data retrieval interval
*
* @return the retrieval interval
*/ */
@Override
public int getDataRetrievalInterval() { public int getDataRetrievalInterval() {
return Integer.parseInt(intervalCombo.getItem(intervalCombo return Integer.parseInt(intervalCombo.getItem(intervalCombo
.getSelectionIndex())); .getSelectionIndex()));
@ -150,7 +146,18 @@ public class PointTimeSubsetTab extends DataTimingSubsetTab implements
/** /**
* Handle a selection change. * Handle a selection change.
*/ */
protected void handleSelection() { private void handleSelection() {
selectionChanged(); selectionChanged();
} }
/**
* Get the tab's save information.
*
* @return The PointTimeXML data object
*/
public PointTimeXML getSaveInfo() {
PointTimeXML ptx = new PointTimeXML();
ptx.setDataRetrievalInterval(getDataRetrievalInterval());
return ptx;
}
} }

View file

@ -31,6 +31,7 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Text;
import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.geometry.jts.ReferencedEnvelope;
import com.google.common.base.Strings;
import com.raytheon.uf.common.datadelivery.registry.DataSet; import com.raytheon.uf.common.datadelivery.registry.DataSet;
import com.raytheon.uf.viz.datadelivery.common.ui.AreaComp; import com.raytheon.uf.viz.datadelivery.common.ui.AreaComp;
import com.raytheon.uf.viz.datadelivery.common.xml.AreaXML; import com.raytheon.uf.viz.datadelivery.common.xml.AreaXML;
@ -60,6 +61,7 @@ import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils;
* Dec 10, 2012 1259 bsteffen Switch Data Delivery from LatLon to referenced envelopes. * Dec 10, 2012 1259 bsteffen Switch Data Delivery from LatLon to referenced envelopes.
* Feb 20, 2013 1589 mpduff Fix to allow saving custom areas. * Feb 20, 2013 1589 mpduff Fix to allow saving custom areas.
* Jun 14, 2013 2064 mpudff Force an update of region controls. * Jun 14, 2013 2064 mpudff Force an update of region controls.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -220,8 +222,7 @@ public class SpatialSubsetTab extends SubsetTab implements IDataSize {
* @return Region Name * @return Region Name
*/ */
public String getRegionSaveText() { public String getRegionSaveText() {
String saveName = savedRegionTxt.getText().trim(); return savedRegionTxt.getText().trim();
return saveName;
} }
/** /**
@ -321,7 +322,7 @@ public class SpatialSubsetTab extends SubsetTab implements IDataSize {
String regionName = area.getRegionName(); String regionName = area.getRegionName();
// set the region name in the combo box // set the region name in the combo box
if (regionName != null) { if (!Strings.isNullOrEmpty(regionName)) {
int i = 0; int i = 0;
areaComp.setRegion(regionName); areaComp.setRegion(regionName);
@ -335,7 +336,7 @@ public class SpatialSubsetTab extends SubsetTab implements IDataSize {
} }
} }
areaComp.updateRegionControls(); areaComp.updateRegionControls();
} }

View file

@ -64,6 +64,7 @@ import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils;
* Aug 22, 2012 0743 djohnson Add TimeXML subclasses. * Aug 22, 2012 0743 djohnson Add TimeXML subclasses.
* Nov 19, 2012 1289 bgonzale Added deleteArea(String) method. * Nov 19, 2012 1289 bgonzale Added deleteArea(String) method.
* Jun 04, 2013 223 mpduff Added PointTimeXML to JaxB context. * Jun 04, 2013 223 mpduff Added PointTimeXML to JaxB context.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -72,11 +73,14 @@ import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils;
*/ */
public class SubsetFileManager { public class SubsetFileManager {
/** Singleton instance */
private static SubsetFileManager instance = new SubsetFileManager(); private static SubsetFileManager instance = new SubsetFileManager();
/** Area file path */
private final String AREA_PATH = "dataDelivery" + File.separator + "subset" private final String AREA_PATH = "dataDelivery" + File.separator + "subset"
+ File.separator + "area" + File.separator; + File.separator + "area" + File.separator;
/** Subset file path */
private final String SUBSET_PATH = "dataDelivery" + File.separator private final String SUBSET_PATH = "dataDelivery" + File.separator
+ "subset" + File.separator; + "subset" + File.separator;
@ -93,8 +97,12 @@ public class SubsetFileManager {
/** Unmarshaller object */ /** Unmarshaller object */
private Unmarshaller unmarshaller; private Unmarshaller unmarshaller;
/** Array of subset files */
private LocalizationFile[] subsetFiles; private LocalizationFile[] subsetFiles;
/**
* Private constructor.
*/
private SubsetFileManager() { private SubsetFileManager() {
createContext(); createContext();
} }
@ -133,6 +141,7 @@ public class SubsetFileManager {
* @param area * @param area
* The area xml object to save * The area xml object to save
* @param shell * @param shell
* The calling dialog's shell
* @return true if save successful * @return true if save successful
*/ */
public boolean saveArea(AreaXML area, Shell shell) { public boolean saveArea(AreaXML area, Shell shell) {
@ -202,8 +211,6 @@ public class SubsetFileManager {
/** /**
* Get the AreaXML file * Get the AreaXML file
* *
* @param name
* Saved file name
* @return AreaXML object * @return AreaXML object
*/ */
public LocalizationFile[] getAreas() { public LocalizationFile[] getAreas() {
@ -227,7 +234,6 @@ public class SubsetFileManager {
area = (AreaXML) unmarshaller.unmarshal(file); area = (AreaXML) unmarshaller.unmarshal(file);
} catch (JAXBException e) { } catch (JAXBException e) {
statusHandler.handle(Priority.ERROR, e.getLocalizedMessage(), e); statusHandler.handle(Priority.ERROR, e.getLocalizedMessage(), e);
e.printStackTrace();
} }
return area; return area;
} }
@ -255,6 +261,7 @@ public class SubsetFileManager {
* @param subset * @param subset
* the object to save * the object to save
* @param shell * @param shell
* The calling dialog's shell
* @return true if successfully saved * @return true if successfully saved
*/ */
public boolean saveSubset(SubsetXML subset, Shell shell) { public boolean saveSubset(SubsetXML subset, Shell shell) {
@ -279,15 +286,12 @@ public class SubsetFileManager {
try { try {
marshaller.marshal(subset, subsetLocFile.getFile()); marshaller.marshal(subset, subsetLocFile.getFile());
subsetLocFile.save(); subsetLocFile.save();
System.out.println("Saved " + subsetLocFile.getFile().getPath());
return true; return true;
} catch (JAXBException e) { } catch (JAXBException e) {
statusHandler.handle(Priority.ERROR, e.getLocalizedMessage(), e); statusHandler.handle(Priority.ERROR, e.getLocalizedMessage(), e);
e.printStackTrace();
} catch (LocalizationOpFailedException e) { } catch (LocalizationOpFailedException e) {
statusHandler.handle(Priority.ERROR, e.getLocalizedMessage(), e); statusHandler.handle(Priority.ERROR, e.getLocalizedMessage(), e);
e.printStackTrace();
} }
return false; return false;
@ -301,7 +305,7 @@ public class SubsetFileManager {
* *
* @return The SubsetXML object * @return The SubsetXML object
*/ */
public SubsetXML<?> loadSubset(String subsetName) { public SubsetXML loadSubset(String subsetName) {
// Load the subset files if not already loaded // Load the subset files if not already loaded
if (subsetFiles == null || subsetFiles.length == 0) { if (subsetFiles == null || subsetFiles.length == 0) {
getSubsets(); getSubsets();
@ -310,7 +314,7 @@ public class SubsetFileManager {
for (LocalizationFile lf : subsetFiles) { for (LocalizationFile lf : subsetFiles) {
if (lf.getFile().getName().equals(subsetName)) { if (lf.getFile().getName().equals(subsetName)) {
try { try {
return (SubsetXML<?>) unmarshaller.unmarshal(lf.getFile()); return (SubsetXML) unmarshaller.unmarshal(lf.getFile());
} catch (JAXBException e) { } catch (JAXBException e) {
statusHandler.handle(Priority.PROBLEM, statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e); e.getLocalizedMessage(), e);

View file

@ -71,10 +71,6 @@ import com.raytheon.uf.viz.datadelivery.subscription.ISubscriptionService;
import com.raytheon.uf.viz.datadelivery.subscription.ISubscriptionService.ISubscriptionServiceResult; import com.raytheon.uf.viz.datadelivery.subscription.ISubscriptionService.ISubscriptionServiceResult;
import com.raytheon.uf.viz.datadelivery.subscription.SubscriptionService.ForceApplyPromptResponse; import com.raytheon.uf.viz.datadelivery.subscription.SubscriptionService.ForceApplyPromptResponse;
import com.raytheon.uf.viz.datadelivery.subscription.SubscriptionService.IForceApplyPromptDisplayText; import com.raytheon.uf.viz.datadelivery.subscription.SubscriptionService.IForceApplyPromptDisplayText;
import com.raytheon.uf.viz.datadelivery.subscription.presenter.CreateSubscriptionDlgPresenter;
import com.raytheon.uf.viz.datadelivery.subscription.subset.presenter.DataTimingSubsetPresenter;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.PointTimeXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SpecificDateTimeXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SubsetXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.TimeXML; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.TimeXML;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.VerticalXML; import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.VerticalXML;
@ -133,14 +129,14 @@ import com.raytheon.viz.ui.presenter.IDisplay;
* Jun 04, 2013 223 mpduff Moved data type specific code to sub classes. * Jun 04, 2013 223 mpduff Moved data type specific code to sub classes.
* Jun 11, 2013 2064 mpduff Fix editing of subscriptions. * Jun 11, 2013 2064 mpduff Fix editing of subscriptions.
* Jun 14, 2013 2108 mpduff Refactored DataSizeUtils. * Jun 14, 2013 2108 mpduff Refactored DataSizeUtils.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* </pre> * </pre>
* *
* @author mpduff * @author mpduff
* @version 1.0 * @version 1.0
*/ */
public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extends DataTimingSubsetPresenter<DATASET, ?, ?, TIMEXML, ?>, TIMEXML extends TimeXML> public abstract class SubsetManagerDlg extends CaveSWTDialog implements
extends CaveSWTDialog implements ITabAction, IDataSize, IDisplay, ITabAction, IDataSize, IDisplay, IForceApplyPromptDisplayText {
IForceApplyPromptDisplayText {
/** constant */ /** constant */
private final static String DATASETS_NOT_SUPPORTED = "Datasets of type [%s] are currently not supported!"; private final static String DATASETS_NOT_SUPPORTED = "Datasets of type [%s] are currently not supported!";
@ -148,6 +144,9 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
private final IUFStatusHandler statusHandler = UFStatus private final IUFStatusHandler statusHandler = UFStatus
.getHandler(SubsetManagerDlg.class); .getHandler(SubsetManagerDlg.class);
private final ISubscriptionService subscriptionService = DataDeliveryServices
.getSubscriptionService();
/** Subset Name text box */ /** Subset Name text box */
private Text nameText; private Text nameText;
@ -157,30 +156,17 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
/** TabFolder object */ /** TabFolder object */
private TabFolder tabFolder; private TabFolder tabFolder;
/** DataSet object */
protected DATASET dataSet;
/** Create a subscription dialog */
private CreateSubscriptionDlgPresenter subDlg;
/** Saved subset tab */ /** Saved subset tab */
private SavedSubsetTab subsetTab; private SavedSubsetTab subsetTab;
/** Vertical subset tab */ /** Vertical subset tab */
protected VerticalSubsetTab vTab; protected VerticalSubsetTab vTab;
/**
* The presenter class separates as much of the logic from the SWT code as
* possible. It also allows for unit testing of the logic since SWT is
* typically not ran headless.
**/
protected PRESENTER timingTabControls;
/** Spatial subset tab */ /** Spatial subset tab */
protected SpatialSubsetTab spatialTabControls; protected SpatialSubsetTab spatialTabControls;
/** Subset XML file object */ /** Subset XML file object */
private SubsetXML<TIMEXML> subsetXml; protected SubsetXML subsetXml;
/** Load dataset flag */ /** Load dataset flag */
private boolean loadDataSet = false; private boolean loadDataSet = false;
@ -195,40 +181,35 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
protected boolean initialized = false; protected boolean initialized = false;
/** Subset manager constant */ /** Subset manager constant */
private final String DD_SUBSET_MANAGER = "Data Delivery Subset Manager - "; protected final String DD_SUBSET_MANAGER = "Data Delivery Subset Manager - ";
/** Vertical tab text */
protected final String VERTICAL_TAB = "Vertical Levels/Parameters"; protected final String VERTICAL_TAB = "Vertical Levels/Parameters";
private final String SPATIAL_TAB = "Spatial"; /** Spatial tab text */
protected final String SPATIAL_TAB = "Spatial";
private final ISubscriptionService subscriptionService = DataDeliveryServices /** The create subscription dialog */
.getSubscriptionService(); private CreateSubscriptionDlg subDlg;
/** The dataset */
private final DataSet dataSet;
/** /**
* Constructor * Constructor
* *
* @param shell * @param shell
* The parent Shell * The parent Shell
* @param dataSet
* The DataSetMetaData
* @param loadDataSet * @param loadDataSet
* Populate the dialog if true * Populate the dialog if true
* @param subsetXml * @param dataSet
* The SubsetXML object to load * The DataSetMetaData
*/ */
public SubsetManagerDlg(Shell shell, DATASET dataSet, boolean loadDataSet, public SubsetManagerDlg(Shell shell, boolean loadDataSet, DataSet dataSet) {
SubsetXML<TIMEXML> subsetXml) {
super(shell, SWT.RESIZE | SWT.DIALOG_TRIM | SWT.MIN, super(shell, SWT.RESIZE | SWT.DIALOG_TRIM | SWT.MIN,
CAVE.INDEPENDENT_SHELL); CAVE.INDEPENDENT_SHELL);
if (dataSet != null) {
setText(DD_SUBSET_MANAGER + dataSet.getDataSetName());
} else {
setText(DD_SUBSET_MANAGER);
}
this.dataSet = dataSet;
this.subsetXml = subsetXml;
this.loadDataSet = loadDataSet; this.loadDataSet = loadDataSet;
this.dataSet = dataSet;
} }
/** /**
@ -240,8 +221,8 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
* @param dataSet * @param dataSet
* The DataSetMetaData * The DataSetMetaData
*/ */
public SubsetManagerDlg(Shell shell, DATASET dataSet) { public SubsetManagerDlg(Shell shell, DataSet dataSet) {
this(shell, dataSet, false, null); this(shell, false, dataSet);
} }
/** /**
@ -261,15 +242,42 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
CAVE.INDEPENDENT_SHELL); CAVE.INDEPENDENT_SHELL);
this.create = false; this.create = false;
this.loadDataSet = true; this.loadDataSet = true;
// TODO: Is there a cleaner way to do this other than casting?
this.dataSet = (DATASET) MetaDataManager.getInstance().getDataSet( this.dataSet = MetaDataManager.getInstance().getDataSet(
subscription.getDataSetName(), subscription.getProvider()); subscription.getDataSetName(), subscription.getProvider());
this.subscription = subscription; this.subscription = subscription;
setText(DD_SUBSET_MANAGER + "Edit: " + subscription.getName()); setText(DD_SUBSET_MANAGER + "Edit: " + subscription.getName());
} }
/**
* Create the type specific tabs.
*
* @param tabFolder
*/
abstract void createTabs(TabFolder tabFolder); abstract void createTabs(TabFolder tabFolder);
/** Populate the subscription object */
protected abstract <T extends Subscription> T populateSubscription(T sub,
boolean create);
/**
* Setup the timing information specific to the data type.
*/
protected abstract Time setupDataSpecificTime(Time newTime, Subscription sub);
/**
* Get the Time object.
*
* @return The time object
*/
protected abstract TimeXML getTimeXmlFromSubscription();
/** Set the title */
protected abstract void setTitle();
/** Get the data time information */
protected abstract TimeXML getDataTimeInfo();
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -333,7 +341,6 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
tabFolder.setLayoutData(gd); tabFolder.setLayoutData(gd);
createCommonTabs(tabFolder); createCommonTabs(tabFolder);
tabFolder.pack(); tabFolder.pack();
} }
/* /*
@ -345,22 +352,12 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
protected void opened() { protected void opened() {
// Set the min size of the shell to the current // Set the min size of the shell to the current
// shell size since it has been packed before this call // shell size since it has been packed before this call
// shell.setMinimumSize(shell.getSize()); shell.setMinimumSize(shell.getSize());
} }
/** Create the tabs */ /** Create the tabs */
private void createCommonTabs(TabFolder tabFolder) { private void createCommonTabs(TabFolder tabFolder) {
createTabs(tabFolder); createTabs(tabFolder);
GridData gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
GridLayout gl = new GridLayout(1, false);
TabItem spatialTab = new TabItem(tabFolder, SWT.NONE);
spatialTab.setText(SPATIAL_TAB);
Composite spatialComp = new Composite(tabFolder, SWT.NONE);
spatialComp.setLayout(gl);
spatialComp.setLayoutData(gd);
spatialTab.setControl(spatialComp);
spatialTabControls = new SpatialSubsetTab(spatialComp, dataSet, this);
TabItem savedSetsTab = new TabItem(tabFolder, SWT.NONE); TabItem savedSetsTab = new TabItem(tabFolder, SWT.NONE);
savedSetsTab.setText("Saved Subsets"); savedSetsTab.setText("Saved Subsets");
@ -369,23 +366,6 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
subsetTab = new SavedSubsetTab(savedSetsComp, this); subsetTab = new SavedSubsetTab(savedSetsComp, this);
} }
/**
* Construct and return the presenter class.
*
* @param shell
* @param subsetManagerDlg
* @param dataSet2
* @param timingComp
*
* @return the presenter instance
*/
protected abstract PRESENTER getDataTimingSubsetPresenter(
Composite parentComp, DATASET dataSet, IDataSize callback,
Shell shell);
protected abstract <T extends Subscription> T populateSubscription(T sub,
boolean create);
/** Create the information composite */ /** Create the information composite */
private void createInfoComp() { private void createInfoComp() {
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
@ -491,14 +471,14 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
* Launch the Create Subscription GUI * Launch the Create Subscription GUI
*/ */
private boolean handleOK(Subscription sub) { private boolean handleOK(Subscription sub) {
System.out.println("SubsetManagerDlg.handleOK(): Implement Me");
if (this.validated(true)) { if (this.validated(true)) {
if (subDlg != null && !subDlg.isDisposed()) { if (subDlg != null && !subDlg.isDisposed()) {
subDlg.bringToTop(); subDlg.bringToTop();
} else { } else {
subDlg = new CreateSubscriptionDlgPresenter( subDlg = new CreateSubscriptionDlg(shell, create, dataSet,
new CreateSubscriptionDlg(shell, create), dataSet, new VizAppTaskExecutor());
create, new VizAppTaskExecutor()); subDlg.setSubscription(sub);
subDlg.setSubscriptionData(sub);
subDlg.open(); subDlg.open();
} }
return subDlg.getStatus() == Status.OK; return subDlg.getStatus() == Status.OK;
@ -508,7 +488,7 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
} }
/** /**
* Query button action handler. * * u Query button action handler.
*/ */
private void handleQuery() { private void handleQuery() {
boolean valid = this.validated(false); boolean valid = this.validated(false);
@ -597,16 +577,12 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
sub.setActive(this.subscription.isActive()); sub.setActive(this.subscription.isActive());
sub.setPriority(this.subscription.getPriority()); sub.setPriority(this.subscription.getPriority());
} }
sub.setProvider(dataSet.getProviderName());
sub.setDataSetName(dataSet.getDataSetName());
sub.setDataSetType(dataSet.getDataSetType());
// Catch the case where the user closes this dialog. // Catch the case where the user closes this dialog.
if (this.isDisposed()) { if (this.isDisposed()) {
return null; return null;
} }
sub.setDataSetName(dataSet.getDataSetName());
sub.setSubscriptionId("AdHocID"); sub.setSubscriptionId("AdHocID");
if (this.subscription != null) { if (this.subscription != null) {
if (this.subscription.getDescription() != null) { if (this.subscription.getDescription() != null) {
@ -620,11 +596,6 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
return populateSubscription(sub, create); return populateSubscription(sub, create);
} }
/**
* Setup the timing information specific to the data type.
*/
protected abstract Time setupDataSpecificTime(Time newTime, Subscription sub);
/** /**
* Display cancel changes message. * Display cancel changes message.
*/ */
@ -699,9 +670,36 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
} }
/** /**
* Validate the area. * {@inheritDoc}
*/ */
private boolean validateArea() { @Override
public void handleSaveSubset() {
if (!DataDeliveryGUIUtils.hasText(this.nameText)) {
DataDeliveryUtils.showMessage(getShell(), SWT.OK, "Name Required",
"Name requred. A subset name must be entered.");
return;
}
if (DataDeliveryGUIUtils.INVALID_CHAR_PATTERN.matcher(
nameText.getText().trim()).find()) {
DataDeliveryUtils
.showMessage(getShell(), SWT.ERROR, "Invalid Characters",
"Invalid characters. The Subset Name may only contain letters/numbers/dashes.");
return;
}
SubsetXML subset = new SubsetXML();
populateSubsetXML(subset);
// Have all the info, now save the file
SubsetFileManager.getInstance().saveSubset(subset, this.shell);
setClean();
subsetTab.enableButtons(nameText);
}
/** Validate the area */
protected boolean validateArea() {
ReferencedEnvelope envelope = spatialTabControls.getEnvelope(); ReferencedEnvelope envelope = spatialTabControls.getEnvelope();
if (envelope == null) { if (envelope == null) {
@ -723,7 +721,9 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
valid = true; valid = true;
} }
} catch (TransformException e) { } catch (TransformException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); statusHandler.handle(
com.raytheon.uf.common.status.UFStatus.Priority.PROBLEM,
e.getLocalizedMessage(), e);
} }
if (!valid) { if (!valid) {
@ -743,33 +743,13 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
return true; return true;
} }
@Override /**
public void handleSaveSubset() { * Populate the subset XML data object.
*
if (!DataDeliveryGUIUtils.hasText(this.nameText)) { * @param subset
DataDeliveryUtils.showMessage(getShell(), SWT.OK, "Name Required", * The SubsetXML object to populate
"Name requred. A subset name must be entered."); */
return; protected void populateSubsetXML(SubsetXML subset) {
}
if (DataDeliveryGUIUtils.INVALID_CHAR_PATTERN.matcher(
nameText.getText().trim()).find()) {
DataDeliveryUtils
.showMessage(getShell(), SWT.ERROR, "Invalid Characters",
"Invalid characters. The Subset Name may only contain letters/numbers/dashes.");
return;
}
SubsetXML<TIMEXML> subset = new SubsetXML<TIMEXML>();
populateSubsetXML(subset);
// Have all the info, now save the file
SubsetFileManager.getInstance().saveSubset(subset, this.shell);
setClean();
subsetTab.enableButtons(nameText);
}
protected void populateSubsetXML(SubsetXML<TIMEXML> subset) {
subset.setBaseSubsetName(nameText.getText()); subset.setBaseSubsetName(nameText.getText());
subset.setDatasetName(dataSet.getDataSetName()); subset.setDatasetName(dataSet.getDataSetName());
subset.setProviderName(dataSet.getProviderName()); subset.setProviderName(dataSet.getProviderName());
@ -778,8 +758,8 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
AreaXML area = spatialTabControls.getSaveInfo(); AreaXML area = spatialTabControls.getSaveInfo();
subset.setArea(area); subset.setArea(area);
// TODO Only save this for grid. Once Obs have parameters then this will // TODO Only save this for grid. Once Obs have parameters then this
// need to be saved for obs // will need to be saved for obs
if (dataSet.getDataSetType() == DataType.GRID) { if (dataSet.getDataSetType() == DataType.GRID) {
// next save vertical layer/parameter info // next save vertical layer/parameter info
ArrayList<VerticalXML> vertList = vTab.getSaveInfo(); ArrayList<VerticalXML> vertList = vTab.getSaveInfo();
@ -787,7 +767,7 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
} }
// finally the date/cycle/forecast data // finally the date/cycle/forecast data
TIMEXML time = timingTabControls.getSaveInfo(); TimeXML time = getDataTimeInfo();
subset.setTime(time); subset.setTime(time);
} }
@ -801,15 +781,19 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void handleLoadSubset(String subsetName) { public void handleLoadSubset(String subsetName) {
SubsetXML loadedSubsetXml = SubsetFileManager.getInstance().loadSubset(
// TODO: How else to do this other than casting? subsetName);
SubsetXML<TIMEXML> loadedSubsetXml = (SubsetXML<TIMEXML>) SubsetFileManager
.getInstance().loadSubset(subsetName);
loadFromSubsetXML(loadedSubsetXml); loadFromSubsetXML(loadedSubsetXml);
} }
protected void loadFromSubsetXML(SubsetXML<TIMEXML> subsetXml) { /**
* Populate the dialog from the SubsetXML object.
*
* @param subsetXml
* The subset xml object
*/
protected void loadFromSubsetXML(SubsetXML subsetXml) {
if (this.subsetXml == subsetXml) { if (this.subsetXml == subsetXml) {
// only populate area and name if subsetXml is loading from initial // only populate area and name if subsetXml is loading from initial
// load, not from the saved subsets tab. // load, not from the saved subsets tab.
@ -821,35 +805,16 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
} }
} }
/**
* Populate the dialog from the Subscription object.
*
* @param subscription
* The subscription object
*/
protected void loadFromSubscription(Subscription subscription) { protected void loadFromSubscription(Subscription subscription) {
this.nameText.setText(this.subscription.getName()); this.nameText.setText(this.subscription.getName());
// Area
AreaXML area = new AreaXML();
ReferencedEnvelope envelope = this.subscription.getCoverage()
.getEnvelope();
ReferencedEnvelope requestEnvelope = this.subscription.getCoverage()
.getRequestEnvelope();
if (requestEnvelope != null && !requestEnvelope.isEmpty()) {
area.setEnvelope(requestEnvelope);
} else {
area.setEnvelope(envelope);
}
spatialTabControls.setDataSet(this.dataSet);
spatialTabControls.populate(area);
} }
/**
* Get the Time object.
*
* @return The time object
*/
protected abstract TIMEXML getTimeXmlFromSubscription();
/** /**
* If any mods have been made to the composite selections, set dirty true. * If any mods have been made to the composite selections, set dirty true.
*/ */
@ -859,10 +824,6 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
return true; return true;
} }
if (timingTabControls.isDirty()) {
return true;
}
if (spatialTabControls.isSpatialDirty()) { if (spatialTabControls.isSpatialDirty()) {
return true; return true;
} }
@ -877,7 +838,6 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
if (vTab != null) { if (vTab != null) {
vTab.setClean(); vTab.setClean();
} }
timingTabControls.setDirty(false);
spatialTabControls.setSpatialDirty(false); spatialTabControls.setSpatialDirty(false);
} }
@ -887,19 +847,18 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
* *
* @param shell * @param shell
* the current dialog shell * the current dialog shell
* @param data * @param dataSet
* the data set * the data set
* @return the dialog * @return the dialog
*/ */
public static SubsetManagerDlg<?, ?, ?> fromDataSet(Shell shell, public static SubsetManagerDlg fromDataSet(Shell shell, DataSet dataSet) {
DataSet data) { if (dataSet.getDataSetType() == DataType.GRID) {
if (data.getDataSetType() == DataType.GRID) { return new GriddedSubsetManagerDlg(shell, (GriddedDataSet) dataSet);
return new GriddedSubsetManagerDlg(shell, (GriddedDataSet) data); } else if (dataSet.getDataSetType() == DataType.POINT) {
} else if (data.getDataSetType() == DataType.POINT) { return new PointSubsetManagerDlg(shell, (PointDataSet) dataSet);
return new PointSubsetManagerDlg(shell, (PointDataSet) data);
} }
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
DATASETS_NOT_SUPPORTED, data.getClass().getName())); DATASETS_NOT_SUPPORTED, dataSet.getClass().getName()));
} }
/** /**
@ -914,7 +873,7 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
* the subscription object * the subscription object
* @return SubsetManagerDlg * @return SubsetManagerDlg
*/ */
public static SubsetManagerDlg<?, ?, ?> fromSubscription(Shell shell, public static SubsetManagerDlg fromSubscription(Shell shell,
boolean loadDataSet, Subscription subscription) { boolean loadDataSet, Subscription subscription) {
if (DataType.GRID == subscription.getDataSetType()) { if (DataType.GRID == subscription.getDataSetType()) {
return new GriddedSubsetManagerDlg(shell, loadDataSet, subscription); return new GriddedSubsetManagerDlg(shell, loadDataSet, subscription);
@ -941,14 +900,14 @@ public abstract class SubsetManagerDlg<DATASET extends DataSet, PRESENTER extend
* @return SubsetManagerDlg * @return SubsetManagerDlg
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static SubsetManagerDlg<?, ?, ?> fromSubsetXML(Shell shell, public static SubsetManagerDlg fromSubsetXML(Shell shell, DataSet data,
DataSet data, boolean loadDataSet, SubsetXML<?> subset) { boolean loadDataSet, SubsetXML subset) {
if (data instanceof GriddedDataSet) { if (data instanceof GriddedDataSet) {
return new GriddedSubsetManagerDlg(shell, (GriddedDataSet) data, return new GriddedSubsetManagerDlg(shell, (GriddedDataSet) data,
loadDataSet, (SubsetXML<SpecificDateTimeXML>) subset); loadDataSet, subset);
} else if (data instanceof PointDataSet) { } else if (data instanceof PointDataSet) {
return new PointSubsetManagerDlg(shell, (PointDataSet) data, true, return new PointSubsetManagerDlg(shell, (PointDataSet) data, true,
(SubsetXML<PointTimeXML>) subset); subset);
} }
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
DATASETS_NOT_SUPPORTED, data.getClass().getName())); DATASETS_NOT_SUPPORTED, data.getClass().getName()));

View file

@ -1,127 +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.datadelivery.subscription.subset.presenter;
import com.google.common.annotations.VisibleForTesting;
import com.raytheon.uf.common.datadelivery.registry.DataSet;
import com.raytheon.uf.common.datadelivery.registry.DataSetMetaData;
import com.raytheon.uf.common.datadelivery.registry.ebxml.DataSetMetaDataFilterableQuery;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.TimeXML;
/**
* The presenter class that handles logic for {@link IDataTimingSubsetView}
* classes. The model-view-presenter pattern (MVP) allows all of the logic and
* important state to be gui implementation independent, which greatly assists
* testing. This class is thread-safe.
*
* @see http://aspiringcraftsman.com/tag/model-view-presenter
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 15, 2012 0743 djohnson Initial creation
* Aug 29, 2012 0223 mpduff Changed as result of renamed objects.
* Sep 24, 2012 1209 djohnson Sub-classes provide isValid() implementations.
* Jan 10, 2013 1444 mpduff Add updateSettings method.
* Jun 04, 2013 223 mpduff Move Grid specific items to sub class.
*
* </pre>
*
* @author djohnson
* @version 1.0
*/
public abstract class DataTimingSubsetPresenter<DATASET extends DataSet, DATASETMETADATA extends DataSetMetaData, VIEW extends IDataTimingSubsetView, TIMEXML extends TimeXML, QUERY extends DataSetMetaDataFilterableQuery<DATASETMETADATA>> {
@VisibleForTesting
final String POPUP_TITLE = "Notice";
@VisibleForTesting
final String SUBSCRIPTIONS_ONLY_USE_LATEST_DATE = "Subscriptions always use the latest date, only adhoc queries support specific date requests."
+ " Overriding options to use the latest date.";
protected final VIEW view;
protected DATASET dataSet;
/**
* @param dataSet
* @param dataTimingSubsetTab
*/
public DataTimingSubsetPresenter(DATASET dataSet, VIEW view) {
this.dataSet = dataSet;
this.view = view;
}
/**
* Initialize the presenter.
*/
public void init() {
view.init();
}
/**
* @return
*/
public boolean isDirty() {
return view.isDirty();
}
/**
* Check whether the view is valid.
*
* @return true if the view is valid
*/
public abstract boolean isValid();
/**
* Set boolean to whether or not date or cycle selections have changed.
*
* @param dateCycleDirty
* time/cycle have changed
*/
public void setDirty(boolean b) {
view.setDirty(b);
}
/**
* Get the save information for this data timing presenter.
*
* @return the save information
*/
public abstract TIMEXML getSaveInfo();
/**
* Restore this data timing presenter from the save information.
*
* @param time
* the saved time information
*/
public abstract void populate(TIMEXML time, DataSet dataSet);
/**
* Update the data timing presenter from the save information.
*
* @param time
* the saved time information
*/
public abstract void updateSettings(TIMEXML time);
}

View file

@ -1,235 +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.datadelivery.subscription.subset.presenter;
import static com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils.getMaxLatency;
import java.util.List;
import com.google.common.annotations.VisibleForTesting;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryGUIUtils;
import com.raytheon.viz.ui.presenter.components.ButtonConf;
import com.raytheon.viz.ui.presenter.components.CheckBoxConf;
import com.raytheon.viz.ui.presenter.components.ComboBoxConf;
import com.raytheon.viz.ui.presenter.components.ListConf;
/**
* Gridded data timing selection dialog presenter.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Sep 12, 2012 mpduff Initial creation
* Sep 27, 2012 1202 bgonzale Set selectionDate to date and cycle.
* Oct 11, 2012 1263 jpiatt Modified for cancel flag.
* Jan 04, 2013 1420 mpduff Add the dataset object.
* Jan 22, 2013 1519 djohnson Use DataDeliveryUtils.getMaxLatency().
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public class GriddedTimingSelectionPresenter {
/** Popup title */
@VisibleForTesting
final String POPUP_TITLE = "Notice";
/** Popup message for no data selected */
@VisibleForTesting
final String VALID_DATE_MUST_BE_SELECTED = "A valid date must be selected.";
/** The dialog view class */
private final IGriddedTimingSelectionDlgView view;
/** Latest data check box conf object */
@VisibleForTesting
final CheckBoxConf latestDataChkConf;
/** Latest data check box action handler */
private final Runnable latestDataChkAction = new Runnable() {
@Override
public void run() {
toggleUseLatestData();
}
};
/** Ok button action handler */
@VisibleForTesting
final Runnable okBtnAction = new Runnable() {
@Override
public void run() {
if (handleOk()) {
view.closeDlg();
}
}
};
/** Cancel button action handler */
@VisibleForTesting
final Runnable cancelBtnAction = new Runnable() {
@Override
public void run() {
cancel = true;
}
};
/** Cancel flag */
private boolean cancel = false;
/** Date/cycle list conf object */
@VisibleForTesting
final ListConf dateCycleListConf;
/** Ok button conf object */
@VisibleForTesting
final ButtonConf okBtnConf;
/** Cancel button conf object */
@VisibleForTesting
ButtonConf cancelBtnConf;
/** The selected cycle */
private int cycle = -999;
/** The selected date */
private String selectedDate;
/** The Gridded dataset obj */
private final GriddedDataSet dataSet;
/**
* Constructor.
*
* @param view
* The view
* @param dataSet
* The dataset
* @param dateCycleList
* The date/cycle list values
*/
public GriddedTimingSelectionPresenter(IGriddedTimingSelectionDlgView view,
GriddedDataSet dataSet, List<String> dateCycleList) {
this.view = view;
this.dataSet = dataSet;
latestDataChkConf = new CheckBoxConf("Get Latest Data", true,
"Use the latest time", latestDataChkAction);
int width = 175;
int height = 225;
dateCycleListConf = new ListConf("Date/Cycle options",
dateCycleList.toArray(new String[dateCycleList.size()]), true,
width, height);
okBtnConf = new ButtonConf(true, "OK", null, okBtnAction);
cancelBtnConf = new ButtonConf(true, "Cancel", null, cancelBtnAction);
}
/**
* Initialize the view.
*/
public void init() {
view.setLatestDataCheckBox(latestDataChkConf);
view.setDateCycleList(dateCycleListConf);
view.setOkButton(okBtnConf);
view.setCancelButton(cancelBtnConf);
}
/**
* OK Button action method.
*
* @return true if everything ok
*/
protected boolean handleOk() {
if (!view.isLatestDataEnabled()) {
String selection = view.getSelection();
if (ComboBoxConf.SELECT_ONE.equals(selection)
|| ComboBoxConf.NONE_AVAILABLE.equals(selection)) {
view.displayPopup(POPUP_TITLE, VALID_DATE_MUST_BE_SELECTED);
return false;
}
DataDeliveryGUIUtils.latencyValidChk(view.getLatency(),
getMaxLatency(dataSet));
// parse off the date/cycle time selected
String[] parts = selection.split(" - ");
this.selectedDate = selection;
String cycleStr = parts[1];
cycleStr = cycleStr.substring(0, cycleStr.indexOf(" Z"));
this.cycle = Integer.parseInt(cycleStr);
} else {
this.cycle = -999;
}
return true;
}
/**
* This method is called via the "Use Latest Data" checkbox being
* selected/unselected.
*/
protected void toggleUseLatestData() {
view.setDateCycleListEnabled();
}
/**
* Open the dialog.
*
* @return The selected cycle
*/
public Integer open() {
Runnable callback = new Runnable() {
@Override
public void run() {
init();
}
};
this.view.setPreOpenCallback(callback);
this.view.openDlg();
return cycle;
}
/**
* Get the selected date.
*
* @return the selected date string
*/
public String getDate() {
return this.selectedDate;
}
/**
* Get cancel flag.
*
* @return true if cancel selected
*/
public boolean isCancel() {
return cancel;
}
}

View file

@ -1,141 +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.datadelivery.subscription.subset.presenter;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import com.google.common.annotations.VisibleForTesting;
import com.raytheon.uf.common.datadelivery.registry.DataSet;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSetMetaData;
import com.raytheon.uf.common.datadelivery.registry.ebxml.GriddedDataSetMetaDataQuery;
import com.raytheon.uf.common.util.CollectionUtil;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.SpecificDateTimeXML;
/**
* {@link DataTimingSubsetPresenter} for Gridded data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 22, 2012 0743 djohnson Initial creation
* Aug 29, 2012 0223 mpduff Removed cycles.
* Sep 24, 2012 1209 djohnson Move isValid() in from view.
* Jan 10, 2013 1444 mpduff Add updateSettings method.
*
* </pre>
*
* @author djohnson
* @version 1.0
*/
public class GriddedTimingSubsetPresenter
extends
DataTimingSubsetPresenter<GriddedDataSet, GriddedDataSetMetaData, IGriddedDataTimingSubsetView, SpecificDateTimeXML, GriddedDataSetMetaDataQuery> {
@VisibleForTesting
final String NO_DATA_FOR_DATE_AND_CYCLE = "No data is available for the specified date and cycle combination.";
@VisibleForTesting
final String MORE_THAN_ONE_CYCLE_SELECTED = "Adhoc queries can only be requested for a single cycle.";
/**
* Constructor.
*
* @param dataSet
* @param view
*/
public GriddedTimingSubsetPresenter(GriddedDataSet dataSet,
IGriddedDataTimingSubsetView view) {
super(dataSet, view);
}
@Override
public void init() {
super.init();
SortedSet<Integer> forecastHours = new TreeSet<Integer>(
dataSet.getForecastHours());
List<String> forecastHoursAsString = new ArrayList<String>();
for (Integer integer : forecastHours) {
forecastHoursAsString.add(Integer.toString(integer));
}
view.setAvailableForecastHours(forecastHoursAsString);
}
/**
*
* {@inheritDoc}
*/
@Override
public SpecificDateTimeXML getSaveInfo() {
SpecificDateTimeXML time = new SpecificDateTimeXML();
String[] fcstHrs = view.getSelectedFcstHours();
for (String hr : fcstHrs) {
time.addHour(hr);
}
return time;
}
/**
* Get the selected forecast hours
*
* @return the selected forecast hours
*/
public String[] getSelectedFcstHours() {
return view.getSelectedFcstHours();
}
@Override
public void populate(SpecificDateTimeXML time, DataSet dataSet) {
view.setSelectedForecastHours(time.getFcstHours());
}
/**
* Check whether the selections are valid.
*
* @return true if tab is valid
*/
@Override
public boolean isValid() {
String[] forecastHours = view.getSelectedFcstHours();
return !CollectionUtil.isNullOrEmpty(forecastHours);
}
/**
* {@inheritDoc}
*/
@Override
public void updateSettings(SpecificDateTimeXML time) {
view.updateSelectedForecastHours(time.getFcstHours());
}
}

View file

@ -1,62 +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.datadelivery.subscription.subset.presenter;
import java.util.List;
import com.raytheon.viz.ui.presenter.IPresenterView;
/**
* Implements view specific functions that the {@link DataTimingSubsetPresenter}
* will call. For instance, the presenter will retrieve a list of available
* dates for a specific dataset and call {@link #setDataSetDates(List)}.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 15, 2012 0743 djohnson Initial creation
* Aug 29, 2012 0223 mpduff Changed as result of renamed objects.
* Sep 24, 2012 1209 djohnson isValid() moved to presenter.
*
* </pre>
*
* @author djohnson
* @version 1.0
*/
public interface IDataTimingSubsetView extends IPresenterView {
/**
* Check whether the date cycle is dirty.
*
* @return true if the date cycle is dirty
*/
boolean isDirty();
/**
* Set whether the date cycle is dirty.
*
* @param b
* the boolean value
*/
void setDirty(boolean b);
}

View file

@ -1,69 +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.datadelivery.subscription.subset.presenter;
import java.util.List;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
/**
* {@link IDataTimingSubsetView} that works with {@link GriddedDataSet}s.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 22, 2012 0743 djohnson Initial creation
* Aug 29, 2012 0223 mpduff Removed cycles.
* Jan 10, 2012 1444 mpduff Add updateSelectedForecastHours method.
* </pre>
*
* @author djohnson
* @version 1.0
*/
public interface IGriddedDataTimingSubsetView extends IDataTimingSubsetView {
/**
* Get the selected forecast hours
*
* @return the selected forecast hours
*/
String[] getSelectedFcstHours();
/**
* @param fcstHours
*/
void setSelectedForecastHours(List<String> fcstHours);
/**
* @param fcstHours
*/
void setAvailableForecastHours(List<String> fcstHours);
/**
* Update the selected forecast hours.
*
* @param fcstHours
*/
void updateSelectedForecastHours(List<String> fcstHours);
}

View file

@ -1,128 +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.datadelivery.subscription.subset.presenter;
import com.raytheon.uf.common.datadelivery.registry.Subscription.SubscriptionPriority;
import com.raytheon.viz.ui.presenter.IPresenterView;
import com.raytheon.viz.ui.presenter.components.ButtonConf;
import com.raytheon.viz.ui.presenter.components.CheckBoxConf;
import com.raytheon.viz.ui.presenter.components.ListConf;
/**
* IGriddedTimingSelectionDlgView interface
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Sep 12, 2012 mpduff Initial creation.
* Oct 11, 2012 1263 jpiatt Modified for cancel flag.
* Jan 04, 2013 1420 mpduff Add getters for Latency and Priority.
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public interface IGriddedTimingSelectionDlgView extends IPresenterView {
/**
* Open the view dialog.
*
* @return the selection
*/
Integer openDlg();
/**
* Set the config object for the latest data check box.
*
* @param checkBoxConf
*/
void setLatestDataCheckBox(CheckBoxConf checkBoxConf);
/**
* Set the date/cycle list config object.
*
* @param dateCycleListConf
*/
void setDateCycleList(ListConf dateCycleListConf);
/**
* Set the config object for the ok button.
*
* @param okBtnConf
*/
void setOkButton(ButtonConf okBtnConf);
/**
* Set the callback to be called at preopen.
*
* @param preOpenCallback
*/
void setPreOpenCallback(Runnable preOpenCallback);
/**
* Check if the latest data checkbox is enabled.
*
* @return true if enabled.
*/
boolean isLatestDataEnabled();
/**
* Set the date/cycle list enabled.
*/
void setDateCycleListEnabled();
/**
* Get the list selection.
*
* @return the selected item in the list
*/
String getSelection();
/**
* Close the dialog.
*/
void closeDlg();
/**
* Set the cancel button.
*
* @param cancelBtnConf
*/
void setCancelButton(ButtonConf cancelBtnConf);
/**
* Get the latency value.
*
* @return Latency value
*/
int getLatency();
/**
* Get the priority.
*
* @return priority
*/
SubscriptionPriority getPriority();
}

View file

@ -1,54 +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.datadelivery.subscription.subset.presenter;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 29, 2013 mpduff Initial creation
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public interface IPointDataTimingSubsetView extends IDataTimingSubsetView {
/**
* Set the Data Retrieval Interval.
*
* @param interval
* the interval to set
*/
void setDataRetrievalInterval(int interval);
/**
* Get the Data Retrieval Interval.
*
* @return the data retrieval interval
*/
int getDataRetrievalInterval();
}

View file

@ -1,106 +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.datadelivery.subscription.subset.presenter;
import com.raytheon.uf.common.datadelivery.registry.DataSet;
import com.raytheon.uf.common.datadelivery.registry.PointDataSet;
import com.raytheon.uf.common.datadelivery.registry.PointDataSetMetaData;
import com.raytheon.uf.common.datadelivery.registry.ebxml.PointDataSetMetaDataQuery;
import com.raytheon.uf.viz.datadelivery.subscription.subset.xml.PointTimeXML;
/**
* Point timing tab Presenter.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 29, 2013 223 mpduff Initial creation.
* Jun 13, 2013 2108 mpduff Get the retrieval interval from the view.
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public class PointTimeSubsetPresenter
extends
DataTimingSubsetPresenter<PointDataSet, PointDataSetMetaData, IPointDataTimingSubsetView, PointTimeXML, PointDataSetMetaDataQuery> {
/**
* Constructor.
*
* @param dataSet
* the PointDataSet
* @param view
* The View
*/
public PointTimeSubsetPresenter(PointDataSet dataSet,
IPointDataTimingSubsetView view) {
super(dataSet, view);
}
/**
* {@inheritDoc}
*/
@Override
public boolean isValid() {
// This is a combo box. Something is always selected. Just return true.
return true;
}
/**
* {@inheritDoc}
*/
@Override
public PointTimeXML getSaveInfo() {
PointTimeXML ptx = new PointTimeXML();
ptx.setDataRetrievalInterval(view.getDataRetrievalInterval());
return ptx;
}
/**
* {@inheritDoc}
*/
@Override
public void populate(PointTimeXML time, DataSet dataSet) {
view.setDataRetrievalInterval(time.getDataRetrievalInterval());
}
/**
* {@inheritDoc}
*/
@Override
public void updateSettings(PointTimeXML time) {
view.setDataRetrievalInterval(time.getDataRetrievalInterval());
}
/**
* Get the data retrieval interval.
*
* @return the data retrieval interval
*/
public int getDataRetrievalInterval() {
return view.getDataRetrievalInterval();
}
}

View file

@ -46,6 +46,7 @@ import com.raytheon.uf.viz.datadelivery.common.xml.IDisplayXml;
* Aug 10, 2012 1022 djohnson {@link SubsetXML} requires provider name. * Aug 10, 2012 1022 djohnson {@link SubsetXML} requires provider name.
* Feb 15, 2013 1638 mschenke Moved Util.EOL into FileUtil. * Feb 15, 2013 1638 mschenke Moved Util.EOL into FileUtil.
* Jun 04, 2013 223 mpduff Refactoring method name change. * Jun 04, 2013 223 mpduff Refactoring method name change.
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* *
* </pre> * </pre>
* *
@ -54,7 +55,7 @@ import com.raytheon.uf.viz.datadelivery.common.xml.IDisplayXml;
*/ */
@XmlRootElement(name = "Subset") @XmlRootElement(name = "Subset")
@XmlAccessorType(XmlAccessType.NONE) @XmlAccessorType(XmlAccessType.NONE)
public class SubsetXML<TIMEXML extends TimeXML> implements IDisplayXml { public class SubsetXML implements IDisplayXml {
private static final String XML_FILE_EXTENSION = ".xml"; private static final String XML_FILE_EXTENSION = ".xml";
@XmlElement(name = "datasetName", type = String.class) @XmlElement(name = "datasetName", type = String.class)
@ -76,7 +77,7 @@ public class SubsetXML<TIMEXML extends TimeXML> implements IDisplayXml {
protected ArrayList<VerticalXML> verticalList = new ArrayList<VerticalXML>(); protected ArrayList<VerticalXML> verticalList = new ArrayList<VerticalXML>();
@XmlElementRef @XmlElementRef
protected TIMEXML time; protected TimeXML time;
/** /**
* @return the subsetName * @return the subsetName
@ -151,7 +152,7 @@ public class SubsetXML<TIMEXML extends TimeXML> implements IDisplayXml {
/** /**
* @return the time * @return the time
*/ */
public TIMEXML getTime() { public TimeXML getTime() {
return time; return time;
} }
@ -159,7 +160,7 @@ public class SubsetXML<TIMEXML extends TimeXML> implements IDisplayXml {
* @param time * @param time
* the time to set * the time to set
*/ */
public void setTime(TIMEXML time) { public void setTime(TimeXML time) {
this.time = time; this.time = time;
} }

View file

@ -1,413 +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.datadelivery.subscription.view;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.eclipse.swt.widgets.Shell;
import com.raytheon.uf.common.datadelivery.registry.Subscription;
import com.raytheon.uf.common.datadelivery.registry.Subscription.SubscriptionPriority;
import com.raytheon.viz.ui.presenter.IPresenterView;
import com.raytheon.viz.ui.presenter.components.ButtonConf;
import com.raytheon.viz.ui.presenter.components.CheckBoxConf;
/**
* Create Subscription Dialog View Interface.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 24, 2012 0223 mpduff Initial creation
* Dec 13, 2012 1391 bgonzale Added status methods.
* Jan 02, 2013 1441 djohnson Add isGroupSelected.
* Jan 04, 2013 1420 mpduff Added getters for latency and priority.
* Jan 25, 2013 1528 djohnson Subscription priority is now an enum.
* Apr 08, 2013 1826 djohnson Remove delivery options.
* May 13, 2013 1040 mpduff Added getSharedSites method.
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public interface ICreateSubscriptionDlgView extends IPresenterView {
/**
* Get the subscription Name.
*
* @return
*/
String getSubscriptionName();
/**
* Set the subscription name.
*
* @param subscriptionName
*/
void setSubscriptionName(String subscriptionName);
/**
* Get the subscription description
*
* @return
*/
String getSubscriptionDescription();
/**
* Set the subscription description.
*
* @param subscriptionDescription
*/
void setSubscriptionDescription(String subscriptionDescription);
/**
* Get the group name.
*
* @return
*/
String getGroupName();
/**
* Set the group name.
*
* @param groupName
*/
void setGroupName(String groupName);
/**
* Is the no expiration date checkbox checked?
*
* @return
*/
boolean isNoExpirationDate();
/**
* Set the no expiration date checkbox
*
* @param noExpiration
*/
void setNoExpiration(boolean noExpiration);
/**
* Get the start text.
*
* @return
*/
String getStartText();
/**
* Get the selected status.
*
* @return Status.OK if Ok selected; Status.CANCEL if cancel selected.
*/
int getStatus();
/**
* Set the selected status. Set to Status.OK if Ok selected; Status.CANCEL
* if cancel selected.
*/
void setStatus(int status);
/**
* Set the start date
*
* @param startDate
*/
void setStartDate(Date startDate);
/**
* Get the expiration time text
*
* @return
*/
String getExpirationText();
/**
* Set the expiration date
*
* @param expDate
*/
void setExpirationDate(Date expDate);
/**
* Get the is always active selection.
*
* @return
*/
boolean isAlwaysActive();
/**
* Set the always active selection.
*
* @param active
*/
void setAlwaysActive(boolean active);
/**
* Get the active start text
*
* @return
*/
String getActiveStartText();
/**
* Set the active start date
*
* @param activeStartDate
*/
void setActiveStartDate(Date activeStartDate);
/**
* Get the active end text
*
* @return
*/
String getActiveEndText();
/**
* Set the active end date
*
* @param activeEndDate
*/
void setActiveEndDate(Date activeEndDate);
/**
* Get the selected priority
*
* @return
*/
SubscriptionPriority getPriority();
/**
* Set the priority selection
*
* @param subscriptionPriority
*/
void setPriority(SubscriptionPriority subscriptionPriority);
/**
* Open the dialog
*/
void openDlg();
/**
* Is view disposed check
*
* @return
*/
boolean isDisposed();
/**
* Bring the view to the top
*/
void bringToTop();
/**
* Set the subscription date fields enabled/disabled
*
* @param b
*/
void setSubscriptionDatesEnabled(boolean b);
/**
* Set the start date button enabled/disabled
*
* @param b
*/
void setStartDateBtnEnabled(boolean b);
/**
* Set the end date button enabled/disabled
*
* @param b
*/
void setEndDateBtnEnabled(boolean b);
/**
* Set the active date fields enabled/disabled
*
* @param b
*/
void setActiveDatesEnabled(boolean b);
/**
* Set the active end date button enabled/disabled
*
* @param b
*/
void setActiveEndDateBtnEnabled(boolean b);
/**
* Set the active start date button enabled/disabled
*
* @param b
*/
void setActiveStartDateBtnEnabled(boolean b);
/**
* Set the OK button config object.
*
* @param okConf
*/
void setOkConf(ButtonConf okConf);
/**
* Get the create flag.
*
* @return
*/
boolean isCreate();
/**
* Select all text in the subscription name field.
*/
void selectAllSubscriptionName();
/**
* Get the change reason.
*
* @return
*/
String getChangeReason();
/**
* Close the view dialog
*/
void closeDlg();
/**
* Get list of selected cycle times
*
* @return
*/
List<Integer> getCycleTimes();
/**
* Set the cycle checkbox config list
*
* @param checkboxConfList
*/
void setCycleConf(List<CheckBoxConf> checkboxConfList);
/**
* Set the select all button config object
*
* @param selectAllConf
*/
void setSelectAllButton(ButtonConf selectAllConf);
/**
* Set the deselect all button config object
*
* @param deselectAllConf
*/
void setDeselectAllButton(ButtonConf deselectAllConf);
/**
* Set the date text fields enabled/disabled.
*
* @param flag
*/
void setDateTxtFieldsEnabled(boolean flag);
/**
* Set the active text fields enabled/disabled
*
* @param flag
*/
void setActiveTextFieldsEnabled(boolean flag);
/**
* Set the cycle times to select.
*
* @param cycleStrings
*/
void selectCycles(List<String> cycleStrings);
/**
* The callback that should be performed when preOpened() is called.
*
* @param callback
* the callback
*/
void setPreOpenCallback(Runnable callback);
/**
* Create the cycle group portion of the subscription view.
*/
void createCycleGroup();
/**
* Return the shell used for display content.
*
* @return the shell
*/
Shell getShell();
/**
* Return true if a valid group is selected.
*
* @return
*/
boolean isGroupSelected();
/**
* Get the latency value.
*
* @return the latency value
*/
int getLatencyValue();
/**
* Set Subscription.
*
* @param subscription
* the subscription
*/
void setSubscription(Subscription subscription);
/**
* Set the cycle times of the model.
*
* @param cycleTimes
*/
void setCycleTimes(Set<Integer> cycleTimes);
/**
* Get the list of shared sites
*
* @return shared sites
*/
String[] getSharedSites();
/**
* Set the list of office ids.
*
* @param officeIDs
* list of office ids
*/
void setOfficeIds(Set<String> officeIDs);
}

View file

@ -36,6 +36,7 @@ import org.eclipse.swt.widgets.Shell;
import com.raytheon.uf.common.datadelivery.registry.Coverage; import com.raytheon.uf.common.datadelivery.registry.Coverage;
import com.raytheon.uf.common.datadelivery.registry.DataLevelType; import com.raytheon.uf.common.datadelivery.registry.DataLevelType;
import com.raytheon.uf.common.datadelivery.registry.DataType;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet; import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
import com.raytheon.uf.common.datadelivery.registry.GriddedTime; import com.raytheon.uf.common.datadelivery.registry.GriddedTime;
import com.raytheon.uf.common.datadelivery.registry.Parameter; import com.raytheon.uf.common.datadelivery.registry.Parameter;
@ -81,6 +82,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Jul 26, 2031 2232 mpduff Removed sendAuthorizationRequest method. * Jul 26, 2031 2232 mpduff Removed sendAuthorizationRequest method.
* Aug 30, 2013 2288 bgonzale Added latency to details display. * Aug 30, 2013 2288 bgonzale Added latency to details display.
* Sept 30, 2013 1797 dhladky Time GriddedTime separation * Sept 30, 2013 1797 dhladky Time GriddedTime separation
* Oct 11, 2013 2386 mpduff Refactor DD Front end.
* </pre> * </pre>
* *
* @author mpduff * @author mpduff
@ -681,11 +683,11 @@ public class DataDeliveryUtils {
} }
final Time subTime = sub.getTime(); final Time subTime = sub.getTime();
if (subTime instanceof GriddedTime) { if (subTime instanceof GriddedTime) {
GriddedTime gtime = (GriddedTime)subTime; GriddedTime gtime = (GriddedTime) subTime;
final List<String> fcstHours = gtime.getFcstHours(); final List<String> fcstHours = gtime.getFcstHours();
if (!CollectionUtil.isNullOrEmpty(fcstHours)) { if (!CollectionUtil.isNullOrEmpty(fcstHours)) {
fmtStr.append("Forecast Hours: ").append(newline); fmtStr.append("Forecast Hours: ").append(newline);
@ -708,7 +710,7 @@ public class DataDeliveryUtils {
} }
} else if (subTime instanceof PointTime) { } else if (subTime instanceof PointTime) {
// Nothing done for Point at this time // Nothing done for Point at this time
} }
List<Parameter> parmArray = sub.getParameter(); List<Parameter> parmArray = sub.getParameter();
if (!CollectionUtil.isNullOrEmpty(parmArray)) { if (!CollectionUtil.isNullOrEmpty(parmArray)) {
@ -762,18 +764,14 @@ public class DataDeliveryUtils {
* @return the maximum latency in minutes * @return the maximum latency in minutes
*/ */
public static int getMaxLatency(Subscription<Time, Coverage> subscription) { public static int getMaxLatency(Subscription<Time, Coverage> subscription) {
if (subscription.getDataSetType() == DataType.POINT) {
//TODO I am going to create a factory for Time so we don't have to do so much casting.
// Getting the generics on subscription was part one of that project.
Time time = subscription.getTime();
if (time instanceof PointTime) {
return subscription.getLatencyInMinutes(); return subscription.getLatencyInMinutes();
} else if (time instanceof GriddedTime) { } else if (subscription.getDataSetType() == DataType.GRID) {
return getMaxLatency(((GriddedTime)subscription.getTime()).getCycleTimes()); return getMaxLatency(((GriddedTime) subscription.getTime())
.getCycleTimes());
} else { } else {
throw new IllegalArgumentException("Invalid Time object!"); throw new IllegalArgumentException("Invalid Data Type: "
+ subscription.getDataSetType().name());
} }
} }

View file

@ -1,406 +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.datadelivery.subscription.presenter;
import static com.raytheon.uf.common.util.Matchers.yyyyMmDdMatches;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Sets;
import com.raytheon.uf.common.datadelivery.registry.DataType;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSet;
import com.raytheon.uf.common.datadelivery.registry.SiteSubscription;
import com.raytheon.uf.common.datadelivery.registry.SiteSubscriptionFixture;
import com.raytheon.uf.common.datadelivery.registry.Subscription;
import com.raytheon.uf.common.datadelivery.registry.SubscriptionBuilder;
import com.raytheon.uf.common.registry.handler.RegistryHandlerException;
import com.raytheon.uf.common.time.CalendarBuilder;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.common.time.util.TimeUtilTest;
import com.raytheon.uf.viz.core.SameThreadGuiTaskExecutor;
import com.raytheon.uf.viz.datadelivery.subscription.ISubscriptionService;
import com.raytheon.uf.viz.datadelivery.subscription.ISubscriptionService.ISubscriptionServiceResult;
import com.raytheon.uf.viz.datadelivery.subscription.SubscriptionService.IForceApplyPromptDisplayText;
import com.raytheon.uf.viz.datadelivery.subscription.view.ICreateSubscriptionDlgView;
/**
* Test {@link CreateSubscriptionDlgPresenter}.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 24, 2012 mpduff Initial creation
* Oct 17, 2012 0726 djohnson Remove unused registry code.
* Nov 09, 2012 1286 djohnson Add test for storing subscription.
* Nov 20, 2012 1286 djohnson {@link ISubscriptionService} now takes the view.
* Jan 02, 2012 1345 djohnson Remove obsolete test.
* Jan 04, 2013 1453 djohnson Add tests for setting the active period.
* Jan 11, 2013 1453 djohnson Add test from failed test scenario.
* Mar 28, 2013 1841 djohnson Subscription is now UserSubscription.
* Apr 08, 2013 1826 djohnson Remove delivery options.
* May 15, 2013 1040 mpduff Remove method.
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public class CreateSubscriptionPresenterTest {
private final ICreateSubscriptionDlgView view = mock(ICreateSubscriptionDlgView.class);
private final GriddedDataSet dataSet = new OpenDapGriddedDataSet();
{
dataSet.setDataSetName("name");
dataSet.setProviderName("provider");
dataSet.setForecastHours(Sets.newHashSet(0, 3, 6));
dataSet.setDataSetType(DataType.GRID);
dataSet.setCycles(Sets.newHashSet(0, 6, 12));
}
private final CreateSubscriptionDlgPresenter presenter = new CreateSubscriptionDlgPresenter(
view, dataSet, true, new SameThreadGuiTaskExecutor());
private final ISubscriptionService service = mock(ISubscriptionService.class);
@Before
public void setUp() {
CreateSubscriptionDlgPresenter.subscriptionService = service;
presenter.init();
}
@After
public void tearDown() {
TimeUtilTest.resumeTime();
}
@Test
public void testOpenCallsViewOpen() throws Exception {
presenter.open();
verify(view).openDlg();
}
@Test
public void testInitOkBtnIsSet() {
verify(view).setOkConf(presenter.OK_CONF);
}
@Test
public void verifyOkButtonConfiguration() {
verify(view).setOkConf(presenter.OK_CONF);
}
@Test
public void verifyDurationValidationNoExpriationCheck() {
when(view.isNoExpirationDate()).thenReturn(true);
assertTrue(presenter.durationValidChk());
verify(view).isNoExpirationDate();
}
@Test
public void verifyDurationValidationDates() {
when(view.getStartText()).thenReturn("12/01/1999 01");
when(view.getExpirationText()).thenReturn("12/31/1999 01");
assertTrue(presenter.durationValidChk());
verify(view).isNoExpirationDate();
verify(view, times(2)).getStartText();
verify(view, times(2)).getExpirationText();
}
@Test
public void verifyActivePeriodValidationAlwaysActive() {
when(view.isAlwaysActive()).thenReturn(true);
assertTrue(presenter.activePeriodValidChk());
}
@Test
public void verifyActivePeriodValidationDates() {
when(view.isAlwaysActive()).thenReturn(false);
when(view.getActiveStartText()).thenReturn("12/01");
when(view.getActiveEndText()).thenReturn("12/31");
assertTrue(presenter.activePeriodValidChk());
}
@Test
public void verifySubscriptionIsSubmittedToSubscriptionService()
throws RegistryHandlerException {
Subscription subscription = SiteSubscriptionFixture.INSTANCE.get();
final ISubscriptionServiceResult result = mock(ISubscriptionServiceResult.class);
when(
service.store(same(subscription),
any(IForceApplyPromptDisplayText.class))).thenReturn(
result);
presenter.storeSubscription(subscription, "username");
verify(service).store(same(subscription),
any(IForceApplyPromptDisplayText.class));
}
@Test
public void verifyIfMessageIsNotReturnedFromSubscriptionServiceThenItIsNotDisplayed()
throws RegistryHandlerException {
Subscription subscription = SiteSubscriptionFixture.INSTANCE.get();
final ISubscriptionServiceResult result = mock(ISubscriptionServiceResult.class);
when(result.hasMessageToDisplay()).thenReturn(false);
when(
service.store(same(subscription),
any(IForceApplyPromptDisplayText.class))).thenReturn(
result);
presenter.storeSubscription(subscription, "username");
verify(view, never()).displayPopup(anyString(), anyString());
}
@Test
public void testActivePeriodAssumesTheCurrentYearWhenDateIsToday()
throws ParseException {
TimeUtilTest.freezeTime();
Calendar cal = TimeUtil.newGmtCalendar();
cal.add(Calendar.YEAR, -1);
Date oneYearAgo = cal.getTime();
SiteSubscription subscription = new SubscriptionBuilder()
.withActivePeriodStart(oneYearAgo)
.withActivePeriodEnd(oneYearAgo).build();
CreateSubscriptionDlgPresenter presenter = new CreateSubscriptionDlgPresenter(
view, dataSet, true, new SameThreadGuiTaskExecutor());
presenter.setSubscriptionData(subscription);
presenter.init();
verify(view).setActiveStartDate(
argThat(yyyyMmDdMatches(TimeUtil.newDate())));
}
@Test
public void testActivePeriodStartAssumesTheNextYearWhenStartAndEndDateIsBeforeToday()
throws ParseException {
Calendar cal = TimeUtil.newGmtCalendar();
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 4);
final Date yesterday = cal.getTime();
// Freeze time at Jan. 5
TimeUtilTest.freezeTime(yesterday.getTime() + TimeUtil.MILLIS_PER_DAY);
SiteSubscription subscription = new SubscriptionBuilder()
.withActivePeriodStart(yesterday)
.withActivePeriodEnd(yesterday).build();
CreateSubscriptionDlgPresenter presenter = new CreateSubscriptionDlgPresenter(
view, dataSet, true, new SameThreadGuiTaskExecutor());
presenter.setSubscriptionData(subscription);
presenter.init();
Calendar januaryFourthAYearLater = TimeUtil.newGmtCalendar();
januaryFourthAYearLater.setTime(yesterday);
januaryFourthAYearLater.add(Calendar.YEAR, 1);
verify(view).setActiveStartDate(
argThat(yyyyMmDdMatches(januaryFourthAYearLater.getTime())));
}
@Test
public void testActivePeriodStartAssumesTheCurrentYearWhenInActiveWindow()
throws ParseException {
Calendar cal = TimeUtil.newGmtCalendar();
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 4);
final Date yesterday = cal.getTime();
// Freeze time at Jan. 5
cal.add(Calendar.DAY_OF_MONTH, 1);
TimeUtilTest.freezeTime(cal.getTimeInMillis());
cal.add(Calendar.DAY_OF_MONTH, 3);
Date threeDaysFromNow = cal.getTime();
SiteSubscription subscription = new SubscriptionBuilder()
.withActivePeriodStart(yesterday)
.withActivePeriodEnd(threeDaysFromNow).build();
CreateSubscriptionDlgPresenter presenter = new CreateSubscriptionDlgPresenter(
view, dataSet, true, new SameThreadGuiTaskExecutor());
presenter.setSubscriptionData(subscription);
presenter.init();
verify(view).setActiveStartDate(argThat(yyyyMmDdMatches(yesterday)));
}
@Test
public void testActivePeriodEndAssumesStartYearWhenDateIsToday()
throws ParseException {
TimeUtilTest.freezeTime();
Calendar cal = TimeUtil.newGmtCalendar();
cal.add(Calendar.YEAR, -1);
Date oneYearAgo = cal.getTime();
Calendar cal2 = TimeUtil.newGmtCalendar();
cal2.setTime(oneYearAgo);
cal2.add(Calendar.DAY_OF_YEAR, 3);
Date oneYearAgoPlusThreeDays = cal2.getTime();
SiteSubscription subscription = new SubscriptionBuilder()
.withActivePeriodStart(oneYearAgo)
.withActivePeriodEnd(oneYearAgoPlusThreeDays).build();
CreateSubscriptionDlgPresenter presenter = new CreateSubscriptionDlgPresenter(
view, dataSet, true, new SameThreadGuiTaskExecutor());
presenter.setSubscriptionData(subscription);
presenter.init();
Calendar expectedCalendar = TimeUtil.newGmtCalendar();
expectedCalendar.setTime(oneYearAgoPlusThreeDays);
expectedCalendar.add(Calendar.YEAR, 1);
verify(view).setActiveEndDate(
argThat(yyyyMmDdMatches(expectedCalendar.getTime())));
}
@Test
public void testActivePeriodEndCrossingYearBoundary() throws ParseException {
Calendar cal = TimeUtil.newGmtCalendar();
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 30);
cal.set(Calendar.YEAR, 1970);
final Date decemberThirtieth = cal.getTime();
Calendar cal2 = TimeUtil.newGmtCalendar();
cal2.setTime(decemberThirtieth);
cal2.set(Calendar.MONTH, Calendar.JANUARY);
cal2.set(Calendar.DAY_OF_MONTH, 4);
cal2.set(Calendar.YEAR, 1970);
Date januaryFourth = cal2.getTime();
SiteSubscription subscription = new SubscriptionBuilder()
.withActivePeriodStart(decemberThirtieth)
.withActivePeriodEnd(januaryFourth).build();
// freeze time at december thirtieth of the current year
Calendar decemberTenth = TimeUtil.newGmtCalendar();
decemberTenth.set(Calendar.MONTH, Calendar.DECEMBER);
decemberTenth.set(Calendar.DAY_OF_MONTH, 10);
decemberTenth.set(Calendar.YEAR, 2000);
TimeUtilTest.freezeTime(decemberTenth.getTimeInMillis());
CreateSubscriptionDlgPresenter presenter = new CreateSubscriptionDlgPresenter(
view, dataSet, true, new SameThreadGuiTaskExecutor());
presenter.setSubscriptionData(subscription);
presenter.init();
Calendar expectedStartCalendar = TimeUtil.newGmtCalendar();
expectedStartCalendar.setTime(decemberTenth.getTime());
expectedStartCalendar.set(Calendar.DAY_OF_MONTH, 30);
Calendar expectedEndCalendar = TimeUtil.newGmtCalendar();
expectedEndCalendar.setTime(decemberTenth.getTime());
expectedEndCalendar.add(Calendar.YEAR, 1);
expectedEndCalendar.set(Calendar.MONTH, Calendar.JANUARY);
expectedEndCalendar.set(Calendar.DAY_OF_MONTH, 4);
verify(view).setActiveEndDate(
argThat(yyyyMmDdMatches(expectedEndCalendar.getTime())));
}
/**
* Taken from the following tester comments:<br>
* When creating a subscription, if the Active Period End date is set to a
* month/day that is earlier than the month/day of the Active Period Start
* date (e.g., Active Period Start date = 01/10/2013 and Active Period End
* date = 01/01/2014), the subscription will go through successfully. Then,
* when editing the subscription and clicking on the Select Date for both
* the Active Period Start and End dates, the Active Period Start date
* (01/10/2014) is after the Active Period End date (01/01/2014). A check
* needs to be added such that if the Start date is after the End date, the
* year for the End date needs to increase by 1 (year + 1). While the year
* has no affect on the Active Period Start and End dates (and associated
* functionality), there may be confusion with the end user.
*
* @throws ParseException
*/
@Test
public void testActivePeriodWhereStartIsDayOfYearAfterEnd()
throws ParseException {
Calendar cal = new CalendarBuilder().withMonth(Calendar.JANUARY)
.withDayOfMonth(10).withYear(2013).build();
final Date januaryTenth = cal.getTime();
cal.set(Calendar.YEAR, 1970);
final Date startDate = cal.getTime();
Calendar cal2 = new CalendarBuilder().withMonth(Calendar.JANUARY)
.withDayOfMonth(1).withYear(2014).build();
final Date januaryFirstYearLater = cal2.getTime();
cal2.set(Calendar.YEAR, 1970);
final Date endDate = cal2.getTime();
SiteSubscription subscription = new SubscriptionBuilder()
.withActivePeriodStart(startDate).withActivePeriodEnd(endDate)
.build();
// freeze time at start date plus a minute
TimeUtilTest.freezeTime(januaryTenth.getTime()
+ TimeUtil.MILLIS_PER_MINUTE);
CreateSubscriptionDlgPresenter presenter = new CreateSubscriptionDlgPresenter(
view, dataSet, true, new SameThreadGuiTaskExecutor());
presenter.setSubscriptionData(subscription);
presenter.init();
verify(view).setActiveStartDate(argThat(yyyyMmDdMatches(januaryTenth)));
verify(view).setActiveEndDate(
argThat(yyyyMmDdMatches(januaryFirstYearLater)));
}
@Test
public void verifyCycleTimesSetToView() {
presenter.open();
verify(view).setCycleTimes(dataSet.getCycles());
}
}

View file

@ -1,113 +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.datadelivery.subscription.subset.presenter;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Sets;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSet;
/**
* Test {@link GriddedTimingSelectionPresenter}.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Sep 12, 2012 mpduff Initial creation
*
* </pre>
*
* @author mpduff
* @version 1.0
*/
public class GriddedTimingSelectionPresenterTest {
private final IGriddedTimingSelectionDlgView view = mock(IGriddedTimingSelectionDlgView.class);
private GriddedTimingSelectionPresenter presenter;
private final GriddedDataSet dataSet = new OpenDapGriddedDataSet();
{
dataSet.setDataSetName("name");
dataSet.setProviderName("provider");
dataSet.setForecastHours(Sets.newHashSet(0, 3, 6));
dataSet.setCycles(Sets.newHashSet(0, 6, 12));
}
@Before
public void setUp() {
List<String> cycles = new ArrayList<String>();
cycles.add("20120501 - 00Z");
presenter = new GriddedTimingSelectionPresenter(view, dataSet, cycles);
}
@Test
public void initSetsLatestDataCheckBox() {
presenter.init();
verify(view).setLatestDataCheckBox(presenter.latestDataChkConf);
}
@Test
public void initSetsDateCycleList() {
presenter.init();
verify(view).setDateCycleList(presenter.dateCycleListConf);
}
@Test
public void initSetsOkButton() {
presenter.init();
verify(view).setOkButton(presenter.okBtnConf);
}
@Test
public void testOpenCallsViewOpen() {
presenter.open();
verify(view).openDlg();
}
@Test
public void uncheckLatestDateEnablesSpecificDateList() {
when(view.isLatestDataEnabled()).thenReturn(false);
presenter.latestDataChkConf.getOnCheckedChangeAction().run();
verify(view).setDateCycleListEnabled();
}
@Test
public void checkLatestDateEnablesSpecificDateList() {
when(view.isLatestDataEnabled()).thenReturn(true);
presenter.latestDataChkConf.getOnCheckedChangeAction().run();
verify(view).setDateCycleListEnabled();
}
}

View file

@ -1,73 +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.datadelivery.subscription.subset.presenter;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Sets;
import com.raytheon.uf.common.datadelivery.registry.GriddedDataSet;
import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSet;
/**
* Test {@link GriddedTimingSubsetPresenter}.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 15, 2012 0743 djohnson Initial creation
*
* </pre>
*
* @author djohnson
* @version 1.0
*/
public class GriddedTimingSubsetPresenterTest {
private final IGriddedDataTimingSubsetView view = mock(IGriddedDataTimingSubsetView.class);
private final GriddedDataSet dataSet = new OpenDapGriddedDataSet();
{
dataSet.setDataSetName("name");
dataSet.setProviderName("provider");
dataSet.setForecastHours(Sets.newHashSet(0, 3, 6));
dataSet.setCycles(Sets.newHashSet(0, 6, 12));
}
private final GriddedTimingSubsetPresenter presenter = new GriddedTimingSubsetPresenter(
dataSet, view);
@Before
public void setUp() {
presenter.init();
}
@Test
public void initSetsForecastHours() {
verify(view).setAvailableForecastHours(anyListOf(String.class));
}
}