From c44e9f88f62a8f0c52ca6aa65c314f4a0b157c34 Mon Sep 17 00:00:00 2001 From: David Friedman Date: Thu, 3 Jul 2014 13:58:24 +0000 Subject: [PATCH] ASM #15052 - WarnGen: service backup should use config.xml from failed site Change-Id: Icff8ca2a124da595be6b83ac9f9999831daee0b1 Former-commit-id: 8784501bba23f3b07926e5410de70fa4d675bc44 [formerly a45fe1dad06c8c4d0df2c0f0df86ccb21d3509b2] [formerly 8784501bba23f3b07926e5410de70fa4d675bc44 [formerly a45fe1dad06c8c4d0df2c0f0df86ccb21d3509b2] [formerly db8977e2812d0603cfbe949876f44a636bf33201 [formerly f9c0dc09ee7bc692c6f70b4a5ad67bb2c2ed5a20]]] Former-commit-id: db8977e2812d0603cfbe949876f44a636bf33201 Former-commit-id: 5270711c5d39b75580d990fe25bdd62ea5d02e71 [formerly d36834080e872b33cbd4315adb68249150f34c9a] Former-commit-id: 4f53bbd556459ed69f92435e5eef547f60b12c59 --- .../viz/warngen/gui/WarngenDialog.java | 148 ++++++++++++------ .../viz/warngen/gui/WarngenLayer.java | 44 ++++++ .../warning/config/DialogConfiguration.java | 13 ++ .../dataplugin/warning/util/WarnFileUtil.java | 37 ++++- 4 files changed, 191 insertions(+), 51 deletions(-) diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java index fc95040d21..62272c75bb 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java @@ -154,6 +154,7 @@ import com.vividsolutions.jts.geom.Polygon; * Oct 01, 2013 DR16612 m.gamazaychikov Fixed inconsistencies with track locking and updateListSelected method * Oct 29, 2013 DR 16734 D. Friedman If redraw-from-hatched-area fails, don't allow the polygon the be used. * Apr 28, 2014 3033 jsanchez Re-initialized the Velocity Engine when switching back up sites. + * Jul 01, 2014 DR 17450 D. Friedman Use list of templates from backup site. * * * @author chammack @@ -482,30 +483,39 @@ public class WarngenDialog extends CaveSWTDialog implements * @param productType2 */ private void createOtherProductsList(Group productType2) { - other = new Button(productType, SWT.RADIO); - other.setText("Other:"); - other.setEnabled(true); - other.addSelectionListener(new SelectionAdapter() { + if (other == null) { + other = new Button(productType, SWT.RADIO); + other.setText("Other:"); + other.setEnabled(true); + other.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - otherSelected(); + @Override + public void widgetSelected(SelectionEvent arg0) { + otherSelected(); + } + + }); + + otherProductListCbo = new Combo(productType, SWT.READ_ONLY + | SWT.DROP_DOWN); + GridData gd = new GridData(SWT.RIGHT, SWT.DEFAULT, true, false); + otherProductListCbo.setLayoutData(gd); + otherProductListCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent arg0) { + otherProductSelected(); + } + + }); + } else { + other.setSelection(false); + if (mainProductBtns.length > 0 && mainProductBtns.length > 0) { + other.moveBelow(mainProductBtns[mainProductBtns.length - 1]); } + otherProductListCbo.moveBelow(other); + } - }); - - otherProductListCbo = new Combo(productType, SWT.READ_ONLY - | SWT.DROP_DOWN); - GridData gd = new GridData(SWT.RIGHT, SWT.DEFAULT, true, false); - otherProductListCbo.setLayoutData(gd); updateOtherProductList(otherProductListCbo); - otherProductListCbo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - otherProductSelected(); - } - - }); } private void createMainProductButtons(Group productType) { @@ -517,12 +527,13 @@ public class WarngenDialog extends CaveSWTDialog implements mainProducts.add(str); } - String defaultTemplate = warngenLayer.getDialogConfig() - .getDefaultTemplate(); - if ((defaultTemplate == null) || defaultTemplate.equals("")) { - defaultTemplate = mainProducts.get(0).split("/")[1]; - } + String defaultTemplate = getDefaultTemplate(); + if (mainProductBtns != null) { + for (Button button : mainProductBtns) { + button.dispose(); + } + } mainProductBtns = new Button[mainProducts.size()]; if (mainProducts.size() > 0) { @@ -538,24 +549,28 @@ public class WarngenDialog extends CaveSWTDialog implements mainProductBtns[0].addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - changeTemplate(mainProducts.get(0).split("/")[1]); + uiChangeTemplate(mainProducts.get(0).split("/")[1]); } }); } GridData gd = new GridData(SWT.RIGHT, SWT.DEFAULT, true, false); - gd.horizontalIndent = 30; - updateListCbo = new Combo(productType, SWT.READ_ONLY | SWT.DROP_DOWN); - updateListCbo.setLayoutData(gd); - recreateUpdates(); + if (updateListCbo == null) { + gd.horizontalIndent = 30; + updateListCbo = new Combo(productType, SWT.READ_ONLY | SWT.DROP_DOWN); + updateListCbo.setLayoutData(gd); + recreateUpdates(); - updateListCbo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - updateListSelected(); - } + updateListCbo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent arg0) { + updateListSelected(); + } - }); + }); + } else if (mainProductBtns.length > 0) { + updateListCbo.moveBelow(mainProductBtns[0]); + } for (int cnt = 1; cnt < mainProducts.size(); cnt++) { final String[] tmp = mainProducts.get(cnt).split("/"); @@ -584,7 +599,7 @@ public class WarngenDialog extends CaveSWTDialog implements } } - changeTemplate(templateName); + uiChangeTemplate(templateName); } } }); @@ -681,7 +696,7 @@ public class WarngenDialog extends CaveSWTDialog implements backupGroup.setLayout(new GridLayout(2, false)); Label label2 = new Label(backupGroup, SWT.BOLD); - label2.setText("Full:"); + label2.setText("WFO:"); label2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); backupSiteCbo = new Combo(backupGroup, SWT.READ_ONLY | SWT.DROP_DOWN); backupSiteCbo.addSelectionListener(new SelectionAdapter() { @@ -1320,9 +1335,28 @@ public class WarngenDialog extends CaveSWTDialog implements } else { new TemplateRunnerInitJob(backupSite).schedule(); } - // Refresh template - changeTemplate(warngenLayer.getTemplateName()); - resetPressed(); + + /* + * When the product selection buttons are recreated below, the + * button for the default template will be selected and mainProducts + * will have been recreated. Then getDefaultTemplate() can be used + * here to change the state. + */ + createMainProductButtons(productType); + createOtherProductsList(productType); + + // Don't let errors prevent the new controls from being displayed! + try { + changeTemplate(getDefaultTemplate()); + resetPressed(); + } catch (Exception e) { + statusHandler + .error("Error occurred while switching to the default template.", + e); + } + + productType.layout(true, true); + getShell().pack(true); } if (backupSiteCbo.getSelectionIndex() == 0) { @@ -1483,6 +1517,19 @@ public class WarngenDialog extends CaveSWTDialog implements return result; } + /** Called by controls that can change the current template. Do not + * do anything if the request template is already selected. This + * check is necessary to prevent certain state being reset if + * a followup has been selected as this is not handled by + * changeTemplate() (DR 14515.) + */ + private void uiChangeTemplate(String templateName) { + if (templateName.equals(warngenLayer.getTemplateName())) { + return; + } + changeTemplate(templateName); + } + /** * This method updates the Warngen Layer and Warngen Dialog based on a new * template selection. This method should also be called when the CWA is @@ -1495,11 +1542,6 @@ public class WarngenDialog extends CaveSWTDialog implements */ private void changeTemplate(String templateName) { - // DR 14515 - if (templateName.equals(warngenLayer.getTemplateName())) { - return; - } - String lastAreaSource = warngenLayer.getConfiguration() .getHatchedAreaSource().getAreaSource(); @@ -1634,6 +1676,7 @@ public class WarngenDialog extends CaveSWTDialog implements otherProducts = new HashMap(); String[] otherProductsStr = warngenLayer.getDialogConfig() .getOtherWarngenProducts().split(","); + theList.removeAll(); for (String str : otherProductsStr) { String[] s = str.split("/"); otherProducts.put(s[0], s[1]); @@ -1784,7 +1827,7 @@ public class WarngenDialog extends CaveSWTDialog implements templateName = otherProducts.get(otherProductListCbo .getItem(otherProductListCbo.getSelectionIndex())); } - changeTemplate(templateName); + uiChangeTemplate(templateName); otherProductListCbo.pack(true); productType.layout(); @@ -2251,7 +2294,7 @@ public class WarngenDialog extends CaveSWTDialog implements templateName = otherProducts.get(otherProductListCbo .getItem(otherProductListCbo.getSelectionIndex())); } - changeTemplate(templateName); + uiChangeTemplate(templateName); } private void refreshDisplay() { @@ -2503,4 +2546,13 @@ public class WarngenDialog extends CaveSWTDialog implements warngenLayer.issueRefresh(); } + private String getDefaultTemplate() { + String defaultTemplate = warngenLayer.getDialogConfig() + .getDefaultTemplate(); + if ((defaultTemplate == null) || defaultTemplate.equals("")) { + defaultTemplate = mainProducts.get(0).split("/")[1]; + } + return defaultTemplate; + } + } diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java index 9d660771d4..72506a7994 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java @@ -209,6 +209,7 @@ import com.vividsolutions.jts.io.WKTReader; * 04/15/2014 DR 17247 D. Friedman Rework error handling in AreaHatcher. * 04/28,2014 3033 jsanchez Properly handled back up configuration (*.xml) files. Set backupSite to null when backup site is not selected. * 05/16/2014 DR 17365 D. Friedman Check if moved vertex results in polygon valid in both lat/lon and local coordinates. + * 07/01/2014 DR 17450 D. Friedman Use list of templates from backup site. * * * @author mschenke @@ -1370,6 +1371,49 @@ public class WarngenLayer extends AbstractStormTrackResource { } else { backupSite = site; } + + DialogConfiguration dc = null; + if (backupSite != null) { + boolean haveBackupConfig = DialogConfiguration.isSiteDialogConfigExtant(backupSite); + if (haveBackupConfig) { + try { + dc = DialogConfiguration.loadDialogConfigNoUser(backupSite); + } catch (Exception e) { + statusHandler.error(String.format( + "Unable to load WarnGen configuration for site %s. Falling back to local configuration.", + getLocalizedSite()), e); + } + } else { + statusHandler.warn(String.format( + "WarnGen configuration for site %s does not exist. Falling back to local configuration.", + backupSite)); + } + if (dc == null) { + try { + dc = DialogConfiguration.loadDialogConfigNoUser(LocalizationManager + .getInstance().getCurrentSite()); + } catch (Exception e) { + dc = new DialogConfiguration(); + statusHandler.error(String.format( + "Unable to load WarnGen configuration for site %s.", + getLocalizedSite()), e); + } + } + } else { + try { + dc = DialogConfiguration.loadDialogConfig(LocalizationManager + .getInstance().getCurrentSite()); + } catch (Exception e) { + dc = new DialogConfiguration(); + statusHandler.error( + "Unable to load local WarnGen configuration.", e); + } + } + if (dc != null && dialogConfig != null) { + dialogConfig.setDefaultTemplate(dc.getDefaultTemplate()); + dialogConfig.setMainWarngenProducts(dc.getMainWarngenProducts()); + dialogConfig.setOtherWarngenProducts(dc.getOtherWarngenProducts()); + } } public String getLocalizedSite() { diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/DialogConfiguration.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/DialogConfiguration.java index e8f48f4f9e..7955e1a5b9 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/DialogConfiguration.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/DialogConfiguration.java @@ -43,6 +43,7 @@ import com.raytheon.uf.common.serialization.SingleTypeJAXBManager; * --/--/---- Initial creation * 10/22/2013 2361 njensen Use JAXBManager for XML * Apr 28, 2014 3033 jsanchez Refactored file retrieval. + * Jul 02, 2014 DR 17450 D. Friedman Support using list of templates from backup site. * * * @author jsanchez @@ -91,6 +92,18 @@ public class DialogConfiguration { return (DialogConfiguration) jaxb.unmarshalFromXml(xml); } + public static DialogConfiguration loadDialogConfigNoUser(String site) + throws FileNotFoundException, IOException, JAXBException { + String xml = WarnFileUtil.convertFileContentsToStringNoUser( + CONFIG_FILE, site); + return (DialogConfiguration) jaxb.unmarshalFromXml(xml); + } + + public static boolean isSiteDialogConfigExtant(String backupSite) { + return WarnFileUtil.isLocalizationFileExtantAtSiteLevel(CONFIG_FILE, + backupSite); + } + public String getWarngenOfficeShort() { return warngenOfficeShort; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/util/WarnFileUtil.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/util/WarnFileUtil.java index defda48d7b..adafb372a7 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/util/WarnFileUtil.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/util/WarnFileUtil.java @@ -25,12 +25,18 @@ import com.raytheon.uf.common.localization.PathManagerFactory; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Apr 28, 2014 3033 jsanchez Searches the backup site directory before the localized site directory. + * Jul 02, 2014 DR 17450 D. Friedman Support using list of templates from backup site. * * * @author jsanchez * @version 1.0 */ public class WarnFileUtil { + public static LocalizationFile findFileInLocalizationIncludingBackupSite(String filename, + String issuingSiteID, String backupSiteID) throws FileNotFoundException { + return findFileInLocalizationIncludingBackupSite(filename, issuingSiteID, backupSiteID, true); + } + /** * Returns the appropriate file in localization. If a backupSiteID is not * null and a corresponding file does exist in the backup site directory, @@ -49,7 +55,7 @@ public class WarnFileUtil { * @throws FileNotFoundException */ public static LocalizationFile findFileInLocalizationIncludingBackupSite(String filename, - String issuingSiteID, String backupSiteID) + String issuingSiteID, String backupSiteID, boolean allowUser) throws FileNotFoundException { IPathManager pm = PathManagerFactory.getPathManager(); @@ -71,6 +77,9 @@ public class WarnFileUtil { LocalizationContext[] searchContext = pm .getLocalSearchHierarchy(LocalizationType.COMMON_STATIC); for (LocalizationContext ctx : searchContext) { + if (!allowUser && ctx.getLocalizationLevel() == LocalizationLevel.USER) + continue; + if ((ctx.getLocalizationLevel() == LocalizationLevel.SITE || ctx .getLocalizationLevel() == LocalizationLevel.CONFIGURED) && issuingSiteID != null) { @@ -90,6 +99,18 @@ public class WarnFileUtil { return fileToUse; } + public static boolean isLocalizationFileExtantAtSiteLevel(String filename, String siteID) { + IPathManager pm = PathManagerFactory.getPathManager(); + String fileToRetrieve = WarningConstants.WARNGEN_DIR + + IPathManager.SEPARATOR + filename; + LocalizationContext backupSiteCtx = pm.getContext( + LocalizationType.COMMON_STATIC, LocalizationLevel.SITE); + backupSiteCtx.setContextName(siteID); + LocalizationFile backupFile = pm.getLocalizationFile(backupSiteCtx, + fileToRetrieve); + return backupFile != null && backupFile.exists(); + } + /** * Locates the appropriate file in the localization hierarchy including the * backupSite directory (if provided) and converts the content of the file @@ -105,10 +126,20 @@ public class WarnFileUtil { public static String convertFileContentsToString(String filename, String localizedSite, String backupSite) throws FileNotFoundException, IOException { - StringBuffer sb = new StringBuffer(); - BufferedReader input = null; File file = findFileInLocalizationIncludingBackupSite(filename, localizedSite, backupSite) .getFile(); + return convertFileContentsToString(file); + } + + public static String convertFileContentsToStringNoUser(String filename, + String site) throws FileNotFoundException { + File file = findFileInLocalizationIncludingBackupSite(filename, site, null, false).getFile(); + return convertFileContentsToString(file); + } + + private static String convertFileContentsToString(File file) { + StringBuffer sb = new StringBuffer(); + BufferedReader input = null; try { input = new BufferedReader(new FileReader(file));