Merge "Issue #2946 Fix auxillary purge rules." into omaha_14.3.1-NHDA

Former-commit-id: 31d75a4b82413b015353055668defab0095ef893
This commit is contained in:
Richard Peter 2014-04-30 14:49:24 -05:00 committed by Gerrit Code Review
commit bfe46bb5e6
197 changed files with 8171 additions and 3777 deletions

View file

@ -25,7 +25,7 @@ import org.eclipse.core.commands.ExecutionException;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import com.raytheon.uf.common.archive.request.ArchiveAdminAuthRequest;
import com.raytheon.uf.common.archive.request.ArchiveCaseCreationAuthRequest;
import com.raytheon.uf.common.auth.user.IUser;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
@ -56,8 +56,12 @@ public class ArchiveCaseCreationDialogAction extends AbstractHandler {
private final IUFStatusHandler statusHandler = UFStatus
.getHandler(ArchiveCaseCreationDialogAction.class);
/** Dialog to display */
private CaseCreationDlg dialog;
/** Default case directory location. */
private String caseDir;
/** Case Administration permission */
private final String PERMISSION = "archive.casecreation";
@ -74,7 +78,7 @@ public class ArchiveCaseCreationDialogAction extends AbstractHandler {
if (dialog == null || dialog.isDisposed()) {
Shell shell = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell();
dialog = new CaseCreationDlg(shell);
dialog = new CaseCreationDlg(shell, caseDir);
dialog.open();
} else {
dialog.bringToTop();
@ -93,16 +97,25 @@ public class ArchiveCaseCreationDialogAction extends AbstractHandler {
IUser user = UserController.getUserObject();
String msg = user.uniqueId()
+ " does not have permission to access archive case creation dialog.";
ArchiveAdminAuthRequest request = new ArchiveAdminAuthRequest();
ArchiveCaseCreationAuthRequest request = new ArchiveCaseCreationAuthRequest();
request.setRoleId(PERMISSION);
request.setNotAuthorizedMessage(msg);
request.setUser(user);
try {
Object o = ThriftClient.sendPrivilegedRequest(request);
if (o instanceof ArchiveAdminAuthRequest) {
ArchiveAdminAuthRequest r = (ArchiveAdminAuthRequest) o;
return r.isAuthorized();
if (o instanceof ArchiveCaseCreationAuthRequest) {
ArchiveCaseCreationAuthRequest r = (ArchiveCaseCreationAuthRequest) o;
if (r.isAuthorized()) {
this.caseDir = r.getCaseDirectory();
return true;
}
} else {
statusHandler
.handle(Priority.ERROR,
String.format(
"Cannot validate user expected response type ArchiveCaseCreationAuthRequest, received %s",
o.getClass().getName()));
}
} catch (VizException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);

View file

@ -0,0 +1,44 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.archive.data;
/**
* A listener to notify when SizeJob has obtain all display data.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 23, 2014 3045 rferrel Initial creation
*
* </pre>
*
* @author rferrel
* @version 1.0
*/
public interface ILoadDisplayDataListener {
/**
* Called by SizeJob after obtaining all display data for all
* archive/category tables.
*/
public void loadedAllDisplayData();
}

View file

@ -52,6 +52,7 @@ import com.raytheon.uf.common.time.util.TimeUtil;
* Dec 11, 2013 #2603 rferrel Selected list changed to a Set.
* Dec 11, 2013 #2624 rferrel Clear display variables when recomputing sizes.
* Mar 27, 2014 #2879 rferrel Loading Case no longer changes Start/End times.
* Apr 23, 2014 #3045 rferrel Changes to prevent race condition while getting labels.
*
* </pre>
*
@ -156,17 +157,17 @@ public class SizeJob extends Job {
private boolean stopComputeSize;
/**
* Priority queue for getting display data for an archive/category.
* Priority queue for getting display data all archive/category tables.
*/
// Do not use a PriorityBlockingQueue since the load select and change
// display methods need to be notified when the display data is available.
private final PriorityQueue<MissingData> missingDataQueue = new PriorityQueue<SizeJob.MissingData>(
DEFAULT_INITIAL_CAPACITY, new Comparator<MissingData>() {
private final PriorityQueue<LoadDisplayData> loadDisplayDataQueue = new PriorityQueue<SizeJob.LoadDisplayData>(
DEFAULT_INITIAL_CAPACITY, new Comparator<LoadDisplayData>() {
@Override
public int compare(MissingData o1, MissingData o2) {
if (o1.visiable != o2.visiable) {
return o1.visiable ? -1 : +1;
public int compare(LoadDisplayData o1, LoadDisplayData o2) {
if (o1.visible != o2.visible) {
return o1.visible ? -1 : +1;
}
if (o1.isSelected() != o2.isSelected()) {
return o1.isSelected() ? -1 : +1;
@ -182,16 +183,22 @@ public class SizeJob extends Job {
});
/**
* Job for processing the missing data queue.
* Job for obtaining display data for all the archive/category tables.
*/
private final MissingDataJob missingDataJob = new MissingDataJob();
private LoadDisplayDataJob loadDisplayDataJob;
/**
* Listener to invoke when all display data loaded.
*/
private final ILoadDisplayDataListener loadDisplayDataListener;
/**
* Constructor.
*/
public SizeJob() {
public SizeJob(ILoadDisplayDataListener loadDisplayDataListener) {
super("Size Job");
setSystem(true);
this.loadDisplayDataListener = loadDisplayDataListener;
}
/**
@ -285,9 +292,11 @@ public class SizeJob extends Job {
* Check all displayData selection state so only the data in selections are
* set.
*
* @param selections
* @param selectName
* @param type
* @return errorMessage when unable to load else null
*/
public void loadSelect(String selectName, ArchiveConstants.Type type) {
public String loadSelect(String selectName, ArchiveConstants.Type type) {
ArchiveConfigManager manager = ArchiveConfigManager.getInstance();
String fileName = ArchiveConstants.selectFileName(type, selectName);
SelectConfig selections = manager.loadSelection(fileName);
@ -301,24 +310,18 @@ public class SizeJob extends Job {
for (String categoryName : archiveInfo.getCategoryNames()) {
Set<String> selectionsSet = selections.getSelectedSet(
archiveName, categoryName);
MissingData missingData = removeMissingData(archiveName,
categoryName);
if (missingData != null) {
missingData.setSelectedSet(selectionsSet);
addMissingData(missingData);
} else {
CategoryInfo categoryInfo = archiveInfo.get(categoryName);
for (DisplayData displayData : categoryInfo
.getDisplayDataList()) {
String displayLabel = displayData.getDisplayLabel();
boolean selected = selectionsSet.contains(displayLabel);
if (selected != displayData.isSelected()) {
setSelect(displayData, selected);
}
CategoryInfo categoryInfo = archiveInfo.get(categoryName);
for (DisplayData displayData : categoryInfo
.getDisplayDataList()) {
String displayLabel = displayData.getDisplayLabel();
boolean selected = selectionsSet.contains(displayLabel);
if (selected != displayData.isSelected()) {
setSelect(displayData, selected);
}
}
}
}
return null;
}
/**
@ -327,10 +330,13 @@ public class SizeJob extends Job {
* @return selected
*/
public List<DisplayData> getSelectAll() {
synchronized (missingDataQueue) {
while (!missingDataQueue.isEmpty()) {
if (missingDataJob.currentMissingData == null
|| missingDataJob.currentMissingData.isSelected()) {
synchronized (loadDisplayDataQueue) {
while (!loadDisplayDataQueue.isEmpty()) {
if ((loadDisplayDataJob.currentLoadDisplayData == null)
|| loadDisplayDataJob.currentLoadDisplayData
.isVisible()
|| loadDisplayDataJob.currentLoadDisplayData
.isSelected()) {
missingDataQueueWait();
} else {
break;
@ -440,33 +446,81 @@ public class SizeJob extends Job {
}
/**
* Change the archive/category display.
*
* @param archiveName
* - non null value
* @param categoryName
* @return displayData when display needs to change otherwise null
* - non null value
* @return true if archiveName and categoryName match the current display
*/
public boolean isCurrentDisplay(String archiveName, String categoryName) {
return archiveName.equals(displayArchive)
&& categoryName.equals(displayCategory);
}
/**
* This method returns a display data list to replace the contents of the
* GUI's achive/category display table or a null list if no update is
* needed. It is assumed this method is called from an non-UI thread.
*
* @param archiveName
* - archive for the new display table
* @param categoryName
* - category for the new display table
* @param shutdown
* - Becomes true when user requests a different table while this
* is waiting for data.
* @return displayData
*/
public List<DisplayData> changeDisplay(String archiveName,
String categoryName) {
String categoryName, AtomicBoolean shutdown) {
List<DisplayData> displayDatas = null;
// Only get data when the display really needs to be changed.
if (!archiveName.equals(displayArchive)
|| !categoryName.equals(displayCategory)) {
MissingData missingData = removeMissingData(archiveName,
// Update visible status of current display.
if ((displayArchive != null) && (displayCategory != null)) {
LoadDisplayData currentMissingData = removeLoadDisplayData(
displayArchive, displayCategory);
if (currentMissingData != null) {
currentMissingData.setVisible(false);
addLoadDisplayData(currentMissingData);
}
}
LoadDisplayData missingData = removeLoadDisplayData(archiveName,
categoryName);
displayArchive = archiveName;
displayCategory = categoryName;
// Update visible status of the new current display.
if (missingData != null) {
missingData.setVisiable(true);
synchronized (missingDataQueue) {
addMissingData(missingData);
while (missingDataQueue.contains(missingData)) {
missingDataQueueWait();
synchronized (loadDisplayDataQueue) {
missingData.setVisible(true);
addLoadDisplayData(missingData);
/*
* Wait for the display data to be loaded or no longer
* needed.
*/
while (loadDisplayDataJob.processing(missingData)
&& !shutdown.get()) {
missingDataQueueWait(500L);
}
}
}
displayDatas = archiveInfoMap.get(archiveName).get(categoryName)
.getDisplayDataList();
displayArchive = archiveName;
displayCategory = categoryName;
changeDisplay(displayDatas);
/*
* If user still needs the data update status of old visible data
* and the new visible data.
*/
if (!shutdown.get()) {
displayDatas = archiveInfoMap.get(archiveName)
.get(categoryName).getDisplayDataList();
changeDisplay(displayDatas);
}
}
return displayDatas;
}
@ -474,7 +528,7 @@ public class SizeJob extends Job {
/**
* Change to display all selected data..
*
* @return displayhData when display needs to change otherwise null.
* @return displayData when display needs to change otherwise null.
*/
public List<DisplayData> changeDisplayAll() {
List<DisplayData> selectedData = null;
@ -499,7 +553,7 @@ public class SizeJob extends Job {
}
iRetentionHour.setRetentionTimes(selections.getStarRetentionHours());
missingDataQueue.clear();
loadDisplayDataQueue.clear();
visibleList = manager.getDisplayData(displayArchive, displayCategory,
false);
@ -527,51 +581,48 @@ public class SizeJob extends Job {
} else {
selectedSet = selections.getSelectedSet(archiveName,
categoryName);
MissingData missingData = new MissingData(archiveName,
categoryName, selectedSet);
missingDataQueue.add(missingData);
LoadDisplayData missingData = new LoadDisplayData(
archiveName, categoryName, selectedSet);
loadDisplayDataQueue.add(missingData);
}
}
put(archiveName, archiveInfo);
}
missingDataJob.schedule();
loadDisplayDataJob = new LoadDisplayDataJob(loadDisplayDataListener,
loadDisplayDataQueue.size());
loadDisplayDataJob.schedule();
return selections.getName();
}
/**
* Find and remove the missing data from the missing data queue.
* Find and remove the associated load display data from the queue.
*
* @param archiveName
* @param categoryName
* @return missingData or null if not on the missing data queue
* @return loadDisplayData or null if no longer on the queue
*/
private MissingData removeMissingData(String archiveName,
private LoadDisplayData removeLoadDisplayData(String archiveName,
String categoryName) {
MissingData missingData = null;
synchronized (missingDataQueue) {
if (missingDataJob.currentMissingData != null
&& archiveName
.equals(missingDataJob.currentMissingData.archive)
&& categoryName
.equals(missingDataJob.currentMissingData.category)) {
// Finish the process of getting the data.
missingDataQueueWait();
} else if (!missingDataQueue.isEmpty()) {
Iterator<MissingData> iterator = missingDataQueue.iterator();
LoadDisplayData loadDisplayData = null;
synchronized (loadDisplayDataQueue) {
if (!loadDisplayDataQueue.isEmpty()) {
Iterator<LoadDisplayData> iterator = loadDisplayDataQueue
.iterator();
while (iterator.hasNext()) {
MissingData md = iterator.next();
LoadDisplayData md = iterator.next();
if (md.archive.equals(archiveName)
&& md.category.equals(categoryName)) {
iterator.remove();
missingData = md;
loadDisplayData = md;
break;
}
}
}
}
return missingData;
return loadDisplayData;
}
/**
@ -580,9 +631,20 @@ public class SizeJob extends Job {
* @return false when interrupted exception
*/
private boolean missingDataQueueWait() {
return missingDataQueueWait(0L);
}
/**
* Wait for notification that the current missing data is finished
* processing or the desired time has lapsed.
*
* @param time
* @return false when interrupted exception
*/
private boolean missingDataQueueWait(long time) {
boolean state = true;
try {
missingDataQueue.wait();
loadDisplayDataQueue.wait(time);
} catch (InterruptedException e) {
state = false;
statusHandler.handle(Priority.INFO, e.getLocalizedMessage(), e);
@ -591,32 +653,30 @@ public class SizeJob extends Job {
}
/**
* This inserts a load display data onto the queue. Should
*
* @param missingData
* @param loadDisplayData
*/
private void addMissingData(MissingData missingData) {
synchronized (missingDataQueue) {
missingDataQueue.add(missingData);
if (missingDataJob.getState() == Job.NONE) {
missingDataJob.schedule();
private void addLoadDisplayData(LoadDisplayData loadDisplayData) {
synchronized (loadDisplayDataQueue) {
loadDisplayDataQueue.add(loadDisplayData);
if (loadDisplayDataJob.getState() == Job.NONE) {
loadDisplayDataJob.schedule();
}
}
}
/**
* Change update visible to the new list.
* Change visible status to reflect the new list.
*
* @param newDisplays
*/
private void changeDisplay(List<DisplayData> newDisplays) {
List<DisplayData> oldDisplays = visibleList;
visibleList = newDisplays;
List<DisplayData> visibleList = new ArrayList<DisplayData>(newDisplays);
for (DisplayData displayData : oldDisplays) {
if (!visibleList.remove(displayData)) {
setVisible(displayData, false);
}
setVisible(displayData, false);
}
for (DisplayData displayData : visibleList) {
@ -761,25 +821,25 @@ public class SizeJob extends Job {
@Override
protected void canceling() {
clearQueue();
missingDataQueue.clear();
missingDataJob.cancel();
loadDisplayDataQueue.clear();
loadDisplayDataJob.cancel();
shutdown.set(true);
}
/**
* Class used by the missing data job to obtain display data for given
* archive/category off the UI thread.
* Class used to track missing display data for the archive/category tables.
* Allowing the information to be retrieved in a non-UI thread.
*/
private static class MissingData {
private static class LoadDisplayData {
protected final String archive;
protected final String category;
protected final Set<String> selectedSet;
protected boolean visiable = false;
protected boolean visible = false;
public MissingData(String archive, String category,
public LoadDisplayData(String archive, String category,
Set<String> selectedSet) {
this.archive = archive;
this.category = category;
@ -790,21 +850,20 @@ public class SizeJob extends Job {
return !selectedSet.isEmpty();
}
public void setVisiable(boolean state) {
this.visiable = state;
public boolean isVisible() {
return visible;
}
public void setSelectedSet(Set<String> selectedSet) {
this.selectedSet.clear();
this.selectedSet.addAll(selectedSet);
public void setVisible(boolean state) {
this.visible = state;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("MissingData[");
StringBuilder sb = new StringBuilder("LoadDisplayData[");
sb.append("archive: ").append(archive);
sb.append(", category: ").append(category);
sb.append(", visible: ").append(visiable);
sb.append(", visible: ").append(isVisible());
sb.append(", isSelected: ").append(isSelected());
sb.append("]");
return sb.toString();
@ -815,14 +874,34 @@ public class SizeJob extends Job {
* This handles getting the display data in the missing data queue and
* queuing the results for the size job.
*/
private class MissingDataJob extends Job {
private class LoadDisplayDataJob extends Job {
private final AtomicBoolean shutdown = new AtomicBoolean(false);
protected MissingData currentMissingData = null;
protected LoadDisplayData currentLoadDisplayData = null;
public MissingDataJob() {
super("MissingData");
private final ILoadDisplayDataListener loadDisplayDataListener;
/**
* Must be set to the maximum number of LoadDisplayData to process.
* Cannot use the queue size since adjusting the queue to change the
* priority may make its size 0. This could cause the job to be
* rescheduled to finish when data added back onto the queue.
*/
private int loadDisplayDataCnt;
/**
* The constructor.
*
* @param loadDisplayDataListener
* @param loadDisplayDataCnt
*/
public LoadDisplayDataJob(
ILoadDisplayDataListener loadDisplayDataListener,
int loadDisplayDataCnt) {
super("Loading Data Sets");
this.loadDisplayDataListener = loadDisplayDataListener;
this.loadDisplayDataCnt = loadDisplayDataCnt;
}
@Override
@ -834,20 +913,21 @@ public class SizeJob extends Job {
ArchiveConfigManager manager = ArchiveConfigManager.getInstance();
while (!shutdown.get()) {
synchronized (missingDataQueue) {
if (currentMissingData != null) {
missingDataQueue.notifyAll();
synchronized (loadDisplayDataQueue) {
if (currentLoadDisplayData != null) {
currentLoadDisplayData = null;
loadDisplayDataQueue.notifyAll();
--loadDisplayDataCnt;
}
currentLoadDisplayData = loadDisplayDataQueue.poll();
if (currentLoadDisplayData == null) {
break;
}
currentMissingData = missingDataQueue.poll();
}
if (currentMissingData == null) {
break;
}
String archiveName = currentMissingData.archive;
String categoryName = currentMissingData.category;
Set<String> selectedSet = currentMissingData.selectedSet;
String archiveName = currentLoadDisplayData.archive;
String categoryName = currentLoadDisplayData.category;
Set<String> selectedSet = currentLoadDisplayData.selectedSet;
List<DisplayData> displayDatas = manager.getDisplayData(
archiveName, categoryName, false);
if (shutdown.get()) {
@ -868,13 +948,31 @@ public class SizeJob extends Job {
}
}
if (loadDisplayDataCnt == 0) {
if (loadDisplayDataListener != null) {
loadDisplayDataListener.loadedAllDisplayData();
}
}
return Status.OK_STATUS;
}
/**
*
* @param loadDisplayData
* @return true when missingData still needs to be processed.
*/
public boolean processing(LoadDisplayData loadDisplayData) {
synchronized (loadDisplayDataQueue) {
return loadDisplayDataQueue.contains(loadDisplayData)
|| loadDisplayData.equals(currentLoadDisplayData);
}
}
@Override
protected void canceling() {
shutdown.set(true);
}
}
}

View file

@ -22,6 +22,7 @@ package com.raytheon.uf.viz.archive.ui;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.core.runtime.IProgressMonitor;
@ -53,6 +54,7 @@ import com.raytheon.uf.common.util.SizeUtil;
import com.raytheon.uf.viz.archive.data.ArchiveInfo;
import com.raytheon.uf.viz.archive.data.CategoryInfo;
import com.raytheon.uf.viz.archive.data.IArchiveTotals;
import com.raytheon.uf.viz.archive.data.ILoadDisplayDataListener;
import com.raytheon.uf.viz.archive.data.IRetentionHour;
import com.raytheon.uf.viz.archive.data.IUpdateListener;
import com.raytheon.uf.viz.archive.data.SizeJob;
@ -79,6 +81,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* Dec 11, 2013 2624 rferrel No longer clear table prior to populating.
* Apr 15, 2014 3034 lvenable Added dispose checks in runAsync calls.
* Apr 10, 2014 3023 rferrel Added setTotalSelectedSize method.
* Apr 23, 2014 3045 rferrel Changes to prevent race condition while getting labels.
*
* </pre>
*
@ -87,7 +90,8 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
*/
public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
IArchiveTotals, IUpdateListener, IModifyListener, IRetentionHour {
IArchiveTotals, IUpdateListener, IModifyListener, IRetentionHour,
ILoadDisplayDataListener {
/** Table composite that holds the table controls. */
private ArchiveTableComp tableComp;
@ -115,7 +119,7 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
/**
* Job that computes sizes of table row entries off the UI thread.
*/
protected final SizeJob sizeJob = new SizeJob();
protected final SizeJob sizeJob = new SizeJob(this);
/** Keeps track of when it is safe to clear the busy cursor. */
protected final AtomicInteger busyCnt = new AtomicInteger(0);
@ -139,6 +143,9 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
private String previousSelectedCategory = null;
/** Job running to populate the currently selected archive/category. */
private Job populateTableJob = null;
/**
* @param parentShell
*/
@ -365,6 +372,9 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
protected void disposed() {
sizeJob.removeUpdateListener(this);
sizeJob.cancel();
if (populateTableJob != null) {
populateTableJob.cancel();
}
}
/**
@ -463,12 +473,17 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
}
/**
* Load a select configuration file.
* Load selected configuration file.
*
* @param selectName
*/
protected void loadSelect(String selectName) {
sizeJob.loadSelect(selectName, type);
protected boolean loadSelect(String selectName) {
String message = sizeJob.loadSelect(selectName, type);
if (message != null) {
MessageDialog.openError(shell, "Unable to load Case", message);
return false;
}
return true;
}
/**
@ -483,15 +498,39 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
setShowingSelected(false);
Job job = new Job("populate category table") {
if (populateTableJob != null) {
populateTableJob.cancel();
setCursorBusy(false);
}
populateTableJob = new Job("populate category table") {
private AtomicBoolean shutdown = new AtomicBoolean(false);
@Override
protected IStatus run(IProgressMonitor monitor) {
getCategoryTableData(archiveName, categoryName);
getCategoryTableData(archiveName, categoryName, shutdown);
// Just populated the current table update cursor.
if (!shutdown.get()) {
populateTableJob = null;
VizApp.runAsync(new Runnable() {
@Override
public void run() {
setCursorBusy(false);
}
});
}
return Status.OK_STATUS;
}
@Override
protected void canceling() {
shutdown.set(true);
}
};
job.schedule();
populateTableJob.schedule();
}
/**
@ -501,12 +540,25 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
*
* @param archiveName
* @param categoryName
* @param shutdown
*/
private void getCategoryTableData(final String archiveName,
final String categoryName) {
final String categoryName, final AtomicBoolean shutdown) {
if (!sizeJob.isCurrentDisplay(archiveName, categoryName)) {
VizApp.runAsync(new Runnable() {
@Override
public void run() {
if (!isDisposed()) {
tableComp.clearTable();
}
}
});
}
final List<DisplayData> displayDatas = sizeJob.changeDisplay(
archiveName, categoryName);
archiveName, categoryName, shutdown);
VizApp.runAsync(new Runnable() {
@ -517,15 +569,11 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
return;
}
try {
if (displayDatas != null) {
tableComp.populateTable(archiveName, categoryName,
displayDatas);
} else {
tableComp.refresh();
}
} finally {
setCursorBusy(false);
if (displayDatas != null) {
tableComp.populateTable(archiveName, categoryName,
displayDatas);
} else {
tableComp.refresh();
}
}
});
@ -537,11 +585,14 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
* @param state
*/
protected void setCursorBusy(boolean state) {
if (state) {
busyCnt.addAndGet(1);
shell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT));
} else if (busyCnt.addAndGet(-1) == 0) {
shell.setCursor(null);
if (!shell.isDisposed()) {
if (state) {
busyCnt.addAndGet(1);
shell.setCursor(shell.getDisplay().getSystemCursor(
SWT.CURSOR_WAIT));
} else if (busyCnt.addAndGet(-1) == 0) {
shell.setCursor(null);
}
}
}
@ -786,6 +837,11 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
return errorMsg == null;
}
/**
* Allows sub-class to perform updates once all the display data is loaded.
*/
abstract public void loadedAllDisplayData();
/**
* When unsaved modifications this asks the user to verify the close.
*

View file

@ -57,6 +57,7 @@ import com.raytheon.uf.common.time.util.TimeUtil;
* Oct 01, 2013 #2147 rferrel Change getEnd() to pick up files with future time stamps.
* Oct 07, 2013 #2438 rferrel Properly save and load retention times.
* Apr 14, 2014 #3023 rferrel Code clean up.
* Apr 24, 2014 #3045 rferrel Implement loadedAllDsipalyData.
*
* </pre>
*
@ -415,4 +416,9 @@ public class ArchiveRetentionDlg extends AbstractArchiveDlg {
archiveComboSelection();
categoryComboSelection();
}
@Override
public void loadedAllDisplayData() {
// nothing to update.
}
}

View file

@ -19,6 +19,7 @@
**/
package com.raytheon.uf.viz.archive.ui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@ -63,6 +64,7 @@ import com.raytheon.uf.viz.archive.data.SizeJob;
* Aug 06, 2013 #2222 rferrel Changes to display all selected data.
* Aug 14, 2013 #2220 rferrel Add refresh method.
* Aug 26, 2013 #2225 rferrel Add missing updates.
* Apr 23, 2014 #3045 rferrel Added clearTable method and new column name.
*
* </pre>
*
@ -71,12 +73,19 @@ import com.raytheon.uf.viz.archive.data.SizeJob;
*/
public class ArchiveTableComp extends Composite {
/** Column label when table displaying category information. */
private final String CATEGORY_COL_LABEL = "Data Set";
/** Column label when table displaying select all information. */
private final String SEL_ALL_COL_LABEL = "Archive | Category | Data Set";
/** Column to display label information. */
private final int LABEL_COL_INDEX = 0;
/** Column to display size information,. */
private final int SIZE_COL_INDEX = 1;
/** Flag to indicate all selections are being displayed. */
private boolean showSelectAll = false;
/** Name of table's archive. */
@ -205,7 +214,7 @@ public class ArchiveTableComp extends Composite {
});
TableColumn pathColumn = new TableColumn(table, SWT.LEFT);
pathColumn.setText("Label");
pathColumn.setText(CATEGORY_COL_LABEL);
TableColumn sizeColumn = new TableColumn(table, SWT.CENTER);
if (type == Type.Retention) {
@ -464,10 +473,17 @@ public class ArchiveTableComp extends Composite {
protected void populateTable(String archiveName, String categoryName,
List<DisplayData> displayDatas) {
showSelectAll = false;
table.getColumn(0).setText("Label");
table.getColumn(0).setText(CATEGORY_COL_LABEL);
populateTable(displayDatas);
}
/**
* Clear table entries.
*/
protected void clearTable() {
populateTable(new ArrayList<DisplayData>(0));
}
/**
* Flag table as showing all selected data and update display.
*
@ -475,7 +491,7 @@ public class ArchiveTableComp extends Composite {
*/
protected void populateSelectAll(List<DisplayData> displayDatas) {
showSelectAll = true;
table.getColumn(0).setText("Archive | Category | Label");
table.getColumn(0).setText(SEL_ALL_COL_LABEL);
populateTable(displayDatas);
}

View file

@ -38,6 +38,7 @@ import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
@ -45,6 +46,7 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import com.raytheon.uf.common.archive.config.ArchiveConstants.Type;
import com.raytheon.uf.common.archive.config.DisplayData;
@ -71,7 +73,11 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* Jul 24, 2013 #2221 rferrel Changes for select configuration.
* Aug 06, 2013 #2222 rferrel Changes to display all selected data.
* Aug 26, 2013 #2225 rferrel Make perspective independent and no longer modal.
* Mar 24, 2014 #2853 rferrel Populate case label directory with default value.
* Mar 26, 2014 32880 rferrerl Implement case compression and split.
* Apr 11, 2014 #3023 rferrel Configurable Threshold options.
* Apr 23, 2014 #3045 rferrel To prevent race condition only allow a case
* load after all labels are loaded.
*
* </pre>
*
@ -80,6 +86,9 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
*/
public class CaseCreationDlg extends AbstractArchiveDlg {
/** The case creation label's default directory. */
private final String defaultCaseDir;
/** Start time label. */
private Label startTimeLbl;
@ -101,9 +110,8 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
/** Compression check box. */
private Button compressChk;
// TODO restore when Multi-file implemented.
// /** Break files check box. */
// private Button breakFilesChk;
/** Break files check box. */
private Button breakFilesChk;
/** Button to save new select case configuration. */
private Button saveAsBtn;
@ -114,17 +122,14 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
/** Button to delete select case configuration. */
private Button deleteBtn;
// TODO restore when Multi-file implemented.
// /** File size spinner control. */
// private Spinner fileSizeSpnr;
/** File size spinner control. */
private Spinner fileSizeSpnr;
// TODO restore when Multi-file implemented.
// /** File size combo box. */
// private Combo fileSizeCbo;
/** File size combo box. */
private Combo fileSizeCbo;
// TODO restore when Multi-file implemented.
// /** Maximum file size label. */
// private Label maxFileSizeLbl;
/** Maximum file size label. */
private Label maxFileSizeLbl;
/** Directory location label. */
private Label locationLbl;
@ -166,19 +171,23 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
/** Manager for configurable values for the dialog. */
private final CaseCreationManager ccManager;
/** Flag to indicate all labels for all tables are loaded. */
private volatile boolean haveAllLabels = false;
/**
* Constructor.
*
* @param parentShell
* Parent shell.
*/
public CaseCreationDlg(Shell parentShell) {
public CaseCreationDlg(Shell parentShell, String defaultCaseDir) {
super(parentShell, SWT.DIALOG_TRIM | SWT.MIN, CAVE.DO_NOT_BLOCK
| CAVE.PERSPECTIVE_INDEPENDENT | CAVE.MODE_INDEPENDENT
| CAVE.INDEPENDENT_SHELL);
this.type = Type.Case;
this.setSelect = false;
this.type = Type.Case;
this.defaultCaseDir = defaultCaseDir;
this.ccManager = new CaseCreationManager();
}
@ -377,60 +386,58 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
*/
compressChk = new Button(compressionComp, SWT.CHECK);
compressChk.setText("Compress Files");
// TODO restore when Multi-file implemented.
// compressChk.addSelectionListener(new SelectionAdapter() {
// @Override
// public void widgetSelected(SelectionEvent e) {
// handleCompressSelection();
// }
// });
compressChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleCompressSelection();
}
});
// TODO restore when Multi-file implemented.
// gd = new GridData();
// gd.horizontalIndent = 20;
// breakFilesChk = new Button(compressionComp, SWT.CHECK);
// breakFilesChk.setText("Break into multiple files");
// breakFilesChk.setLayoutData(gd);
// breakFilesChk.setEnabled(false);
// breakFilesChk.addSelectionListener(new SelectionAdapter() {
// @Override
// public void widgetSelected(SelectionEvent e) {
// handleBreakFilesSelection(breakFilesChk.getSelection());
// }
// });
gd = new GridData();
gd.horizontalIndent = 20;
breakFilesChk = new Button(compressionComp, SWT.CHECK);
breakFilesChk.setText("Break into multiple files");
breakFilesChk.setLayoutData(gd);
breakFilesChk.setEnabled(false);
breakFilesChk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleBreakFilesSelection(breakFilesChk.getSelection());
}
});
// Composite maxFileSizeComp = new Composite(compressionComp, SWT.NONE);
// gl = new GridLayout(3, false);
// gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
// gd.horizontalIndent = 20;
// maxFileSizeComp.setLayout(gl);
// maxFileSizeComp.setLayoutData(gd);
//
// maxFileSizeLbl = new Label(maxFileSizeComp, SWT.NONE);
// maxFileSizeLbl.setText("Max File Size: ");
// maxFileSizeLbl.setEnabled(false);
//
// gd = new GridData(60, SWT.DEFAULT);
// fileSizeSpnr = new Spinner(maxFileSizeComp, SWT.BORDER);
// fileSizeSpnr.setIncrement(1);
// fileSizeSpnr.setPageIncrement(50);
// fileSizeSpnr.setMaximum(2000);
// fileSizeSpnr.setMinimum(500);
// fileSizeSpnr.setLayoutData(gd);
// fileSizeSpnr.setEnabled(false);
//
// fileSizeCbo = new Combo(maxFileSizeComp, SWT.VERTICAL | SWT.DROP_DOWN
// | SWT.BORDER | SWT.READ_ONLY);
// fileSizeCbo.setEnabled(false);
// fileSizeCbo.addSelectionListener(new SelectionAdapter() {
// @Override
// public void widgetSelected(SelectionEvent e) {
// handleFileSizeChangeSelection();
// }
// });
// fileSizeCbo.add("MB");
// fileSizeCbo.add("GB");
// fileSizeCbo.select(0);
Composite maxFileSizeComp = new Composite(compressionComp, SWT.NONE);
gl = new GridLayout(3, false);
gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
gd.horizontalIndent = 20;
maxFileSizeComp.setLayout(gl);
maxFileSizeComp.setLayoutData(gd);
maxFileSizeLbl = new Label(maxFileSizeComp, SWT.NONE);
maxFileSizeLbl.setText("Max File Size: ");
maxFileSizeLbl.setEnabled(false);
gd = new GridData(60, SWT.DEFAULT);
fileSizeSpnr = new Spinner(maxFileSizeComp, SWT.BORDER);
fileSizeSpnr.setIncrement(1);
fileSizeSpnr.setPageIncrement(50);
fileSizeSpnr.setMaximum(2000);
fileSizeSpnr.setMinimum(500);
fileSizeSpnr.setLayoutData(gd);
fileSizeSpnr.setEnabled(false);
fileSizeCbo = new Combo(maxFileSizeComp, SWT.VERTICAL | SWT.DROP_DOWN
| SWT.BORDER | SWT.READ_ONLY);
fileSizeCbo.setEnabled(false);
fileSizeCbo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleFileSizeChangeSelection();
}
});
fileSizeCbo.add("MB");
fileSizeCbo.add("GB");
fileSizeCbo.select(0);
}
/**
@ -490,34 +497,48 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
// }
// });
String tooltip = "Waiting on loading of Data Sets.";
Color color = shell.getDisplay().getSystemColor(SWT.COLOR_YELLOW);
saveBtn = new Button(actionControlComp, SWT.PUSH);
saveBtn.setText(" Save ");
saveBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
saveSelection(selectName);
clearModified();
if (haveAllLabels) {
saveSelection(selectName);
clearModified();
}
}
});
saveBtn.setToolTipText(tooltip);
saveBtn.setEnabled(false);
saveBtn.setBackground(color);
saveAsBtn = new Button(actionControlComp, SWT.PUSH);
saveAsBtn.setText(" Save As... ");
saveAsBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
handleSaveAsCase();
if (haveAllLabels) {
handleSaveAsCase();
}
}
});
saveAsBtn.setToolTipText(tooltip);
saveAsBtn.setBackground(color);
loadBtn = new Button(actionControlComp, SWT.PUSH);
loadBtn.setText(" Load... ");
loadBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
handleLoadCase();
if (haveAllLabels) {
handleLoadCase();
}
}
});
loadBtn.setToolTipText(tooltip);
loadBtn.setBackground(color);
deleteBtn = new Button(actionControlComp, SWT.PUSH);
deleteBtn.setText(" Delete... ");
@ -606,11 +627,12 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
public void dialogClosed(Object returnValue) {
if (returnValue instanceof String) {
String name = returnValue.toString();
loadSelect(name);
populateTableComp();
updateTotals(null);
setSelectName(name);
clearModified();
if (loadSelect(name)) {
populateTableComp();
updateTotals(null);
setSelectName(name);
clearModified();
}
}
}
});
@ -653,14 +675,9 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
List<DisplayData> displayDatas = getSelectedData();
boolean doCompress = compressChk.getSelection();
// TODO restore once Multi-file implemented.
// boolean doMultiFiles = breakFilesChk.getSelection();
// int compressSize = fileSizeSpnr.getSelection();
// String sizeType =
// fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex());
boolean doMultiFiles = false;
int compressSize = 500;
String sizeType = "MB";
boolean doMultiFiles = breakFilesChk.getSelection();
int compressSize = fileSizeSpnr.getSelection();
String sizeType = fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex());
setCursorBusy(true);
if (generateCaseDlg == null || generateCaseDlg.isDisposed()) {
@ -703,19 +720,18 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
}
// TODO restore when Multi-file implemented.
// /**
// * Enable/Disable controls based on the compression check box.
// */
// private void handleCompressSelection() {
// if (compressChk.getSelection()) {
// handleBreakFilesSelection(breakFilesChk.getSelection());
// } else {
// handleBreakFilesSelection(false);
// }
//
// breakFilesChk.setEnabled(compressChk.getSelection());
// }
/**
* Enable/Disable controls based on the compression check box.
*/
private void handleCompressSelection() {
if (compressChk.getSelection()) {
handleBreakFilesSelection(breakFilesChk.getSelection());
} else {
handleBreakFilesSelection(false);
}
breakFilesChk.setEnabled(compressChk.getSelection());
}
/**
* Bring up modal dialog to get the case's directory name.
@ -754,18 +770,17 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
}
}
// TODO restore when Multi-file implemented.
// /**
// * Enable/Disable file size controls.
// *
// * @param enabled
// * Enabled flag.
// */
// private void handleBreakFilesSelection(boolean enabled) {
// maxFileSizeLbl.setEnabled(enabled);
// fileSizeSpnr.setEnabled(enabled);
// fileSizeCbo.setEnabled(enabled);
// }
/**
* Enable/Disable file size controls.
*
* @param enabled
* Enabled flag.
*/
private void handleBreakFilesSelection(boolean enabled) {
maxFileSizeLbl.setEnabled(enabled);
fileSizeSpnr.setEnabled(enabled);
fileSizeCbo.setEnabled(enabled);
}
/**
* Enables the generate button will user has entered all needed elements.
@ -777,36 +792,35 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
}
}
// TODO restore when Multi-file implemented.
// /**
// * Action performed when the file size has changed.
// */
// private void handleFileSizeChangeSelection() {
// /*
// * If the same item was selected just return.
// */
// if (fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex()).equals(
// (String) fileSizeCbo.getData())) {
// return;
// }
//
// if (fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex()).equals("MB")) {
// fileSizeSpnr.setIncrement(1);
// fileSizeSpnr.setPageIncrement(50);
// fileSizeSpnr.setMaximum(2000);
// fileSizeSpnr.setMinimum(500);
// fileSizeSpnr.setSelection(500);
// } else {
// fileSizeSpnr.setIncrement(1);
// fileSizeSpnr.setPageIncrement(5);
// fileSizeSpnr.setMinimum(1);
// fileSizeSpnr.setMaximum(10);
// fileSizeSpnr.setSelection(1);
// }
//
// fileSizeCbo
// .setData(fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex()));
// }
/**
* Action performed when the file size has changed.
*/
private void handleFileSizeChangeSelection() {
/*
* If the same item was selected just return.
*/
if (fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex()).equals(
(String) fileSizeCbo.getData())) {
return;
}
if (fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex()).equals("MB")) {
fileSizeSpnr.setIncrement(1);
fileSizeSpnr.setPageIncrement(50);
fileSizeSpnr.setMaximum(2000);
fileSizeSpnr.setMinimum(500);
fileSizeSpnr.setSelection(500);
} else {
fileSizeSpnr.setIncrement(1);
fileSizeSpnr.setPageIncrement(5);
fileSizeSpnr.setMinimum(1);
fileSizeSpnr.setMaximum(10);
fileSizeSpnr.setSelection(1);
}
fileSizeCbo
.setData(fileSizeCbo.getItem(fileSizeCbo.getSelectionIndex()));
}
/**
* Display the directory browser dialog.
@ -815,6 +829,15 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
DirectoryDialog dlg = new DirectoryDialog(shell, SWT.OPEN);
dlg.setText("Case Location");
String dirName = dlg.open();
updateLocationLbl(dirName);
}
/**
* Update the case label and fields dependent on the change.
*
* @param dirName
*/
private void updateLocationLbl(String dirName) {
if (dirName != null) {
locationLbl.setText(trimDirectoryName(dirName));
locationLbl.setToolTipText(dirName);
@ -1059,4 +1082,62 @@ public class CaseCreationDlg extends AbstractArchiveDlg {
super.clearModified();
saveBtn.setEnabled(false);
}
/*
* (non-Javadoc)
*
* @see com.raytheon.viz.ui.dialogs.CaveSWTDialogBase#opened()
*/
@Override
protected void opened() {
super.opened();
File caseDir = new File(defaultCaseDir);
if (caseDir.isDirectory()) {
updateLocationLbl(defaultCaseDir);
} else {
MessageDialog
.openError(
shell,
"Error",
String.format(
"Unable to find Case Location directory:\n%s\nMay need to mount the directory.",
defaultCaseDir));
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.archive.ui.AbstractArchiveDlg#haveAllLabels()
*/
@Override
public void loadedAllDisplayData() {
haveAllLabels = true;
/*
* Restore the buttons' default background color and tooltip text. The
* buttons color is not the system standard and the tool tip text
* indicates it is waiting for the labels to be loaded.
*/
VizApp.runAsync(new Runnable() {
@Override
public void run() {
if (!isDisposed()) {
saveBtn.setBackground(null);
saveBtn.setToolTipText(null);
saveAsBtn.setBackground(null);
saveAsBtn.setToolTipText(null);
loadBtn.setBackground(null);
loadBtn.setToolTipText(null);
}
}
});
}
@Override
protected boolean isModified() {
return super.isModified();
}
}

View file

@ -116,7 +116,7 @@ public class CaseLoadSaveDeleteDlg extends CaveSWTDialog {
private void init() {
createCaseControls();
GuiUtil.addSeparator(shell, SWT.HORIZONTAL);
createBottomAcitonButtons();
createBottomActionButtons();
}
/**
@ -151,7 +151,7 @@ public class CaseLoadSaveDeleteDlg extends CaveSWTDialog {
/**
* Button layout at the bottom of the dialog.
*/
private void createBottomAcitonButtons() {
private void createBottomActionButtons() {
Composite actionControlComp = new Composite(shell, SWT.NONE);
GridLayout gl = new GridLayout(2, false);
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);

View file

@ -37,6 +37,7 @@ import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
@ -94,6 +95,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* implementation of compression.
* Oct 08, 2013 2442 rferrel Remove category directory.
* Feb 04, 2014 2270 rferrel Move HDF files to parent's directory.
* Mar 26, 2014 2880 rferrel Compress and split cases implemented.
* Apr 03, 2014 2862 rferrel Logic for shared locking of top level directories.
*
* </pre>
@ -143,9 +145,8 @@ public class GenerateCaseDlg extends CaveSWTDialog {
/** When true break the compress file into multiple files. */
private final boolean doMultiFiles;
// Needed when compress and split implemented
// /** The compress size for multiple files. */
// private final long splitSize;
/** The compress size for multiple files. */
private final long splitSize;
/** Job to perform the case generation off of the UI thread. */
private GenerateJob generateJob;
@ -187,8 +188,7 @@ public class GenerateCaseDlg extends CaveSWTDialog {
this.doCompress = doCompress;
this.doMultiFiles = doMultiFiles;
// Needed when compress and split implemented.
// this.splitSize = splitSize;
this.splitSize = splitSize;
this.caseName = caseDir.getAbsolutePath().substring(
targetDir.getAbsolutePath().length() + 1);
setText("Generating - " + caseName);
@ -498,6 +498,9 @@ public class GenerateCaseDlg extends CaveSWTDialog {
boolean allowCopy = true;
CopyInfo copyInfo = null;
ITimer timer = TimeUtil.getTimer();
timer.start();
try {
/*
* The sourceDataList is sorted so all the displayDatas for a
@ -556,7 +559,7 @@ public class GenerateCaseDlg extends CaveSWTDialog {
if (!doCompress) {
caseCopy = new CopyMove();
} else if (doMultiFiles) {
caseCopy = new CompressAndSplitCopy();
caseCopy = new CompressAndSplitCopy(splitSize);
} else {
caseCopy = new CompressCopy();
}
@ -658,11 +661,18 @@ public class GenerateCaseDlg extends CaveSWTDialog {
try {
// Allow the caseCopy to clean its resources.
caseCopy.finishCase();
} catch (CaseCreateException ex) {
} catch (Exception ex) {
// Ignore
}
caseCopy = null;
}
timer.stop();
if (statusHandler.isPriorityEnabled(Priority.INFO)) {
String message = String.format("Case %s took %s.",
caseDir.getName(),
TimeUtil.prettyDuration(timer.getElapsedTime()));
statusHandler.handle(Priority.INFO, message);
}
}
// Release current lock.
@ -874,6 +884,8 @@ public class GenerateCaseDlg extends CaveSWTDialog {
* This class copies selected files/directories to a case-directory/archive.
*/
private static class CopyMove implements ICaseCopy {
private final IUFStatusHandler statusHandler;
/**
* Flag to indicate user canceled the case generation.
*/
@ -889,6 +901,13 @@ public class GenerateCaseDlg extends CaveSWTDialog {
*/
private int startRelativePath;
/**
* Constructor.
*/
public CopyMove() {
statusHandler = UFStatus.getHandler(this.getClass());
}
/**
* Copy source File to desired destination.
*
@ -901,6 +920,16 @@ public class GenerateCaseDlg extends CaveSWTDialog {
return;
}
if (!source.exists()) {
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
String message = String.format(
"Purged and unable to place in case: %s",
source.getAbsoluteFile());
statusHandler.handle(Priority.DEBUG, message);
}
return;
}
if (source.isDirectory()) {
if (!destination.exists()) {
@ -924,6 +953,11 @@ public class GenerateCaseDlg extends CaveSWTDialog {
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.archive.ui.ICaseCopy#copy(java.io.File)
*/
@Override
public void copy(File source) throws CaseCreateException {
String relativePath = source.getAbsolutePath().substring(
@ -933,10 +967,17 @@ public class GenerateCaseDlg extends CaveSWTDialog {
destination.getParentFile().mkdirs();
copyFile(source, destination);
} catch (IOException ex) {
throw new CaseCreateException("CopyMove.copy: ", ex);
throw new CaseCreateException("Copy Move ", ex);
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.archive.ui.ICaseCopy#startCase(java.io.File,
* com.raytheon.uf.common.archive.config.DisplayData,
* java.util.concurrent.atomic.AtomicBoolean)
*/
@Override
public void startCase(File caseDir, DisplayData displayData,
AtomicBoolean shutdown) {
@ -948,6 +989,11 @@ public class GenerateCaseDlg extends CaveSWTDialog {
startRelativePath = displayData.getRootDir().length();
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.archive.ui.ICaseCopy#finishCase()
*/
@Override
public void finishCase() {
// Nothing to do.
@ -957,55 +1003,79 @@ public class GenerateCaseDlg extends CaveSWTDialog {
/**
* This class takes selected directories/files to
* case-directory/archive/compress-category-file. The compress-category-file
* is a tar gzip file containing the categorie's data.
* is a tar gzip file containing the category's data.
*/
private static class CompressCopy implements ICaseCopy {
private final IUFStatusHandler statusHandler;
/**
* Flag to indicate user canceled case generation.
*/
private AtomicBoolean shutdown;
protected AtomicBoolean shutdown;
/**
* Top Level destination directory.
*/
private File destDir;
protected File destDir;
/**
* Stream to the file being created.
*/
private FileOutputStream fileStream;
protected FileOutputStream fileStream;
/**
* Stream to perform the compression.
*/
private GZIPOutputStream zipStream;
protected GZIPOutputStream zipStream;
/**
* Stream to create the tar image.
*/
private ArchiveOutputStream tarStream;
protected ArchiveOutputStream tarStream;
/**
* The category directory name used to generate tar file name(s).
*/
protected String categoryDirName;
/**
* Index to start of relative path in source File.
*/
private int startRelativePath;
protected int startRelativePath;
/**
* Directories already created in the tar image.
*/
private final HashSet<File> tarDirFile = new HashSet<File>();
protected final HashSet<File> tarDirFile = new HashSet<File>();
/**
* Buffer to use for reading in a file.
*/
private final byte[] buffer = new byte[(int) (32 * FileUtils.ONE_KB)];
protected final byte[] buffer = new byte[(int) (32 * FileUtils.ONE_KB)];
/**
* Current tar file being created.
*/
protected File tarFile;
/**
* Constructor.
*/
public CompressCopy() {
this.statusHandler = UFStatus.getHandler(this.getClass());
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.archive.ui.ICaseCopy#copy(java.io.File)
*/
@Override
public void copy(File source) throws CaseCreateException {
try {
addParentDir(source);
addTarFiles(new File[] { source });
} catch (IOException e) {
} catch (Exception e) {
throw new CaseCreateException("Compress Copy failed: ", e);
}
}
@ -1015,14 +1085,26 @@ public class GenerateCaseDlg extends CaveSWTDialog {
*
* @param files
* @throws IOException
* @throws ArchiveException
* @throws CaseCreateException
*/
private void addTarFiles(File[] files) throws IOException {
private void addTarFiles(File[] files) throws IOException,
ArchiveException {
for (File file : files) {
if (shutdown.get()) {
return;
}
String name = file.getAbsolutePath().substring(
startRelativePath);
if (!file.exists()) {
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
String message = String.format(
"Purged and unable to place in case: %s",
file.getAbsoluteFile());
statusHandler.handle(Priority.DEBUG, message);
}
continue;
}
if (file.isDirectory()) {
if (!tarDirFile.contains(file)) {
TarArchiveEntry entry = new TarArchiveEntry(file, name);
@ -1032,6 +1114,7 @@ public class GenerateCaseDlg extends CaveSWTDialog {
addTarFiles(file.listFiles());
}
} else if (file.exists()) {
checkFit(file);
// DR 2270 bump HDF files up a directory.
if (name.endsWith(hdfExt)) {
File destination = new File(file.getParentFile()
@ -1065,7 +1148,7 @@ public class GenerateCaseDlg extends CaveSWTDialog {
*
* @param stream
*/
private void closeStream(Closeable stream) {
protected void closeStream(Closeable stream) {
try {
stream.close();
} catch (IOException ex) {
@ -1073,13 +1156,21 @@ public class GenerateCaseDlg extends CaveSWTDialog {
}
}
/**
* Allows sub-class to check to see if file will fit in the current tar
* file and if needed setup new tar file.
*/
protected void checkFit(File file) throws IOException, ArchiveException {
// Do not change the tar file.
}
/**
* If needed add parent directories to the tar image.
*
* @param file
* @throws IOException
*/
private void addParentDir(File file) throws IOException {
protected void addParentDir(File file) throws IOException {
File parent = file.getParentFile();
if (parent != null && !tarDirFile.contains(parent)
&& (parent.getAbsolutePath().length() > startRelativePath)) {
@ -1093,6 +1184,13 @@ public class GenerateCaseDlg extends CaveSWTDialog {
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.archive.ui.ICaseCopy#startCase(java.io.File,
* com.raytheon.uf.common.archive.config.DisplayData,
* java.util.concurrent.atomic.AtomicBoolean)
*/
@Override
public void startCase(File caseDir, DisplayData displayData,
AtomicBoolean shutdown) throws CaseCreateException {
@ -1100,30 +1198,67 @@ public class GenerateCaseDlg extends CaveSWTDialog {
this.shutdown = shutdown;
String archiveDirName = ArchiveConstants
.convertToFileName(displayData.getArchiveName());
String categoryDirName = ArchiveConstants
categoryDirName = ArchiveConstants
.convertToFileName(displayData.getCategoryName());
destDir = new File(caseDir, archiveDirName);
destDir.mkdirs();
tarDirFile.clear();
startRelativePath = displayData.getRootDir().length();
File tarFile = new File(destDir, categoryDirName
+ ArchiveConstants.TAR_EXTENSION);
fileStream = new FileOutputStream(tarFile);
zipStream = new GZIPOutputStream(fileStream);
ArchiveStreamFactory factory = new ArchiveStreamFactory();
tarStream = factory.createArchiveOutputStream(
ArchiveStreamFactory.TAR, zipStream);
if (tarStream instanceof TarArchiveOutputStream) {
((TarArchiveOutputStream) tarStream)
.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
}
openStreams();
} catch (Exception e) {
throw new CaseCreateException("CompressCopy.startCase: ", e);
throw new CaseCreateException("Compress Copy start case: ", e);
}
}
/**
* Determine a new tar file and set up its streams.
*
* @throws IOException
* @throws ArchiveException
*/
protected void openStreams() throws IOException, ArchiveException {
tarDirFile.clear();
tarFile = getTarFile();
fileStream = new FileOutputStream(tarFile);
zipStream = new GZIPOutputStream(fileStream);
ArchiveStreamFactory factory = new ArchiveStreamFactory();
tarStream = factory.createArchiveOutputStream(
ArchiveStreamFactory.TAR, zipStream);
if (tarStream instanceof TarArchiveOutputStream) {
((TarArchiveOutputStream) tarStream)
.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
}
}
/**
* Determine new tar file.
*
* @return tarFile
*/
protected File getTarFile() {
return new File(destDir, categoryDirName
+ ArchiveConstants.TAR_EXTENSION);
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.archive.ui.ICaseCopy#finishCase()
*/
@Override
public void finishCase() throws CaseCreateException {
try {
closeStreams();
} catch (IOException e) {
throw new CaseCreateException("Compress Copy finish: ", e);
}
}
/**
* Close all the streams for current tar file.
*
* @throws IOException
*/
protected void closeStreams() throws IOException {
try {
if (tarStream != null) {
tarStream.finish();
@ -1131,8 +1266,6 @@ public class GenerateCaseDlg extends CaveSWTDialog {
if (zipStream != null) {
zipStream.finish();
}
} catch (IOException e) {
throw new CaseCreateException("CaseCopy.finish: ", e);
} finally {
if (tarStream != null) {
closeStream(tarStream);
@ -1150,316 +1283,90 @@ public class GenerateCaseDlg extends CaveSWTDialog {
/*
* This class intended for making "image" files read for burning to a CD or
* DVD. Need to resolve issues on how this should be done.
* DVD.
*/
private static class CompressAndSplitCopy implements ICaseCopy {
private static class CompressAndSplitCopy extends CompressCopy {
/**
* Number of bytes to back off the split limit to allow finishing the
* tar without exceeding the limit.
*/
private final long BACK_OFF_BYTES = 5 * FileUtils.ONE_KB;
/**
* Maximum bytes for a tar file.
*/
private final long splitSize;
/**
* Count of tar files for a category.
*/
private int fileCnt = 0;
/**
* Constructor.
*
* @param splitSize
*/
public CompressAndSplitCopy(long splitSize) {
super();
this.splitSize = splitSize - BACK_OFF_BYTES;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.archive.ui.GenerateCaseDlg.CompressCopy#startCase
* (java.io.File, com.raytheon.uf.common.archive.config.DisplayData,
* java.util.concurrent.atomic.AtomicBoolean)
*/
@Override
public void startCase(File caseDir, DisplayData displayData,
AtomicBoolean shutdown) throws CaseCreateException {
throw new CaseCreateException(
"Compress and split not yet implemented.");
this.fileCnt = 0;
super.startCase(caseDir, displayData, shutdown);
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.archive.ui.GenerateCaseDlg.CompressCopy#getTarFile
* ()
*/
@Override
public void copy(File source) throws CaseCreateException {
// TODO Auto-generated method stub
protected File getTarFile() {
int cnt = ++fileCnt;
String name = String.format("%s_%03d%s", categoryDirName, cnt,
ArchiveConstants.TAR_EXTENSION);
return new File(destDir, name);
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.archive.ui.GenerateCaseDlg.CompressCopy#checkFit
* (java.io.File)
*/
@Override
public void finishCase() {
// TODO Auto-generated method stub
protected void checkFit(File file) throws IOException, ArchiveException {
// force update of tarFile length.
tarStream.flush();
zipStream.flush();
fileStream.flush();
/*
* Most likely over estimates the size since it is unknown how well
* file will compress.
*/
long size = tarFile.length() + file.length();
if (size >= splitSize) {
closeStreams();
openStreams();
addParentDir(file);
}
}
// TODO Example code for future implementation of this class.
// Will need to break up into the starCase, copy and finishCase will
// need close and join.
// private void compressAndSplitCase() {
// ArchiveOutputStream tarStream = null;
// GZIPOutputStream zipStream = null;
// try {
// Pipe pipe = Pipe.open();
// OutputStream poStream = Channels.newOutputStream(pipe.sink());
// zipStream = new GZIPOutputStream(poStream);
// ArchiveStreamFactory factory = new ArchiveStreamFactory();
//
// tarStream = factory.createArchiveOutputStream(
// ArchiveStreamFactory.TAR, zipStream);
//
// if (tarStream instanceof TarArchiveOutputStream) {
// ((TarArchiveOutputStream) tarStream)
// .setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
// }
//
// final InputStream piStream = Channels.newInputStream(pipe
// .source());
// splitDone.set(false);
//
// Job splitJob = new Job("Split") {
//
// @Override
// protected IStatus run(IProgressMonitor monitor) {
// OutputStream splitStream = null;
// long totSize = 0;
// try {
// byte[] buffer = new byte[12 * 1024];
//
// int bufCnt = 0;
// long splitCnt = 0L;
// while ((bufCnt = piStream.read(buffer)) != -1) {
// totSize += bufCnt;
// if (splitStream == null) {
// splitStream = openSplitFile(++numSplitFiles);
// }
// long fileSize = splitCnt + bufCnt;
// if (fileSize < splitSize) {
// splitStream.write(buffer, 0, bufCnt);
// splitCnt = fileSize;
// } else if (fileSize == splitSize) {
// splitStream.write(buffer, 0, bufCnt);
// splitStream.close();
// splitStream = null;
// splitCnt = 0L;
// } else {
// int cnt = (int) (splitSize - splitCnt);
// splitStream.write(buffer, 0, cnt);
// splitStream.close();
// splitStream = openSplitFile(++numSplitFiles);
// int remainder = bufCnt - cnt;
// splitStream.write(buffer, cnt, remainder);
// splitCnt = remainder;
// }
// }
// } catch (IOException e) {
// statusHandler.handle(Priority.PROBLEM,
// e.getLocalizedMessage(), e);
// } finally {
// if (splitStream != null) {
// try {
// splitStream.close();
// } catch (IOException e) {
// // Ignore
// }
// }
// splitDone.set(true);
// System.out.println("totalSize: " + totSize
// + ", splitSize: " + splitSize
// + ", numSplitFiles: " + numSplitFiles);
// }
//
// return Status.OK_STATUS;
// }
// };
// splitJob.schedule();
//
// createTarFile(tarStream, caseDir.listFiles());
// tarStream.finish();
// zipStream.finish();
// try {
// tarStream.close();
// } catch (IOException ex) {
// // Ignore
// }
// tarStream = null;
//
// try {
// zipStream.close();
// } catch (IOException ex) {
// // Ignore
// }
// zipStream = null;
//
// while (!splitDone.get()) {
// if (splitJob.getState() == Job.RUNNING) {
// try {
// System.out.println("splitJob.join()");
// splitJob.join();
// } catch (InterruptedException e) {
// statusHandler.handle(Priority.INFO,
// e.getLocalizedMessage(), e);
// }
// } else {
// try {
// private void compressAndSplitCase() {
// ArchiveOutputStream tarStream = null;
// GZIPOutputStream zipStream = null;
// try {
// Pipe pipe = Pipe.open();
// OutputStream poStream = Channels.newOutputStream(pipe.sink());
// zipStream = new GZIPOutputStream(poStream);
// ArchiveStreamFactory factory = new ArchiveStreamFactory();
//
// tarStream = factory.createArchiveOutputStream(
// ArchiveStreamFactory.TAR, zipStream);
//
// if (tarStream instanceof TarArchiveOutputStream) {
// ((TarArchiveOutputStream) tarStream)
// .setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
// }
//
// final InputStream piStream = Channels.newInputStream(pipe
// .source());
// splitDone.set(false);
//
// Job splitJob = new Job("Split") {
//
// @Override
// protected IStatus run(IProgressMonitor monitor) {
// OutputStream splitStream = null;
// long totSize = 0;
// try {
// byte[] buffer = new byte[12 * 1024];
//
// int bufCnt = 0;
// long splitCnt = 0L;
// while ((bufCnt = piStream.read(buffer)) != -1) {
// totSize += bufCnt;
// if (splitStream == null) {
// splitStream = openSplitFile(++numSplitFiles);
// }
// long fileSize = splitCnt + bufCnt;
// if (fileSize < splitSize) {
// splitStream.write(buffer, 0, bufCnt);
// splitCnt = fileSize;
// } else if (fileSize == splitSize) {
// splitStream.write(buffer, 0, bufCnt);
// splitStream.close();
// splitStream = null;
// splitCnt = 0L;
// } else {
// int cnt = (int) (splitSize - splitCnt);
// splitStream.write(buffer, 0, cnt);
// splitStream.close();
// splitStream = openSplitFile(++numSplitFiles);
// int remainder = bufCnt - cnt;
// splitStream.write(buffer, cnt, remainder);
// splitCnt = remainder;
// }
// }
// } catch (IOException e) {
// statusHandler.handle(Priority.PROBLEM,
// e.getLocalizedMessage(), e);
// } finally {
// if (splitStream != null) {
// try {
// splitStream.close();
// } catch (IOException e) {
// // Ignore
// }
// }
// splitDone.set(true);
// System.out.println("totalSize: " + totSize
// + ", splitSize: " + splitSize
// + ", numSplitFiles: " + numSplitFiles);
// }
//
// return Status.OK_STATUS;
// }
// };
// splitJob.schedule();
//
// createTarFile(tarStream, caseDir.listFiles());
// tarStream.finish();
// zipStream.finish();
// try {
// tarStream.close();
// } catch (IOException ex) {
// // Ignore
// }
// tarStream = null;
//
// try {
// zipStream.close();
// } catch (IOException ex) {
// // Ignore
// }
// zipStream = null;
//
// while (!splitDone.get()) {
// if (splitJob.getState() == Job.RUNNING) {
// try {
// System.out.println("splitJob.join()");
// splitJob.join();
// } catch (InterruptedException e) {
// statusHandler.handle(Priority.INFO,
// e.getLocalizedMessage(), e);
// }
// } else {
// try {
// Thread.sleep(200L);
// } catch (InterruptedException e) {
// statusHandler.handle(Priority.INFO,
// e.getLocalizedMessage(), e);
// }
// }
// }
// } catch (IOException e) {
// statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
// e);
// } catch (ArchiveException e1) {
// statusHandler.handle(Priority.PROBLEM,
// e1.getLocalizedMessage(), e1);
// } finally {
// if (tarStream != null) {
// try {
// tarStream.close();
// } catch (IOException e) {
// // Ignore
// }
// }
//
// if (zipStream != null) {
// try {
// zipStream.close();
// } catch (IOException e) {
// // Ignore
// }
// }
// }
// setProgressBar(100, SWT.NORMAL);
// deleteCaseDir();
// String message = caseDir.getName() + "split into " + numSplitFiles
// + " file(s).";
// setStateLbl(message, null);
// }
// Thread.sleep(200L);
// } catch (InterruptedException e) {
// statusHandler.handle(Priority.INFO,
// e.getLocalizedMessage(), e);
// }
// }
// }
// } catch (IOException e) {
// statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
// e);
// } catch (ArchiveException e1) {
// statusHandler.handle(Priority.PROBLEM,
// e1.getLocalizedMessage(), e1);
// } finally {
// if (tarStream != null) {
// try {
// tarStream.close();
// } catch (IOException e) {
// // Ignore
// }
// }
//
// if (zipStream != null) {
// try {
// zipStream.close();
// } catch (IOException e) {
// // Ignore
// }
// }
// }
// setProgressBar(100, SWT.NORMAL);
// deleteCaseDir();
// String message = caseDir.getName() + "split into " + numSplitFiles
// + " file(s).";
// setStateLbl(message, null);
// }
}
/** Task to update the lock plugin's last execute time. */

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Ccfp Plug-in
Bundle-SymbolicName: com.raytheon.uf.viz.ccfp;singleton:=true
Bundle-Version: 1.14.0
Bundle-Version: 1.14.0.qualifier
Bundle-Vendor: RAYTHEON
Require-Bundle: com.raytheon.uf.viz.core
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

View file

@ -19,9 +19,10 @@
**/
package com.raytheon.uf.viz.collaboration.comm.identity.event;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.packet.Presence;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* Event fired when the roster has changed
*
@ -33,6 +34,7 @@ import org.jivesoftware.smack.packet.Presence;
* ------------ ---------- ----------- --------------------------
* Apr 06, 2012 jkorman Initial creation.
* Feb 24, 2014 2632 mpduff Added getPresence, changed getItem to getEntry.
* Apr 24, 2014 3070 bclement getEntry() returns UserId
*
* </pre>
*
@ -54,7 +56,7 @@ public interface IRosterChangeEvent {
*
* @return The changed entry
*/
RosterEntry getEntry();
UserId getEntry();
/**
* Get the Presence object.

View file

@ -50,7 +50,8 @@ import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 04, 2014 2785 mpduff Initial creation
* Apr 14, 2014 2903 bclement moved from session subpackage to account
* Apr 14, 2014 2903 bclement moved from session subpackage to account
* Apr 24, 2014 3070 bclement RosterChangeEvent changes, adds back even if blocked
*
* </pre>
*
@ -119,10 +120,8 @@ public class SubscriptionPacketListener implements PacketListener,
* @param fromID
*/
private void handleSubscribed(UserId fromID) {
ContactsManager cm = sessionManager.getContactsManager();
RosterEntry entry = cm.getRosterEntry(fromID);
IRosterChangeEvent event = new RosterChangeEvent(RosterChangeType.ADD,
entry);
fromID);
sessionManager.postEvent(event);
}
@ -132,13 +131,8 @@ public class SubscriptionPacketListener implements PacketListener,
* @param fromID
*/
private void handleUnsubscribed(UserId fromID) {
ContactsManager cm = sessionManager.getContactsManager();
RosterEntry entry = cm.getRosterEntry(fromID);
if (entry == null) {
return;
}
IRosterChangeEvent event = new RosterChangeEvent(
RosterChangeType.DELETE, entry);
RosterChangeType.DELETE, fromID);
sessionManager.postEvent(event);
}
@ -149,28 +143,29 @@ public class SubscriptionPacketListener implements PacketListener,
*/
private void handleSubResponse(UserId fromId, SubscriptionResponse response) {
Presence.Type subscribedType;
ContactsManager cm = sessionManager.getContactsManager();
boolean addToRoster = false;
if (response.isAccepted()) {
subscribedType = Presence.Type.subscribed;
RosterEntry entry = cm.getRosterEntry(fromId);
if (entry == null) {
addToRoster = true;
}
} else {
subscribedType = Presence.Type.unsubscribed;
}
Presence presence = new Presence(subscribedType);
try {
sendPresence(fromId, presence);
if (addToRoster) {
if (response.addToGroup()) {
cm.addToGroup(response.getGroup(), fromId);
} else {
cm.addToRoster(fromId);
if (response.isAccepted()) {
/* add them back */
ContactsManager cm = sessionManager.getContactsManager();
RosterEntry entry = cm.getRosterEntry(fromId);
if (entry != null && ContactsManager.isBlocked(entry)) {
/* in roster, but blocked */
cm.sendContactRequest(fromId);
}
if (response.addToGroup()) {
/*
* if contact is not in roster, this will also send them a
* contact request, otherwise it just add them to the group
*/
cm.addToGroup(response.getGroup(), fromId);
}
}
} catch (CollaborationException e) {
log.error("Unable to send presence", e);

View file

@ -19,11 +19,11 @@
**/
package com.raytheon.uf.viz.collaboration.comm.provider.event;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.packet.Presence;
import com.raytheon.uf.viz.collaboration.comm.identity.event.IRosterChangeEvent;
import com.raytheon.uf.viz.collaboration.comm.identity.event.RosterChangeType;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
/**
* Event posted when a roster entry needs to be updated
@ -36,6 +36,7 @@ import com.raytheon.uf.viz.collaboration.comm.identity.event.RosterChangeType;
* ------------ ---------- ----------- --------------------------
* Apr 11, 2012 jkorman Initial creation
* Feb 24, 2014 2632 mpduff Added getPresence, changed getItem to getEntry.
* Apr 24, 2014 3070 bclement getEntry() returns UserId
*
* </pre>
*
@ -47,7 +48,7 @@ public class RosterChangeEvent implements IRosterChangeEvent {
private final RosterChangeType type;
private final RosterEntry entry;
private final UserId entry;
/** The presence object */
private Presence presence;
@ -60,7 +61,7 @@ public class RosterChangeEvent implements IRosterChangeEvent {
* @param entry
* The changed entry.
*/
public RosterChangeEvent(RosterChangeType type, RosterEntry entry) {
public RosterChangeEvent(RosterChangeType type, UserId entry) {
this.type = type;
this.entry = entry;
}
@ -76,7 +77,7 @@ public class RosterChangeEvent implements IRosterChangeEvent {
* @param presence
* The presence object
*/
public RosterChangeEvent(RosterChangeType type, RosterEntry entry,
public RosterChangeEvent(RosterChangeType type, UserId entry,
Presence presence) {
this.type = type;
this.entry = entry;
@ -102,7 +103,7 @@ public class RosterChangeEvent implements IRosterChangeEvent {
* @see com.raytheon.uf.viz.collaboration.comm.identity.event.IRosterChangeEvent#getEntry()
*/
@Override
public RosterEntry getEntry() {
public UserId getEntry() {
return entry;
}

View file

@ -26,7 +26,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.packet.Presence;
@ -48,6 +47,8 @@ import com.raytheon.uf.viz.collaboration.comm.provider.event.RosterChangeEvent;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 22, 2014 2822 bclement Initial creation
* Apr 24, 2014 3070 bclement removed roster,
* RosterChangedEvent sends UserId not RosterEntry
*
* </pre>
*
@ -58,17 +59,14 @@ public class ContactsListener implements RosterListener {
private final ContactsManager manager;
private final Roster roster;
private final Map<String, List<ResourceInfo>> contactResources = new HashMap<String, List<ResourceInfo>>();
/**
* @param manager
* @param roster
*/
public ContactsListener(ContactsManager manager, Roster roster) {
public ContactsListener(ContactsManager manager) {
this.manager = manager;
this.roster = roster;
}
/*
@ -92,9 +90,11 @@ public class ContactsListener implements RosterListener {
}
}
RosterEntry entry = manager.getRosterEntry(u);
post(entry);
if (entry != null) {
post(entry);
}
IRosterChangeEvent event = new RosterChangeEvent(
RosterChangeType.PRESENCE, entry, presence);
RosterChangeType.PRESENCE, u, presence);
post(event);
}
}
@ -197,11 +197,13 @@ public class ContactsListener implements RosterListener {
*/
private void send(Collection<String> addresses, RosterChangeType type) {
for (String addy : addresses) {
RosterEntry entry = roster.getEntry(addy);
if (entry != null) {
IRosterChangeEvent event = new RosterChangeEvent(type, entry);
post(event);
}
UserId entry = IDConverter.convertFrom(addy);
/*
* RosterChangeEvents can't use RosterEntry objects because DELETE
* events happen after the entry is removed from the server roster
*/
IRosterChangeEvent event = new RosterChangeEvent(type, entry);
post(event);
}
}

View file

@ -47,6 +47,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.common.util.collections.UpdatingSet;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager;
import com.raytheon.uf.viz.collaboration.comm.provider.Tools;
import com.raytheon.uf.viz.collaboration.comm.provider.connection.CollaborationConnection;
@ -75,6 +76,9 @@ import com.raytheon.uf.viz.collaboration.comm.provider.connection.CollaborationC
* Apr 16, 2014 2981 bclement fixed NPE when cached shared group deleted on server
* Apr 23, 2014 2822 bclement moved roster listener to ContactsListener,
* added getSharedDisplayEnabledResource()
* Apr 24, 2014 3070 bclement added checks for empty groups, added isContact(),
* added sendContactRequest()
* fixed contact request logic in addToGroup()
*
* </pre>
*
@ -134,7 +138,7 @@ public class ContactsManager {
localAliases = UserIdWrapper.readAliasMap();
this.xmpp = xmpp;
Roster roster = xmpp.getRoster();
this.contactsListener = new ContactsListener(this, roster);
this.contactsListener = new ContactsListener(this);
roster.addRosterListener(this.contactsListener);
}
@ -154,7 +158,7 @@ public class ContactsManager {
* group will be null if it has been removed from server after
* cached in shared groups.
*/
if (rg != null) {
if (rg != null && !rg.getEntries().isEmpty()) {
rval.add(new SharedGroup(rg));
}
}
@ -176,7 +180,8 @@ public class ContactsManager {
} else {
rval = new ArrayList<RosterGroup>(groups.size());
for (RosterGroup group : groups) {
if (!shared.contains(group.getName())) {
if (!shared.contains(group.getName())
&& !group.getEntries().isEmpty()) {
rval.add(group);
}
}
@ -197,24 +202,14 @@ public class ContactsManager {
if (group == null) {
group = createGroup(groupName);
}
String id = user.getNormalizedId();
RosterEntry entry = group.getEntry(id);
if (entry != null) {
if (isBlocked(entry)) {
// entry is in roster, but we aren't subscribed. Request a
// subscription.
try {
connection.getAccountManager().sendPresence(user,
new Presence(Type.subscribe));
} catch (CollaborationException e) {
statusHandler.error("Problem subscribing to user", e);
}
} else {
statusHandler
.debug("Attempted to add user to group it was already in: "
+ id + " in " + groupName);
RosterEntry entry = getRosterEntry(user);
if (entry != null && isBlocked(entry)) {
/* entry is in roster, but we are blocked */
try {
sendContactRequest(user);
} catch (CollaborationException e) {
statusHandler.error("Problem subscribing to user", e);
}
return;
}
try {
addToGroup(group, user);
@ -223,8 +218,8 @@ public class ContactsManager {
}
} catch (XMPPException e) {
String msg = getGroupModInfo(e);
statusHandler.error("Problem adding user to group: " + id + " to "
+ group.getName() + ". " + msg, e);
statusHandler.error("Problem adding user to group: " + user
+ " to " + group.getName() + ". " + msg, e);
}
}
@ -667,6 +662,7 @@ public class ContactsManager {
}
/**
*
* @param entry
* @return true if we are blocked from seeing updates from user in entry
*/
@ -697,6 +693,31 @@ public class ContactsManager {
return rval;
}
/**
*
* @param entry
* @return true if we can see updates from user in entry
*/
public static boolean isContact(RosterEntry entry) {
ItemType type = entry.getType();
return type != null
&& (type.equals(ItemType.both) || type.equals(ItemType.to));
}
/**
* @see #isContact(RosterEntry)
* @param id
* @return true if we can see updates from user
*/
public boolean isContact(UserId id) {
RosterEntry entry = getRosterEntry(id);
boolean rval = false;
if (entry != null) {
rval = isContact(entry);
}
return rval;
}
/**
* @see ContactsListener#getSharedDisplayEnabledResource(UserId)
* @param user
@ -706,6 +727,17 @@ public class ContactsManager {
return contactsListener.getSharedDisplayEnabledResource(user);
}
/**
* Send a contact request to user
*
* @param user
* @throws CollaborationException
*/
public void sendContactRequest(UserId user) throws CollaborationException {
IAccountManager manager = connection.getAccountManager();
manager.sendPresence(user, new Presence(Type.subscribe));
}
/**
* Listener interface for group update events
*/

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 B

View file

@ -52,6 +52,7 @@ import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
* Feb 13, 2014 2751 bclement made generic for IUsers
* Feb 13, 2014 2751 njensen Extracted getImageName() to allow overrides
* Feb 17, 2014 2751 bclement moved block image logic to roster specific code
* Apr 24, 2014 3070 bclement added pending contact icon
*
* </pre>
*
@ -103,6 +104,14 @@ public abstract class AbstractUserLabelProvider<T extends IUser> extends
return null;
}
String key = getImageName(user);
if (element instanceof RosterEntry) {
RosterEntry entry = (RosterEntry) element;
ItemStatus status = entry.getStatus();
if (status != null) {
/* status always indicates pending */
key = "pending";
}
}
if (imageMap.get(key) == null && !key.equals("")) {
imageMap.put(key, CollaborationUtils.getNodeImage(key));
@ -144,7 +153,8 @@ public abstract class AbstractUserLabelProvider<T extends IUser> extends
}
ItemStatus status = entry.getStatus();
if (status != null) {
text.append(status).append(" pending\n");
/* status always indicates pending */
text.append("Contact request pending\n");
}
}
// delete trailing newline

View file

@ -42,6 +42,7 @@ import com.raytheon.uf.viz.core.localization.HierarchicalPreferenceStore;
* Mar 1, 2012 rferrel Initial creation
* Feb 19, 2014 2631 mpduff Changed to use the HierarchicalPreferenceStore.
* Feb 20, 2014 2631 mpduff Need to set defaults here since we changed to use the HierarchicalPreferenceStore
* Apr 24, 2014 3070 bclement added default groupname to preference defaults
*
* </pre>
*
@ -126,6 +127,8 @@ public class Activator extends AbstractUIPlugin {
prefs.setDefault(CollabPrefConstants.DEFAULT_HANDLE,
CollabPrefConstants.HandleOption.USERNAME.name());
prefs.setDefault(CollabPrefConstants.CUSTOM_HANDLE, "");
prefs.setDefault(CollabPrefConstants.DEFAULT_GROUPNAME_PREF,
"Contacts");
}
return prefs;
}

View file

@ -19,6 +19,9 @@
**/
package com.raytheon.uf.viz.collaboration.ui;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
@ -71,6 +74,7 @@ import com.raytheon.viz.ui.views.CaveWorkbenchPageManager;
* Mar 06, 2014 2848 bclement moved SharedDisplaySessionMgr.joinSession call to InviteDialog
* Apr 08, 2014 2785 mpduff removed preference listener
* Apr 11, 2014 2903 bclement added disconnect handler
* Apr 24, 2014 2955 bclement ignore duplicate session invites
*
* </pre>
*
@ -91,6 +95,8 @@ public class ConnectionSubscriber {
private final DisconnectHandler disconnect = new DisconnectHandler();
private final Set<String> pendingInviteDialogs = new HashSet<String>();
private ConnectionSubscriber() {
}
@ -178,16 +184,53 @@ public class ConnectionSubscriber {
@Subscribe
public void handleInvitationEvent(final IVenueInvitationEvent event) {
final String roomId = event.getRoomId().getFQName();
VizApp.runAsync(new Runnable() {
@Override
public void run() {
Shell shell = new Shell(Display.getCurrent());
InviteDialog inviteBox = new InviteDialog(shell, event);
if (!(Boolean) inviteBox.open()) {
return;
if (!invitePending(roomId)) {
try {
Shell shell = new Shell(Display.getCurrent());
InviteDialog inviteBox = new InviteDialog(shell, event);
if ((Boolean) inviteBox.open()) {
/* user accepted invite */
openSession(inviteBox);
}
} finally {
synchronized (pendingInviteDialogs) {
pendingInviteDialogs.remove(roomId);
}
}
} else {
statusHandler.debug("Ignoring duplicate session invite: "
+ roomId);
}
}
/**
* @param roomId
* @return true if there is already an invitation pending for this
* room
*/
private boolean invitePending(String roomId) {
synchronized (pendingInviteDialogs) {
boolean pending = pendingInviteDialogs.contains(roomId);
if (!pending) {
/* immediately set to pending to ignore dup invites */
pendingInviteDialogs.add(roomId);
}
return pending;
}
}
/**
* Open session view after invite has been accepted
*
* @param inviteBox
*/
private void openSession(InviteDialog inviteBox) {
try {
IVenueSession session = inviteBox.getSession();
if (inviteBox.isSharedDisplay()) {

View file

@ -25,11 +25,12 @@ import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
@ -48,6 +49,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* ------------ ---------- ----------- --------------------------
* Jun 27, 2012 bsteffen Initial creation
* Jan 24, 2014 2701 bclement removed local groups
* Apr 23, 2014 3040 lvenable Cleaned up dialog code/layout. Added check for group name.
*
* </pre>
*
@ -56,72 +58,122 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
*/
public class CreateGroupDialog extends CaveSWTDialog {
/** Name text field. */
private Text nameText;
/** New group name. */
private String newGroup = null;
/**
* Constructor.
*
* @param parentShell
* Parent shell.
*/
public CreateGroupDialog(Shell parentShell) {
super(parentShell, SWT.DIALOG_TRIM);
setText("Create Group");
}
@Override
protected Layout constructShellLayout() {
GridLayout mainLayout = new GridLayout(1, false);
return mainLayout;
}
@Override
protected Object constructShellLayoutData() {
return new GridData(SWT.FILL, SWT.DEFAULT, true, false);
}
@Override
protected void initializeComponents(Shell shell) {
Composite entryComp = new Composite(shell, SWT.NONE);
RowLayout layout = new RowLayout(SWT.HORIZONTAL);
layout.center = true;
entryComp.setLayout(layout);
entryComp.setLayout(new GridLayout(2, false));
entryComp
.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false));
new Label(entryComp, SWT.NONE).setText("Group Name: ");
nameText = new Text(entryComp, SWT.BORDER);
nameText.setLayoutData(new RowData(100, SWT.DEFAULT));
nameText.setLayoutData(new GridData(150, SWT.DEFAULT));
nameText.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
finish();
handleOkAction();
}
}
});
/*
* Action buttons
*/
Composite buttonComp = new Composite(shell, SWT.NONE);
buttonComp.setLayoutData(new GridData(SWT.RIGHT, SWT.NONE, false,
false, 1, 1));
layout = new RowLayout(SWT.HORIZONTAL);
layout.pack = false;
buttonComp.setLayout(layout);
buttonComp.setLayout(new GridLayout(2, false));
buttonComp.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true,
false));
GridData gd = new GridData(SWT.RIGHT, SWT.DEFAULT, true, false);
gd.widthHint = 75;
Button okButton = new Button(buttonComp, SWT.PUSH);
okButton.setText("OK");
okButton.setLayoutData(gd);
okButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
finish();
handleOkAction();
}
});
gd = new GridData(SWT.LEFT, SWT.DEFAULT, true, false);
gd.widthHint = 75;
Button cancelButton = new Button(buttonComp, SWT.PUSH);
cancelButton.setText("Cancel");
cancelButton.setLayoutData(gd);
cancelButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
close();
}
});
}
private void finish() {
/**
* Handle the OK action.
*/
private void handleOkAction() {
if (validGroupName() == false) {
return;
}
newGroup = nameText.getText();
CollaborationConnection.getConnection().getContactsManager()
.createGroup(newGroup);
close();
}
/**
* Check if there was something entered in the text field.
*
* @return True if there is text in the group name text field.
*/
private boolean validGroupName() {
if (nameText.getText().length() == 0) {
MessageBox mb = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
mb.setText("Invalid Name");
mb.setMessage("You have not entered a group name. Please enter one.");
mb.open();
return false;
}
return true;
}
/**
* Get the group name.
*
* @return The group name.
*/
public String getNewGroup() {
return newGroup;
}
}

View file

@ -34,6 +34,7 @@ import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Shell;
import org.jivesoftware.smack.RosterGroup;
@ -55,6 +56,9 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* Feb 13, 2014 2755 bclement roster addition now done in account manager, user input passed back
* Apr 07, 2014 2785 mpduff Changed to implement CaveSWTDialog
* Fix loading of groups
* Apr 23, 2014 3040 lvenable Cleaned up dialog code/layout. Allow the cancellation of the create
* group dialog without closing this dialog. Added capability to resize
* the group combo box if the names get too long.
*
* </pre>
*
@ -62,12 +66,19 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* @version 1.0
*/
public class SubRequestDialog extends CaveSWTDialog {
private final String NEW_GROUP = "New Group...";
/** User ID. */
private final String userid;
/** Combo listing all of the available groups. */
private Combo groupCbo;
/** Create group dialog. */
private CreateGroupDialog createGroupDlg;
/** Allow button. */
private Button allowBtn;
/**
* Constructor
*
@ -80,35 +91,70 @@ public class SubRequestDialog extends CaveSWTDialog {
setText("Contact Request");
}
@Override
protected Layout constructShellLayout() {
GridLayout mainLayout = new GridLayout(1, false);
return mainLayout;
}
@Override
protected Object constructShellLayoutData() {
return new GridData(SWT.FILL, SWT.DEFAULT, true, false);
}
@Override
protected void initializeComponents(Shell shell) {
GridLayout gl = new GridLayout(1, false);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
Composite mainComp = new Composite(shell, SWT.NONE);
GridLayout gl = new GridLayout(1, false);
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
mainComp.setLayout(gl);
mainComp.setLayoutData(gd);
/*
* Top Label
*/
gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
Label msgLbl = new Label(mainComp, SWT.NONE);
msgLbl.setText(userid + " wants to add you to their contacts list.");
msgLbl.setText(userid + " wants to add you to a contacts list:");
msgLbl.setLayoutData(gd);
gl = new GridLayout(2, false);
gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
/*
* Group composite and controls.
*/
Composite groupComp = new Composite(mainComp, SWT.NONE);
gl = new GridLayout(3, false);
gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
groupComp.setLayout(gl);
groupComp.setLayoutData(gd);
gd = new GridData(SWT.RIGHT, SWT.DEFAULT, true, false);
gd = new GridData(SWT.DEFAULT, SWT.CENTER, false, true);
Label groupLbl = new Label(groupComp, SWT.NONE);
groupLbl.setText("Group: ");
groupLbl.setLayoutData(gd);
gd = new GridData(SWT.FILL, SWT.CENTER, true, true);
gd.minimumWidth = 130;
groupCbo = new Combo(groupComp, SWT.DROP_DOWN | SWT.READ_ONLY);
groupCbo.setItems(getGroupNames());
groupCbo.select(0);
groupCbo.setLayout(gl);
groupCbo.setLayoutData(gd);
gd = new GridData();
gd.horizontalIndent = 5;
Button newGroup = new Button(groupComp, SWT.PUSH);
newGroup.setText("New Group...");
newGroup.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleNewGroupAction();
}
});
addSeparator(mainComp);
/*
* Action buttons.
*/
gl = new GridLayout(2, false);
gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false);
Composite btnComp = new Composite(mainComp, SWT.NONE);
@ -118,16 +164,21 @@ public class SubRequestDialog extends CaveSWTDialog {
int btnWidth = 75;
gd = new GridData(btnWidth, SWT.DEFAULT);
Button allowBtn = new Button(btnComp, SWT.PUSH);
allowBtn = new Button(btnComp, SWT.PUSH);
allowBtn.setText("Allow");
allowBtn.setLayoutData(gd);
allowBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
action(true);
handleAllowDenyAction(true);
}
});
// Disable the allow button if there are no items in the combo box.
if (groupCbo.getItemCount() == 0) {
allowBtn.setEnabled(false);
}
gd = new GridData(btnWidth, SWT.DEFAULT);
Button denyBtn = new Button(btnComp, SWT.PUSH);
denyBtn.setText("Deny");
@ -135,12 +186,14 @@ public class SubRequestDialog extends CaveSWTDialog {
denyBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
action(false);
handleAllowDenyAction(false);
}
});
}
/**
* Get the list of group names.
*
* @return list of existing group names
*/
private String[] getGroupNames() {
@ -157,28 +210,45 @@ public class SubRequestDialog extends CaveSWTDialog {
}
Collections.sort(groupList);
groupList.add(0, NEW_GROUP);
return groupList.toArray(new String[groupList.size()]);
}
/**
* Action handler.
*
* @param approved
* true if request approved, false if denied
* Handle adding a new group.
*/
private void action(boolean approved) {
if (approved) {
if (groupCbo.getSelectionIndex() == 0) {
// new group
CreateGroupDialog dialog = new CreateGroupDialog(Display
.getCurrent().getActiveShell());
dialog.open();
String group = dialog.getNewGroup();
setReturnValue(group);
} else {
private void handleNewGroupAction() {
if (createGroupDlg == null || createGroupDlg.isDisposed()) {
createGroupDlg = new CreateGroupDialog(Display.getCurrent()
.getActiveShell());
createGroupDlg.open();
String groupName = createGroupDlg.getNewGroup();
// If the group name is not null, add it to the combo and then
// select it.
if (groupName != null) {
allowBtn.setEnabled(true);
groupCbo.add(groupName, 0);
groupCbo.select(0);
shell.pack();
}
} else {
createGroupDlg.bringToTop();
}
}
/**
* Handle Allow/Deny action.
*
* @param allowRequest
* True if request allowed, false if denied
*/
private void handleAllowDenyAction(boolean allowRequest) {
if (allowRequest) {
if (groupCbo.getItemCount() != 0) {
setReturnValue(groupCbo.getItem(groupCbo.getSelectionIndex()));
} else {
}
} else {
setReturnValue(null);
@ -186,4 +256,19 @@ public class SubRequestDialog extends CaveSWTDialog {
close();
}
/**
* Add a line separator to the given composite.
*
* @param parentComp
* Parent composite.
*/
private void addSeparator(Composite parentComp) {
GridLayout gl = (GridLayout) parentComp.getLayout();
GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
gd.horizontalSpan = gl.numColumns;
Label sepLbl = new Label(parentComp, SWT.SEPARATOR | SWT.HORIZONTAL);
sepLbl.setLayoutData(gd);
}
}

View file

@ -32,7 +32,6 @@ import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import com.raytheon.uf.viz.collaboration.comm.provider.connection.CollaborationConnection;
import com.raytheon.uf.viz.collaboration.comm.provider.user.ContactsManager;
import com.raytheon.uf.viz.collaboration.comm.provider.user.SharedGroup;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
import com.raytheon.uf.viz.collaboration.ui.data.CollaborationGroupContainer;
@ -51,6 +50,7 @@ import com.raytheon.uf.viz.collaboration.ui.data.SessionGroupContainer;
* Dec 6, 2013 2561 bclement removed ECF
* Jan 24, 2014 2701 bclement removed local groups, added shared groups
* Jan 27, 2014 2700 bclement added support roster entries
* Apr 24, 2014 3070 bclement removed check for hasInteraction() from group entries
*
* </pre>
*
@ -141,8 +141,7 @@ public class UsersTreeContentProvider implements ITreeContentProvider {
UserId localUser = connection.getUser();
for (RosterEntry entry : entries) {
String user = entry.getUser();
if (!localUser.isSameUser(user)
&& ContactsManager.hasInteraction(entry)) {
if (!localUser.isSameUser(user)) {
result.add(entry);
}
}

View file

@ -51,6 +51,7 @@ import com.raytheon.uf.viz.core.icon.IconUtil;
* Jul 3, 2012 bsteffen Initial creation
* Dec 20, 2013 2563 bclement added support for ungrouped roster entries
* Jan 24, 2014 2701 bclement removed local groups
* Apr 24, 2014 3070 bclement RosterChangeEvent changes
*
* </pre>
*
@ -114,8 +115,9 @@ public class AddToGroupAction extends Action {
if (entry != null) {
// the entry wasn't in a group, so the entire tree needs to be
// refreshed
UserId entryId = IDConverter.convertFrom(entry);
connection.postEvent(new RosterChangeEvent(RosterChangeType.MODIFY,
entry));
entryId));
}
}

View file

@ -26,6 +26,8 @@ import com.raytheon.uf.viz.collaboration.comm.identity.event.RosterChangeType;
import com.raytheon.uf.viz.collaboration.comm.provider.connection.CollaborationConnection;
import com.raytheon.uf.viz.collaboration.comm.provider.event.RosterChangeEvent;
import com.raytheon.uf.viz.collaboration.comm.provider.user.ContactsManager;
import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
import com.raytheon.uf.viz.collaboration.ui.Activator;
import com.raytheon.uf.viz.core.icon.IconUtil;
@ -40,6 +42,7 @@ import com.raytheon.uf.viz.core.icon.IconUtil;
* ------------ ---------- ----------- --------------------------
* Dec 20, 2013 2563 bclement Initial creation
* Mar 05, 2014 2837 bclement changed wording from Roster to Contacts, added image
* Apr 24, 2014 3070 bclement RosterChangeEvent changes
*
* </pre>
*
@ -64,7 +67,8 @@ public class RemoveFromRosterAction extends Action {
ContactsManager manager = connection
.getContactsManager();
manager.removeFromRoster(entry);
UserId entryId = IDConverter.convertFrom(entry);
connection.postEvent(new RosterChangeEvent(RosterChangeType.DELETE,
entry));
entryId));
}
}

View file

@ -21,12 +21,10 @@ package com.raytheon.uf.viz.collaboration.ui.actions;
import org.eclipse.jface.action.Action;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Presence.Type;
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
import com.raytheon.uf.viz.collaboration.comm.identity.IAccountManager;
import com.raytheon.uf.viz.collaboration.comm.provider.connection.CollaborationConnection;
import com.raytheon.uf.viz.collaboration.comm.provider.user.ContactsManager;
import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
import com.raytheon.uf.viz.collaboration.ui.Activator;
import com.raytheon.uf.viz.core.icon.IconUtil;
@ -42,6 +40,7 @@ import com.raytheon.uf.viz.core.icon.IconUtil;
* ------------ ---------- ----------- --------------------------
* Jan 24, 2014 bclement Initial creation
* Mar 05, 2014 2837 bclement added image
* Apr 24, 2014 3070 bclement moved contact request logic to contacts manager
*
* </pre>
*
@ -71,10 +70,9 @@ public class SendSubReqAction extends Action {
@Override
public void run() {
CollaborationConnection connection = CollaborationConnection.getConnection();
IAccountManager manager = connection.getAccountManager();
ContactsManager manager = connection.getContactsManager();
try {
manager.sendPresence(IDConverter.convertFrom(entry), new Presence(
Type.subscribe));
manager.sendContactRequest(IDConverter.convertFrom(entry));
} catch (CollaborationException e) {
Activator.statusHandler.error(
"Unable to send subscription request", e);

View file

@ -34,6 +34,7 @@ package com.raytheon.uf.viz.collaboration.ui.prefs;
* Feb 3, 2014 2699 bclement added handle preferences
* Feb 18, 2014 2631 mpduff Add constants for room change events.
* Mar 24, 2014 2936 mpduff Remove INCLUDE_NWS_FEED_FIELD_EDITOR_ID.
* Apr 24, 2014 3070 bclement added DEFAULT_GROUPNAME_PREF
*
* </pre>
*
@ -62,6 +63,8 @@ public class CollabPrefConstants {
public static final String CUSTOM_HANDLE = "customHandle";
public static final String DEFAULT_GROUPNAME_PREF = "defaultGroupName";
public static final int AWAY_TIMEOUT_DEFAULT = 10; // ten minutes
/** Enable join events field editor id */

View file

@ -19,7 +19,6 @@
**/
package com.raytheon.uf.viz.collaboration.ui.prefs;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@ -27,7 +26,6 @@ import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.XMPPException;
import com.raytheon.uf.common.status.IUFStatusHandler;
@ -36,6 +34,7 @@ import com.raytheon.uf.viz.collaboration.comm.identity.roster.ISubscriptionRespo
import com.raytheon.uf.viz.collaboration.comm.identity.roster.SubscriptionResponse;
import com.raytheon.uf.viz.collaboration.comm.provider.account.ISubscriptionRequestCompleteAction;
import com.raytheon.uf.viz.collaboration.comm.provider.connection.CollaborationConnection;
import com.raytheon.uf.viz.collaboration.comm.provider.user.ContactsManager;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserSearch;
import com.raytheon.uf.viz.collaboration.ui.Activator;
@ -52,6 +51,8 @@ import com.raytheon.uf.viz.core.VizApp;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 03, 2014 2785 mpduff Initial creation
* Apr 24, 2014 3070 bclement added default group for auto accept
* fixed auto accept known contacts
*
* </pre>
*
@ -88,15 +89,16 @@ public class SubscriptionResponderImpl implements ISubscriptionResponder {
.getPreferenceStore();
if (prefs.getBoolean(CollabPrefConstants.AUTO_ACCEPT_SUBSCRIBE)) {
rval.setAccepted(true);
rval.setGroup(prefs
.getString(CollabPrefConstants.DEFAULT_GROUPNAME_PREF));
action.executeSubscriptionRequestComplete(fromID, rval);
return;
}
CollaborationConnection conn = CollaborationConnection.getConnection();
Collection<RosterGroup> groups = conn.getContactsManager().getGroups(
fromID);
if (!groups.isEmpty()) {
// we already have this user in a group in our roster
ContactsManager cm = conn.getContactsManager();
if (cm.isContact(fromID)) {
/* we already have a subscription to this user */
rval.setAccepted(true);
action.executeSubscriptionRequestComplete(fromID, rval);
} else {

View file

@ -44,7 +44,10 @@ import com.raytheon.uf.viz.core.exception.VizException;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Dec 16, 2011 mschenke Initial creation
* Dec 16, 2011 mschenke Initial creation
* Feb 27, 2013 #1532 bsteffen Delete uf.common.colormap.image
* Nov 11, 2013 #2492 mschenke Added getDataUnti to IColormappedImage
* Apr 15, 2014 #3016 randerso Fix null pointer during construction
*
* </pre>
*
@ -107,7 +110,9 @@ public class ColormappedImage implements IColormappedImage,
*/
@Override
public void dispose() {
image.dispose();
if (image != null) {
image.dispose();
}
}
/*

View file

@ -25,6 +25,7 @@ import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.osgi.framework.internal.core.BundleRepository;
import org.osgi.framework.Bundle;
import org.osgi.framework.wiring.BundleWiring;
import org.reflections.Reflections;
@ -47,6 +48,7 @@ import org.reflections.util.ConfigurationBuilder;
* ------------- -------- ----------- --------------------------
* Oct 21, 2013 2491 bsteffen Initial creation
* Jan 22, 2014 2062 bsteffen Handle bundles with no wiring.
* Apr 16, 2014 3018 njensen Synchronize against BundleRepository
*
* </pre>
*
@ -58,11 +60,26 @@ public class BundleReflections {
private final Reflections reflections;
@SuppressWarnings("restriction")
public BundleReflections(Bundle bundle, Scanner scanner) throws IOException {
ConfigurationBuilder cb = new ConfigurationBuilder();
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
BundleRepository bundleRepo = BundleRepositoryGetter
.getFrameworkBundleRepository(bundle);
if (bundleWiring != null) {
cb.addClassLoader(bundleWiring.getClassLoader());
if (bundleRepo != null) {
synchronized (bundleRepo) {
cb.addClassLoader(bundleWiring.getClassLoader());
}
} else {
/*
* even if we couldn't get the bundle repository to sync
* against, it's probably safe, see BundleRepositoryGetter
* javadoc
*/
cb.addClassLoader(bundleWiring.getClassLoader());
}
cb.addUrls(FileLocator.getBundleFile(bundle).toURI().toURL());
cb.setScanners(scanner);
reflections = cb.build();
@ -87,4 +104,5 @@ public class BundleReflections {
}
return subTypes;
}
}

View file

@ -0,0 +1,104 @@
/**
* 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.core.reflect;
import java.lang.reflect.Field;
import org.eclipse.osgi.framework.internal.core.AbstractBundle;
import org.eclipse.osgi.framework.internal.core.BundleRepository;
import org.eclipse.osgi.framework.internal.core.Framework;
import org.osgi.framework.Bundle;
/**
* Utility class to get the BundleRepository object associated with a Bundle, to
* potentially synchronize against that object.
*
* Specifically if a call to BundleWiring.getClassLoader() is invoked on a
* thread other than main/UI thread, then there is a possible deadlock if the
* application shuts down while the BundleWiring.getClassLoader() call is still
* going. The BundleRepository of the Framework is the primary resource that is
* in contention in this deadlock scenario, due to the BundleRepository being
* used as a synchronization lock both deep in bundleWiring.getClassloader() and
* in Framework shutdown code. The other resource used as a synchronization lock
* and causing the deadlock is the BundleLoader associated with the bundle.
*
* Therefore to avoid this deadlock, if you are going to call
* BundleWiring.getClassLoader() you should attempt to get the BundleRepository
* and synchronize against it. This will ensure the call to getClassLoader() can
* finish and then release synchronization locks of both the BundleRepository
* and BundleLoader.
*
* If we fail to get the BundleRepository due to access restrictions, then you
* should proceed onwards anyway because the odds of the application shutting
* down at the same time as the call to BundleWiring.getClassLoader() is still
* running is low. Even if that occurs, the odds are further reduced that the
* two threads will synchronize against the BundleRepository at the same time
* and deadlock.
*
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 17, 2014 njensen Initial creation
*
* </pre>
*
* @author njensen
* @version 1.0
*/
public class BundleRepositoryGetter {
private BundleRepositoryGetter() {
}
/**
* Attempts to retrieve the BundleRepository associated with the bundle's
* framework. Returns the BundleRepository or null if it could not be
* retrieved.
*
* @param bundle
* the bundle to retrieve the associated BundleRepository for
* @return the BundleRepository or null
*/
@SuppressWarnings("restriction")
protected static BundleRepository getFrameworkBundleRepository(Bundle bundle) {
BundleRepository bundleRepo = null;
if (bundle instanceof AbstractBundle) {
try {
AbstractBundle ab = (AbstractBundle) bundle;
Field bundleRepoField = Framework.getField(Framework.class,
BundleRepository.class, true);
bundleRepo = (BundleRepository) bundleRepoField.get(ab
.getFramework());
} catch (Throwable t) {
// intentionally log to console and proceed anyway
t.printStackTrace();
}
}
return bundleRepo;
}
}

View file

@ -28,6 +28,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.osgi.framework.internal.core.BundleRepository;
import org.osgi.framework.Bundle;
import org.osgi.framework.namespace.BundleNamespace;
import org.osgi.framework.namespace.PackageNamespace;
@ -56,6 +57,7 @@ import com.raytheon.uf.viz.core.Activator;
* Dec 10, 2013 2602 bsteffen Add null checks to detect unloaded
* bundles.
* Feb 03, 2013 2764 bsteffen Use OSGi API to get dependencies.
* Apr 17, 2014 3018 njensen Synchronize against BundleRepository
*
* </pre>
*
@ -95,6 +97,7 @@ public class SubClassLocator implements ISubClassLocator {
* @param base
* @return
*/
@Override
public Collection<Class<?>> locateSubClasses(Class<?> base) {
Map<String, Set<Class<?>>> recursiveClasses = new HashMap<String, Set<Class<?>>>(
bundleLookup.size(), 1.0f);
@ -109,6 +112,7 @@ public class SubClassLocator implements ISubClassLocator {
/**
* Store the cache to disk.
*/
@Override
public void save() {
cache.save();
}
@ -265,10 +269,25 @@ public class SubClassLocator implements ISubClassLocator {
if (bundleWiring == null) {
return Collections.emptySet();
}
ClassLoader loader = bundleWiring.getClassLoader();
BundleRepository bundleRepo = BundleRepositoryGetter
.getFrameworkBundleRepository(bundle);
ClassLoader loader = null;
if (bundleRepo != null) {
synchronized (bundleRepo) {
loader = bundleWiring.getClassLoader();
}
} else {
/*
* even if we couldn't get the bundle repository to sync against,
* it's probably safe, see BundleRepositoryGetter javadoc
*/
loader = bundleWiring.getClassLoader();
}
if (loader == null) {
return Collections.emptySet();
}
HashSet<Class<?>> result = new HashSet<Class<?>>(classNames.size(),
1.0f);
for (String className : classNames) {

View file

@ -41,6 +41,7 @@ import com.raytheon.uf.viz.monitor.ui.dialogs.MonitoringAreaConfigDlg;
* Jan 5, 2010 mpduff Initial creation
* Nov 27, 2012 1351 skorolev Changes for non-blocking dialog.
* Jan 29, 2014 2757 skorolev Changed OK button handler.
* Apr 23, 2014 3054 skorolev Fixed issue with removing a new station from list.
*
* </pre>
*
@ -66,22 +67,16 @@ public class FogMonitoringAreaConfigDlg extends MonitoringAreaConfigDlg {
@Override
protected void handleOkBtnSelection() {
// Check for changes in the data
if (!configManager.getAddedZones().isEmpty()
|| !configManager.getAddedStations().isEmpty()
|| this.timeWindowChanged || this.shipDistanceChanged
|| this.fogChkChanged || this.maZonesRemoved) {
if (dataIsChanged()) {
int choice = showMessage(shell, SWT.OK | SWT.CANCEL,
"Fog Monitor Confirm Changes",
"Want to Update Fog Monitor's Setup files?");
if (choice == SWT.OK) {
// Save the config xml file
configManager.setTimeWindow(timeWindow.getSelection());
this.timeWindowChanged = false;
configManager.setShipDistance(shipDistance.getSelection());
this.shipDistanceChanged = false;
configManager.setUseAlgorithms(fogChk.getSelection());
this.fogChkChanged = false;
this.maZonesRemoved = false;
resetStatus();
configManager.saveConfigData();
/**
* DR#11279: re-initialize threshold manager and the monitor
@ -92,22 +87,7 @@ public class FogMonitoringAreaConfigDlg extends MonitoringAreaConfigDlg {
if ((!configManager.getAddedZones().isEmpty())
|| (!configManager.getAddedStations().isEmpty())) {
String message = "New zones have been added, the display "
+ "thresholds for the new zones are set to "
+ "default values, you may edit them with the display "
+ "thresholds editor which can be launched from Fog Monitor "
+ "zone table.\n\nIf Fog Monitor is running anywhere within "
+ "the office, clear it.\n";
showMessage(shell, SWT.ICON_INFORMATION | SWT.OK,
"Fog Monitor Confirm Changes", message);
String message2 = "New zones have been added, and their monitoring thresholds "
+ "have been set to default values; would you like to modify "
+ "their threshold values now?";
int yesno = showMessage(shell, SWT.ICON_QUESTION | SWT.YES
| SWT.NO, "Edit Thresholds Now?", message2);
if (yesno == SWT.YES) {
if (editDialog() == SWT.YES) {
FogMonDispThreshDlg fogMonitorDlg = new FogMonDispThreshDlg(
shell, CommonConfig.AppName.FOG,
DataUsageKey.MONITOR);

View file

@ -41,6 +41,7 @@ import com.raytheon.uf.viz.monitor.ui.dialogs.MonitoringAreaConfigDlg;
* Jan 5, 2010 mpduff Initial creation
* Nov 27, 2012 1351 skorolev Changes for non-blocking dialog.
* Jan 29, 2014 2757 skorolev Changed OK button handler.
* Apr 23, 2014 3054 skorolev Fixed issue with removing a new station from list.
*
* </pre>
*
@ -73,22 +74,16 @@ public class SSMonitoringAreaConfigDlg extends MonitoringAreaConfigDlg {
@Override
protected void handleOkBtnSelection() {
// Check for changes in the data
if (!configManager.getAddedZones().isEmpty()
|| !configManager.getAddedStations().isEmpty()
|| this.timeWindowChanged || this.shipDistanceChanged
|| this.fogChkChanged || this.maZonesRemoved) {
if (dataIsChanged()) {
int choice = showMessage(shell, SWT.OK | SWT.CANCEL,
"SAFESEAS Monitor Confirm Changes",
"Want to update the SAFESEAS setup files?");
if (choice == SWT.OK) {
// Save the config xml file
configManager.setTimeWindow(timeWindow.getSelection());
this.timeWindowChanged = false;
configManager.setShipDistance(shipDistance.getSelection());
this.shipDistanceChanged = false;
configManager.setUseAlgorithms(fogChk.getSelection());
this.fogChkChanged = false;
this.maZonesRemoved = false;
resetStatus();
configManager.saveConfigData();
/**
* DR#11279: re-initialize threshold manager and the monitor
@ -98,21 +93,7 @@ public class SSMonitoringAreaConfigDlg extends MonitoringAreaConfigDlg {
SafeSeasMonitor.reInitialize();
if ((!configManager.getAddedZones().isEmpty())
|| (!configManager.getAddedStations().isEmpty())) {
String message = "You're updating the SAFESEAS monitoring settings."
+ "\n\nIf SAFESEAS is running anywhere within "
+ "the office, please clear it.\n";
showMessage(shell, SWT.OK, "SAFESEAS Config Change",
message);
String message2 = "New zones have been added, and their monitoring thresholds "
+ "have been set to default values; would you like to modify "
+ "their threshold values now?";
int yesno = showMessage(shell, SWT.ICON_QUESTION | SWT.YES
| SWT.NO, "Edit Thresholds Now?", message2);
if (yesno == SWT.YES) {
if (editDialog() == SWT.YES) {
SSDispMonThreshDlg ssMonitorDlg = new SSDispMonThreshDlg(
shell, CommonConfig.AppName.SAFESEAS,
DataUsageKey.MONITOR);

View file

@ -41,6 +41,7 @@ import com.raytheon.uf.viz.monitor.ui.dialogs.MonitoringAreaConfigDlg;
* Jan 5, 2010 mpduff Initial creation
* Nov 27, 2012 1351 skorolev Changes for non-blocking dialog.
* Jan 29, 2014 2757 skorolev Changed OK button handler.
* Apr 23, 2014 3054 skorolev Fixed issue with removing a new station from list.
*
* </pre>
*
@ -67,17 +68,14 @@ public class SnowMonitoringAreaConfigDlg extends MonitoringAreaConfigDlg {
@Override
protected void handleOkBtnSelection() {
// Check for changes in the data
if (!configManager.getAddedZones().isEmpty()
|| !configManager.getAddedStations().isEmpty()
|| this.timeWindowChanged || this.maZonesRemoved) {
if (dataIsChanged()) {
int choice = showMessage(shell, SWT.OK | SWT.CANCEL,
"SNOW Monitor Confirm Changes",
"Want to update the SNOW setup files?");
if (choice == SWT.OK) {
// Save the config xml file
configManager.setTimeWindow(timeWindow.getSelection());
this.timeWindowChanged = false;
this.maZonesRemoved = false;
resetStatus();
configManager.saveConfigData();
/**
* DR#11279: re-initialize threshold manager and the monitor
@ -88,18 +86,7 @@ public class SnowMonitoringAreaConfigDlg extends MonitoringAreaConfigDlg {
if ((!configManager.getAddedZones().isEmpty())
|| (!configManager.getAddedStations().isEmpty())) {
showMessage(shell, SWT.ICON_INFORMATION | SWT.OK,
"SNOW Config Change",
"You're updating the SNOW monitoring settings."
+ "\n\nIf SNOW is running anywhere within "
+ "the office, please clear it.\n");
String message2 = "New zones have been added, and their monitoring thresholds "
+ "have been set to default values; would you like to modify "
+ "their threshold values now?";
int yesno = showMessage(shell, SWT.ICON_QUESTION | SWT.YES
| SWT.NO, "Edit Thresholds Now?", message2);
if (yesno == SWT.YES) {
if (editDialog() == SWT.YES) {
SnowMonDispThreshDlg snowMonitorDlg = new SnowMonDispThreshDlg(
shell, CommonConfig.AppName.SNOW,
DataUsageKey.MONITOR);

View file

@ -58,6 +58,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* ------------ ---------- ----------- --------------------------
* Apr 2, 2009 lvenable Initial creation
* Nov 20, 2012 1297 skorolev Changes for non-blocking dialog.
* Apr 23, 2014 3054 skorolev Added MESONET handling
*
* </pre>
*
@ -159,7 +160,7 @@ public class AddNewStationDlg extends CaveSWTDialog {
createTopLabelRadioControls();
createTextControls();
createBottomButtons();
setStationLabel();
stationLbl.setText("StationID:");
}
/**
@ -183,30 +184,13 @@ public class AddNewStationDlg extends CaveSWTDialog {
metarRdo = new Button(radioComp, SWT.RADIO);
metarRdo.setText("Metar");
metarRdo.setSelection(true);
metarRdo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
setStationLabel();
}
});
// TODO: Disable if area has no marine zones.
maritimeRdo = new Button(radioComp, SWT.RADIO);
maritimeRdo.setText("Maritime");
maritimeRdo.setEnabled(appName != CommonConfig.AppName.SNOW);
maritimeRdo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
setStationLabel();
}
});
mesonetRdo = new Button(radioComp, SWT.RADIO);
mesonetRdo.setText("Mesonet");
mesonetRdo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
setStationLabel();
}
});
}
/**
@ -251,23 +235,22 @@ public class AddNewStationDlg extends CaveSWTDialog {
if (metarRdo.getSelection()) {
stationType = StationIdXML.METAR;
} else if (mesonetRdo.getSelection()) {
String s = stationTF.getText();
s = s.substring(s.indexOf("#") + 1, s.length());
stationType = s.toUpperCase();
stationType = StationIdXML.MESONET;
// TODO need to verify the stationType exists.
// was in SSmesonetStationInfo.txt in AWIPS1.
} else {
stationType = StationIdXML.MARITIME;
}
if (!stationTF.getText().isEmpty()) {
configManager.addStation(area, stationTF.getText(),
stationType, false);
configManager.addStation(area, stationTF.getText()
.toUpperCase(), stationType, false);
/**
* for DR #7854: add new station to Monitor Area Config GUI
*/
handleAddNewStation();
} else {
displayInputErrorMsg("Invalid Station ID entered: Please enter a valid Station ID for the selected Station Type");
displayInputErrorMsg("No Station ID entered."
+ "\nPlease enter a valid Station ID for the selected Station Type.");
}
}
});
@ -285,37 +268,28 @@ public class AddNewStationDlg extends CaveSWTDialog {
});
}
/**
* Set the station label.
*/
private void setStationLabel() {
if (mesonetRdo.getSelection() == true) {
stationLbl.setText("StationID#Provider:");
} else {
stationLbl.setText("StationID:");
}
}
/**
* Adds a new station.
*/
private void handleAddNewStation() {
if (!isValidStation()) {
displayInputErrorMsg("Invalid Station ID entered: Please enter a valid Station ID for the selected Station Type");
String stn = stationTF.getText().toUpperCase();
if (!isValidStation(stn)) {
displayInputErrorMsg("Invalid Station ID entered: "
+ stn
+ " \nPlease enter a valid Station ID for the selected Station Type.");
return;
}
String stn = stationTF.getText();
if (metarRdo.getSelection()) {
stn = stn + "#METAR";
} else if (maritimeRdo.getSelection()) {
stn = stn + "#MARITIME";
} else {
// TODO: Mesonet
stn = stn + "#MESONET";
}
if (macDlg.isExistingStation(stn)) {
displayInputErrorMsg("The Station, "
displayInputErrorMsg("The Station '"
+ stn
+ ", is already in your Monitoring Area or among your Additional Stations");
+ "' is already in your Monitoring Area or among your Additional Stations.");
return;
}
macDlg.addNewStationAction(stn);
@ -325,13 +299,11 @@ public class AddNewStationDlg extends CaveSWTDialog {
/**
* Checks if station is valid.
*
* @param stnId
*
* @return boolean value
*/
private boolean isValidStation() {
String stnId = stationTF.getText();
if (stnId.contains("#") && !mesonetRdo.getSelection()) {
return false;
}
private boolean isValidStation(String stnId) {
String catalogtypePhrase = "";
if (metarRdo.getSelection()) {
catalogtypePhrase = "catalogtype = 1"; // METAR
@ -339,7 +311,6 @@ public class AddNewStationDlg extends CaveSWTDialog {
catalogtypePhrase = "catalogtype = 33 or catalogtype = 32"; // MARITIME
} else {
catalogtypePhrase = "catalogtype = 1000"; // MESONET
stnId = stnId.substring(0, stnId.indexOf("#"));
}
try {
String sql = "select stationid, catalogtype from common_obs_spatial where ( "
@ -353,11 +324,9 @@ public class AddNewStationDlg extends CaveSWTDialog {
return false;
}
return true;
/**
* TODO: need to add code for handling Mesonet station type
*/
} catch (Exception e) {
statusHandler.handle(Priority.ERROR, e.getMessage());
statusHandler.handle(Priority.ERROR, "Can not get " + stnId
+ " station in the database. ", e);
}
return false;
}

View file

@ -51,6 +51,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* ------------ ---------- ----------- --------------------------
* Apr 2, 2009 lvenable Initial creation
* Nov 20, 2012 1297 skorolev Changes for non-blocking dialog.
* Apr 23, 2014 3054 skorolev Deleted unnecessary parameter in addArea method.
*
* </pre>
*
@ -225,7 +226,8 @@ public class AddNewZoneDlg extends CaveSWTDialog {
gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
gd.horizontalSpan = 2;
Label useDecimalLbl = new Label(textComp, SWT.CENTER);
useDecimalLbl.setText("Use Decimal Degrees, West Longitude negative");
useDecimalLbl
.setText("Use Decimal Degrees. West Longitude is negative.");
useDecimalLbl.setLayoutData(gd);
}
@ -283,23 +285,19 @@ public class AddNewZoneDlg extends CaveSWTDialog {
String areaId = idTF.getText();
if (areaId.equals("") || areaId.length() != 6
|| (areaId.charAt(2) != 'C' && areaId.charAt(2) != 'Z')) {
displayInputErrorMsg("Invalid Area ID entered. Please enter a correctly formatted Area ID");
displayInputErrorMsg("Invalid Area ID = '" + areaId
+ "' entered. Please enter a correctly formatted Area ID.");
return;
}
if (macDlg.isExistingZone(areaId)) {
displayInputErrorMsg("The Area ID, "
+ areaId
+ ", is already in your Monitoring Area or among your Additional Zones");
+ ", is already in your Monitoring Area or among your Additional Zones.");
return;
}
if (latString == null || latString.isEmpty() || lonString == null
|| lonString.isEmpty()) {
MessageBox messageBox = new MessageBox(shell, SWT.ICON_INFORMATION
| SWT.OK);
messageBox.setText("Invalid Lat/Lon");
messageBox
.setMessage("Invalid Lat/Lon entered. Please enter correctly formatted Lat and Lon values");
messageBox.open();
macDlg.latLonErrorMsg(latString, lonString);
return;
} else {
try {
@ -311,16 +309,15 @@ public class AddNewZoneDlg extends CaveSWTDialog {
type = ZoneType.MARITIME;
}
}
configMan.addArea(areaId, lat, lon, type, false);
if (lat > 90.0 || lat < -90.0 || lon > 180.0 || lon < -180.0) {
macDlg.latLonErrorMsg(latString, lonString);
return;
}
configMan.addArea(areaId, lat, lon, type);
macDlg.addNewZoneAction(areaId, centroidLatTF.getText(),
centroidLonTF.getText());
} catch (NumberFormatException e) {
MessageBox messageBox = new MessageBox(shell,
SWT.ICON_INFORMATION | SWT.OK);
messageBox.setText("Invalid Lat/Lon");
messageBox
.setMessage("Invalid Lat/Lon entered. Please enter correctly formatted Lat and Lon values");
messageBox.open();
macDlg.latLonErrorMsg(latString, lonString);
return;
}
}

View file

@ -30,6 +30,7 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import com.raytheon.uf.common.monitor.config.FogMonitorConfigurationManager;
@ -50,6 +51,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* ------------ ---------- ----------- --------------------------
* Apr 2, 2009 lvenable Initial creation
* Nov 20, 2012 1297 skorolev Changes for non-blocking dialog.
* Apr 23, 2014 3054 skorolev Fixed issue with deleting a new station.
*
* </pre>
*
@ -155,7 +157,8 @@ public class DeleteStationDlg extends CaveSWTDialog {
deleteBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
deleteSelected();
String delStn = deleteSelected();
setReturnValue(delStn);
}
});
@ -166,7 +169,6 @@ public class DeleteStationDlg extends CaveSWTDialog {
closeBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
setReturnValue(true);
close();
}
});
@ -184,14 +186,26 @@ public class DeleteStationDlg extends CaveSWTDialog {
/**
* Delete stations from the list.
*/
private void deleteSelected() {
private String deleteSelected() {
String retval = null;
if (stationList.getItemCount() != 0) {
String selection = stationList.getItem(stationList
.getSelectionIndex());
configMan.removeStation(selection);
stationList.remove(stationList.getSelectionIndex());
populate();
if (stationList.getSelectionIndex() != -1) {
int idx = stationList.getSelectionIndex();
String selection = stationList.getItem(idx);
retval = configMan.getAddedStations().get(idx);
configMan.getAddedStations().remove(idx);
stationList.remove(selection);
populate();
} else {
MessageBox messageBox = new MessageBox(shell,
SWT.ICON_INFORMATION | SWT.NONE);
messageBox.setText("Selection error.");
messageBox.setMessage("Please select station to delete.");
messageBox.open();
stationList.select(0);
}
}
return retval;
}
/**

View file

@ -53,6 +53,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* ------------ ---------- ----------- --------------------------
* Apr 2, 2009 lvenable Initial creation
* Nov 20, 2012 1297 skorolev Changes for non-blocking dialog.
* Apr 23, 2014 3054 skorolev Fixed issues with removing a new zone from list.
*
* </pre>
*
@ -60,6 +61,12 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* @version 1.0
*/
public class EditNewZoneDlg extends CaveSWTDialog {
/**
* Call back interface.
*/
private INewZoneStnAction macDlg;
/**
* Zone list control.
*/
@ -115,6 +122,8 @@ public class EditNewZoneDlg extends CaveSWTDialog {
*/
private Label bottomLbl;
private String delZone;
/**
* Constructor.
*
@ -122,10 +131,13 @@ public class EditNewZoneDlg extends CaveSWTDialog {
* Parent shell.
* @param appName
* Application name.
* @param monitoringAreaConfigDlg
*/
public EditNewZoneDlg(Shell parent, AppName appName) {
public EditNewZoneDlg(Shell parent, AppName appName,
INewZoneStnAction macDlg) {
super(parent, SWT.DIALOG_TRIM, CAVE.DO_NOT_BLOCK);
setText(appName.toString() + ": Edit a Newly Added Zone");
this.macDlg = macDlg;
configMan = this.getConfigManager(appName);
}
@ -279,7 +291,7 @@ public class EditNewZoneDlg extends CaveSWTDialog {
deleteBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
deleteSelected();
delZone = deleteSelected();
}
});
}
@ -316,7 +328,7 @@ public class EditNewZoneDlg extends CaveSWTDialog {
closeBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
setReturnValue(true);
setReturnValue(delZone);
close();
}
});
@ -339,6 +351,7 @@ public class EditNewZoneDlg extends CaveSWTDialog {
// DR #7343: a null areaXml causes an "Unhandled event loop exception"
if (areaXml != null) {
idTF.setText(areaXml.getAreaId());
idTF.setEnabled(false);
latTF.setText(String.valueOf(areaXml.getCLat()));
lonTF.setText(String.valueOf(areaXml.getCLon()));
if (areaXml.getType() == ZoneType.REGULAR) {
@ -354,8 +367,7 @@ public class EditNewZoneDlg extends CaveSWTDialog {
/**
* Delete selected zones.
*/
// TODO: Delete zone from left list in the Area Configuration dialog.
private void deleteSelected() {
private String deleteSelected() {
if (zoneList.getItemCount() != 0) {
String area = zoneList.getItem(zoneList.getSelectionIndex());
zoneList.remove(zoneList.getSelectionIndex());
@ -363,9 +375,11 @@ public class EditNewZoneDlg extends CaveSWTDialog {
idTF.setText("");
latTF.setText("");
lonTF.setText("");
return area;
} else {
bottomLbl.setText("No zones have been added.");
}
return null;
}
/**
@ -375,28 +389,36 @@ public class EditNewZoneDlg extends CaveSWTDialog {
if (zoneList.getItemCount() != 0) {
String area = zoneList.getItem(zoneList.getSelectionIndex());
double lat;
if (!latTF.getText().isEmpty()) {
lat = Double.parseDouble(latTF.getText());
String latStr = latTF.getText();
String lontStr = lonTF.getText();
if (latStr == null || latStr.isEmpty() || lontStr == null
|| lontStr.isEmpty()) {
macDlg.latLonErrorMsg(latStr, lontStr);
return;
} else {
// wrong value will be filtered when save
lat = 9999.0;
try {
double lat = Double.parseDouble(latStr);
double lon = Double.parseDouble(lontStr);
if (lat > 90.0 || lat < -90.0 || lon > 180.0
|| lon < -180.0) {
macDlg.latLonErrorMsg(latStr, lontStr);
return;
}
ZoneType type = ZoneType.REGULAR;
if (marineRdo.getSelection()) {
type = ZoneType.MARITIME;
}
configMan.removeArea(area);
configMan.removeAddedArea(area);
configMan.addArea(area, lat, lon, type);
populate();
// Return cursor to the top of the list.
zoneList.select(0);
} catch (NumberFormatException e) {
macDlg.latLonErrorMsg(latStr, lontStr);
return;
}
}
double lon;
if (!lonTF.getText().isEmpty()) {
lon = Double.parseDouble(lonTF.getText());
} else {
// wrong value will be filtered when save
lon = 9999.0;
}
ZoneType type = ZoneType.REGULAR;
if (marineRdo.getSelection()) {
type = ZoneType.MARITIME;
}
configMan.removeArea(area);
configMan.removeAddedArea(area);
configMan.addArea(idTF.getText(), lat, lon, type, false);
populate();
} else {
bottomLbl.setText("No zones have been added.");
}

View file

@ -1,18 +1,19 @@
package com.raytheon.uf.viz.monitor.ui.dialogs;
/**
* Interface used for action callbacks for the Monitor Area
* Configure Dlg
* Interface used for action callbacks for the Monitor Area Configure Dlg
*
* <pre>
*
*
* SOFTWARE HISTORY
*
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 9, 2011 7854, 7855 zhao Initial creation
*
* Feb 9, 2011 7854, 7855 zhao Initial creation
* Apr 24, 2014 3054 skorolev Add an error message box action.
*
* </pre>
*
*
* @author zhao
* @version 1.0
*/
@ -21,11 +22,19 @@ public interface INewZoneStnAction {
* Action to add a new zone to Monitor Area.
*/
public void addNewZoneAction(String id, String lat, String log);
public boolean isExistingZone(String id);
/**
* Action to add a new station to Monitor Area
*/
public void addNewStationAction(String stnWithType);
public void addNewStationAction(String stnWithType);
public boolean isExistingStation(String stnWithType);
/**
* Action to show an error message box for invalid Latitude and Longitude
* values.
*/
public void latLonErrorMsg(String latStr, String lonStr);
}

View file

@ -72,6 +72,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* Feb 06, 2013 1578 skorolev Fixed a cursor problem for checkboxes.
* Oct 07, 2013 #2443 lvenable Fixed image memory leak.
* Jan 29, 2014 2757 skorolev Added status variables.
* Apr 23, 2014 3054 skorolev Fixed issue with removing from list a new zone and a new station.
* </pre>
*
* @author lvenable
@ -187,6 +188,9 @@ public abstract class MonitoringAreaConfigDlg extends CaveSWTDialog implements
/** monitor area stations **/
private java.util.List<String> maStations = null;
/** monitor area stations status. */
protected boolean maStationsRemoved = false;
/** monitor area additional zones **/
private java.util.List<String> additionalZones = null;
@ -287,6 +291,7 @@ public abstract class MonitoringAreaConfigDlg extends CaveSWTDialog implements
" Error initiate Additional Zone/Stations list.", e);
}
Collections.sort(additionalStns);
mode = Mode.Zone;
}
/*
@ -565,6 +570,7 @@ public abstract class MonitoringAreaConfigDlg extends CaveSWTDialog implements
@Override
public void widgetSelected(SelectionEvent event) {
removeAssociated();
maStationsRemoved = true;
}
});
/*
@ -864,25 +870,32 @@ public abstract class MonitoringAreaConfigDlg extends CaveSWTDialog implements
}
addNewZoneDlg.open();
} else {
if (associatedList.getSelectionIndex() == -1) {
associatedList.setSelection(0);
}
String area = associatedList.getItem(associatedList
.getSelectionIndex());
if (addNewStnDlg == null) {
addNewStnDlg = new AddNewStationDlg(shell, appName, area, this);
addNewStnDlg.setCloseCallback(new ICloseCallback() {
@Override
public void dialogClosed(Object returnValue) {
if ((Boolean) returnValue) {
// Update the dialog
populateLeftLists();
if (associatedList.getSelectionIndex() != -1) {
String area = associatedList.getItem(associatedList
.getSelectionIndex());
if (addNewStnDlg == null) {
addNewStnDlg = new AddNewStationDlg(shell, appName, area,
this);
addNewStnDlg.setCloseCallback(new ICloseCallback() {
@Override
public void dialogClosed(Object returnValue) {
if ((Boolean) returnValue) {
// Update the dialog
populateLeftLists();
}
addNewStnDlg = null;
}
addNewStnDlg = null;
}
});
});
}
addNewStnDlg.open();
} else {
MessageBox messageBox = new MessageBox(shell,
SWT.ICON_INFORMATION | SWT.NONE);
messageBox.setText("Selection error.");
messageBox.setMessage("Please select associated zone.");
messageBox.open();
associatedList.select(0);
}
addNewStnDlg.open();
}
}
@ -892,12 +905,14 @@ public abstract class MonitoringAreaConfigDlg extends CaveSWTDialog implements
private void handleEditDeleteAction() {
if (zoneRdo.getSelection() == true) {
if (editDlg == null) {
editDlg = new EditNewZoneDlg(shell, appName);
editDlg = new EditNewZoneDlg(shell, appName, this);
editDlg.setCloseCallback(new ICloseCallback() {
@Override
public void dialogClosed(Object returnValue) {
if ((Boolean) returnValue) {
// Update the dialog
if (returnValue instanceof String) {
// Update the edit dialog
String selectedZone = returnValue.toString();
maZones.remove(selectedZone);
populateLeftLists();
}
editDlg = null;
@ -911,8 +926,10 @@ public abstract class MonitoringAreaConfigDlg extends CaveSWTDialog implements
deleteStnDlg.setCloseCallback(new ICloseCallback() {
@Override
public void dialogClosed(Object returnValue) {
if ((Boolean) returnValue) {
// Update the dialog
if (returnValue instanceof String) {
// Update the delete dialog
String selectedStn = returnValue.toString();
maStations.remove(selectedStn);
populateLeftLists();
}
deleteStnDlg = null;
@ -1385,4 +1402,68 @@ public abstract class MonitoringAreaConfigDlg extends CaveSWTDialog implements
arrowUpImg.dispose();
arrowDownImg.dispose();
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.monitor.ui.dialogs.INewZoneStnAction#latLonErrorMsg()
*/
public void latLonErrorMsg(String latStr, String lonStr) {
MessageBox messageBox = new MessageBox(shell, SWT.ICON_INFORMATION
| SWT.OK);
messageBox.setText("Invalid Lat/Lon");
StringBuilder errMsg = new StringBuilder("Invalid Lat/Lon entered:");
errMsg.append("\nLatitude = ");
errMsg.append(latStr);
errMsg.append("\nLongitude = ");
errMsg.append(lonStr);
errMsg.append("\nPlease enter correctly formatted Lat and Lon values:");
errMsg.append("\nLatitude should be between -90,90.");
errMsg.append("\nLongitude should be between -180,180.");
messageBox.setMessage(errMsg.toString());
messageBox.open();
}
/**
* Reset data status.
*/
protected void resetStatus() {
this.timeWindowChanged = false;
this.maZonesRemoved = false;
this.maStationsRemoved = false;
this.shipDistanceChanged = false;
this.fogChkChanged = false;
}
/**
* Check if data and data states have been changed.
*
* @return
*/
protected boolean dataIsChanged() {
if (!configMgr.getAddedZones().isEmpty()
|| !configMgr.getAddedStations().isEmpty()
|| this.timeWindowChanged || this.shipDistanceChanged
|| this.fogChkChanged || this.maZonesRemoved
|| this.maStationsRemoved) {
return true;
}
return false;
}
protected int editDialog() {
showMessage(shell, SWT.ICON_INFORMATION | SWT.OK, appName
+ " Config Change", "You're updating the " + appName
+ " monitoring settings." + "\n\nIf " + appName
+ " is running anywhere within "
+ "the office, please clear it.\n");
String message2 = "New zones have been added, and their monitoring thresholds "
+ "have been set to default values; would you like to modify "
+ "their threshold values now?";
int yesno = showMessage(shell, SWT.ICON_QUESTION | SWT.YES | SWT.NO,
"Edit Thresholds Now?", message2);
return yesno;
}
}

View file

@ -61,6 +61,7 @@ import com.raytheon.viz.grid.util.RadarAdapter;
* ------------ ---------- ----------- --------------------------
* Dec 13, 2011 bsteffen Initial creation
* Feb 21, 2014 DR 16744 D. Friedman Add radar/grid updates
* Apr 1, 2014 DR 17220 D. Friedman Handle uninitialized grid inventory
*
* </pre>
*
@ -138,6 +139,10 @@ public class ThinClientDataUpdateTree extends DataUpdateTree {
Set<AlertMessage> radarMessages = new HashSet<AlertMessage>();
Map<String, RequestConstraint> metadata = RadarAdapter.getInstance()
.getUpdateConstraints();
if (metadata == null) {
// Can happen if grid inventory has not been initialized
return;
}
metadata = new HashMap<String, RequestConstraint>(metadata);
metadata.put("insertTime", new RequestConstraint(time,
ConstraintType.GREATER_THAN));

View file

@ -28,7 +28,7 @@ import org.osgi.framework.BundleContext;
import com.raytheon.uf.viz.core.localization.HierarchicalPreferenceStore;
/**
* TODO Add Description
* Activator class for the thinclient
*
* <pre>
*
@ -37,7 +37,8 @@ import com.raytheon.uf.viz.core.localization.HierarchicalPreferenceStore;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Oct 20, 2011 mschenke Initial creation
* Mar 3, 2014 2861 mschenke Create preference store immediately
* Mar 03, 2014 2861 mschenke Create preference store immediately
* Apr 25, 2014 2972 njensen Fixed prefs so thinclient can start
*
*
* </pre>
@ -56,12 +57,17 @@ public class Activator extends AbstractUIPlugin {
private BundleContext ctx;
// General preference store
private IPersistentPreferenceStore prefs = new HierarchicalPreferenceStore(
this);
/**
* General preference store. This must NOT be a HierarchicalPreferenceStore
* as those store to the server and this preference store contains the
* server addresses.
*/
private ScopedPreferenceStore prefs = new ScopedPreferenceStore(
InstanceScope.INSTANCE, PLUGIN_ID);
// Preferences for UI
private HierarchicalPreferenceStore uiPrefs;
private HierarchicalPreferenceStore uiPrefs = new HierarchicalPreferenceStore(
PLUGIN_ID);
private IThinClientComponent component;
@ -78,6 +84,7 @@ public class Activator extends AbstractUIPlugin {
* org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
* )
*/
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
this.ctx = context;
@ -95,6 +102,7 @@ public class Activator extends AbstractUIPlugin {
* org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
* )
*/
@Override
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
@ -121,15 +129,12 @@ public class Activator extends AbstractUIPlugin {
*/
@Override
public IPersistentPreferenceStore getPreferenceStore() {
if (prefs == null) {
prefs = new ScopedPreferenceStore(new InstanceScope(), PLUGIN_ID);
}
return prefs;
}
/**
* Get the Ui preference store
* Get the UI preference store. This only contains the options for the
* refresh intervals that are shown on the preference page.
*
* @return
*/

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Aviation Plug-in
Bundle-SymbolicName: com.raytheon.viz.aviation;singleton:=true
Bundle-Version: 1.14.0
Bundle-Version: 1.14.0.qualifier
Bundle-Activator: com.raytheon.viz.aviation.activator.Activator
Bundle-Vendor: Raytheon
Require-Bundle: org.eclipse.ui,

View file

@ -315,6 +315,10 @@
# Status: TEST
# Title: AvnFPS: OB9.2 installation breaks mtrs.cfg file
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 02APR2014 17211 zhao (code obtained from the listserver via Virgil that implements a new rule regarding CB, TS etc)
#
#
#
import exceptions, re, time, types
@ -423,6 +427,8 @@ ddHH/ddHH)""",
60: """NSW not needed""",
61: """The period covered by a TAF shall not exceed 30
hours""",
81: """CB may only be mentioned when TS or VCTS mentioned
(NWSI 10-813, Appendix B, 1.2.7.3)""",
}
_Warnings = { \
@ -1054,6 +1060,10 @@ class Decoder(tpg.VerboseParser):
'TS' in g['vcnty']['str']:
if 'sky' not in g or 'CB' not in g['sky']['str']:
raise Error(_Errors[11])
if 'sky' in g and 'CB' in g['sky']['str']:
if ('pcp' not in g or 'TS' not in g['pcp']['str']) and \
('vcnty' not in g or 'TS' not in g['vcnty']['str']):
raise Error(_Errors[81])
def check_obv(self):
# NWSI 10-813, 1.2.6

View file

@ -85,6 +85,7 @@ import com.vividsolutions.jts.geom.LineString;
* 04-07-10 #4614 randerso Reworked to use localization files
* 07-11-12 #875 rferrel Move points to PointsDataManager.
* 01-29-14 DR 16351 D. Friedman Fix updates to storm track from preferences.
* 04-02-14 DR 16351 D. Friedman Fix updates to storm track from preferences. (backport from 14.2.2)
*
* </pre>
*

View file

@ -100,6 +100,7 @@ import com.vividsolutions.jts.geom.LineString;
* 06-24-2013 DR 16317 D. Friedman Handle "motionless" track.
* 01-28-2014 DR16465 mgamazaychikov Fixed the problem with anchor point when frame
* count changes; made line width configurable.
* 04-07-2014 DR 17232 D. Friedman Make sure pivot indexes are valid.
*
* </pre>
*
@ -212,9 +213,10 @@ public class StormTrackDisplay implements IRenderable {
}
if (currentFrame == currentState.displayedPivotIndex) {
if (currentState.displayedPivotIndex == currentState.pivotIndex) {
if (currentState.displayedPivotIndex == currentState.pivotIndex &&
currentState.otherPivotIndex >= 0) {
currentState.displayedPivotIndex = currentState.otherPivotIndex;
} else {
} else if (currentState.pivotIndex >= 0){
currentState.displayedPivotIndex = currentState.pivotIndex;
}
}
@ -236,9 +238,10 @@ public class StormTrackDisplay implements IRenderable {
currentState.displayedPivotIndex = currentState.pivotIndex;
currentState.nextPivotIndex = -1;
} else if (currentFrame == currentState.displayedPivotIndex) {
if (currentState.displayedPivotIndex == currentState.pivotIndex) {
if (currentState.displayedPivotIndex == currentState.pivotIndex &&
currentState.otherPivotIndex >= 0) {
currentState.displayedPivotIndex = currentState.otherPivotIndex;
} else {
} else if (currentState.pivotIndex >= 0){
currentState.displayedPivotIndex = currentState.pivotIndex;
}
} else if (currentFrame != currentState.displayedPivotIndex) {
@ -1413,4 +1416,5 @@ public class StormTrackDisplay implements IRenderable {
data.setMotionSpeed((int) mpsToKts.convert(state.speed));
dataManager.setStormTrackData(data);
}
}

View file

@ -63,6 +63,7 @@ import com.vividsolutions.jts.geom.Point;
* needs to update the track because
* the point has been moved.
* 08-12-2013 DR 16427 D. Friedman Prevent NPE.
* 04-07-2014 DR 17232 D. Friedman Set displayedPivotIndex when needed.
*
* </pre>
*
@ -270,6 +271,17 @@ public class StormTrackUIManager extends InputAdapter {
state.pointMoved = true;
FramesInfo info = controller.getDescriptor().getFramesInfo();
trackUtil.setPivotIndexes(info, state);
// This code is duplicated from StormTrackDisplay.paint().
if (state.displayedPivotIndex == trackUtil.getCurrentFrame(info)) {
if (state.displayedPivotIndex == state.pivotIndex &&
state.otherPivotIndex >= 0) {
state.displayedPivotIndex = state.otherPivotIndex;
} else if (state.pivotIndex >= 0) {
state.displayedPivotIndex = state.pivotIndex;
}
}
state.nextPivotIndex = trackUtil.getCurrentFrame(info);
controller.issueRefresh();
rval = true;

View file

@ -21,6 +21,7 @@
from com.raytheon.uf.viz.core import GraphicsFactory
from com.raytheon.uf.viz.core.drawables import PaintProperties
from com.raytheon.viz.core.gl import GLTargetProxy
from com.raytheon.uf.viz.core.rsc import ResourceProperties
#
# Base class for Viz painting from python
@ -32,6 +33,7 @@ from com.raytheon.viz.core.gl import GLTargetProxy
# ------------ ---------- ----------- --------------------------
# 04/01/09 njensen Initial Creation.
# 08/20/2012 #1077 randerso Fixed backgroundColor setting
# Apr 16, 2014 3039 njensen Ensure correct ResourceList.add() is used
#
#
#
@ -83,7 +85,7 @@ class VizPainter():
desc = self.getDescriptor()
vizResource.setDescriptor(desc)
vizResource.init(self.target)
desc.getResourceList().add(vizResource)
desc.getResourceList().add(vizResource, ResourceProperties())
def paint(self, time, canvas=None):
if type(time) is str:
@ -130,4 +132,4 @@ class VizPainter():
if index > -1:
self.getDescriptor().setFrame(index)

View file

@ -58,6 +58,10 @@ import com.raytheon.viz.ui.personalities.awips.AbstractCAVEComponent;
* now that they're no longer in
* localization store.
* Dec 04, 2013 #2588 dgilling Add thread to force shutdown.
* Mar 25, 2014 #2963 randerso Removed obsolete python_include support
* which was adding an empty string into the
* python path causing python to look in user's
* current default directory for modules.
*
* </pre>
*
@ -104,11 +108,6 @@ public class GfeClient extends AbstractCAVEComponent {
FileUtil.join("python", "pyViz")), null)).getPath())
.getPath();
String pyInclude = System.getProperty("python_include");
if (pyInclude == null) {
pyInclude = "";
}
String utilityDir = new File(FileLocator.resolve(
FileLocator.find(Activator.getDefault().getBundle(), new Path(
FileUtil.join("python", "utility")), null)).getPath())
@ -116,8 +115,8 @@ public class GfeClient extends AbstractCAVEComponent {
boolean includeUser = (!VizApp.getWsId().getUserName().equals("SITE"));
String includePath = PyUtil.buildJepIncludePath(true, pyInclude,
utilityDir, GfeCavePyIncludeUtil.getCommonPythonIncludePath(),
String includePath = PyUtil.buildJepIncludePath(true, utilityDir,
GfeCavePyIncludeUtil.getCommonPythonIncludePath(),
GfeCavePyIncludeUtil.getCommonGfeIncludePath(),
GfeCavePyIncludeUtil.getConfigIncludePath(includeUser),
pyVizDir,

View file

@ -27,11 +27,15 @@ import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.menus.UIElement;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.viz.core.VizApp;
import com.raytheon.viz.gfe.core.DataManager;
import com.raytheon.viz.gfe.core.DataManagerUIFactory;
import com.raytheon.viz.gfe.core.msgs.EnableDisableTopoMsg;
import com.raytheon.viz.gfe.core.msgs.EnableDisableTopoMsg.Action;
import com.raytheon.viz.gfe.core.msgs.Message;
import com.raytheon.viz.gfe.core.parm.Parm;
/**
* Handle the GFE Topography menu item
@ -42,6 +46,7 @@ import com.raytheon.viz.gfe.core.msgs.Message;
* ------------ ---------- ----------- --------------------------
* Jul 2, 2008 #1160 randerso Initial creation
* Nov 20, 2013 #2331 randerso Re-implemented using message
* Apr 02, 2014 #2969 randerso Fix state of Topography menu item
*
* </pre>
*
@ -53,6 +58,8 @@ public class TopoHandler extends AbstractHandler implements IElementUpdater {
private IUFStatusHandler statusHandler = UFStatus
.getHandler(TopoHandler.class);
public static String commandId = "com.raytheon.viz.gfe.actions.topo";
/*
* (non-Javadoc)
*
@ -62,11 +69,21 @@ public class TopoHandler extends AbstractHandler implements IElementUpdater {
*/
@Override
public Object execute(ExecutionEvent arg0) throws ExecutionException {
Action lastAction = Message.inquireLastMessage(
EnableDisableTopoMsg.class).getAction();
boolean topoDisplayed = false;
DataManager dm = DataManagerUIFactory.getCurrentInstance();
if (dm != null) {
Parm[] parms = dm.getParmManager().getDisplayedParms();
ParmID topoId = dm.getTopoManager().getCompositeParmID();
for (Parm p : parms) {
if (p.getParmID().equals(topoId)) {
topoDisplayed = true;
break;
}
}
}
Action newAction;
if (lastAction.equals(Action.ENABLE)) {
if (topoDisplayed) {
newAction = Action.DISABLE;
} else {
newAction = Action.ENABLE;
@ -88,8 +105,25 @@ public class TopoHandler extends AbstractHandler implements IElementUpdater {
@SuppressWarnings("rawtypes")
@Override
public void updateElement(final UIElement element, Map parameters) {
element.setChecked(Message
.inquireLastMessage(EnableDisableTopoMsg.class).getAction()
.equals(EnableDisableTopoMsg.Action.ENABLE));
boolean topoDisplayed = false;
DataManager dm = DataManagerUIFactory.getCurrentInstance();
if (dm != null) {
Parm[] parms = dm.getParmManager().getDisplayedParms();
ParmID topoId = dm.getTopoManager().getCompositeParmID();
for (Parm p : parms) {
if (p.getParmID().equals(topoId)) {
topoDisplayed = true;
break;
}
}
}
final boolean checked = topoDisplayed;
VizApp.runAsync(new Runnable() {
@Override
public void run() {
element.setChecked(checked);
}
});
}
}

View file

@ -68,6 +68,7 @@ import com.vividsolutions.jts.geom.MultiPolygon;
* Jan 30, 2013 #15719 jdynina Allowed more than 128 chars in wx
* strings
* 02/19/2013 1637 randerso Added throws declarations to translateDataFrom
* 04/01/2014 17187 randerso (code checked in by zhao) To allow over 128 wx lements
*
* </pre>
*
@ -902,19 +903,19 @@ public class WeatherGridData extends AbstractGridData implements INumpyable {
}
}
}
// COMBINE mode is more difficult, have to do each one
else {
for (int i = 0; i < dim.x; i++) {
for (int j = 0; j < dim.y; j++) {
if (points.get(i, j) == 1) {
WeatherKey combined = new WeatherKey(key.get(values
.get(i, j)));
combined.addAll(doGetWeatherValue(i, j));
grid.set(i, j, lookupKeyValue(combined));
}
}
}
}
// COMBINE mode is more difficult, have to do each one
else {
for (int i = 0; i < dim.x; i++) {
for (int j = 0; j < dim.y; j++) {
if (points.get(i, j) == 1) {
WeatherKey combined = new WeatherKey(
key.get(0xFF & values.get(i, j)));
combined.addAll(doGetWeatherValue(i, j));
grid.set(i, j, lookupKeyValue(combined));
}
}
}
}
setGrid(grid);
}

View file

@ -26,6 +26,8 @@ import java.util.List;
import java.util.Set;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.geometry.GeneralEnvelope;
import org.opengis.geometry.Envelope;
@ -48,6 +50,7 @@ import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability;
import com.raytheon.viz.core.ColorUtil;
import com.raytheon.viz.gfe.Activator;
import com.raytheon.viz.gfe.PythonPreferenceStore;
import com.raytheon.viz.gfe.actions.TopoHandler;
import com.raytheon.viz.gfe.core.DataManager;
import com.raytheon.viz.gfe.core.IParmManager;
import com.raytheon.viz.gfe.core.ISampleSetManager;
@ -80,6 +83,7 @@ import com.raytheon.viz.ui.editor.AbstractEditor;
* 08/20/2009 2310 njensen Separated most logic out into AbstractSpatialDisplayManager
* 04/02/2014 2961 randerso Added a listener to redo time matching when ISC mode changes
*
* 04/02/2014 2969 randerso Fix state of Topography menu item
* </pre>
*
* @author chammack
@ -367,6 +371,11 @@ public class GFESpatialDisplayManager extends AbstractSpatialDisplayManager
createResourceFromParm(desc, addParm, false);
}
}
if (PlatformUI.isWorkbenchRunning()) {
ICommandService service = (ICommandService) PlatformUI
.getWorkbench().getService(ICommandService.class);
service.refreshElements(TopoHandler.commandId, null);
}
}
@Override

View file

@ -140,6 +140,7 @@ import com.raytheon.viz.gfe.types.MutableInteger;
* 11/21/2013 #2331 randerso Merge with AbstractParmManager and deleted MockParmManager
* to simplify maintenance of this class.
* Changed handling of enabling/disabling Topo parm
* 04/02/2014 #2969 randerso Fix error when Toop parm is unloaded.
* </pre>
*
* @author chammack
@ -780,7 +781,9 @@ public class ParmManager implements IParmManager, IMessageClient {
parmIDs.addAll(Arrays.asList(vcParms));
} else if ((cacheParmIDs == null)
&& (!dbID.getDbType().equals("V"))) {
uncachedDbs.add(dbID);
if (this.availableServerDatabases.contains(dbID)) {
uncachedDbs.add(dbID);
}
} else {
parmIDs.addAll(cacheParmIDs);

View file

@ -156,6 +156,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* update VTEC lines on products that
* aren't being corrected.
* 02/05/2014 17022 ryu Modified loadDraft() to fix merging of WMO heading and AWIPS ID.
* 03/25/2014 #2884 randerso Added xxxid to check for disabling editor
*
* </pre>
*
@ -2728,20 +2729,31 @@ public class ProductEditorComp extends Composite implements
&& !msg.getMode().equals(ActiveTableMode.PRACTICE)) {
return;
}
List<String> pils = VTECTableChangeNotification.DisableTable.get(pil);
String brained = null;
boolean allFound = false;
String sid = getDefString("fullStationID");
String pil = getDefString("pil");
if (pil != null) {
pil = pil.substring(0, 3);
String pilxxx = getDefString("pil");
String pil = null;
if (pilxxx != null) {
pil = pilxxx.substring(0, 3);
List<String> pils = VTECTableChangeNotification.DisableTable
.get(pil);
// append xxxId to pil for matching
if (pils != null) {
String xxxId = pilxxx.substring(3, pilxxx.length());
for (int i = 0; i < pils.size(); i++) {
pils.set(i, pils.get(i) + xxxId);
}
}
for (VTECChange m : msg.getChanges()) {
if (m.getSite().equals("*ALL") || m.getPil().equals("*ALL*")) {
allFound = true;
}
String msgPilxxx = m.getPil() + m.getXxxid();
if (m.getSite().equals(sid)) {
if ((pils == null) && m.getPil().equals(pil)) {
if ((pils == null) && msgPilxxx.equals(pilxxx)) {
if (brain()) {
brained = m.getPil();
}

View file

@ -116,6 +116,7 @@ import com.raytheon.uf.common.time.TimeRange;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 11, 2011 dgilling Initial creation
* 04/08/2014 DR 17187 randerson (code checked in by zhao)
*
* </pre>
*
@ -451,7 +452,7 @@ public class WeatherInterp extends Interp {
// are already set to 0.
// get its value
key = keys1[index];
key = keys1[0xFF & index];
// find this key in the new list, and save the corresponding
// index
@ -466,7 +467,7 @@ public class WeatherInterp extends Interp {
// bytes
index = grid2.get(i, j);
// get its key
key = keys2[index];
key = keys2[0xFF & index];
// find this key in the new list, and save the corresponding
// index
for (int k = 0; k < _allKeys.size(); k++) {

View file

@ -74,12 +74,15 @@ import com.raytheon.viz.grid.record.RequestableDataRecord;
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 16, 2009 brockwoo Initial creation
* Nov 21, 2009 3576 rjpeter Refactored use of DerivParamDesc.
* Jun 04, 2013 2041 bsteffen Improve exception handing in grid
* resources.
* Date Ticket# Engineer Description
* ------------- -------- ----------- --------------------------
* Mar 16, 2009 brockwoo Initial creation
* Nov 21, 2009 3576 rjpeter Refactored use of DerivParamDesc.
* Jun 04, 2013 2041 bsteffen Improve exception handing in grid
* resources.
* Apr 04, 2014 2973 bsteffen Use correct area for expanding subgrid
* requests.
*
* </pre>
*
* @author brockwoo
@ -295,7 +298,6 @@ public class GridDataCubeAdapter extends AbstractDataCubeAdapter {
continue;
}
GridRecord record = data.getGridSource();
area = record.getLocation();
String file = HDF5Util.findHDF5Location(record).getPath();
if (file != null) {
List<GridRequestableData> list = fileMap.get(file);

View file

@ -83,6 +83,7 @@ import com.raytheon.viz.radar.util.StationUtils;
* ------------ ---------- ----------- --------------------------
* Mar 23, 2010 #4473 rjpeter Initial creation
* Feb 21, 2014 DR 16744 D. Friedman Add getUpdateConstraints
* Apr 1, 2014 DR 17220 D. Friedman Handle uninitialized grid inventory
*
* </pre>
*
@ -404,6 +405,11 @@ public class RadarAdapter {
}
public Map<String, RequestConstraint> getUpdateConstraints() {
RadarStation radarStation = getConfiguredRadar();
if (radarStation == null) {
// Can happen if grid inventory has not been initialized
return null;
}
RadarProductCodeMapping rpcMap = RadarProductCodeMapping.getInstance();
HashSet<Integer> productCodes = new HashSet<Integer>();
for (String abbrev : rpcMap.getParameterAbbrevs()) {
@ -412,8 +418,8 @@ public class RadarAdapter {
Map<String, RequestConstraint> rcMap = new HashMap<String, RequestConstraint>();
rcMap.put(RadarAdapter.PLUGIN_NAME_QUERY, new RequestConstraint(
RADAR_SOURCE));
rcMap.put(ICAO_QUERY, new RequestConstraint(getConfiguredRadar()
.getRdaId().toLowerCase()));
rcMap.put(ICAO_QUERY, new RequestConstraint(radarStation.getRdaId()
.toLowerCase()));
rcMap.put(
PRODUCT_CODE_QUERY,
new RequestConstraint(Arrays.toString(new ArrayList<Integer>(

View file

@ -69,7 +69,9 @@ import com.raytheon.viz.mpe.ui.radartable.ReadBiasTableParam;
* Jul 14, 2009 snaples Initial creation
* Jun 18, 2013 16053 snaples Removed reference to setRadarEditFlag
* Aug 06, 2013 16243 Changed the Gui to a ScrolledComposite.
* Feb 2, 2014 16201 snaples Added saved data flag support
* Feb 2, 2014 16201 snaples Added saved data flag support
* Apr 4, 2014 17223 snaples Updated other_office_id and rfc_bias to object
* array so that called procedure can update and return values properly.
*
* </pre>
*
@ -469,18 +471,22 @@ public class RadarBiasTableDialog extends Dialog {
}
bcoefLbl.setText(bbias);
bcoefLbl.setLayoutData(gd);
String[] oid = new String[1];
String office_id = "";
float other_bias_value = 0;
oid[0] = office_id;
Float[] obias_value = new Float[1];
Float other_bias_value = 0.00f;
obias_value[0] = other_bias_value;
int bias_found = ReadBiasTableParam.get_rfc_bias_value(rid,
office_id, other_bias_value);
oid, obias_value);
if (bias_found == 0) {
obias = "N/A";
ooffice = "N/A";
} else {
obias = String.format("%-1.2f", other_bias_value);
ooffice = office_id;
obias = String.format("%-1.2f", obias_value[0]);
ooffice = oid[0];
}
gd = new GridData(SWT.FILL, SWT.CENTER, true, true);
Label obiasLbl = new Label(biasListComp, SWT.CENTER);

View file

@ -43,6 +43,7 @@ import com.raytheon.viz.mpe.ui.dialogs.RadarBiasTableDialog;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 15, 2009 snaples Initial creation
* Apr 04, 2014 17223 snaples Updated get_rfc_bias to properly update and return values to calling procedure.
*
* </pre>
*
@ -161,8 +162,8 @@ public class ReadBiasTableParam {
return coefs;
}
public static int get_rfc_bias_value(String rid, String office_id,
float pBias) {
public static int get_rfc_bias_value(String rid, String[] oid,
Float[] pBias) {
String pFxaLocalSite = appsDefaults.getToken("fxa_local_site");
String where = "";
int bias_found = 0;
@ -174,7 +175,6 @@ public class ReadBiasTableParam {
String pRadarLoc = "";
Rwbiasstat pRWBiasStat = new Rwbiasstat();
Rwbiasdyn pRWBiasDynNode = new Rwbiasdyn();
length = pFxaLocalSite.length();
if (length > 0) {
@ -219,8 +219,8 @@ public class ReadBiasTableParam {
* this does not exist, then set the bias to 1.
*/
bias_found = 1;
pBias = 1.00f;
office_id = pRadarLoc;
pBias[0] = 1.00f;
oid[0] = pRadarLoc;
ListIterator<Rwbiasdyn> li = pRWBiasDynList
.listIterator();
@ -230,7 +230,7 @@ public class ReadBiasTableParam {
if (pRWBiasDynNode.getNumpairs() >= pRWBiasStat
.getNpairBiasSelect()) {
pBias = pRWBiasDynNode.getBias();
pBias[0] = pRWBiasDynNode.getBias();
break;
}
}

View file

@ -311,9 +311,11 @@ public class ListSelectionDlg extends CaveSWTDialog {
*/
private void action() {
int choice = displayConfirmationBox();
if (choice == SWT.CANCEL) {
return;
if (selectList.getSelectionCount() == 0) {
int choice = displayConfirmationBox();
if (choice == SWT.CANCEL) {
return;
}
}
if (returnAsArray == ReturnArray.ARRAY_STRING_ITEMS) {

View file

@ -60,6 +60,8 @@
<vbSource key="AKWAVE239" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="AKwave10" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="AKwave4" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="AKHwave10" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="AKHwave4" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="BHPE" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="CPCoutlook211" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="DHM" category="SfcGrid" views="PLANVIEW TIMESERIES" />
@ -70,6 +72,7 @@
<vbSource key="GFSLAMPTstorm" name="GFSLAMP-Grid" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GLERL" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GlobalWave" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GLOBHwave" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="GRLKwave" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="MOSGuide" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="HurWind175" category="SfcGrid" views="PLANVIEW TIMESERIES" />
@ -86,7 +89,13 @@
<vbSource key="MSAS" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="NamDNG" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="ETA212" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="NAHwave15" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="NAHwave10" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="NAHwave4" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="NICICE" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="NPHwave15" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="NPHwave10" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="NPHwave4" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="OPCWave181" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="OPCWave182" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="OPCWave180" category="SfcGrid" views="PLANVIEW TIMESERIES" />
@ -97,21 +106,36 @@
<vbSource key="RTGSST" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="RTGSSTHR" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="RTMA" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-GulfMexico" category="SfcGrid/RTOFS" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-GulfStream" category="SfcGrid/RTOFS" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-GulfMaine" category="SfcGrid/RTOFS" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Atlantic" category="SfcGrid/RTOFS" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Alaska" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Arctic" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Bering" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Guam" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-GulfAlaska" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Honolulu" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-HudsonBaffin" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Samoa" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-TropPaciLowres" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-WestAtl" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-WestConus" category="SfcGrid/RTOFS" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-GulfMexico" category="SfcGrid/RTOFS/forecast" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-GulfStream" category="SfcGrid/RTOFS/forecast" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-GulfMaine" category="SfcGrid/RTOFS/forecast" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Atlantic" category="SfcGrid/RTOFS/forecast" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Alaska" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Arctic" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Bering" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Guam" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-GulfAlaska" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Honolulu" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-HudsonBaffin" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Samoa" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-TropPaciLowres" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-WestAtl" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-WestConus" category="SfcGrid/RTOFS/forecast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-GulfMexico" category="SfcGrid/RTOFS/nowcast" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-GulfStream" category="SfcGrid/RTOFS/nowcast" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-GulfMaine" category="SfcGrid/RTOFS/nowcast" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-Atlantic" category="SfcGrid/RTOFS/nowcast" subCategory="Atlantic" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-Alaska" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-Arctic" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-Bering" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-Guam" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-GulfAlaska" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-Honolulu" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-HudsonBaffin" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-Samoa" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-TropPaciLowres" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-WestAtl" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="RTOFS-Now-WestConus" category="SfcGrid/RTOFS/nowcast" subCategory="Global" views="PLANVIEW TIMESERIES" />
<vbSource key="SeaIce" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="SPCGuide" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="HurWind226" category="SfcGrid" views="PLANVIEW TIMESERIES" />
@ -123,6 +147,7 @@
<vbSource key="WNAWAVE238" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="WNAwave10" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="WNAwave4" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="WPHwave10" category="SfcGrid" views="PLANVIEW TIMESERIES" />
<vbSource key="bufrmosLAMP" name="GFSLAMP-Stn" category="Point"
views="TIMESERIES" />
<vbSource key="Ldad" category="Point" views="TIMESERIES" />
@ -149,4 +174,4 @@
subCategory="Column" />
<vbSource key="radarVWP" name="VWP" category="Point"
subCategory="Column" views="CROSSSECTION TIMEHEIGHT VARVSHGT SOUNDING TIMESERIES" />
</vbSourceList>
</vbSourceList>

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: JOGL Win64 Specific Fragment
Bundle-SymbolicName: javax.media.opengl.win64
Bundle-Version: 1.14.0
Bundle-Version: 1.14.0.qualifier
Fragment-Host: javax.media.opengl;bundle-version="1.1.1"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86_64))

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Windows 64-bit Jep Library
Bundle-SymbolicName: org.jep.win64
Bundle-Version: 1.14.0
Bundle-Version: 1.14.0.qualifier
Fragment-Host: org.jep;bundle-version="2.3.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86_64))

View file

@ -1,26 +1,66 @@
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SPARQL';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SPARQL';
CREATE FUNCTION taxonomyelementtype_classificationnode_update() RETURNS void AS $$
DECLARE
t bool;
BEGIN
SELECT EXISTS(
SELECT * FROM information_schema.tables
WHERE
table_schema = 'ebxml' AND
table_name = 'taxonomyelementtype_classificationnode'
) into t;
IF
t ='t'
THEN
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SPARQL';
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SQL-92';
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:XQuery';
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:EJBQL';
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:ExportObject';
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:FindAllMyObjects';
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:ExtrinsicObjectQuery';
INSERT INTO ebxml.taxonomyelementtype_classificationnode(taxonomyelementtype_id,classificationnode_id)
VALUES('urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage','urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL');
RAISE NOTICE 'updated ebxml.taxonomyelementtype_classificationnode table, success!';
ELSE
RAISE NOTICE 'Table ebxml.taxonomyelementtype_classificationnode does not exist, skipping!';
END IF;
END;
$$ LANGUAGE plpgsql;
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SQL-92';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SQL-92';
CREATE FUNCTION classificationnode_update() RETURNS void AS $$
DECLARE
t bool;
BEGIN
SELECT EXISTS(
SELECT * FROM information_schema.tables
WHERE
table_schema = 'ebxml' AND
table_name = 'classificationnode'
) into t;
IF
t ='t'
THEN
delete from where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SPARQL';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SQL-92';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:XQuery';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:EJBQL';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:ExportObject';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:FindAllMyObjects';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:ExtrinsicObjectQuery';
INSERT INTO ebxml.classificationnode (id,lid,objecttype,owner,versionname,code,parent,path)
VALUES ('urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL','urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL',
'urn:oasis:names:tc:ebxml-regrep:ObjectType:RegistryObject:ClassificationNode','NCF','1','HQL',
'urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage','/urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage/HQL');
RAISE NOTICE 'updated ebxml.classificationnode table, success!';
ELSE
RAISE NOTICE 'Table ebxml.classificationnode does not exist, skipping!';
END IF;
END;
$$ LANGUAGE plpgsql;
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:XQuery';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:XQuery';
select taxonomyelementtype_classificationnode_update();
select classificationnode_update();
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:EJBQL';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:EJBQL';
DROP FUNCTION taxonomyelementtype_classificationnode_update();
DROP FUNCTION classificationnode_update();
INSERT INTO ebxml.classificationnode (id,lid,objecttype,owner,versionname,code,parent,path) VALUES
('urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL','urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL',
'urn:oasis:names:tc:ebxml-regrep:ObjectType:RegistryObject:ClassificationNode','NCF','1','HQL',
'urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage','/urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage/HQL');
INSERT INTO ebxml.taxonomyelementtype_classificationnode(taxonomyelementtype_id,classificationnode_id) VALUES('urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage','urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL');
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:ExportObject';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:ExportObject';
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:FindAllMyObjects';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:FindAllMyObjects';
delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:ExtrinsicObjectQuery';
delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:ExtrinsicObjectQuery';

View file

@ -1,3 +1,3 @@
alter table madis drop constraint madis_location_reftime_provider_subprovider_restriction_key;
alter table if exists madis drop constraint madis_location_reftime_provider_subprovider_restriction_key;
alter table if exists madis add CONSTRAINT madis_latitude_longitude_stationid_reftime_provider_subprovider UNIQUE (latitude, longitude, stationid, reftime, provider, subprovider, restriction)
alter table madis add constraint madis_location_stationid_reftime_provider_subprovider_restr_key UNIQUE (location, stationid, reftime, provider, subprovider, restriction)

View file

@ -53,7 +53,6 @@ for f in $files; do
fi
else
echo "ERROR: Problem updating file $f"
exit 1
fi
done

View file

@ -38,6 +38,22 @@
<appender-ref ref="ProductSrvRequestLog" />
</appender>
<!-- TextDBSrvRequest log -->
<appender name="TextDBSrvRequestLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${edex.home}/logs/edex-request-textdbSrvRequest-%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%-5p %d [%t] %c{0}: %m%n</pattern>
</encoder>
</appender>
<appender name="TextDBSrvRequestLogAsync" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="TextDBSrvRequestLog" />
</appender>
<!-- ThriftSrv (RemoteRequestRouteWrapper) request log -->
<appender name="ThriftSrvRequestLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@ -73,6 +89,11 @@
<appender-ref ref="ProductSrvRequestLogAsync"/>
</logger>
<logger name="TextDBSrvRequestLogger" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="TextDBSrvRequestLogAsync"/>
</logger>
<logger name="ThriftSrvRequestLogger" additivity="false">
<level value="Info"/>
<appender-ref ref="ThriftSrvRequestLogAsync" />

View file

@ -12,15 +12,8 @@
<tx:annotation-driven transaction-manager="metadataTxManager"
proxy-target-class="true" />
<!-- The db class finder will search the packages listed for classes with @Entity or @Embeddable -->
<bean id="dbClassFinder" class="com.raytheon.uf.edex.database.DatabaseClassAnnotationFinder" >
<constructor-arg>
<list>
<value>com.raytheon</value>
<value>gov.noaa</value>
</list>
</constructor-arg>
</bean>
<!-- The db class finder will search the plugin dir for classes with @Entity or @Embeddable -->
<bean id="dbClassFinder" class="com.raytheon.uf.edex.database.DatabaseClassAnnotationFinder" />
<bean id="metadataDbSessionConfig"
class="com.raytheon.uf.edex.database.DatabaseSessionConfiguration">

View file

@ -20,21 +20,26 @@
package com.raytheon.edex.plugin.gfe.server.notify;
import java.util.List;
import java.util.Set;
import com.raytheon.uf.common.activetable.ActiveTableMode;
import com.raytheon.uf.common.activetable.VTECChange;
import com.raytheon.uf.common.activetable.VTECTableChangeNotification;
import com.raytheon.uf.common.dataplugin.gfe.textproduct.DraftProduct;
import com.raytheon.uf.common.localization.FileUpdatedMessage;
import com.raytheon.uf.common.localization.FileUpdatedMessage.FileChangeType;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.site.SiteMap;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.util.FileUtil;
import com.raytheon.uf.edex.core.EDEXUtil;
import com.raytheon.uf.edex.core.EdexException;
/**
* Listener to handle VTEC Table Change notifications
@ -45,7 +50,11 @@ import com.raytheon.uf.common.util.FileUtil;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 5, 2012 randerso Initial creation
* Jun 5, 2012 randerso Initial creation
* Mar 25, 2014 #2884 randerso Added xxxid to check for disabling drafts
* Fixed to work with sites other than the EDEX site
* Added work around to Localization not sending
* FileUpdatedMessages on EDEX
*
* </pre>
*
@ -65,23 +74,32 @@ public class VTECTableChangeListener {
}
private void checkDrafts(ActiveTableMode tableName, VTECChange change) {
String siteid = change.getSite();
String officeId = change.getSite();
String pil = change.getPil();
String xxxid = change.getXxxid();
String awipspil = officeId + pil + xxxid; // the KKKKCCCXXX
statusHandler.handle(Priority.EVENTA, "checkDrafts: " + tableName + ":"
+ siteid + ":" + pil);
+ awipspil);
String mode = "Standard";
if (tableName.equals(ActiveTableMode.PRACTICE)) {
mode = "PRACTICE";
}
String awipspil = siteid + pil; // only the KKKKCCC
Set<String> siteList = SiteMap.getInstance()
.getSite3LetterIds(officeId);
IPathManager pathMgr = PathManagerFactory.getPathManager();
LocalizationContext siteContext = pathMgr.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.SITE);
LocalizationContext[] contexts = new LocalizationContext[siteList
.size()];
int i = 0;
for (String siteId : siteList) {
contexts[i++] = pathMgr.getContextForSite(
LocalizationType.CAVE_STATIC, siteId);
}
String path = FileUtil.join("gfe", "drafts");
LocalizationFile[] inv = pathMgr.listFiles(siteContext, path, null,
false, true);
LocalizationFile[] inv = pathMgr.listFiles(contexts, path, null, false,
true);
for (LocalizationFile lf : inv) {
String[] tokens = lf.getFile().getName().split("-");
@ -98,19 +116,35 @@ public class VTECTableChangeListener {
boolean markit = false;
// attempt a match for the pil in the DisableTable of related pils
// attempt a match for the pil in the DisableTable of related
// pils
List<String> pils = VTECTableChangeNotification.DisableTable
.get(pil);
if (pils != null) {
markit = pils.contains(fpil.substring(4, 7));
} else if (awipspil.equals(fpil.substring(0, 7))) {
markit = pils.contains(fpil.substring(4, 7))
&& xxxid.equals(fpil.substring(7, fpil.length()));
} else if (awipspil.equals(fpil)) {
markit = true;
} else if (siteid.equals("*ALL*")) {
} else if (officeId.equals("*ALL*")) {
// This is for the clear hazards GUI.
markit = true;
}
if (markit) {
markDraft(lf);
// TODO: remove sending of FileUpdateMessage after DR #2768 is
// fixed
try {
EDEXUtil.getMessageProducer().sendAsync(
"utilityNotify",
new FileUpdatedMessage(lf.getContext(), lf
.getName(), FileChangeType.UPDATED, lf
.getTimeStamp().getTime()));
} catch (EdexException e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
}
}
}
}

View file

@ -38,6 +38,7 @@ import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.util.FileUtil;
import com.raytheon.uf.edex.core.EDEXUtil;
import com.raytheon.uf.edex.core.EdexTimerBasedThread;
/**
@ -88,7 +89,7 @@ public class SmartInitSrv extends EdexTimerBasedThread {
if (record != null) {
runSmartInit(record);
}
} while (record != null);
} while ((record != null) && !EDEXUtil.isShuttingDown());
}
@Override

View file

@ -195,4 +195,14 @@
<alias base="RTOFS-TropPaciLowres">rtofsGlobal</alias>
<alias base="RTOFS-WestAtl">rtofsGlobal</alias>
<alias base="RTOFS-WestConus">rtofsGlobal</alias>
<alias base="GLOBHwave">GLOBHwave</alias>
<alias base="AKHwave10">AKHwave10</alias>
<alias base="AKHwave4">AKHwave4</alias>
<alias base="WPHwave10">WPHwave10</alias>
<alias base="NPHwave15">NPHwave15</alias>
<alias base="NPHwave10">NPHwave10</alias>
<alias base="NPHwave4">NPHwave4</alias>
<alias base="NAHwave15">NAHwave15</alias>
<alias base="NAHwave10">NAHwave10</alias>
<alias base="NAHwave4">NAHwave4</alias>
</aliasList>

View file

@ -5,6 +5,7 @@
May 07, 2013 #1974 randerso Removed unnecessary TPCSG_ entries (should only need TPCSG-)
Changed TP_XXX to tpXXX for RFC total precip
Jul 03, 2013 #2044 randerso Removed mappings from tpXXX to tp_XXX for RFCQPF
Mar 31, 2014 #2934 dgilling Updated params for pSurge2.0/PHISH data.
-->
<aliasList caseSensitive="true" namespace="gfeParamName">
<alias base="AV">av</alias>
@ -308,37 +309,6 @@
<alias base="tp6c8">tp6c8</alias>
<alias base="TP6mean">tpmean6</alias>
<alias base="TP6sprd">tpsprd6</alias>
<alias base="PSurge0ftRun">PSurge0Ft</alias>
<alias base="PSurge1ftRun">PSurge1Ft</alias>
<alias base="PSurge4ftRun">PSurge4Ft</alias>
<alias base="PSurge5ftRun">PSurge5Ft</alias>
<alias base="PSurge6ftRun">PSurge6Ft</alias>
<alias base="Surge20pctRun">Surge20Pct</alias>
<alias base="PSurge7ftRun">PSurge7Ft</alias>
<alias base="PSurge8ftRun">PSurge8Ft</alias>
<alias base="PSurge9ftRun">PSurge9Ft</alias>
<alias base="PSurge10ftRun">PSurge10Ft</alias>
<alias base="Surge30pctRun">Surge30Pct</alias>
<alias base="PSurge11ftRun">PSurge11Ft</alias>
<alias base="PSurge12ftRun">PSurge12Ft</alias>
<alias base="PSurge13ftRun">PSurge13Ft</alias>
<alias base="Surge40pctRun">Surge40Pct</alias>
<alias base="PSurge14ftRun">PSurge14Ft</alias>
<alias base="PSurge15ftRun">PSurge15Ft</alias>
<alias base="PSurge16ftRun">PSurge16Ft</alias>
<alias base="Surge50pctRun">Surge50Pct</alias>
<alias base="PSurge17ftRun">PSurge17Ft</alias>
<alias base="PSurge18ftRun">PSurge18Ft</alias>
<alias base="PSurge19ftRun">PSurge19Ft</alias>
<alias base="PSurge20ftRun">PSurge20Ft</alias>
<alias base="PSurge2ftRun">PSurge2Ft</alias>
<alias base="PSurge21ftRun">PSurge21Ft</alias>
<alias base="PSurge22ftRun">PSurge22Ft</alias>
<alias base="PSurge23ftRun">PSurge23Ft</alias>
<alias base="PSurge24ftRun">PSurge24Ft</alias>
<alias base="PSurge25ftRun">PSurge25Ft</alias>
<alias base="PSurge3ftRun">PSurge3Ft</alias>
<alias base="Surge10pctRun">Surge10Pct</alias>
<alias base="TP-ECMWF">tpecmwf</alias>
<alias base="TPW">tpw</alias>
<alias base="Tsprd">tsprd</alias>
@ -373,4 +343,61 @@
<alias base="WSsprd">wssprd</alias>
<alias base="wxType">wx</alias>
<alias base="zAGL">zagl</alias>
<alias base="Surge10pctCumul">Surge10Pct</alias>
<alias base="Surge20pctCumul">Surge20Pct</alias>
<alias base="Surge30pctCumul">Surge30Pct</alias>
<alias base="Surge40pctCumul">Surge40Pct</alias>
<alias base="Surge50pctCumul">Surge50Pct</alias>
<alias base="PSurge0ftCumul">PSurge0Ft</alias>
<alias base="PSurge1ftCumul">PSurge1Ft</alias>
<alias base="PSurge2ftCumul">PSurge2Ft</alias>
<alias base="PSurge3ftCumul">PSurge3Ft</alias>
<alias base="PSurge4ftCumul">PSurge4Ft</alias>
<alias base="PSurge5ftCumul">PSurge5Ft</alias>
<alias base="PSurge6ftCumul">PSurge6Ft</alias>
<alias base="PSurge7ftCumul">PSurge7Ft</alias>
<alias base="PSurge8ftCumul">PSurge8Ft</alias>
<alias base="PSurge9ftCumul">PSurge9Ft</alias>
<alias base="PSurge10ftCumul">PSurge10Ft</alias>
<alias base="PSurge11ftCumul">PSurge11Ft</alias>
<alias base="PSurge12ftCumul">PSurge12Ft</alias>
<alias base="PSurge13ftCumul">PSurge13Ft</alias>
<alias base="PSurge14ftCumul">PSurge14Ft</alias>
<alias base="PSurge15ftCumul">PSurge15Ft</alias>
<alias base="PSurge16ftCumul">PSurge16Ft</alias>
<alias base="PSurge17ftCumul">PSurge17Ft</alias>
<alias base="PSurge18ftCumul">PSurge18Ft</alias>
<alias base="PSurge19ftCumul">PSurge19Ft</alias>
<alias base="PSurge20ftCumul">PSurge20Ft</alias>
<alias base="PSurge21ftCumul">PSurge21Ft</alias>
<alias base="PSurge22ftCumul">PSurge22Ft</alias>
<alias base="PSurge23ftCumul">PSurge23Ft</alias>
<alias base="PSurge24ftCumul">PSurge24Ft</alias>
<alias base="PSurge25ftCumul">PSurge25Ft</alias>
<alias base="Surge10pct6hr">Surge10Pctincr</alias>
<alias base="Surge20pct6hr">Surge20Pctincr</alias>
<alias base="Surge30pct6hr">Surge30Pctincr</alias>
<alias base="Surge40pct6hr">Surge40Pctincr</alias>
<alias base="Surge50pct6hr">Surge50Pctincr</alias>
<alias base="PSurge0ft6hr">PSurge0Ftincr</alias>
<alias base="PSurge1ft6hr">PSurge1Ftincr</alias>
<alias base="PSurge2ft6hr">PSurge2Ftincr</alias>
<alias base="PSurge3ft6hr">PSurge3Ftincr</alias>
<alias base="PSurge4ft6hr">PSurge4Ftincr</alias>
<alias base="PSurge5ft6hr">PSurge5Ftincr</alias>
<alias base="PSurge6ft6hr">PSurge6Ftincr</alias>
<alias base="PSurge7ft6hr">PSurge7Ftincr</alias>
<alias base="PSurge8ft6hr">PSurge8Ftincr</alias>
<alias base="PSurge9ft6hr">PSurge9Ftincr</alias>
<alias base="PSurge10ft6hr">PSurge10Ftincr</alias>
<alias base="PSurge11ft6hr">PSurge11Ftincr</alias>
<alias base="PSurge12ft6hr">PSurge12Ftincr</alias>
<alias base="PSurge13ft6hr">PSurge13Ftincr</alias>
<alias base="PSurge14ft6hr">PSurge14Ftincr</alias>
<alias base="PSurge15ft6hr">PSurge15Ftincr</alias>
<alias base="PSurge16ft6hr">PSurge16Ftincr</alias>
<alias base="PSurge17ft6hr">PSurge17Ftincr</alias>
<alias base="PSurge18ft6hr">PSurge18Ftincr</alias>
<alias base="PSurge19ft6hr">PSurge19Ftincr</alias>
<alias base="PSurge20ft6hr">PSurge20Ftincr</alias>
</aliasList>

View file

@ -37,6 +37,8 @@
# to get correct offsets for Alaska
# 01/17/2014 #2719 randerso Added NHA domain
# 02/20/2014 #2824 randerso Added log message when local override files are not found
# 03/11/2014 #2897 dgilling Add new MHWM databases to default configuration.
# 03/20/2014 #2418 dgilling Remove unneeded D2D source PHISH.
#
########################################################################
@ -1023,7 +1025,6 @@ D2DDBVERSIONS = {
"HPCERP": 5,
"TPCProb": 30,
"TPCStormSurge": 1,
"PHISH": 1,
"CRMTopo": 1,
"NED": 1,
}
@ -1063,7 +1064,11 @@ if SID in ALASKA_SITES:
'RTOFS-Arctic',
'RTOFS-Bering',
'RTOFS-GulfAlaska',
'RTOFS-HudsonBaffin'
'RTOFS-HudsonBaffin',
'NPHwave15',
'AKHwave10',
'AKHwave4',
'GLOBHwave',
]
# Hawaii OCONUS
@ -1082,6 +1087,10 @@ elif SID == "HFO":
('TPCWindProb', 'TPCProb'),
('ECMWF-HiRes','ECMWFHiRes'),
'RTOFS-Honolulu',
'NPHwave15',
'WPHwave10',
'NPHwave4',
'GLOBHwave',
]
# San Juan OCONUS
@ -1105,6 +1114,10 @@ elif SID == "SJU":
('TPCWindProb', 'TPCProb'),
('ECMWF-HiRes','ECMWFHiRes'),
'RTOFS-Atlantic',
'NAHwave15',
'NAHwave10',
'NAHwave4',
'GLOBHwave',
]
# Guam OCONUS
@ -1114,7 +1127,9 @@ elif SID == "GUM":
'GWW233',
'GlobalWave',
('TPCWindProb', 'TPCProb'),
'RTOFS-Guam'
'RTOFS-Guam',
'WPHwave10',
'GLOBHwave',
]
#CONUS sites
@ -1138,7 +1153,6 @@ elif SID in CONUS_EAST_SITES:
'GLERL',
'WNAWAVE238',
('TPCSurgeProb','TPCStormSurge'), # DCS3462
'PHISH',
'GlobalWave',
'EPwave10',
'AKwave10',
@ -1165,6 +1179,14 @@ elif SID in CONUS_EAST_SITES:
('SPCGuide', 'SPC'),
('ECMWF-HiRes','ECMWFHiRes'),
('ENPWAVE253', 'ENPwave'),
'NAHwave15',
'NAHwave10',
'NAHwave4',
'NPHwave15',
'NPHwave10',
'NPHwave4',
'WPHwave10',
'GLOBHwave',
]
else: #######DCS3501 WEST_CONUS
@ -1188,7 +1210,6 @@ else: #######DCS3501 WEST_CONUS
'GLERL',
'WNAWAVE238',
('TPCSurgeProb','TPCStormSurge'), # DCS3462
'PHISH',
'GlobalWave',
'EPwave10',
'WCwave10',
@ -1216,6 +1237,14 @@ else: #######DCS3501 WEST_CONUS
('SPCGuide', 'SPC'),
('ECMWF-HiRes','ECMWFHiRes'),
('ENPWAVE253', 'ENPwave'),
'NAHwave15',
'NAHwave10',
'NAHwave4',
'NPHwave15',
'NPHwave10',
'NPHwave4',
'WPHwave10',
'GLOBHwave',
]
if SID in GreatLake_SITES:

View file

@ -87,6 +87,7 @@ from com.raytheon.uf.edex.database.cluster import ClusterTask
# 01/09/14 16952 randerso Fix regression made in #2517 which caused errors with overlapping grids
# 02/04/14 17042 ryu Check in changes for randerso.
# 04/03/2014 2737 randerso Allow iscMosaic to blankOtherPeriods even when no grids received
# 04/11/2014 17242 David Gillingham (code checked in by zhao)
#
BATCH_DELAY = 0.0
@ -909,8 +910,7 @@ class IscMosaic:
destGrid, history = grid
self.__dbGrid = (destGrid, history, tr)
else:
self.logProblem("Unable to access grid for ",
self.__printTR(tr), "for ", self.__parmName)
logger.error("Unable to access grid for "+self.__printTR(tr) +" for " + self.__parmName)
return None
return (self.__dbGrid[0], self.__dbGrid[1])

View file

@ -51,6 +51,7 @@ from com.raytheon.uf.common.localization import LocalizationContext_Localization
# methods where it's needed.
# 11/07/13 2517 randerso Allow getLogger to override logLevel
# 01/22/14/ 2504 randerso Added hostname to log path
# 04/10/2014 17241 David Gillingham (code checked in by zhao)
#
#
@ -297,8 +298,12 @@ def getLogger(scriptName, logName=None, logLevel=logging.INFO):
logFile = os.path.join(logPath, logName)
if not os.path.exists(logPath):
try:
os.makedirs(logPath)
except OSError as e:
import errno
if e.errno != errno.EEXIST:
raise e
theLog = logging.getLogger(scriptName)
theLog.setLevel(logLevel)

View file

@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
Mar 31, 2014 #2934 dgilling Added new FHAG0 level needed for pSurge2.0.
-->
<LevelMappings>
<Level key="BL030">
<DatabaseLevel levelName="BL" levelOneValue="0.0" levelTwoValue="30.0" unit="hPa"/>
@ -237,6 +240,9 @@
<Level key="FH13716">
<DatabaseLevel levelName="FH" levelOneValue="13716.0" unit="m"/>
</Level>
<Level key="FHAG0">
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" unit="m"/>
</Level>
<Level key="FHAG2">
<DatabaseLevel levelName="FHAG" levelOneValue="2.0" unit="m"/>
</Level>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -1,819 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Oct 03, 2013 #2418 dgilling Initial Creation.
-->
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>21600</fcst>
<fcst>43200</fcst>
<fcst>64800</fcst>
<fcst>86400</fcst>
<fcst>108000</fcst>
<fcst>129600</fcst>
<fcst>151200</fcst>
<fcst>172800</fcst>
<fcst>194400</fcst>
<fcst>216000</fcst>
<fcst>237600</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge10Pct</short_name>
<long_name>10% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE10pct</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge20Pct</short_name>
<long_name>20% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE20pct</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge30Pct</short_name>
<long_name>30% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE30pct</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge40Pct</short_name>
<long_name>40% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE40pct</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge50Pct</short_name>
<long_name>50% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE50pct</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge0Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 0 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge00c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge1Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 1 foot</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge01c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge2Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 2 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge02c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge3Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 3 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge03c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge4Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 4 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge04c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge5Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 5 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge05c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge6Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 6 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge06c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge7Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 7 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge07c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge8Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 8 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge08c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge9Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 9 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge09c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge10Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 10 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge10c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge11Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 11 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge11c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge12Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 12 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge12c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge13Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 13 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge13c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge14Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 14 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge14c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge15Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 15 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge15c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge16Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 16 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge16c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge17Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 17 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge17c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge18Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 18 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge18c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge19Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 19 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge19c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge20Ft</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 20 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge20c</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge10pct6hr</short_name>
<long_name>10% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE10pct6hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge20pct6hr</short_name>
<long_name>20% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE20pct6hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge30pct6hr</short_name>
<long_name>30% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE30pct6hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge40pct6hr</short_name>
<long_name>40% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE40pct6hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>Surge50pct6hr</short_name>
<long_name>50% Exceedance Height</long_name>
<units>feet</units>
<udunits>feet</udunits>
<uiname>SURGE50pct6hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>25.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge0ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 0 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge006hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge1ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 1 foot</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge016hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge2ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 2 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge026hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge3ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 3 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge036hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge4ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 4 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge046hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge5ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 5 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge056hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge6ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 6 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge066hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge7ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 7 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge076hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge8ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 8 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge086hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge9ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 9 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge096hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge10ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 10 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge106hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge11ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 11 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge116hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge12ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 12 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge126hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge13ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 13 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge136hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge14ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 14 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge146hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge15ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 15 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge156hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge16ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 16 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge166hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge17ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 17 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge176hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge18ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 18 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge186hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge19ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 19 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge196hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>PSurge20ft6hr</short_name>
<long_name>Prob of Hurricane Storm Surge &gt; 20 feet</long_name>
<units>%</units>
<udunits>percent</udunits>
<uiname>ProbSurge206hr</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-9999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticTopo</short_name>
<long_name>Topography</long_name>
<units>meters</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
</gridParamInfo>

View file

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>0</fcst>
<fcst>10800</fcst>
<fcst>21600</fcst>
<fcst>32400</fcst>
<fcst>43200</fcst>
<fcst>54000</fcst>
<fcst>64800</fcst>
<fcst>75600</fcst>
<fcst>86400</fcst>
<fcst>97200</fcst>
<fcst>108000</fcst>
<fcst>118800</fcst>
<fcst>129600</fcst>
<fcst>140400</fcst>
<fcst>151200</fcst>
<fcst>162000</fcst>
<fcst>172800</fcst>
<fcst>183600</fcst>
<fcst>194400</fcst>
<fcst>205200</fcst>
<fcst>216000</fcst>
<fcst>226800</fcst>
<fcst>237600</fcst>
<fcst>248400</fcst>
<fcst>259200</fcst>
<fcst>280800</fcst>
<fcst>302400</fcst>
<fcst>324000</fcst>
<fcst>345600</fcst>
<fcst>367200</fcst>
<fcst>388800</fcst>
<fcst>410400</fcst>
<fcst>432000</fcst>
<fcst>453600</fcst>
</valtimeMINUSreftime>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>perpw</short_name>
<long_name>Primary wave period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>primaryWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvhgt</short_name>
<long_name>Wind wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticSpacing</short_name>
<long_name>Grid spacing</long_name>
<units>meters</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>vw</short_name>
<long_name>v-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>vWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swdir</short_name>
<long_name>Swell peak period direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>swellWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/s</units>
<fillValue>-999999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wd</short_name>
<long_name>Wind Direction</long_name>
<units>degreeTrue</units>
<udunits>degree_True</udunits>
<uiname>windDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvdir</short_name>
<long_name>Direction of wind waves (from which)</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>dirWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wvper</short_name>
<long_name>Wind wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>peakPeriodWindWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>htsgw</short_name>
<long_name>Sig height combined wind waves and swell</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightWindWavesandSwell</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swper</short_name>
<long_name>Swell wave peak period</long_name>
<units>s</units>
<udunits>seconds</udunits>
<uiname>swellWavePeriod</uiname>
<valid_range>0.0</valid_range>
<valid_range>100.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>swell</short_name>
<long_name>Significant swell wave height</long_name>
<units>m</units>
<udunits>meters</udunits>
<uiname>heightSwellWaves</uiname>
<valid_range>0.0</valid_range>
<valid_range>50.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>OSEQD 1 2</levelsDesc>
<levels>
<level>OSEQD1</level>
<level>OSEQD2</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>dirpw</short_name>
<long_name>Primary wave direction</long_name>
<units>degree true</units>
<udunits>degree_True</udunits>
<uiname>primaryWaveDir</uiname>
<valid_range>0.0</valid_range>
<valid_range>360.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>uw</short_name>
<long_name>u-component wind</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>uWind</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>ws</short_name>
<long_name>Wind Speed</long_name>
<units>m/s</units>
<udunits>meter/sec</udunits>
<uiname>windSpeed</uiname>
<valid_range>-150.0</valid_range>
<valid_range>150.0</valid_range>
<fillValue>-999999.0</fillValue>
<n3D>1</n3D>
<levelsDesc>SFC</levelsDesc>
<levels>
<level>SFC</level>
</levels>
</gridParameterInfo>
</gridParamInfo>

View file

@ -110,7 +110,7 @@
<level>SFC</level>
</levels>
</gridParameterInfo>
<gribParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>hailprob</short_name>
<long_name>Hail Probability</long_name>
<units>%</units>
@ -123,8 +123,8 @@
<levels>
<level>SFC</level>
</levels>
</gribParameterInfo>
<gribParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>windprob</short_name>
<long_name>Damaging Wind Probability</long_name>
<units>%</units>
@ -137,8 +137,8 @@
<levels>
<level>SFC</level>
</levels>
</gribParameterInfo>
<gribParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>sigtrndprob</short_name>
<long_name>Extreme Tornado Probability</long_name>
<units>%</units>
@ -151,8 +151,8 @@
<levels>
<level>SFC</level>
</levels>
</gribParameterInfo>
<gribParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>sighailprob</short_name>
<long_name>Extreme Hail Probability</long_name>
<units>%</units>
@ -165,8 +165,8 @@
<levels>
<level>SFC</level>
</levels>
</gribParameterInfo>
<gribParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>sigwindprob</short_name>
<long_name>Extreme Damaging Wind Probability</long_name>
<units>%</units>
@ -179,8 +179,8 @@
<levels>
<level>SFC</level>
</levels>
</gribParameterInfo>
<gribParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>prsvr</short_name>
<long_name>Combined Severe Probability</long_name>
<units>%</units>
@ -193,8 +193,8 @@
<levels>
<level>SFC</level>
</levels>
</gribParameterInfo>
<gribParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</gridParameterInfo>
<gridParameterInfo xsi:type="parameterInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<short_name>prsigsv</short_name>
<long_name>Combined Extreme Severe Probability</long_name>
<units>%</units>
@ -208,5 +208,5 @@
<levels>
<level>SFC</level>
</levels>
</gribParameterInfo>
</gridParameterInfo>
</gridParamInfo>

View file

@ -59,7 +59,7 @@ from com.raytheon.uf.common.parameter.mapping import ParameterMapper;
# Static values for accessing parameter lookup tables
PARAMETER_TABLE = "4.2"
GENPROCESS_TABLE = "A"
PROCESS_TYPE_TABLE = "4.3"
LEVELS_TABLE = "4.5"
DOT = "."
MISSING = "Missing"
@ -429,6 +429,9 @@ class GribDecoder():
gribDict['parameterName'] = MISSING
parameterAbbreviation = MISSING
gribDict['parameterUnit'] = MISSING
processType = int(pdsTemplate[2])
gribDict['processType'] = str(GribTableLookup.getInstance().getTableValue(centerID, subcenterID, PROCESS_TYPE_TABLE, processType))
levelName = None;
levelUnit = None;
@ -1157,7 +1160,8 @@ class GribDecoder():
subcenter = gribDict['subcenter']
process = gribDict['genprocess']
gridModel = GribModelLookup.getInstance().getModel(center, subcenter, grid, process)
processType = gribDict['processType']
gridModel = GribModelLookup.getInstance().getModel(center, subcenter, grid, process, processType)
return gridModel
def _createModelName(self, gribDict, grid):
@ -1165,7 +1169,8 @@ class GribDecoder():
subcenter = gribDict['subcenter']
process = gribDict['genprocess']
return GribModelLookup.getInstance().getModelName(center, subcenter, grid, process)
processType = gribDict['processType']
return GribModelLookup.getInstance().getModelName(center, subcenter, grid, process, processType)
def _checkForecastFlag(self, gribDict, grid, dataTime):
gridModel = self._getGridModel(gribDict, grid)

View file

@ -899,7 +899,7 @@ public class Grib1Decoder extends AbstractDecoder {
private String createModelName(int centerId, int subcenterId, int process,
GridCoverage grid) {
return GribModelLookup.getInstance().getModelName(centerId,
subcenterId, grid, process);
subcenterId, grid, process, null);
}
/**
@ -915,7 +915,7 @@ public class Grib1Decoder extends AbstractDecoder {
private void checkForecastFlag(DataTime time, int centerId,
int subcenterId, int process, GridCoverage grid) {
GridModel gridModel = GribModelLookup.getInstance().getModel(centerId,
subcenterId, grid, process);
subcenterId, grid, process, null);
if ((gridModel != null) && gridModel.getAnalysisOnly()) {
time.getUtilityFlags().remove(FLAG.FCST_USED);
}

View file

@ -225,7 +225,7 @@ public class EnsembleGridAssembler implements IDecoderPostProcessor {
updateExistingRecord(record, assembledRecord, thinned, dao);
}
EDEXUtil.getMessageProducer().sendAsync("notificationAggregation",
new PluginDataObject[] { record });
new PluginDataObject[] { assembledRecord });
}
private GridRecord createAssembledRecord(GridRecord record,

View file

@ -25,7 +25,6 @@ import java.util.List;
import com.raytheon.edex.plugin.grib.exception.GribException;
import com.raytheon.uf.common.dataplugin.grid.GridConstants;
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
import com.raytheon.uf.common.dataquery.db.QueryParam.QueryOperand;
import com.raytheon.uf.edex.database.plugin.PluginFactory;
import com.raytheon.uf.edex.database.query.DatabaseQuery;
import com.raytheon.uf.edex.plugin.grid.dao.GridDao;
@ -43,6 +42,7 @@ import com.raytheon.uf.edex.plugin.grid.dao.GridDao;
* Aug 31, 2010 5875 bphillip Initial Creation
* Mar 26, 2013 1821 bsteffen Optimize FFG version query.
* Oct 15, 2013 2473 bsteffen Remove deprecated method calls.
* Apr 25, 2014 2060 njensen Remove dependency on grid dataURI column
*
* </pre>
*
@ -57,13 +57,14 @@ public class FFGGribPostProcessor implements IDecoderPostProcessor {
try {
GridDao gribDao = (GridDao) PluginFactory.getInstance()
.getPluginDao(GridConstants.GRID);
record.setSecondaryId("%");
record.setDataURI(null);
/*
* All we want to do is check for pre-existing records, and if some
* are found, increment the version number in the secondaryId so
* it's not identified as a duplicate
*/
DatabaseQuery query = new DatabaseQuery(GridRecord.class);
query.addReturnedField(GridConstants.SECONDARY_ID);
// The dataURI constraint does the final selection but the other
// constraints help the db optimize efficiently.
query.addQueryParam(GridConstants.DATASET_ID, record.getDatasetId());
query.addQueryParam(GridConstants.PARAMETER_ABBREVIATION, record
.getParameter().getAbbreviation());
@ -71,9 +72,21 @@ public class FFGGribPostProcessor implements IDecoderPostProcessor {
.getId());
query.addQueryParam(GridConstants.LOCATION_ID, record.getLocation()
.getId());
query.addQueryParam("dataURI", record.getDataURI(),
QueryOperand.LIKE);
query.addQueryParam("dataTime.refTime", record.getDataTime()
.getRefTime());
query.addQueryParam("dataTime.fcstTime", record.getDataTime()
.getFcstTime());
query.addQueryParam(GridConstants.ENSEMBLE_ID,
record.getEnsembleId());
List<?> result = gribDao.queryByCriteria(query);
/*
* TODO this does not appear to be cluster safe, but we probably
* dodge it due to the low frequency of this data arriving for the
* same parameters, time, etc
*/
// find the highest version number
int maxVersion = -1;
for (Object row : result) {
String secondaryId = (String) row;
@ -90,6 +103,7 @@ public class FFGGribPostProcessor implements IDecoderPostProcessor {
}
record.setSecondaryId("Version" + (maxVersion + 1));
record.getInfo().setId(null);
// clear out dataURI in case it was cached
record.setDataURI(null);
} catch (Exception e) {
throw new GribException("Error decoding FFG grid", e);

View file

@ -25,7 +25,7 @@ import java.util.Map;
import javax.measure.converter.UnitConverter;
import javax.measure.unit.SI;
import javax.xml.bind.JAXBException;
import javax.xml.bind.JAXB;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
@ -39,9 +39,7 @@ import com.raytheon.uf.common.localization.ILocalizationFileObserver;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.localization.exception.LocalizationException;
import com.raytheon.uf.common.parameter.Parameter;
import com.raytheon.uf.common.serialization.JAXBManager;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
@ -62,6 +60,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
* Date Ticket# Engineer Description
* ------------- -------- ----------- --------------------------
* Mar 28, 2010 2874 bsteffen Initial creation
* Apr 25, 2014 2060 njensen Use JAXB instead of JAXBManager
*
*
* </pre>
@ -93,31 +92,23 @@ public class TemperatureCorrectionPostProcessor implements
}
}
protected LocalizationFile readConfiguration() throws GribException {
protected LocalizationFile readConfiguration() {
LocalizationFile file = PathManagerFactory.getPathManager()
.getStaticLocalizationFile(LOCALIZATON_LOCATION);
Map<String, Double> paramThresholdMap = new HashMap<String, Double>(8);
if (file != null && file.exists()) {
JAXBManager manager = null;
try {
manager = new JAXBManager(TemperatureCorrectionParameters.class);
} catch (JAXBException e) {
/* No hope of recovering */
throw new GribException(
"Error occured preparing to load temperate correction parameters.",
e);
}
TemperatureCorrectionParameters params = null;
try {
params = file.jaxbUnmarshal(
TemperatureCorrectionParameters.class, manager);
} catch (LocalizationException e) {
params = JAXB.unmarshal(file.getFile(),
TemperatureCorrectionParameters.class);
} catch (Exception e) {
/* Some hope of recovering with a better file. */
statusHandler
.error("Error occured loading temperate correction parameters, verify the file is formatted correctly.",
e);
}
if (params != null) {
for (TemperatureCorrectionParameter param : params
.getParameters()) {
@ -134,7 +125,7 @@ public class TemperatureCorrectionPostProcessor implements
public void fileUpdated(FileUpdatedMessage message) {
try {
readConfiguration();
} catch (GribException e) {
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
}
}

View file

@ -55,6 +55,8 @@ import com.raytheon.uf.common.util.mapping.MultipleMappingException;
* reverse.
* Apr 30, 2013 1961 bsteffen Add ability to disable grib tables.
* Oct 14, 2013 2473 bsteffen Remove lookup of deprecated grib files.
* Apr 25, 2014 2874 bsteffen Add processType
*
*
* </pre>
*
@ -94,42 +96,60 @@ public class GribModelLookup {
initModelList();
}
public GridModel getModel(int center, int subcenter, String grid,
int process) {
GridModel model = models.get(toKey(center, subcenter, grid, process));
if (model == null) {
// See if there is a version for all grids.
model = models.get(toKey(center, subcenter, null, process));
/**
* Get a model based off some fields in the grib file.
*
* @param center
* the id of the center
* @param subcenter
* the id of the subcenter
* @param grid
* gridcoverage as defined in the grib file(don't use subgrids)
* @param process
* the process id
* @param processType
* the process type, although this is a byte in the grib file
* this method expects the byte to be resolved to a string by
* looking up the type id in the grib tables(4.3). grib1 does not
* include a value for process type so null is acceptable.
* @return The grid model if one is find or null if no such model is defined
* in the localization files..
*/
public GridModel getModel(int center, int subcenter, GridCoverage grid,
int process, String processType) {
/* Match all fields */
GridModel model = getModelSimple(center, subcenter, grid, process,
processType);
if (model == null && processType != null) {
/* Match with no processType specified */
model = getModelSimple(center, subcenter, grid, process, null);
}
if (model == null && grid != null) {
/* Match with no grid specified */
model = getModelSimple(center, subcenter, null, process,
processType);
}
if (model == null && grid != null && processType != null) {
/* Match with no grid or processType */
model = getModelSimple(center, subcenter, null, process, null);
}
return model;
}
public GridModel getModel(int center, int subcenter, GridCoverage grid,
int process) {
GridModel model = null;
if (grid.getName() != null) {
models.get(toKey(center, subcenter, grid.getName(), process));
}
if (model == null) {
private GridModel getModelSimple(int center, int subcenter,
GridCoverage grid, int process, String processType) {
if (grid != null) {
for (String gribGridName : GribSpatialCache.getInstance()
.getGribCoverageNames(grid)) {
model = models.get(toKey(center, subcenter, gribGridName,
process));
String key = toKey(center, subcenter, gribGridName, process,
processType);
GridModel model = models.get(key);
if (model != null) {
break;
return model;
}
}
if (model == null) {
// last step is to look for a matching center, subcenter, and
// process with no grid.
model = models.get(toKey(center, subcenter, null, process));
}
}
return model;
}
public GridModel getModel(int center, int subcenter, int gridid, int process) {
return getModel(center, subcenter, String.valueOf(gridid), process);
return null;
}
public GridModel getModelByName(String name) {
@ -141,8 +161,9 @@ public class GribModelLookup {
}
public String getModelName(int center, int subcenter, GridCoverage grid,
int process) {
GridModel model = getModel(center, subcenter, grid, process);
int process, String processType) {
GridModel model = getModel(center, subcenter, grid, process,
processType);
if (model == null || model.getName() == null) {
String cenSubProc = "GribModel:" + String.valueOf(center) + ":"
+ String.valueOf(subcenter) + ":" + String.valueOf(process);
@ -219,41 +240,32 @@ public class GribModelLookup {
private void addModels(GridModelSet modelSet) {
for (GridModel model : modelSet.getModels()) {
int subCenter = Integer.parseInt(model.getSubCenter());
modelsByName.put(model.getName(), model);
for (int process : model.getProcess()) {
if (model.getAllGrids().isEmpty()) {
models.put(
toKey(model.getCenter(),
Integer.parseInt(model.getSubCenter()),
null, process), model);
String key = toKey(model.getCenter(), subCenter, null,
process, model.getProcessType());
models.put(key, model);
}
for (String grid : model.getAllGrids()) {
models.put(
toKey(model.getCenter(),
Integer.parseInt(model.getSubCenter()),
grid, process), model);
String key = toKey(model.getCenter(), subCenter, grid,
process, model.getProcessType());
models.put(key, model);
}
}
}
}
private String toKey(Integer center, Integer subcenter, String grid,
Integer process) {
Integer process, String processType) {
StringBuilder builder = new StringBuilder();
builder.append(center);
builder.append(subcenter);
builder.append(grid);
builder.append(process);
builder.append(processType);
return builder.toString();
// final int PRIME = 31;
// int result = 1;
// result = PRIME * result + ((center == null) ? 0 : center.hashCode());
// result = PRIME * result
// + ((subcenter == null) ? 0 : subcenter.hashCode());
// result = PRIME * result + ((grid == null) ? 0 : grid.hashCode());
// result = PRIME * result + ((process == null) ? 0 :
// process.hashCode());
// return result;
}
}

View file

@ -76,6 +76,10 @@ public class GridModel {
@XmlElement(name = "id")
private ArrayList<Integer> process;
/** The generating processes associated with this model */
@XmlElement
private String processType;
@XmlElement
private String alias;
@ -130,6 +134,14 @@ public class GridModel {
public void setProcess(ArrayList<Integer> process) {
this.process = process;
}
public String getProcessType() {
return processType;
}
public void setProcessType(String processType) {
this.processType = processType;
}
public Integer getCenter() {
return center;

View file

@ -23,10 +23,10 @@
<description>HudsonBaffin Real Time Ocean Forecast System</description>
<firstGridPointCorner>LowerLeft</firstGridPointCorner>
<spacingUnit>degree</spacingUnit>
<la1>45.0</la1>
<la1>40.0</la1>
<lo1>251.0</lo1>
<nx>328</nx>
<ny>132</ny>
<ny>152</ny>
<dx>0.25</dx>
<dy>0.25</dy>
</latLonGridCoverage>

View file

@ -27,10 +27,10 @@
<id>RTOFS-Alaska</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-Arctic</name>
<center>7</center>
@ -39,10 +39,10 @@
<id>RTOFS-Arctic</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-Bering</name>
<center>7</center>
@ -51,10 +51,10 @@
<id>RTOFS-Bering</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-Guam</name>
<center>7</center>
@ -63,10 +63,10 @@
<id>RTOFS-Guam</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-GulfAlaska</name>
<center>7</center>
@ -75,10 +75,10 @@
<id>RTOFS-GulfAlaska</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-Honolulu</name>
<center>7</center>
@ -87,10 +87,10 @@
<id>RTOFS-Honolulu</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-HudsonBaffin</name>
<center>7</center>
@ -99,10 +99,10 @@
<id>RTOFS-HudsonBaffin</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-Samoa</name>
<center>7</center>
@ -111,10 +111,10 @@
<id>RTOFS-Samoa</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-TropPaciLowres</name>
<center>7</center>
@ -123,10 +123,10 @@
<id>RTOFS-TropPaciLowres</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-WestAtl</name>
<center>7</center>
@ -135,10 +135,10 @@
<id>RTOFS-WestAtl</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-WestConus</name>
<center>7</center>
@ -147,10 +147,10 @@
<id>RTOFS-WestConus</id>
</grids>
<process>
<id>0</id>
<id>85</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-Atlantic</name>
<center>7</center>
@ -160,7 +160,6 @@
<id>45</id>
</process>
</model>
<model>
<name>RTOFS-Atlantic-HiRes</name>
<center>7</center>
@ -169,8 +168,8 @@
<process>
<id>45</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-GulfMaine</name>
<center>7</center>
@ -179,8 +178,8 @@
<process>
<id>45</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-GulfMexico</name>
<center>7</center>
@ -189,8 +188,8 @@
<process>
<id>45</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-GulfStream</name>
<center>7</center>
@ -199,5 +198,187 @@
<process>
<id>45</id>
</process>
<processType>Forecast</processType>
</model>
<model>
<name>RTOFS-Now-Alaska</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-Alaska</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-Arctic</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-Arctic</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-Bering</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-Bering</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-Guam</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-Guam</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-GulfAlaska</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-GulfAlaska</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-Honolulu</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-Honolulu</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-HudsonBaffin</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-HudsonBaffin</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-Samoa</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-Samoa</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-TropPaciLowres</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-TropPaciLowres</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-WestAtl</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-WestAtl</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-WestConus</name>
<center>7</center>
<subcenter>0</subcenter>
<grids>
<id>RTOFS-WestConus</id>
</grids>
<process>
<id>85</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-Atlantic</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>RTOFS-Atlantic</grid>
<process>
<id>45</id>
</process>
</model>
<model>
<name>RTOFS-Now-Atlantic-HiRes</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>RTOFS-Atlantic-HiRes</grid>
<process>
<id>45</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-GulfMaine</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>RTOFS-GulfMaine</grid>
<process>
<id>45</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-GulfMexico</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>RTOFS-GulfMexico</grid>
<process>
<id>45</id>
</process>
<processType>Nowcast</processType>
</model>
<model>
<name>RTOFS-Now-GulfStream</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>RTOFS-GulfStream</grid>
<process>
<id>45</id>
</process>
<processType>Nowcast</processType>
</model>
</gribModelSet>

View file

@ -2095,6 +2095,106 @@
<id>11</id>
</process>
</model>
<model>
<name>GLOBHwave</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>720311001</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>AKHwave10</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>15</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>AKHwave4</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>16</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>NAHwave15</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>238</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>NAHwave10</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>12</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>NAHwave4</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>18</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>NPHwave15</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>253</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>NPHwave10</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>13</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>NPHwave4</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>17</grid>
<process>
<id>13</id>
</process>
</model>
<model>
<name>WPHwave10</name>
<center>7</center>
<subcenter>0</subcenter>
<grid>14</grid>
<process>
<id>13</id>
</process>
</model>
<!-- END SUBCENTER 0 -->

View file

@ -8,6 +8,11 @@
6:6:Forecast error
7:7:Analysis error
8:8:Observation
# 9-191 Reserved
9:9:Climatological
10:10:Probability-Weighted Forecast
11:11:Bias-Corrected Ensemble Forecast
# 12-13 Reserved
14:14:Nowcast
# 15-191 Reserved
# 192-254 Reserved for local use
255:255:Missing

Some files were not shown because too many files have changed in this diff Show more