From a616a9ef1e42a774deaf1ad5210c6387e4d73427 Mon Sep 17 00:00:00 2001 From: Sarah Pontius Date: Wed, 5 Aug 2015 13:47:13 -0600 Subject: [PATCH 01/21] VLab Issue #9414 - GFE Formatter: Storm surge forecast can differ significantly from Threat and potential impacts provided in TCV; fixes #9414 Change-Id: I1279f9f9ace9253120d48ff3c64196a90a8a4b28 Former-commit-id: 7b21f969f526edffb6426bd66b56367e50238a30 --- .../base/textproducts/templates/product/Hazard_TCV.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/Hazard_TCV.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/Hazard_TCV.py index f2653406f2..7a640878e2 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/Hazard_TCV.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/Hazard_TCV.py @@ -1,4 +1,4 @@ -# Version 2015.7.23-0 +# Version 2015.8.05-0 import GenericHazards import JsonSupport @@ -1775,9 +1775,11 @@ class StormSurgeSection(SectionCommon): def _peakSurge(self, segmentDict, productSegmentGroup, productSegment): self._textProduct.debug_print("_peakSurge _inundationMax = %s" % (self._stats._inundationMax), 1) + # DR 17727: To make the output consistent, max threat should be calculated here + self._stats._maxThreat = "None" + if self._stats._inundationMax is not None and self._stats._inundationMax >= 1: max = round(self._stats._inundationMax) - self._stats._maxThreat = "None" if max > 10: maxRange = 4 self._stats._maxThreat = "Extreme" From 291bcf6c918e27a04d6546dfbb6438d7e812f202 Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Fri, 11 Sep 2015 21:54:29 -0400 Subject: [PATCH 02/21] ASM #18034 - Emergency Fix for HFON FFFG issue Change-Id: Id58b8a2f63bffae4965b3e3fccc53a2e97092e0c Former-commit-id: 3212663c31208edefe405df747d8d33b962a03dc --- .../monitor/ffmp/ui/rsc/FFMPRowGenerator.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPRowGenerator.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPRowGenerator.java index 71d694bf21..870d232b5a 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPRowGenerator.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPRowGenerator.java @@ -29,6 +29,7 @@ import com.raytheon.uf.common.dataplugin.ffmp.FFMPBasin; import com.raytheon.uf.common.dataplugin.ffmp.FFMPBasinData; import com.raytheon.uf.common.dataplugin.ffmp.FFMPBasinMetaData; import com.raytheon.uf.common.dataplugin.ffmp.FFMPGuidanceBasin; +import com.raytheon.uf.common.dataplugin.ffmp.FFMPGuidanceInterpolation; import com.raytheon.uf.common.dataplugin.ffmp.FFMPRecord; import com.raytheon.uf.common.dataplugin.ffmp.FFMPRecord.FIELDS; import com.raytheon.uf.common.dataplugin.ffmp.FFMPTemplates; @@ -925,6 +926,85 @@ public class FFMPRowGenerator implements Runnable { guidance = Float.NaN; } } + } else { + + float value1 = 0.0f; + float value2 = 0.0f; + FFMPGuidanceInterpolation interpolate = resource.getGuidanceInterpolators().get(guidType); + String source1 = interpolate.getSource1(); + String source2 = interpolate.getSource2(); + double ratioOffset = interpolate.getInterpolationOffset(); + Float adjValue1 = 0.0f; + Float adjValue2 = 0.0f; + + // interpolate from zero to first guidance + if (source1.equals(source2)) { + if ((ratioOffset == Double.NaN) || (ratioOffset == 0.0)) { + adjValue2 = Float.NaN; + } + + FFFGDataMgr dman = FFFGDataMgr.getInstance(); + if (dman.isExpired() == false) { + adjValue2 = dman.adjustValue(adjValue2, source2, cBasinPfaf, 0l); + } + + if (!adjValue2.isNaN()) { + value2 = adjValue2.floatValue(); + } + + // straight from awips1 code ( FFMPdataUtils.C ) + // We have an extrapolation to zero (the low side). + // The formula below yields: + // coeff = 0.62 for 0.25 time frame (endpoints.second) + // coeff = 0.75 for 0.50 time frame (endpoints.second) + // coeff = 0.88 for 0.75 time frame (endpoints.second) + // coeff = 0.95 for 0.90 time frame (endpoints.second) + // float mid, frac; + // mid = endpoints.second / 2.0; + // frac = 1.0 - ( ( duration - mid ) / mid ); + // coeff = ( duration / endpoints.second ) + (0.25 * frac); + + if ((interpolate.getHour(source1) == 0) + || (source1.equals(source2) && (interpolate + .getHour(source2) == 1))) { + Double ratio = new Double(ratioOffset); + if (ratio.equals(.25)) { + guidance = (float) (.62 * value2); + } else if (ratio.equals(.5)) { + guidance = (float) (.75 * value2); + } else if (ratio.equals(.75)) { + guidance = (float) (.88 * value2); + } else if (ratio.equals(.9)) { + guidance = (float) (.95 * value2); + } + } + + // otherwise interpolate linearly I guess + + } else { + // check if values at the source do not exist + FFFGDataMgr dman = FFFGDataMgr.getInstance(); + if (dman.isExpired() == false) { + adjValue1 = dman.adjustValue(adjValue1, source1, cBasinPfaf, 0l); + } + + if (!adjValue1.isNaN()) { + value1 = adjValue1.floatValue(); + } + if (dman.isExpired() == false) { + adjValue2 = dman.adjustValue(adjValue2, source2, cBasinPfaf, 0l); + } + + if (!adjValue2.isNaN()) { + value2 = adjValue2.floatValue(); + } + + if ((value1 == Float.NaN) || (value2 == Float.NaN)) { + guidance = Float.NaN; + } + + guidance = (float)(value1 + ((value2 - value1) * ratioOffset)); + } } return new FFMPTableCellData(FIELDS.GUIDANCE, guidance, forced); From 9c7321a9a5960dbf5cd31bf08d6cdb23d06a67d8 Mon Sep 17 00:00:00 2001 From: Roger Ferrel Date: Thu, 1 Oct 2015 16:14:51 -0500 Subject: [PATCH 03/21] Omaha #4899 Checks to prevent sending product while in operational mode and simulated time. Former-commit-id: 8f422c4fe573ab1d1391d4d975f6b245ed933938 --- .../texteditor/dialogs/TextEditorDialog.java | 319 ++++++++++-------- 1 file changed, 186 insertions(+), 133 deletions(-) diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java index 0a2780723b..3d8ba7a44a 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java @@ -143,6 +143,7 @@ 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.time.ISimulatedTimeChangeListener; import com.raytheon.uf.common.time.SimulatedTime; import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.common.wmo.WMOHeader; @@ -189,6 +190,7 @@ import com.raytheon.viz.ui.dialogs.CaveJFACEDialog; import com.raytheon.viz.ui.dialogs.CaveSWTDialog; import com.raytheon.viz.ui.dialogs.ICloseCallback; import com.raytheon.viz.ui.dialogs.SWTMessageBox; +import com.raytheon.viz.ui.simulatedtime.SimulatedTimeOperations; /** * Main Text Editor dialog. @@ -348,6 +350,8 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox; * 05Mar2015 RM 15025 kshrestha Fix to maintain the headers that they are saved with * 10Mar2015 RM 14866 kshrestha Disable QC GUI pop up for TextWS * 6Apr2015 RM14968 mgamazaychikov Fix formatting for pathcast section + * Sep 29 2015 4899 rferrel Do not send product while in operational mode and + * simulated time. * * * @@ -356,7 +360,8 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox; public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, IAfosBrowserCallback, IWmoBrowserCallback, IRecoverEditSessionCallback, ITextCharWrapCallback, IScriptRunnerObserver, IScriptEditorObserver, - INotificationObserver, IProductQueryCallback { + INotificationObserver, IProductQueryCallback, + ISimulatedTimeChangeListener { /** * Handler used for messges. @@ -1465,6 +1470,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, callbackClient = cbClient; this.textWorkstationFlag = textWorkstationFlag; + SimulatedTime.getSystemTime().addSimulatedTimeChangeListener(this); } private static JAXBManager getJaxbManager() throws JAXBException { @@ -4166,6 +4172,10 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, * Enter the text editor mode. */ private void enterEditor() { + if (!validateTime()) { + return; + } + initTemplateOverwriteMode(); StdTextProduct product = TextDisplayModel.getInstance() .getStdTextProduct(token); @@ -4905,6 +4915,9 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, * true if product is to be resent */ synchronized private void sendProduct(final boolean resend) { + if (!validateTime()) { + return; + } StdTextProduct prod = getStdTextProduct(); if (warnGenFlag) { QCConfirmationMsg qcMsg = new QCConfirmationMsg(); @@ -4964,11 +4977,11 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, return; } - if (isWarnGenDlg == true){ + if (isWarnGenDlg == true) { StdTextProduct prod = getStdTextProduct(); String afosId = prod.getCccid() + prod.getNnnid() + prod.getXxxid(); - SendConfirmationMsg sendMsg = new SendConfirmationMsg(resend, afosId, - prod.getNnnid()); + SendConfirmationMsg sendMsg = new SendConfirmationMsg(resend, + afosId, prod.getNnnid()); WarnGenConfirmationDlg wgcd = new WarnGenConfirmationDlg(shell, sendMsg.getTitle(), sendMsg.getProductMessage(), @@ -5748,140 +5761,154 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, int afosXxxLimit = 5; // second three characters is AFOS XXX String prodText = textEditor.getText(); - if (!prodText.startsWith("ZCZC")) { - /* - * DR15610 - Make sure that if the first line of the text product is not - * a WMO heading it is treated as part of the text body. - */ - String[] pieces = textEditor.getText().split("\r*\n", 2); - if (pieces.length > 1) { - pieces[0] += "\n"; // WMOHeader expects this - } - WMOHeader header = new WMOHeader(pieces[0].getBytes(), null); - if (!header.isValid()) { - headerTF.setText(""); - try { - textEditor.setText(originalText); - textEditor.setEditable(true); - textEditor.setEditable(false); - } catch (IllegalArgumentException e) { - // There is no text product body, so set it to the empty string. - textEditor.setText(""); + if (!prodText.startsWith("ZCZC")) { + /* + * DR15610 - Make sure that if the first line of the text product is + * not a WMO heading it is treated as part of the text body. + */ + String[] pieces = textEditor.getText().split("\r*\n", 2); + if (pieces.length > 1) { + pieces[0] += "\n"; // WMOHeader expects this } - } else { - // TODO FIX PARSING - - // First, set the current header by assuming that it usually - // consists of the first two lines of text in the text product, - // though there will be exceptions to that "rule" as handled below. - // So, obtain the AFOS NNNxxx. If it's where it is supposed to be - // in the new format, then the existing header is already an AWIPS - // text product identifier. Otherwise it is a legacy AFOS - // identifier. - if (TextDisplayModel.getInstance().hasStdTextProduct(token)) { - StdTextProduct textProd = TextDisplayModel.getInstance() - .getStdTextProduct(token); - StdTextProductId prodId = textProd.getProdId(); + WMOHeader header = new WMOHeader(pieces[0].getBytes(), null); + if (!header.isValid()) { + headerTF.setText(""); try { - // start of second line of text - start = textEditor.getOffsetAtLine(thisLine + 1); - if ((textEditor.getText(start, start + afosNnnLimit) - .equals(prodId.getNnnid())) - && (textEditor.getText(start + afosNnnLimit + 1, - start + afosXxxLimit).equals(prodId - .getXxxid()))) { - // Text matches the products nnnid and xxxid - numberOfLinesOfHeaderText = 2; - } else if (textEditor.getText(start, - start + afosNnnLimit + 2).equals( - AFOSParser.DRAFT_PIL) - || textEditor.getText(start, - start + afosNnnLimit + 2).equals("TTAA0")) { - // Text matches temporary WRKWG# - numberOfLinesOfHeaderText = 2; - } else { + textEditor.setText(originalText); + textEditor.setEditable(true); + textEditor.setEditable(false); + } catch (IllegalArgumentException e) { + // There is no text product body, so set it to the empty + // string. + textEditor.setText(""); + } + } else { + // TODO FIX PARSING + + // First, set the current header by assuming that it usually + // consists of the first two lines of text in the text product, + // though there will be exceptions to that "rule" as handled + // below. + // So, obtain the AFOS NNNxxx. If it's where it is supposed to + // be + // in the new format, then the existing header is already an + // AWIPS + // text product identifier. Otherwise it is a legacy AFOS + // identifier. + if (TextDisplayModel.getInstance().hasStdTextProduct(token)) { + StdTextProduct textProd = TextDisplayModel.getInstance() + .getStdTextProduct(token); + StdTextProductId prodId = textProd.getProdId(); + try { + // start of second line of text + start = textEditor.getOffsetAtLine(thisLine + 1); + if ((textEditor.getText(start, start + afosNnnLimit) + .equals(prodId.getNnnid())) + && (textEditor.getText( + start + afosNnnLimit + 1, start + + afosXxxLimit).equals(prodId + .getXxxid()))) { + // Text matches the products nnnid and xxxid + numberOfLinesOfHeaderText = 2; + } else if (textEditor.getText(start, + start + afosNnnLimit + 2).equals( + AFOSParser.DRAFT_PIL) + || textEditor.getText(start, + start + afosNnnLimit + 2).equals( + "TTAA0")) { + // Text matches temporary WRKWG# + numberOfLinesOfHeaderText = 2; + } else { + // Assume this header block is a legacy AFOS + // identifier. + numberOfLinesOfHeaderText = 1; + } + } catch (IllegalArgumentException e) { // Assume this header block is a legacy AFOS identifier. numberOfLinesOfHeaderText = 1; } + } + + try { + start = 0; + finish = textEditor.getOffsetAtLine(thisLine + + numberOfLinesOfHeaderText) - 1; } catch (IllegalArgumentException e) { - // Assume this header block is a legacy AFOS identifier. - numberOfLinesOfHeaderText = 1; + // The text does not span enough lines so use the full + // extent + // of the product. + finish = textEditor.getCharCount() - 1; + } + + // Set the content of the header block to consist of just the + // header + // of + // the text product... it will get reunited with the body when + // it is + // saved. + if (finish > start) { + headerTF.setText(textEditor.getText(start, finish)); + } else { + headerTF.setText(""); + } + + // Next, set the current body by assuming that it always + // consists of the rest of the text product beyond the line(s) + // of text in the header. + try { + int numberOfBlankLines = -1; + String line = null; + do { + numberOfBlankLines++; + line = textEditor.getLine(thisLine + + numberOfLinesOfHeaderText + + numberOfBlankLines); + } while ((line.length() == 0) || line.equals("")); + // Note: 'st' is a reference to 'textEditor'... + // delelete the header from the text in 'textEditor' + finish = textEditor.getOffsetAtLine(thisLine + + numberOfLinesOfHeaderText + numberOfBlankLines); + textEditor.setSelection(start, finish); + textEditor.setEditable(true); + textEditor.invokeAction(SWT.DEL); + textEditor.setEditable(false); + } catch (IllegalArgumentException e) { + // There is no text product body, so set it to the empty + // string. + textEditor.setText(""); } } + } else { + /** + * If the first word begins with "ZCZC", it is a two-line header at + * least, it is + * "ZCZC CCNNNXXX adr\r\r\nTTAA00 KCCC DDHHMM bbb\r\r\n" + */ + int newLineIndex = prodText.indexOf("\n\n"); + String first = prodText.substring(0, newLineIndex); - try { - start = 0; - finish = textEditor.getOffsetAtLine(thisLine - + numberOfLinesOfHeaderText) - 1; - } catch (IllegalArgumentException e) { - // The text does not span enough lines so use the full extent - // of the product. - finish = textEditor.getCharCount() - 1; - } + if (first.length() > 10) { + String rest = prodText.substring(newLineIndex + 1); - // Set the content of the header block to consist of just the header - // of - // the text product... it will get reunited with the body when it is - // saved. - if (finish > start) { - headerTF.setText(textEditor.getText(start, finish)); - } else { - headerTF.setText(""); - } + headerTF.setText(first); + String cccnnnxxx = first.substring(5, 14); + setCurrentSiteId(""); + setCurrentWmoId(""); + setCurrentWsfoId(cccnnnxxx.substring(0, 3)); + setCurrentProdCategory(cccnnnxxx.substring(3, 6)); + setCurrentProdDesignator(cccnnnxxx.substring(6, 9)); - // Next, set the current body by assuming that it always - // consists of the rest of the text product beyond the line(s) - // of text in the header. - try { - int numberOfBlankLines = -1; - String line = null; - do { - numberOfBlankLines++; - line = textEditor.getLine(thisLine - + numberOfLinesOfHeaderText + numberOfBlankLines); - } while ((line.length() == 0) || line.equals("")); - // Note: 'st' is a reference to 'textEditor'... - // delelete the header from the text in 'textEditor' - finish = textEditor.getOffsetAtLine(thisLine - + numberOfLinesOfHeaderText + numberOfBlankLines); - textEditor.setSelection(start, finish); - textEditor.setEditable(true); - textEditor.invokeAction(SWT.DEL); - textEditor.setEditable(false); - } catch (IllegalArgumentException e) { - // There is no text product body, so set it to the empty string. - textEditor.setText(""); + try { + textEditor.setText(rest.trim()); + textEditor.setEditable(true); + textEditor.setEditable(false); + } catch (IllegalArgumentException e) { + // There is no text product body, so set it to the empty + // string. + textEditor.setText(""); + } } } - } else { - /** - * If the first word begins with "ZCZC", it is a two-line header at least, - * it is "ZCZC CCNNNXXX adr\r\r\nTTAA00 KCCC DDHHMM bbb\r\r\n" - */ - int newLineIndex = prodText.indexOf("\n\n"); - String first = prodText.substring(0, newLineIndex); - - if (first.length() > 10 ) { - String rest = prodText.substring(newLineIndex+1); - - headerTF.setText(first); - String cccnnnxxx = first.substring(5, 14); - setCurrentSiteId(""); - setCurrentWmoId(""); - setCurrentWsfoId(cccnnnxxx.substring(0, 3)); - setCurrentProdCategory(cccnnnxxx.substring(3, 6)); - setCurrentProdDesignator(cccnnnxxx.substring(6, 9)); - - try { - textEditor.setText(rest.trim()); - textEditor.setEditable(true); - textEditor.setEditable(false); - } catch (IllegalArgumentException e) { - // There is no text product body, so set it to the empty string. - textEditor.setText(""); - } - } - } } /** @@ -7801,6 +7828,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, highlightBackgroundClr.dispose(); } + SimulatedTime.getSystemTime().removeSimulatedTimeChangeListener(this); + inEditMode = false; } @@ -7951,7 +7980,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, } // is this the pathcast paragragh? - if (paragraphStart.startsWith("* THIS") && paragraphStart.endsWith("WILL BE NEAR...")) { + if (paragraphStart.startsWith("* THIS") + && paragraphStart.endsWith("WILL BE NEAR...")) { inPathcast = true; } @@ -7964,8 +7994,10 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, padding = " "; } - if ((inLocations || inPathcast) && (paragraphStartLineNumber == lineNumber)) { - // Keep LOCATIONS and PATHCAST first line short & don't paste more to it. + if ((inLocations || inPathcast) + && (paragraphStartLineNumber == lineNumber)) { + // Keep LOCATIONS and PATHCAST first line short & don't paste more + // to it. if (line.indexOf("...") == line.lastIndexOf("...")) { return; } @@ -8045,11 +8077,11 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, && (allText.charAt(eol + 1) == '\n')) { deleteLen = 2; } else if (allText.charAt(eol) == '\n') { - if (allText.charAt(eol-1) == '.' && allText.charAt(eol-2) != '.') { + if (allText.charAt(eol - 1) == '.' + && allText.charAt(eol - 2) != '.') { // do not extend this line. return; - } - else { + } else { deleteLen = 1; } } else { @@ -8197,8 +8229,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, } textEditor.replaceTextRange(position, 0, replacement.toString()); // remove and extra space - if (textEditor.getText(position -1, position - 1).equals(" ")) { - textEditor.replaceTextRange(position-1, 1, ""); + if (textEditor.getText(position - 1, position - 1).equals(" ")) { + textEditor.replaceTextRange(position - 1, 1, ""); } ++endWrapLine; } @@ -8717,4 +8749,25 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, return header; } + + /** + * Validate CAVE is in a state to allow sending of text product; and display + * a warning when unable to send. + * + * @return true when able to send text product + */ + private boolean validateTime() { + if ((shell != null) && !shell.isDisposed() && shell.isVisible() + && !SimulatedTimeOperations.isTransmitAllowed()) { + SimulatedTimeOperations.displayFeatureLevelWarning(shell, + "Send Text Product"); + return false; + } + return true; + } + + @Override + public void timechanged() { + validateTime(); + } } From 4bbc7f67e927ef15273f4cd1fed19b9a0a23dda0 Mon Sep 17 00:00:00 2001 From: Roger Ferrel Date: Mon, 5 Oct 2015 08:13:53 -0500 Subject: [PATCH 04/21] Omaha #4898 Prevent sending of TAF when in DRT mode. Former-commit-id: 37f33962fae292bd531540f96b034017683ba2ea --- .../aviation/editor/TafViewerEditorDlg.java | 415 +++++++++++------- 1 file changed, 251 insertions(+), 164 deletions(-) diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java index 4db3ec5928..6aa116ec12 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java @@ -104,6 +104,7 @@ import com.raytheon.uf.common.python.PythonScript; 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.time.ISimulatedTimeChangeListener; import com.raytheon.uf.common.time.SimulatedTime; import com.raytheon.uf.viz.core.RGBColors; import com.raytheon.uf.viz.core.VizApp; @@ -133,10 +134,12 @@ import com.raytheon.viz.avnconfig.ITafSiteConfig; import com.raytheon.viz.avnconfig.MessageStatusComp; import com.raytheon.viz.avnconfig.TafSiteConfigFactory; import com.raytheon.viz.avnconfig.TafSiteData; +import com.raytheon.viz.core.mode.CAVEMode; import com.raytheon.viz.texteditor.TextDisplayModel; import com.raytheon.viz.texteditor.msgs.IAviationObserver; import com.raytheon.viz.ui.dialogs.CaveSWTDialog; import com.raytheon.viz.ui.dialogs.ICloseCallback; +import com.raytheon.viz.ui.simulatedtime.SimulatedTimeOperations; /** * This class displays the TAF Viewer and Editor dialog. @@ -241,7 +244,8 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * May 15, 2014 3002 bgonzale Moved common taf code to com.raytheon.uf.common.dataplugin.taf. * 08/13/2014 3497 njensen Refactored syntax checking to prevent potential infinite loop * 12/02/2014 #15007 zhao Added restoreFrom() for the "Restore From..." menu option - * 04/07/2015 17332 zhao Added code to handle case of "Cancel" in "Restore From..." + * 04/07/2015 17332 zhao Added code to handle case of "Cancel" in "Restore From..." + * Sep 28, 2015 4898 rferrel Disable sending of TAF when CAVE not in real time. * * * @@ -250,10 +254,16 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * */ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, - IEditActions { + ISimulatedTimeChangeListener, IEditActions { private final transient IUFStatusHandler statusHandler = UFStatus .getHandler(TafViewerEditorDlg.class); + /** + * Developer can use this for debug purposes by making it true. This can go + * away once AlertViz respects the Priorty setting of the status handler. + */ + private static final boolean trace = false; + private final String SPLIT_REGEX = "=+[\\s\n]*|\n{2,}|\n$"; /** @@ -559,6 +569,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, this.stationList = stationList; setText("AvnFPS TAF Editor"); + SimulatedTime.getSystemTime().addSimulatedTimeChangeListener(this); } /** @@ -672,6 +683,18 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, // Select the editor tab on the tab folder. tabFolder.setSelection(editorTab); + /* + * Queue the validation so that this dialog will be displayed prior + * to the validation. This allows any validate warning to be + * displayed over this dialog. + */ + VizApp.runAsync(new Runnable() { + + @Override + public void run() { + validateTime(); + } + }); // Do not set editorTafTabComp radial buttons here it can corrupt a // populated selected tab. // Any changes must be done after a open tab is found and populated. @@ -973,6 +996,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, @Override public void disposeDialog() { disposeDialog = true; + SimulatedTime.getSystemTime().removeSimulatedTimeChangeListener(this); AvnSmartToolJob.shutdown(); for (ViewerTab viewerTab : modelsTabs) { viewerTab.dispose(); @@ -1590,6 +1614,16 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, // Make the editor tab the default selection on the tab folder. tabFolder.setSelection(editorTab); + tabFolder.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + super.widgetSelected(e); + if (e.item == editorTab) { + validateTime(); + } + } + }); } /** @@ -1813,81 +1847,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, sendBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { - if (!SendDialog.isAuthorized()) { - return; - } - // Assume editorTafTabComp is for the active tab. - if (editorTafTabComp.isTafSent()) { - putMessageToForecaster("Cannot send forecast: Forecast already sent"); - return; - } else if (editorTafTabComp.isSyntaxChecked()) { - if (disallowSend.equals("always")) { - putMessageToForecaster("Cannot send forecast: Send is disabled"); - return; - } - // Flag to allow sending if the syntax error threshold is - // met. - boolean okToSend = true; - if (editorTafTabComp.isErrorsInBulletin()) { - if (disallowSend.equals("warning") - && (editorTafTabComp.getErrorLevel() >= 1)) { - okToSend = false; - } else if (disallowSend.equals("error") - && (editorTafTabComp.getErrorLevel() >= 2)) { - okToSend = false; - } else if (disallowSend.equals("fatal") - && (editorTafTabComp.getErrorLevel() >= 3)) { - okToSend = false; - } - } - - if (okToSend) { - if (confirmSend) { - String bbb = editorTafTabComp.getBBB(); - - if (bbb.startsWith("AA") || bbb.startsWith("CC")) { - MessageBox mb = new MessageBox(shell, - SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL); - mb.setMessage("Attempting to send an AMD or COR TAF, please confirm."); - if (mb.open() == SWT.CANCEL) { - return; - } - } - } - } else { - putMessageToForecaster("Cannot send forecast: Bulletin has errors" - + "\n" - + "Use Clear Errors to send it without changes"); - return; - } - - if (autoPrintMI.getSelection()) { - printForecast(editorTafTabComp.getTextEditorControl() - .getText()); - } - - if (mustCreate(sendDlg)) { - sendDlg = new SendDialog(shell, editorTafTabComp, - msgStatComp, sendCollectMI.getSelection()); - sendDlg.setCloseCallback(new ICloseCallback() { - - @Override - public void dialogClosed(Object returnValue) { - // sendDlg sets the "taf sent" field only - if (editorTafTabComp.isTafSent()) { - editorTafTabComp.updateTafSent(true); - } - sendDlg = null; - } - }); - sendDlg.open(); - } else { - sendDlg.bringToTop(); - } - - } else { - putMessageToForecaster("Cannot send forecast: Press Syntax before transmission"); - } + sendAction(); } }); @@ -2096,7 +2056,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, return editorComp; } - /** + /** * Check if there is an extra '=' sign in a TAF * * @param doLogMessage @@ -2113,7 +2073,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, st = editorTafTabComp.getTextEditorControl(); in = in.toUpperCase().replaceAll("TAF", "\n\nTAF").trim(); - while ( in.contains("\n\n\n") ) { + while (in.contains("\n\n\n")) { in = in.replace("\n\n\n", "\n\n"); } @@ -2153,35 +2113,121 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, String msg = "Syntax error: There is an extra '=' sign or 'TAF' is missing at beginning of TAF"; String[] tafs = in.split("\n\n"); int tafStartIndex = 0; - for ( String taf : tafs ) { + for (String taf : tafs) { int firstEqualSignIndex = taf.indexOf('='); - if ( firstEqualSignIndex == -1 ) { + if (firstEqualSignIndex == -1) { tafStartIndex += taf.length() + 2; continue; } - int secondEqualSignIndex = taf.indexOf('=', firstEqualSignIndex+1); - if ( secondEqualSignIndex == -1 ) { + int secondEqualSignIndex = taf + .indexOf('=', firstEqualSignIndex + 1); + if (secondEqualSignIndex == -1) { tafStartIndex += taf.length() + 2; continue; } - while ( secondEqualSignIndex > -1 ) { - int secondEqualSignIndexInEditorText = tafStartIndex + secondEqualSignIndex; - StyleRange sr = new StyleRange(secondEqualSignIndexInEditorText, 1, null, qcColors[3]); + while (secondEqualSignIndex > -1) { + int secondEqualSignIndexInEditorText = tafStartIndex + + secondEqualSignIndex; + StyleRange sr = new StyleRange( + secondEqualSignIndexInEditorText, 1, null, qcColors[3]); syntaxMap.put(sr, msg); st.setStyleRange(sr); - secondEqualSignIndex = taf.indexOf('=', secondEqualSignIndex+1); + secondEqualSignIndex = taf.indexOf('=', + secondEqualSignIndex + 1); } errorFound = true; tafStartIndex += taf.length() + 2; } - if ( doLogMessage ) { + if (doLogMessage) { msgStatComp.setMessageText(msg, qcColors[3].getRGB()); } return errorFound; } + private void sendAction() { + if (!SendDialog.isAuthorized()) { + putMessageToForecaster("Not authorized to send TAF."); + return; + } + + if (!validateTime()) { + return; + } + // Assume editorTafTabComp is for the active tab. + if (editorTafTabComp.isTafSent()) { + putMessageToForecaster("Cannot send forecast: Forecast already sent"); + return; + } else if (editorTafTabComp.isSyntaxChecked()) { + if (disallowSend.equals("always")) { + putMessageToForecaster("Cannot send forecast: Send is disabled"); + return; + } + // Flag to allow sending if the syntax error threshold is + // met. + boolean okToSend = true; + if (editorTafTabComp.isErrorsInBulletin()) { + if (disallowSend.equals("warning") + && (editorTafTabComp.getErrorLevel() >= 1)) { + okToSend = false; + } else if (disallowSend.equals("error") + && (editorTafTabComp.getErrorLevel() >= 2)) { + okToSend = false; + } else if (disallowSend.equals("fatal") + && (editorTafTabComp.getErrorLevel() >= 3)) { + okToSend = false; + } + } + + if (okToSend) { + if (confirmSend) { + String bbb = editorTafTabComp.getBBB(); + + if (bbb.startsWith("AA") || bbb.startsWith("CC")) { + MessageBox mb = new MessageBox(shell, SWT.ICON_QUESTION + | SWT.OK | SWT.CANCEL); + mb.setMessage("Attempting to send an AMD or COR TAF, please confirm."); + if (mb.open() == SWT.CANCEL) { + return; + } + } + } + } else { + putMessageToForecaster("Cannot send forecast: Bulletin has errors" + + "\n" + "Use Clear Errors to send it without changes"); + return; + } + + if (autoPrintMI.getSelection()) { + printForecast(editorTafTabComp.getTextEditorControl().getText()); + } + + if (mustCreate(sendDlg)) { + sendDlg = new SendDialog(shell, editorTafTabComp, msgStatComp, + sendCollectMI.getSelection()); + sendDlg.setCloseCallback(new ICloseCallback() { + + @Override + public void dialogClosed(Object returnValue) { + // sendDlg sets the "taf sent" field only + if (editorTafTabComp.isTafSent()) { + editorTafTabComp.updateTafSent(true); + } + sendDlg = null; + } + }); + sendDlg.open(); + } else { + sendDlg.bringToTop(); + } + + } else { + putMessageToForecaster("Cannot send forecast: Press Syntax before transmission"); + } + + } + private void syntaxCheck() { // Assume editorTafTabComp is for the active tab. st = editorTafTabComp.getTextEditorControl(); @@ -2344,7 +2390,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, gd = new GridData(SWT.FILL, SWT.FILL, true, true); guidanceViewerFolder = new TabFolder(guidanceViewerComp, SWT.NONE); guidanceViewerFolder.setLayoutData(gd); - guidanceViewerFolder.addSelectionListener(new SelectionListener() { + guidanceViewerFolder.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -2366,12 +2412,6 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, currentTab.markTextAsUpdating(); } } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // TODO Auto-generated method stub - System.out.println("default selection listener event: " + e); - } }); configMgr.setDefaultColors(guidanceViewerFolder); @@ -2503,24 +2543,25 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, } } } - + /** * restore from a file a user selects */ private void restoreFrom() { - - if ( tabFolder.getSelectionIndex() == VIEWER_TAB_SELECTED ) { + + if (tabFolder.getSelectionIndex() == VIEWER_TAB_SELECTED) { tabFolder.setSelection(editorTab); } - + String tempTafPath = "aviation/tmp/"; IPathManager pm = PathManagerFactory.getPathManager(); - LocalizationContext context = pm.getContext(LocalizationType.CAVE_STATIC, LocalizationLevel.SITE); + LocalizationContext context = pm.getContext( + LocalizationType.CAVE_STATIC, LocalizationLevel.SITE); String path = pm.getFile(context, tempTafPath).getAbsolutePath(); FileDialog dlg = new FileDialog(shell, SWT.OPEN); dlg.setFilterPath(path); String filepath = dlg.open(); - if ( filepath == null ) { // if "Cancel"; do nothing + if (filepath == null) { // if "Cancel"; do nothing return; } @@ -2582,7 +2623,8 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, } catch (FileNotFoundException e) { setMessageStatusError("File " + filepath + " not found."); } catch (IOException e) { - setMessageStatusError("An IOException occured while opening file " + filepath); + setMessageStatusError("An IOException occured while opening file " + + filepath); } finally { if (errorMsg != null) { setMessageStatusError("File " + filepath + ": " + errorMsg); @@ -2756,8 +2798,9 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, .getText()); setMessageStatusOK("Temporary WRKTAF Stored in DB"); } catch (Exception e) { - String msg = e.toString(); - System.out.println(msg); + statusHandler + .error("Problem storing temporary WRKTAF in text product database.", + e); } } } @@ -3026,7 +3069,6 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, st.setStyleRange(null); syntaxMap.clear(); - /* * TODO Refactor all of this to be smarter. Right now it's kind of dumb * in that the python syntax check can potentially alter the datetime of @@ -3175,12 +3217,16 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, // The keys are: index, fatal, ident, amd, itime, vtime, group, and // bbb for (String k : parsedText.keySet()) { - // System.out.println("The outer key is " + k); + if (traceEnabled()) { + statusHandler.debug("The outer key is " + k); + } if ((!k.equals("group")) && (!k.equals("bbb"))) { HashMap> m = (HashMap>) parsedText .get(k); for (String k2 : m.keySet()) { - // System.out.println("The inner key is " + k2); + if (traceEnabled()) { + statusHandler.debug("The inner key is " + k2); + } if (k2.equals("warning") || k2.equals("error") || k2.equals("fatal") || k2.equals("index")) { results = m.get(k2); @@ -3212,29 +3258,43 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, } } else if (k.equals("group")) { Object o1 = parsedText.get(k); - // System.out.println(o1.getClass().getName()); - java.util.ArrayList lm1 = (java.util.ArrayList) o1; - for (HashMap m1 : lm1) { + if (traceEnabled()) { + statusHandler.debug(o1.getClass().getName()); + } + java.util.List> lm1 = (List>) o1; + for (Map m1 : lm1) { for (String k2 : m1.keySet()) { - // System.out.println("The next inner key is " + - // k2); + if (traceEnabled()) { + statusHandler.debug("The next inner key is " + + k2); + } Object o2 = m1.get(k2); - // System.out.println(o2.getClass().getName()); - HashMap m2 = (HashMap) o2; + if (traceEnabled()) { + statusHandler.debug(o2.getClass().getName()); + } + Map m2 = (Map) o2; for (String k3 : m2.keySet()) { - // System.out.println("The next next inner key is " - // + k3); + if (traceEnabled()) { + statusHandler + .debug("The next next inner key is " + + k3); + } Object o3 = m2.get(k3); - // System.out.println(o3.getClass().getName()); - if (o3.getClass().getName() - .equals("java.util.HashMap")) { - HashMap m3 = (HashMap) o3; + if (traceEnabled()) { + statusHandler + .debug(o3.getClass().getName()); + } + if (o3 instanceof Map) { + Map m3 = (Map) o3; for (String k4 : m3.keySet()) { - // System.out - // .println("The next next next inner key is " - // + k4); - // Object o4 = m3.get(k4); - // System.out.println(o4.getClass().getName()); + if (traceEnabled()) { + statusHandler + .debug("The next next next inner key is " + + k4); + Object o4 = m3.get(k4); + statusHandler.debug(o4.getClass() + .getName()); + } if (k4.equals("warning") || k4.equals("error") || k4.equals("fatal") @@ -3245,23 +3305,21 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, if (k4.equals("index")) { getRange(range, results); } else { - // System.out - // .print("The result is: "); for (String s : results) { errorMsg.append(s); } - // System.out.println("At line " - // + range[frLineIndex] - // + " in column " - // + range[frColIndex] + - // "..."); - // System.out.println(errorMsg - // .toString()); - // st.setCaretOffset(st - // .getOffsetAtLine(currentLineNo - // + range[frLineIndex] - // - 1) - // + range[frColIndex]); + if (traceEnabled()) { + StringBuilder sb = new StringBuilder(); + sb.append( + "The result is: At line ") + .append(range[frLineIndex]) + .append(" in column ") + .append(range[frColIndex]) + .append("...\n") + .append(errorMsg); + statusHandler.debug(sb + .toString()); + } errorLevel = createErrorStyleRange( "'" + errorMsg @@ -3287,9 +3345,9 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, } } - } else if (k.equals("bbb")) { - // Object o = parsedText.get(k); - // System.out.println(o.getClass().getName()); + } else if (k.equals("bbb") && traceEnabled()) { + Object o = parsedText.get(k); + statusHandler.debug(o.getClass().getName()); } } } @@ -3758,7 +3816,6 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, if (endIndex == -1) { endIndex = in.length(); } - boolean isWrapping = false; String thisSite = ""; String lastLine = ""; String line = in.substring(beginIndex, endIndex); @@ -3804,7 +3861,6 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, if (lineNumber == keyLineNum) { if (!isWrappingLine(line, thisSite)) { - isWrapping = false; text = result.get("text").toString() + "\n"; level = Integer.parseInt(result .get("level").toString()); @@ -3818,7 +3874,6 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, break; } else { // a PROB30 group is wrapped in two lines - isWrapping = true; text = result.get("text").toString() + "\n"; level = Integer.parseInt(result .get("level").toString()); @@ -3932,8 +3987,6 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, File path = pm.getStaticFile("aviation" + fs + "config" + fs + "gui" + fs + "SyntaxMonitorCfg.xml"); - System.out.println("path = " + path); - syntaxMonCfg = JAXB.unmarshal(path, SyntaxMonitorCfg.class); } catch (Exception e) { @@ -4010,7 +4063,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, sb.append(TafUtil.safeFormatTaf(t, showHeaders)); sb.append("\n"); } - }// System.out.println("TEMPO "+sb.toString().indexOf("TEMPO")+"/"+sb.toString().indexOf("\n",72)); + } tafViewerStTxt.setText(sb.toString()); hightlightTAF(); @@ -4068,27 +4121,27 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, .getCurrentTempoMap(stationName);// 20120711 if (tempoMap != null) { int tempoStart = taf.indexOf(TEMPO_TXT); - int tempoEnd = taf.indexOf(TafUtil.LINE_BREAK, tempoStart);// end - // of - // the - // TEMPO - // line + // end of the TEMPO line + int tempoEnd = taf.indexOf(TafUtil.LINE_BREAK, tempoStart); StringBuilder str = new StringBuilder(" "); for (String alertKey : tempoMap.keySet()) { - // System.out.println("2___alertKey: "+ alertKey); + if (traceEnabled()) { + statusHandler.debug("2___alertKey: " + alertKey); + } for (String value : tempoMap.get(alertKey)) { - // System.out.println("3___value: "+ value); + if (traceEnabled()) { + statusHandler.debug("3___value: " + value); + } str.setLength(1); str.append(value); int len = str.length(); str.append(" "); + // for tempo only int startIndex = taf - .indexOf(str.toString(), tempoStart);// for - // tempo - // only + .indexOf(str.toString(), tempoStart); if (startIndex < 0) { str.setLength(len); @@ -4358,7 +4411,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, font.dispose(); printer.dispose(); } else { - System.out.println("No default printer set."); + putMessageToForecaster("Auto Print failed. No default printer set."); } } @@ -4375,13 +4428,8 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, // Only load the latest TAF, and assume it is the first one in // the Viewer. sb.append(TafUtil.safeFormatTaf(tafsInViewer[0], false)); - String originalBbb = ""; String[] header = tafsInViewer[0].getWmoHeader().split(" "); - if (header.length > 3) { - originalBbb = header[3]; - } - ITafSiteConfig config = TafSiteConfigFactory.getInstance(); TafSiteData siteData = config.getSite(site); @@ -4558,6 +4606,45 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, } } + /** + * Validate CAVE can send a TAF. + * + * @return true when in real time. + */ + private boolean validateTime() { + if ((shell != null) && !shell.isDisposed() && shell.isVisible()) { + /* + * Currently practice mode not supported. + */ + if (CAVEMode.getMode() == CAVEMode.PRACTICE) { + putMessageToForecaster("Not allowed to send TAF when in practice mode."); + return false; + } else if (!SimulatedTimeOperations.isTransmitAllowed()) { + SimulatedTimeOperations.displayFeatureLevelWarning(shell, + "Send TAF"); + return false; + } + } + return true; + } + + @Override + public void timechanged() { + validateTime(); + } + + /** + * + * @return + */ + private boolean traceEnabled() { + /* + * TODO When alertviz respects Prioirty change this to use the + * statusHander priority debug enabled. + */ + return trace; + } + /** * Internal class to up date the Viewer tab highlights when the Metar tab * selections change what should be highlighted. From 6536afe67eb301919d1716dc26a2b4aefa6d3795 Mon Sep 17 00:00:00 2001 From: David Friedman Date: Wed, 7 Oct 2015 16:01:38 +0000 Subject: [PATCH 05/21] ASM #18132 - Text Workstation incorrectly reassigns ETN of TCV products Change-Id: I19db78aa384a12f238a3be1375c276f7ff0f601f Former-commit-id: 69492727ae30b793cf26a9431350b019f7eb6dd8 --- .../viz/texteditor/dialogs/EtnRules.java | 40 ++++++++++++ .../texteditor/dialogs/TextEditorDialog.java | 63 +++++++++++++++++-- .../localization/textws/gui/EtnRules.xml | 4 ++ 3 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/EtnRules.java create mode 100644 cave/com.raytheon.viz.textworkstation/localization/textws/gui/EtnRules.xml diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/EtnRules.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/EtnRules.java new file mode 100644 index 0000000000..13459ce9d0 --- /dev/null +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/EtnRules.java @@ -0,0 +1,40 @@ +package com.raytheon.viz.texteditor.dialogs; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlList; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * Describe rules for modifying VTEC ETNs. + * + *
+ *
+ * SOFTWARE HISTORY
+ *
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Oct 07, 2015 ASM #18132 D. Friedman Initial creation
+ *
+ * 
+ * + */ +@XmlRootElement(name = "etnRules") +@XmlAccessorType(XmlAccessType.NONE) +public class EtnRules { + private List excludePhenSigs = new ArrayList(); + + @XmlElement + @XmlList + public List getExcludePhenSigs() { + return excludePhenSigs; + } + + public void setExcludePhenSigs(List excludePhenSigs) { + this.excludePhenSigs = excludePhenSigs; + } +} diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java index 0a2780723b..26eb33bef4 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java @@ -348,6 +348,7 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox; * 05Mar2015 RM 15025 kshrestha Fix to maintain the headers that they are saved with * 10Mar2015 RM 14866 kshrestha Disable QC GUI pop up for TextWS * 6Apr2015 RM14968 mgamazaychikov Fix formatting for pathcast section + * 07Oct2015 RM 18132 D. Friedman Exlucde certain phensigs from automatic ETN incrementing. * * * @@ -378,6 +379,18 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, private static List gfePils = Arrays.asList("WSW", "NPW", "HLS", "CFW", "WCN", "FFA", "MWW", "RFW"); + /** + * Default list of VTEC phenomena significance codes for which the ETN + * should not be changed when sending a NEW-action product. + */ + private static final List defaultNoETNIncrementPhenSigs = Arrays + .asList("HU.A", "HU.S", "HU.W", "TR.A", "TR.W", "SS.A", "SS.W", + "TY.A", "TY.W"); + /** + * Path of ETN rules localization file + */ + private static final String ETN_RULES_FILE = "textws/gui/EtnRules.xml"; + /** * Auto wrap start range column.. */ @@ -5073,8 +5086,13 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, * this case (isOpertional && ! resend) case, * saveEditedProduct, does not actually save anything. */ - prod.setProduct(VtecUtil.getVtec( - removeSoftReturns(prod.getProduct()), true)); + if (shouldSetETNtoNextValue(prod)) { + statusHandler.handle(Priority.INFO, "Will increment ETN for this product."); + prod.setProduct(VtecUtil.getVtec( + removeSoftReturns(prod.getProduct()), true)); + } else { + statusHandler.handle(Priority.INFO, "Will NOT increment ETN for this product."); + } /* * This silly bit of code updates the ETN of a VTEC in the * text pane to reflect the ETN that was actually used, but @@ -5105,10 +5123,15 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, } else { try { if (!resend) { - body = VtecUtil - .getVtec(removeSoftReturns(MixedCaseProductSupport - .conditionalToUpper(prod.getNnnid(), - textEditor.getText()))); + if (shouldSetETNtoNextValue(prod)) { + statusHandler.handle(Priority.INFO, "Will increment ETN for this product."); + body = VtecUtil + .getVtec(removeSoftReturns(MixedCaseProductSupport + .conditionalToUpper(prod.getNnnid(), + textEditor.getText()))); + } else { + statusHandler.handle(Priority.INFO, "Will NOT increment ETN for this product."); + } } updateTextEditor(body); if ((inEditMode || resend) @@ -5151,6 +5174,34 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, } } + private EtnRules getETNRules() throws Exception { + LocalizationFile lf = PathManagerFactory.getPathManager() + .getStaticLocalizationFile(ETN_RULES_FILE); + if (lf == null) { + throw new Exception("ETN rules file (" + ETN_RULES_FILE + ") not found."); + } + return JAXB.unmarshal(lf.getFile(), EtnRules.class); + } + + private boolean shouldSetETNtoNextValue(StdTextProduct prod) { + List excludedPhenSigs = null; + try { + excludedPhenSigs = getETNRules().getExcludePhenSigs(); + } catch (Exception e) { + statusHandler.handle(Priority.WARN, + "Error loading ETN assignment rules. Will use default rules.", + e); + excludedPhenSigs = defaultNoETNIncrementPhenSigs; + } + boolean result = true; + VtecObject vo = VtecUtil.parseMessage(prod.getProduct()); + if (vo != null && excludedPhenSigs != null + && excludedPhenSigs.contains(vo.getPhensig())) { + result = false; + } + return result; + } + private OUPRequest createOUPRequest(StdTextProduct prod, String text) { OUPRequest req = new OUPRequest(); OfficialUserProduct oup = new OfficialUserProduct(); diff --git a/cave/com.raytheon.viz.textworkstation/localization/textws/gui/EtnRules.xml b/cave/com.raytheon.viz.textworkstation/localization/textws/gui/EtnRules.xml new file mode 100644 index 0000000000..27b6e3f9ae --- /dev/null +++ b/cave/com.raytheon.viz.textworkstation/localization/textws/gui/EtnRules.xml @@ -0,0 +1,4 @@ + + + HU.A HU.S HU.W TR.A TR.W SS.A SS.W TY.A TY.W + From 9f01e98c455879f2707b7f51990975e7a874ae36 Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Wed, 7 Oct 2015 12:29:53 -0400 Subject: [PATCH 06/21] ASM #17785 - Minor Template Change for Flash Flood Warning Change-Id: I5e25d173c261e92a7341f8fc5704165669115e93 Former-commit-id: eb717cbd6fd6da565bd6bf99d81db7c89f19c2df --- .../common_static/base/warngen/flashFloodWarning.xml | 6 +++--- .../base/warngen/flashFloodWarningFollowup.xml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/flashFloodWarning.xml b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/flashFloodWarning.xml index c49cc13286..3655eea173 100755 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/flashFloodWarning.xml +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/flashFloodWarning.xml @@ -133,7 +133,7 @@ Must be paired with proper vm code (also commented out in flashFloodWarning.vm)! - + @@ -183,7 +183,7 @@ Must be paired with proper vm code (also commented out in flashFloodWarning.vm)! - + @@ -234,7 +234,7 @@ Must be paired with proper vm code (also commented out in flashFloodWarning.vm)! - + diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/flashFloodWarningFollowup.xml b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/flashFloodWarningFollowup.xml index d122f9732d..b15ff3a07c 100755 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/flashFloodWarningFollowup.xml +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/flashFloodWarningFollowup.xml @@ -134,7 +134,7 @@ Must be paired with proper vm code (also commented out in flashFloodWarningFollo - + @@ -186,7 +186,7 @@ Must be paired with proper vm code (also commented out in flashFloodWarningFollo - + From 4a5cc197fc3b3bdb3d42a205c7758e368550e9c5 Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Wed, 7 Oct 2015 13:32:18 -0400 Subject: [PATCH 07/21] ASM #18120 - Changes to add tsunami advisory to GFE Change-Id: I93205516d5111c4f4482f857adfc491e218e65c7 Former-commit-id: 64700a4ddf86de279317170e7fe90c4ccb613f40 --- .../localization/gfe/userPython/procedures/MergeHazards.py | 5 +++-- .../gfe/userPython/utilities/MakeHazardConfig.py | 2 +- .../edex_static/base/textproducts/templates/product/AFD.py | 3 +++ .../base/textproducts/templates/product/AreaFcst.py | 3 +++ .../edex_static/base/textproducts/templates/product/SRF.py | 3 +++ .../utility/common_static/base/colormaps/GFE/Hazards.cmap | 1 + .../utility/common_static/base/vtec/VTECTable.py | 3 +++ 7 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/procedures/MergeHazards.py b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/procedures/MergeHazards.py index ada5b66fd1..50667790d1 100755 --- a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/procedures/MergeHazards.py +++ b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/procedures/MergeHazards.py @@ -178,8 +178,9 @@ HazardsConflictDict = { "SC.Y", "SW.Y", "SE.W", "RB.Y", "SI.Y", "CF.S", "TY.W", "GL.A", "SR.A", "HF.A", "SE.A", "CF.W", "CF.A", "CF.Y", "SU.W", "SU.Y"], - "TS.A" : ["TS.W"], - "TS.W" : ["TS.A"], + "TS.A" : ["TS.W", "TS.Y"], + "TS.W" : ["TS.A", "TS.Y"], + "TS.Y" : ["TS.A", "TS.W"], "TY.A" : ["TR.A", "TY.W", "HU.S", "HF.W", "GL.A", "SR.A", "HF.A", "SE.A", "CF.A", "CF.S"], "TY.W" : ["TY.A", "HU.S", "TR.A", "TR.W", "GL.A", "SR.A", "HF.A", "SE.A", "CF.A", "CF.S", "SU.Y", "GL.W", "SR.W", "HF.W", "BW.Y","SC.Y", "SW.Y", "SE.W", "RB.Y", "SI.Y", "CF.W", "CF.Y", "SU.W"], diff --git a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/utilities/MakeHazardConfig.py b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/utilities/MakeHazardConfig.py index b52b3918f8..36aed798cc 100644 --- a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/utilities/MakeHazardConfig.py +++ b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/utilities/MakeHazardConfig.py @@ -62,7 +62,7 @@ hazardDict = OrderedDict([ "GL.A", "GL.W", "SE.A", "SE.W", "UP.A", "UP.W", "HF.A", "HF.W", "LO.Y", "SC.Y", "SW.Y", "RB.Y", "SI.Y", "MS.Y", "SR.A", "SR.W"]), ('Tropical Cyclone', ["HU.W", "HU.A", "TR.W", "TR.A"]), - ('Tsunami', ["TS.A", "TS.W"]), + ('Tsunami', ["TS.A", "TS.W", "TS.Y"]), # ('Local', ["TEST"]), #example of adding local hazards # you can define your own groups of hazards by adding new categories diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AFD.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AFD.py index a0a95b8643..0a9f35aac9 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AFD.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AFD.py @@ -1107,4 +1107,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis): ('FW.W', allActions, 'FireWx'), # RED FLAG WARNING ('FW.A', allActions, 'FireWx1'), # FIRE WEATHER WATCH ('LO.Y', marineActions, 'LowWater'), # LOW WATER ADVISORY + ('TS.W', allActions, 'Tsunami'), # TSUNAMI WARNING + ('TS.Y', allActions, 'Tsunami'), # TSUNAMI ADVISORY + ('TS.A', allActions, 'Tsunami'), # TSUNAMI WATCH ] diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AreaFcst.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AreaFcst.py index ef0690d51f..117683a1fe 100755 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AreaFcst.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AreaFcst.py @@ -1516,4 +1516,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis): ('LO.Y', allActions, 'Drought'), # LOW WATER ADVISORY ('TO.A', allActions, 'Convective'), # TORNADO WATCH ('SV.A', allActions, 'Convective'), # SEVERE THUNDERSTORM WATCH + ('TS.W', allActions, 'Tsunami'), # TSUNAMI WARNING + ('TS.Y', allActions, 'Tsunami'), # TSUNAMI ADVISORY + ('TS.A', allActions, 'Tsunami'), # TSUNAMI WATCH ] diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/SRF.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/SRF.py index 86143b4b62..cece6da3f2 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/SRF.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/SRF.py @@ -1950,5 +1950,8 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis): ('SU.Y', allActions, 'Marine'), # HIGH SURF ADVISORY ('RP.S', allActions, 'Rip'), # High Rip Threat ('BH.S', allActions, 'BeachHaz'), # Beach Hazards Statement + ('TS.W', allActions, 'Tsunami'), # TSUNAMI WARNING + ('TS.Y', allActions, 'Tsunami'), # TSUNAMI ADVISORY + ('TS.A', allActions, 'Tsunami'), # TSUNAMI WATCH ] diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/utility/common_static/base/colormaps/GFE/Hazards.cmap b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/utility/common_static/base/colormaps/GFE/Hazards.cmap index bc51f8c46f..e546b390e1 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/utility/common_static/base/colormaps/GFE/Hazards.cmap +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/utility/common_static/base/colormaps/GFE/Hazards.cmap @@ -84,6 +84,7 @@ + diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/VTECTable.py b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/VTECTable.py index 63e5e5b5da..110c1434aa 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/VTECTable.py +++ b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/VTECTable.py @@ -281,6 +281,9 @@ VTECTable = { 'TS.W' : {'phen': 'TS', 'sig': 'W', 'hdln': 'Tsunami Warning'}, + 'TS.Y' : {'phen': 'TS', + 'sig': 'Y', + 'hdln': 'Tsunami Advisory'}, 'TY.A' : {'phen': 'TY', 'sig': 'A', 'hdln': 'Typhoon Watch'}, From bded51a1b97eb4b6d0752db39f140eb9018c0b37 Mon Sep 17 00:00:00 2001 From: "Loubna.Bousaidi" Date: Thu, 8 Oct 2015 18:04:01 +0000 Subject: [PATCH 08/21] ASM #17978 fixed the hydroview display for time step Change-Id: I1d8ad9cc8dc3320190763738be4683f68ab676f3 Former-commit-id: b8709b6bcbcd274d23ea079d9874b57d90cd4b2c --- .../PointDataControlManager.java | 6 +- .../data/StationEntryDetails.java | 14 + .../hydro/resource/MultiPointResource.java | 565 +++++++++++++----- .../viz/hydrocommon/data/GageData.java | 170 +++++- .../hydrocommon/data/GageDataTimeStep.java | 340 +++++++++++ 5 files changed, 937 insertions(+), 158 deletions(-) create mode 100644 cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/GageDataTimeStep.java diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/pointdatacontrol/PointDataControlManager.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/pointdatacontrol/PointDataControlManager.java index 3b16653e05..3e39c9b05c 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/pointdatacontrol/PointDataControlManager.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/pointdatacontrol/PointDataControlManager.java @@ -80,7 +80,9 @@ import com.raytheon.viz.hydrocommon.util.HydroDialogStatus; * Jan 27, 2011 #5274 bkowal Using the swt job class to request data * asynchronously and display a progress * indicator on the main interface. - * Feb 11, 2014 #15829 lbousaidi check for Missing before processing River Threat. + * Feb 11, 2014 #15829 lbousaidi check for Missing before processing River Threat. + * Oct 05, 2015 #17978 lbousaidi updated addStationEntry() to use StationEntryDetails.getPeDTsE() + * * * * @author mpduff @@ -1079,7 +1081,7 @@ public class PointDataControlManager extends Job { * the StationEntryDetails object to add */ public void addStationEntry(StationEntryDetails sed) { - stationEntryMap.put(sed.getLid(), sed); + stationEntryMap.put(sed.getPeDTsE(), sed); } /** diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/pointdatacontrol/data/StationEntryDetails.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/pointdatacontrol/data/StationEntryDetails.java index aaaa183e75..8c0fd5b1ea 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/pointdatacontrol/data/StationEntryDetails.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/pointdatacontrol/data/StationEntryDetails.java @@ -31,6 +31,7 @@ import java.util.Calendar; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 4, 2009 mpduff Initial creation + * Oct 05, 015 17978 lbousaidi added getPeDTsE() * * * @@ -422,5 +423,18 @@ public class StationEntryDetails { return sb.toString(); } + /** + * Get the ingest filter table primary key value for this data object. + * + * @return The primary key object + */ + public String getPeDTsE() { + StringBuilder sb = new StringBuilder(); + sb.append(this.lid); + sb.append(this.pe); + sb.append(this.ts); + + return sb.toString(); + } } diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/resource/MultiPointResource.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/resource/MultiPointResource.java index c1fcd5de6f..067f613a69 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/resource/MultiPointResource.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/resource/MultiPointResource.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.TimeZone; import javax.measure.unit.NonSI; @@ -89,6 +90,7 @@ import com.raytheon.viz.hydrocommon.HydroDisplayManager; import com.raytheon.viz.hydrocommon.colorscalemgr.HydroColorManager; import com.raytheon.viz.hydrocommon.data.GageData; import com.raytheon.viz.hydrocommon.data.GageData.ThreatIndex; +import com.raytheon.viz.hydrocommon.data.GageDataTimeStep; import com.raytheon.viz.hydrocommon.data.RiverStat; import com.raytheon.viz.hydrocommon.pdc.PDCOptionData; import com.raytheon.viz.hydrocommon.whfslib.colorthreshold.ColorThreshold; @@ -133,6 +135,7 @@ import com.vividsolutions.jts.index.strtree.STRtree; * Apr 09, 2015 4215 mpduff Check strTree before removing items. * Jun 26, 2015 17386 xwei Fixed : HydroView crashes in when Refresh Data after loading saved display files * Jul 06, 2015 4215 mpduff Correct the fact that user's cannot click and view time series. + * Oct 05, 2015 17978 lbousaidi Enable TimeStep GUI to display multiple values and Parameter Codes for a given lid * * * @@ -218,7 +221,11 @@ public class MultiPointResource extends private final Map dataMap = new HashMap(); + private final Map dataMapTimeStep = new HashMap(); + private STRtree strTree = new STRtree(); + + private STRtree strTreeTimeStep = new STRtree(); private IFont font; @@ -332,18 +339,45 @@ public class MultiPointResource extends for (GageData gage : data) { /* Get the point color for this location */ if ((gage.getLid() != null) && gage.isUse()) { - addPoint(gage); + if ( pcOptions.getQueryMode() == 1 ){ + addPointTimeStep(gage); + }else{ + addPoint(gage); + } } } } } /** - * Add a point to this resource. + * Add a point to this resource in TimeStep Mode. * * @param gage * GageData object - */ + */ + private synchronized void addPointTimeStep(GageData gage) { + String lid = gage.getLid(); + + if ( !dataMapTimeStep.containsKey(lid) ) { + + Coordinate xy = new Coordinate(gage.getLon(), gage.getLat()); + gage.setCoordinate(xy); + + /* Create a small envelope around the point */ + PixelExtent pe = getPixelExtent( gage, getShiftWidth(gage), getShiftHeight(gage) ); + Envelope newEnv = descriptor.pixelToWorld( pe ); + + GageDataTimeStep newGageTS = new GageDataTimeStep( gage ); + + strTree.insert(newEnv, newGageTS); + dataMapTimeStep.put(lid, newGageTS); + + } else{ + dataMapTimeStep.get(lid).Update(gage); + } + + } + private synchronized void addPoint(GageData gage) { String lid = gage.getLid(); GageData existing = dataMap.get(lid); @@ -422,6 +456,216 @@ public class MultiPointResource extends return new PixelExtent(coors); } + + /** + * Draws the plot information for TimeStep + * + * @param data + * the gage data obj + * @param shiftWidth + * the shift width coordinate + * @param shiftHeight + * the shift height coordinate + * @param paintProps + * the paint properties + * @param target + * the graphics target + * @throws VizException + */ + private Collection drawPlotInfoTimeStep(GageDataTimeStep gageTimeStep, + double shiftWidth, double shiftHeight, PaintProperties paintProps, + IGraphicsTarget target) throws VizException { + List strings = new ArrayList(); + Coordinate c = gageTimeStep.getCoordinate(); + + + + /* Logic for determining how the data values are displayed. */ + boolean showValue1 = pdcManager.isValue(); + + + double[] centerpixels = descriptor + .worldToPixel(new double[] { c.x, c.y }); + + if (showValue1) { + + String [] valueStrings; + + if ( pcOptions.getElementType() == 1 ){ + valueStrings = gageTimeStep.getRainValue( pcOptions.getPrecipPeFilter() ).split("\n"); + }else{ + valueStrings = gageTimeStep.getOtherValue().split("\n"); + } + + int strSize = valueStrings.length; + + RGB[] strColor = new RGB[strSize]; + + if ( strSize > 0){ + for (int i=0; i data = pdcManager.getObsReportList(); resetDataMap(); - if (data != null) { - List images = new ArrayList(data.size()); - List strings = new ArrayList( - data.size() * 3); - for (GageData gage : data) { - /* Get the point color for this location */ - if ((gage.getLid() != null) && gage.isUse()) { - addPoint(gage); - Coordinate c = gage.getCoordinate(); - double[] pixel = descriptor.worldToPixel(new double[] { - c.x, c.y }); - if (pixel != null && extent.contains(pixel)) { - double shiftHeightValue = getShiftHeight(gage); - double shiftWidthValue = getShiftWidth(gage); - /* Draw the icons */ - if (pcOptions.getIcon() == 1) { - RGB color = null; - if (pcOptions.getRiverStatus() == 1) { - color = gage.getColor(); - } else { - color = RGBColors.getRGBColor(colorSet.get(0) - .getColorname().getColorName()); - } - PointImage image = new PointImage(getIcon(target, - gage, color), pixel[0], pixel[1]); - image.setSiteId(gage.getLid()); - images.add(image); - } - strings.addAll(drawPlotInfo(gage, shiftWidthValue, - shiftHeightValue, paintProps, target)); - } - } - } - if (images.size() > 0) { - target.getExtension(IPointImageExtension.class) - .drawPointImages(paintProps, images); - } - if (strings.size() > 0) { - target.drawStrings(strings); - } - } - + + if ( pcOptions.getQueryMode() == 1 ){ + paintInternalHelperTimeStep( target, paintProps ); + }else{ + paintInternalHelper( target, paintProps ); + } + GageData currentData = manager.getCurrentData(); if (currentData != null) { List siteList = pdcManager.getObsReportList(); @@ -850,7 +1004,141 @@ public class MultiPointResource extends } } + + /** + * Paint method called to display this resource in TimeStep mode. + * + * @param target + * The IGraphicsTarget + * @param paintProps + * The Paint Properties + * @throws VizException + */ + private void paintInternalHelperTimeStep(IGraphicsTarget target, PaintProperties paintProps) throws VizException { + + List data = pdcManager.getObsReportList(); + + if (data == null) { + return; + } + + for (GageData gage : data) { + /* Get the point color for this location */ + if ((gage.getLid() != null) && gage.isUse()) { + + addPointTimeStep(gage); + + } + + } + + IExtent extent = paintProps.getView().getExtent(); + + List images = new ArrayList( dataMapTimeStep.size() ); + List strings = new ArrayList( dataMapTimeStep.size() * 3 ); + + Iterator> it = dataMapTimeStep.entrySet().iterator(); + Map.Entry gageTS = null; + while ( it.hasNext() ) { + gageTS = it.next(); + + Coordinate c = gageTS.getValue().getCoordinate(); + double[] pixel = descriptor.worldToPixel(new double[] { c.x, c.y }); + + if (pixel != null && extent.contains(pixel)) { + double shiftHeightValue = getShiftHeight(gageTS.getValue()); + double shiftWidthValue = getShiftWidth(gageTS.getValue()); + /* Draw the icons */ + if (pcOptions.getIcon() == 1) { + RGB color = null; + if (pcOptions.getRiverStatus() == 1) { + color = gageTS.getValue().getColor(); + } else { + color = RGBColors.getRGBColor(colorSet.get(0) + .getColorname().getColorName()); + } + PointImage image = new PointImage( + getIcon(target, gageTS.getValue(), color), pixel[0], pixel[1] + ); + + image.setSiteId(gageTS.getValue().getLid()); + images.add(image); + } + strings.addAll( drawPlotInfoTimeStep( gageTS.getValue(), shiftWidthValue, shiftHeightValue, paintProps, target ) ); + } + + } + if (images.size() > 0) { + target.getExtension(IPointImageExtension.class) + .drawPointImages(paintProps, images); + } + if (strings.size() > 0) { + target.drawStrings(strings); + } + } + + /** + * Paint method called to display this resource. + * + * @param target + * The IGraphicsTarget + * @param paintProps + * The Paint Properties + * @throws VizException + */ + private void paintInternalHelper(IGraphicsTarget target, PaintProperties paintProps) throws VizException { + + List data = pdcManager.getObsReportList(); + + if (data == null) { + return; + } + + IExtent extent = paintProps.getView().getExtent(); + + List images = new ArrayList( data.size() ); + List strings = new ArrayList( data.size() * 3 ); + for (GageData gage : data) { + /* Get the point color for this location */ + if ((gage.getLid() != null) && gage.isUse()) { + + addPoint(gage); + + Coordinate c = gage.getCoordinate(); + double[] pixel = descriptor.worldToPixel(new double[] { c.x, c.y }); + + if (pixel != null && extent.contains(pixel)) { + double shiftHeightValue = getShiftHeight(gage); + double shiftWidthValue = getShiftWidth(gage); + /* Draw the icons */ + if (pcOptions.getIcon() == 1) { + RGB color = null; + if (pcOptions.getRiverStatus() == 1) { + color = gage.getColor(); + } else { + color = RGBColors.getRGBColor(colorSet.get(0) + .getColorname().getColorName()); + } + PointImage image = new PointImage(getIcon(target, + gage, color), pixel[0], pixel[1]); + image.setSiteId(gage.getLid()); + images.add(image); + } + strings.addAll( drawPlotInfo(gage, shiftWidthValue, shiftHeightValue, paintProps, target) ); + } + } + } + + if (images.size() > 0) { + target.getExtension(IPointImageExtension.class) + .drawPointImages(paintProps, images); + } + if (strings.size() > 0) { + target.drawStrings(strings); + } + } + /** * Set the selected coordinate * @@ -941,49 +1229,9 @@ public class MultiPointResource extends } return null; } + - private String getDataFormat(String pe) { - String format = "6.2f"; - - if (pe.toUpperCase().startsWith("H")) { - /* Height data */ - format = "%6.2f"; - } else if (pe.toUpperCase().startsWith("P")) { - /* Precip/Pressure data */ - format = "%6.2f"; - } else if (pe.toUpperCase().startsWith("T")) { - /* Temperature data */ - format = "%6.0f"; - } else if (pe.toUpperCase().startsWith("S")) { - /* Snow data */ - if (pe.equalsIgnoreCase("SL")) { - format = "%6.2f"; - } else { - format = "%6.1f"; - } - } else if (pe.toUpperCase().startsWith("U")) { - /* Wind data */ - if (pe.equalsIgnoreCase("UQ")) { - format = "%8.4f"; - } else { - format = "%6.0f"; - } - } else if (pe.toUpperCase().startsWith("X")) { - /* Weather data */ - format = "%5.0f"; - } else if (pe.toUpperCase().startsWith("Q")) { - /* Flow/Runoff data */ - if (!pe.equalsIgnoreCase("QB")) { - format = "%6.0f"; - } else { - format = "%6.2f"; - } - } - - return format; - } - - private RGB getRiverValueColorForTimeStepMode(GageData gage) { + private RGB getRiverValueColorForTimeStepMode( String pLid, double pValue ) { RGB color = null; String threatIndex = ThreatIndex.THREAT_MISSING_DATA.getThreatIndex(); @@ -991,7 +1239,7 @@ public class MultiPointResource extends double floodLevel = PDCConstants.MISSING_VALUE; /* Get the river status object for this lid */ - RiverStat riverStat = dataManager.getRiverStatus(gage.getLid()); + RiverStat riverStat = dataManager.getRiverStatus(pLid); int selectedTimeStepElement = pcOptions.getTsDataElement(); @@ -1012,12 +1260,12 @@ public class MultiPointResource extends } // determine the threat level - if ((gage.getValue()) != PDCConstants.MISSING_VALUE) { + if (( pValue ) != PDCConstants.MISSING_VALUE) { threatIndex = ThreatIndex.THREAT_MISSING_STAGE.getThreatIndex(); if ((actionLevel != PDCConstants.MISSING_VALUE) && (actionLevel != 0)) { - if (gage.getValue() >= actionLevel) { + if ( pValue >= actionLevel) { threatIndex = ThreatIndex.THREAT_ACTION.getThreatIndex(); } else { threatIndex = ThreatIndex.THREAT_NONE.getThreatIndex(); @@ -1025,7 +1273,7 @@ public class MultiPointResource extends } if ((floodLevel != PDCConstants.MISSING_VALUE) && (floodLevel != 0)) { - if (gage.getValue() >= floodLevel) { + if ( pValue >= floodLevel) { threatIndex = ThreatIndex.THREAT_FLOOD.getThreatIndex(); } else if (actionLevel == PDCConstants.MISSING_VALUE) { threatIndex = ThreatIndex.THREAT_NONE.getThreatIndex(); @@ -1244,10 +1492,19 @@ public class MultiPointResource extends /** * Clear the data map. - */ + */ public void resetDataMap() { - dataMap.clear(); - strTree = new STRtree(); + + if (pcOptions.getQueryMode() == 1){ + + dataMapTimeStep.clear(); + strTreeTimeStep = new STRtree(); + }else{ + + dataMap.clear(); + strTree = new STRtree(); + } + } private class TimeSeriesLaunchAction extends AbstractRightClickAction { diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/GageData.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/GageData.java index 07a0dca1d4..4372a8753f 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/GageData.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/GageData.java @@ -42,7 +42,8 @@ import com.vividsolutions.jts.geom.Coordinate; * ------------ ---------- ----------- -------------------------- * 05Nov2008 --- dhladky Initial Creation * 14Mar2012 1790 rferrel Fix Comparable to remove eclipse warnings. - * + * 05Oct2015 17978 lbousaidi Added getParamCode(), getShefDurCode(), convertDur(), + * getDataFormat(). * * * @author dhladky @@ -909,7 +910,7 @@ public class GageData implements Comparable { return retVal; } - /* + /** * (non-Javadoc) * * @see java.lang.Object#toString() @@ -918,4 +919,169 @@ public class GageData implements Comparable { public String toString() { return this.getLid(); } + + /** + * Get Parameter Code + * + * @return String Parameter Code + * + */ + public String getParamCode(){ + return getPe() + getShefDurCode()+ getTs() + getExtremum(); + } + + /** + * Get Shef Duration Code + * + * @return String Shef Duration Code + * + */ + public String getShefDurCode(){ + + String shefDurCode; + if ( getPe().equalsIgnoreCase("PC") ) { + + // PC is always "I", but sometimes the duration might have been + // screwed up + + shefDurCode = "I"; + } else { + shefDurCode = convertDur((int) getDur()); + if (shefDurCode == null) { + shefDurCode = "?"; + } + } + return shefDurCode; + + } + + /** + * Convert duration int to String character. + * + * @param dur + * The duration value + * @return The single character duration value + */ + public static String convertDur(int dur) { + String value = null; + + switch (dur) { + case 0: + value = "I"; + break; + case 1: + value = "U"; + break; + case 5: + value = "E"; + break; + case 10: + value = "G"; + break; + case 15: + value = "C"; + break; + case 30: + value = "J"; + break; + case 1001: + value = "H"; + break; + case 1002: + value = "B"; + break; + case 1003: + value = "T"; + break; + case 1004: + value = "F"; + break; + case 1006: + value = "Q"; + break; + case 1008: + value = "A"; + break; + case 1012: + value = "K"; + break; + case 1018: + value = "L"; + break; + case 2001: + value = "D"; + break; + case 2007: + value = "W"; + break; + case 3001: + value = "M"; + break; + case 4001: + value = "Y"; + break; + case 5004: + value = "P"; + break; + case 5001: + value = "S"; + break; + case 5002: + value = "R"; + break; + case 5005: + value = "X"; + break; + } + + return value; + } + + /** + * Get data format + * + * @param pe - element type + * + * @return String - format string + */ + public static String getDataFormat(String pe) { + String format = "6.2f"; + + if (pe.toUpperCase().startsWith("H")) { + /* Height data */ + format = "%6.2f"; + } else if (pe.toUpperCase().startsWith("P")) { + /* Precip/Pressure data */ + format = "%6.2f"; + } else if (pe.toUpperCase().startsWith("T")) { + /* Temperature data */ + format = "%6.0f"; + } else if (pe.toUpperCase().startsWith("S")) { + /* Snow data */ + if (pe.equalsIgnoreCase("SL")) { + format = "%6.2f"; + } else { + format = "%6.1f"; + } + } else if (pe.toUpperCase().startsWith("U")) { + /* Wind data */ + if (pe.equalsIgnoreCase("UQ")) { + format = "%8.4f"; + } else { + format = "%6.0f"; + } + } else if (pe.toUpperCase().startsWith("X")) { + /* Weather data */ + format = "%5.0f"; + } else if (pe.toUpperCase().startsWith("Q")) { + /* Flow/Runoff data */ + if (!pe.equalsIgnoreCase("QB")) { + format = "%6.0f"; + } else { + format = "%6.2f"; + } + } + + return format; + } } \ No newline at end of file diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/GageDataTimeStep.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/GageDataTimeStep.java new file mode 100644 index 0000000000..4a1356cab4 --- /dev/null +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/GageDataTimeStep.java @@ -0,0 +1,340 @@ +/** + * 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.viz.hydrocommon.data; + +/** + * Class for packaging the gage data in TimeStep mode. + * + *
+ * SOFTWARE HISTOR
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Sep 14, 2015  17978     lbousaidi   Initial Creation  
+ * 
+ * + * @author lbousaidi + * @version 1.0 + */ + + +public class GageDataTimeStep extends GageData { + + private String PP_p = ""; + + private String PC_p = ""; + + private String Other_p = ""; + + private String PP_v = ""; + + private String PC_v = ""; + + private String Other_v = ""; + + /** + * public constructor + */ + public GageDataTimeStep(){ + super(); + + } + + /** + * public constructor + * + * @param gage + */ + public GageDataTimeStep( GageData gage ){ + + setLid(gage.getLid()); + setName(gage.getName()); + setElevation(gage.getElevation()); + setValidtime(gage.getValidtime()); + setCoordinate(gage.getCoordinate()); + setDispClass(gage.getDispClass()); + + setValue( gage.getValue() ); + setThreatIndex( gage.getThreatIndex() ); + + setP( gage ); + setV( gage ); + return; + } + + /** + * Update by a gage + * + * @param gage + */ + public void Update( GageData gage ){ + + if (getValue() < gage.getValue()){ + setValue( gage.getValue() ); + setThreatIndex(gage.getThreatIndex()); + } + + addParam( gage ); + addValue( gage ); + + return; + } + + + + /** + * Get both PP and PC Parameter codes + */ + public String getPpAndPcParam() { + + return combineString( PP_p, PC_p ); + + } + + /** + * Get both PP and PC Values + */ + public String getPpAndPcValue() { + + return combineString( PP_v, PC_v ); + + } + + /** + * Get PP Parameter codes + */ + public String getPpParam( ) { + + return PP_p; + } + + /** + * Get both PP values + */ + public String getPpValue() { + + return PP_v; + } + + /** + * Get PC Parameter codes + */ + public String getPcParam( ) { + + return PC_p; + } + + /** + * Get both PC values + */ + public String getPcValue() { + + return PC_v; + } + + /** + * Get Parameter codes for rain + */ + public String getRainParam(int a){ + + if (a == 0){ + return getPpAndPcParam(); + } + + if (a == 1){ + return getPcParam(); + } + + if (a == 2){ + return getPpParam(); + } + + return ""; + } + + /** + * Get Parameter values for rain + */ + public String getRainValue(int a){ + + if (a == 0){ + return getPpAndPcValue(); + } + + if (a == 1){ + return getPcValue(); + } + + if (a == 2){ + return getPpValue(); + } + + return ""; + } + + /** + * Get both Parameter codes for other + */ + public String getOtherParam() { + + return Other_p; + } + + /** + * Get both values for other + */ + public String getOtherValue() { + + return Other_v; + } + + /** + * Set Parameter codes + * + * @param gage + * + */ + private void setP( GageData gage ) { + + if (gage.getPe().equalsIgnoreCase("PP")){ + + PP_p = gage.getParamCode(); + return; + + } + + if (gage.getPe().equalsIgnoreCase("PC")){ + + PC_p = gage.getParamCode(); + return; + } + + Other_p = gage.getParamCode(); + + } + + /** + * Set values + * + * @param gage + * + */ + private void setV( GageData gage ) { + + if (gage.getPe().equalsIgnoreCase("PP")){ + + PP_v = formatValue(gage); + return; + } + + if (gage.getPe().equalsIgnoreCase("PC")){ + + PC_v = formatValue(gage); + return; + } + + Other_v = formatValue(gage); + + } + + /** + * Add Parameter codes + * + * @param gage + * + */ + private void addParam( GageData gage ) { + + if (gage.getPe().equalsIgnoreCase("PP")){ + + PP_p = combineString(PP_p, gage.getParamCode()); + } + + if (gage.getPe().equalsIgnoreCase("PC")){ + + PC_p = combineString(PC_p, gage.getParamCode()); + } + + Other_p = combineString (Other_p, gage.getParamCode()); + } + + /** + * Add values + * + * @param gage + * + */ + private void addValue( GageData gage ) { + + if (gage.getPe().equalsIgnoreCase("PP")){ + + PP_v = combineString( PP_v, formatValue(gage) ); + } + + if (gage.getPe().equalsIgnoreCase("PC")){ + + PC_v = combineString( PC_v, formatValue(gage) ); + } + + Other_v = combineString ( Other_v, formatValue(gage) ); + + } + + /** + * Combine two strings + * + * @param strOne first string + * + * @param strTwo second string + */ + private String combineString( String strOne, String strTwo ) { + + String combinedStr = ""; + + if (strOne.equalsIgnoreCase("")){ + combinedStr = strTwo; + }else { + if ( !strTwo.equalsIgnoreCase("") ){ + combinedStr = strOne + "\n" + strTwo; + }else{ + combinedStr = strOne; + } + } + + return combinedStr; + } + + public static String formatValue( GageData pGage ){ + + String valueLabel; + String formatStr = null; + + formatStr = getDataFormat( pGage.getPe() ); + + if ( pGage.getValue() == -9999 ) { + valueLabel = "M"; + } else { + valueLabel = String.format( formatStr, pGage.getValue() ); + } + + return valueLabel; + } + +} From 006ea4637ef300a8292e7043f8c27c3e4efac44c Mon Sep 17 00:00:00 2001 From: "Bruce.Hundermark" Date: Wed, 7 Oct 2015 14:42:08 +0000 Subject: [PATCH 09/21] ASM #18125 Show_ISC_Info error message displayed when closing ISC Info dialog Change-Id: I52b59d7f7ca1c3763bb5c711d6f7fb2a241e85bc Former-commit-id: 9cff7d78762288c3481b728c201f705d794c01ae --- .../src/com/raytheon/viz/gfe/smarttool/Tool.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/Tool.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/Tool.java index 1067fa404d..e4d4250ce9 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/Tool.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/Tool.java @@ -73,6 +73,7 @@ import com.raytheon.viz.gfe.smarttool.script.SmartToolController; * 02/20/2013 #1597 randerso Added logging to support GFE Performance metrics * 04/10/2013 16028 ryu Check for null seTime in execute() * 07/07/2015 14739 ryu Modified execute() to return with updated varDict. + * 10/08/2015 18125 bhunder Modified CANCEL_MSG_START to work with Jep updates * * * @@ -87,7 +88,7 @@ public class Tool { private final IPerformanceStatusHandler perfLog = PerformanceStatus .getHandler("GFE:"); - private static final String CANCEL_MSG_START = "jep.JepException: : Cancel: Cancel >>>"; + private static final String CANCEL_MSG_START = "jep.JepException: : Cancel: Cancel"; private final IParmManager parmMgr; From bae2c8d0b6a7aca441173c7056d9c9a7ccc3eaf6 Mon Sep 17 00:00:00 2001 From: "Qinglu.Lin" Date: Fri, 9 Oct 2015 08:53:35 -0400 Subject: [PATCH 10/21] ASM #18154 - assigning 1 to usedirs in warngenloc table results in incorrect third bullet in a SVR product Change-Id: I121d2610ea72f9afdd21bb2fb790e26c5aeb1b4d Former-commit-id: b5534ca240aa8931ac0f09d945b1d99f307ff982 --- .../common/dataplugin/warning/portions/GisUtil.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/portions/GisUtil.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/portions/GisUtil.java index 5248882683..9c1e8572cb 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/portions/GisUtil.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/portions/GisUtil.java @@ -60,6 +60,7 @@ import com.vividsolutions.jts.geom.GeometryFactory; * for county based products. * Jan 13, 2015 3996 ccody Correct NPE caused by calculating portions of Geometry objects with multiple sub Geometry objects * This is a Jim Ramer fix + * Oct 9, 2015 #18154 Qinglu Lin Updated calculateLocationPortion(). * * * @author chammack @@ -353,12 +354,6 @@ public class GisUtil { public static EnumSet calculateLocationPortion( Geometry locationGeom, Geometry reference, boolean useExtreme, boolean notUseShapefileCentroid) { - CountyUserData cud = (CountyUserData) locationGeom.getUserData(); - Map atts = cud.entry.attributes; - Number lonNumber = (Number) atts.get("LON"); - double lonDouble = lonNumber.doubleValue(); - Number latNumber = (Number) atts.get("LAT"); - double latDouble = latNumber.doubleValue(); for (int i = 0; i < locationGeom.getNumGeometries(); i++) { Geometry geom = locationGeom.getGeometryN(i); if (geom.intersects(reference)) { @@ -368,9 +363,10 @@ public class GisUtil { geomCentroid = geom.getEnvelope().getCentroid() .getCoordinate(); } else { + Map atts = ((CountyUserData) locationGeom.getUserData()).entry.attributes; geomCentroid = new Coordinate(); - geomCentroid.x = lonDouble; - geomCentroid.y = latDouble; + geomCentroid.x = ((Number) atts.get("LON")).doubleValue(); + geomCentroid.y = ((Number) atts.get("LAT")).doubleValue(); } Coordinate refCentroid = reference.getCentroid() .getCoordinate(); From 0b96489dc5c15ce25f2d1cb20b20188a0dbb212d Mon Sep 17 00:00:00 2001 From: David Friedman Date: Fri, 9 Oct 2015 15:23:22 +0000 Subject: [PATCH 11/21] ASM #17996 - Distorted 4-panel display in side pane (Additional fix for NSHARP) Change-Id: I5354b82d1162bf0531470314d879d8122aeaf1f3 Former-commit-id: af261a4e5e9053c66125cb987c714203c77adab6 --- .../raytheon/uf/viz/d2d/ui/map/SideView.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/cave/com.raytheon.uf.viz.d2d.ui/src/com/raytheon/uf/viz/d2d/ui/map/SideView.java b/cave/com.raytheon.uf.viz.d2d.ui/src/com/raytheon/uf/viz/d2d/ui/map/SideView.java index d2b9f39b07..6e43a2510a 100644 --- a/cave/com.raytheon.uf.viz.d2d.ui/src/com/raytheon/uf/viz/d2d/ui/map/SideView.java +++ b/cave/com.raytheon.uf.viz.d2d.ui/src/com/raytheon/uf/viz/d2d/ui/map/SideView.java @@ -95,7 +95,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Aug 25, 2014 3467 mapeters Removed changing of editability from swapPanes(). * Mar 02, 2015 4204 njensen Support for swapping part names * Apr 02, 2015 4204 njensen Fix 4-panel swap of renamed parts - * Sep 18, 2015 DR 17996 D. Friedman Clear editor pane's renderable display before swap + * Sep 18, 2015 DR 17996 D. Friedman Clear editor pane's IRenderableDisplay before swap * * * @@ -389,6 +389,11 @@ public class SideView extends ViewPart implements IMultiPaneEditor, int viewPaneCount = viewPanes.length; try { + boolean isCompatibleEditor = theEditor + .getSite() + .getId() + .equals(DescriptorMap.getEditorId(myRenderables[0] + .getDescriptor().getClass().getName())); // I have my renderables saved off, load editor renderables // to me first if (viewPaneCount > editorPaneCount) { @@ -399,7 +404,15 @@ public class SideView extends ViewPart implements IMultiPaneEditor, for (int i = 0; i < editorPaneCount; ++i) { IRenderableDisplay display = editorPanes[i] .getRenderableDisplay(); - editorPanes[i].setRenderableDisplay(null); + /* + * TODO: This condition is currently needed because the + * NSHARP input handlers incorrectly retain references + * to VizDisplayPane instances. Should do this + * unconditionally when that is fixed. + */ + if (isCompatibleEditor) { + editorPanes[i].setRenderableDisplay(null); + } viewPanes[i].setRenderableDisplay(display); if (editorHiddenDisplays.contains(editorPanes[i] .getRenderableDisplay()) == false @@ -412,7 +425,10 @@ public class SideView extends ViewPart implements IMultiPaneEditor, IRenderableDisplay display = editorPanes[i] .getRenderableDisplay(); boolean hide = editorHiddenDisplays.contains(display); - editorPanes[i].setRenderableDisplay(null); + // TODO: See note above for the isCompatibleEditor condition. + if (isCompatibleEditor) { + editorPanes[i].setRenderableDisplay(null); + } if (i < viewPaneCount) { viewPanes[i].setRenderableDisplay(display); if (hide) { @@ -429,11 +445,7 @@ public class SideView extends ViewPart implements IMultiPaneEditor, } } - if (theEditor - .getSite() - .getId() - .equals(DescriptorMap.getEditorId(myRenderables[0] - .getDescriptor().getClass().getName()))) { + if (isCompatibleEditor) { // swap loop properties LoopProperties editorLoopProperties = theEditor From e01b2a83aff2df6ea2419f5ef7289c894ba740bc Mon Sep 17 00:00:00 2001 From: David Friedman Date: Fri, 9 Oct 2015 19:57:57 +0000 Subject: [PATCH 12/21] ASM #17944 - RADAR: Radarserver should handle NDM file tdwrElevations.txt properly Change-Id: Idbe78a67e85c4f40f0cfedb0b58b379e84302058 Former-commit-id: 18755ea398e4279476a0073bacffd6db61ea0ee6 --- .../src/com/raytheon/rcm/products/ElevationInfo.java | 2 +- .../META-INF/MANIFEST.MF | 3 ++- .../viz/monitor/scan/commondialogs/TrendGraphCanvas.java | 3 ++- .../com/raytheon/uf/viz/radarapps/core/RadarApps.java | 9 +++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ElevationInfo.java b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ElevationInfo.java index ff95ecce19..7e9381609e 100644 --- a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ElevationInfo.java +++ b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ElevationInfo.java @@ -120,7 +120,7 @@ public class ElevationInfo { private ArrayList vcpInfo = new ArrayList(); private HashMap staticInfo = new HashMap(); - public ElevationInfo() { + /*package*/ ElevationInfo() { Scanner fs; InputStream s; diff --git a/cave/com.raytheon.uf.viz.monitor.scan/META-INF/MANIFEST.MF b/cave/com.raytheon.uf.viz.monitor.scan/META-INF/MANIFEST.MF index 819df9de5d..31285370e9 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.uf.viz.monitor.scan/META-INF/MANIFEST.MF @@ -16,7 +16,8 @@ Require-Bundle: org.eclipse.ui, com.raytheon.uf.viz.cwat;bundle-version="1.11.17", com.raytheon.uf.common.dataplugin.cwat;bundle-version="1.11.17", com.raytheon.uf.common.dataplugin.scan;bundle-version="1.12.1112", - com.raytheon.rcm.lib;bundle-version="1.12.1174" + com.raytheon.rcm.lib;bundle-version="1.12.1174", + com.raytheon.uf.viz.radarapps.core;bundle-version="1.15.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Export-Package: com.raytheon.uf.viz.monitor.scan, diff --git a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/commondialogs/TrendGraphCanvas.java b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/commondialogs/TrendGraphCanvas.java index b60d8b4b6e..9e1d0bf52f 100644 --- a/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/commondialogs/TrendGraphCanvas.java +++ b/cave/com.raytheon.uf.viz.monitor.scan/src/com/raytheon/uf/viz/monitor/scan/commondialogs/TrendGraphCanvas.java @@ -48,6 +48,7 @@ import com.raytheon.uf.common.monitor.scan.config.SCANConfigEnums.ScanTables; import com.raytheon.uf.common.monitor.scan.xml.SCANAttributesXML; import com.raytheon.uf.viz.monitor.scan.TrendGraphData; import com.raytheon.uf.viz.monitor.scan.config.SCANConfig; +import com.raytheon.uf.viz.radarapps.core.RadarApps; /** * @@ -398,7 +399,7 @@ public class TrendGraphCanvas { scanTable, "rng", ident); LinkedHashMap rngDateMap = tgd.getGraphData(); - ElevationInfo eleInfo = new ElevationInfo(); + ElevationInfo eleInfo = RadarApps.getElevationInfo(); int[] elevationAngles = eleInfo.getScanElevations(null, vcp); if (elevationAngles == null) return; diff --git a/cave/com.raytheon.uf.viz.radarapps.core/src/com/raytheon/uf/viz/radarapps/core/RadarApps.java b/cave/com.raytheon.uf.viz.radarapps.core/src/com/raytheon/uf/viz/radarapps/core/RadarApps.java index d842da8007..523274da25 100644 --- a/cave/com.raytheon.uf.viz.radarapps.core/src/com/raytheon/uf/viz/radarapps/core/RadarApps.java +++ b/cave/com.raytheon.uf.viz.radarapps.core/src/com/raytheon/uf/viz/radarapps/core/RadarApps.java @@ -33,6 +33,7 @@ import com.raytheon.rcm.config.RadarType; import com.raytheon.rcm.config.RcmUtil; import com.raytheon.rcm.mqsrvr.ReplyObj.ConfigReply; import com.raytheon.rcm.mqsrvr.ReqObj; +import com.raytheon.rcm.products.ElevationInfo; import com.raytheon.uf.viz.core.catalog.DirectDbQuery; import com.raytheon.uf.viz.core.catalog.DirectDbQuery.QueryLanguage; import com.raytheon.uf.viz.core.exception.VizException; @@ -134,4 +135,12 @@ public class RadarApps { return null; } + /** Obtains an ElevationInfo instance. + *

+ * Using this method ensures RcmResourceProvider has been set up correctly. + */ + public static ElevationInfo getElevationInfo() { + return ElevationInfo.getInstance(); + } + } From 707202de1a99f94db605bdada5e035660457e06d Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Tue, 13 Oct 2015 12:33:35 -0400 Subject: [PATCH 13/21] ASM #17872 - DRT mode in D2D/CAVE allows publishing of new grids with old timestamp Change-Id: I9a376596b4f6edaa665f86a52be1cf1e87e98964 Former-commit-id: 9ad9a29e57e8749936bd8cdc53f74ef750f417ed --- .../raytheon/viz/gfe/actions/ShowIscRequestReplyDialog.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/ShowIscRequestReplyDialog.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/ShowIscRequestReplyDialog.java index 6d88d5b06c..c6e004df8c 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/ShowIscRequestReplyDialog.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/actions/ShowIscRequestReplyDialog.java @@ -86,8 +86,7 @@ public class ShowIscRequestReplyDialog extends AbstractHandler { public boolean isEnabled() { DataManager dm = DataManagerUIFactory.getCurrentInstance(); if (dm != null) { - return (!dm.sendIscOnSave() || !dm.sendIscOnPublish()) - && CAVEMode.getMode().equals(CAVEMode.OPERATIONAL) + return CAVEMode.getMode().equals(CAVEMode.OPERATIONAL) && dm.requestISC(); } From 34f59753f81b6e09d67d3b698e0938f6c3f4750c Mon Sep 17 00:00:00 2001 From: "Rici.Yu" Date: Tue, 13 Oct 2015 13:25:06 -0400 Subject: [PATCH 14/21] ASM #16938 - Fix data error when HDF5 storage type changes Change-Id: Id750ad66426b4dec201a5e64ecc6d9db758480bd Former-commit-id: 90cd6425a5e7a1fd7389f7e425031037aa840fd3 --- .../gfe/server/database/IFPGridDatabase.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java index a67a6c9aa3..b04c5f5e52 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/database/IFPGridDatabase.java @@ -117,6 +117,7 @@ import com.raytheon.uf.edex.database.DataAccessLayerException; * 05/29/2014 #3071 randerso Fix NPE in getCachedParmID * 09/21/2014 #3648 randerso Changed deleteDatabase to handle database already being deleted by other JVM * 01/13/2015 #3955 randerso Changed a few private methods to protected to allow TopoDatabase to subclass IFPGridDatabase + * 10/13/2015 16938 ryu Remove existing HDF5 data before calling saveGridsToHdf5 when storage type changed * * * @@ -501,6 +502,10 @@ public class IFPGridDatabase extends GridDatabase { if (!updatedRecords.isEmpty()) { try { + // storage data type has changed - remove existing data first + if (!newPSI.getStorageType().equals(oldPSI.getStorageType())) { + this.removeFromHDF5(updatedRecords); + } this.saveGridsToHdf5(updatedRecords, newPSI); } catch (Exception e) { statusHandler @@ -2088,6 +2093,22 @@ public class IFPGridDatabase extends GridDatabase { } } + /** + * Removes records of a single parm from the HDF5 repository. If the records + * do not exist in the HDF5, the operation is ignored. + * + * @param records + * The records to be removed + */ + private void removeFromHDF5(List records) { + List times = new ArrayList(records.size()); + for (GFERecord record: records) { + times.add(record.getTimeRange()); + } + + removeFromHDF5(records.get(0).getParmId(), times); + } + /** * Removes records from the HDF5 repository. If the records do not exist in * the HDF5, the operation is ignored From 1914a40b5eb1e1d82b997c6d3d852f8b7c754581 Mon Sep 17 00:00:00 2001 From: "Kiran.Shrestha" Date: Tue, 13 Oct 2015 17:56:13 +0000 Subject: [PATCH 15/21] ASM #13456 NamDNG5 not available in Volume Browser Change-Id: Id8b3d884ca9ba9979526705f59da765b85bc3f3c Former-commit-id: 50fa47c3914bc07e7d70a7ed63026afdabb3be42 --- .../localization/volumebrowser/VbSources/sfcGrid.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cave/com.raytheon.viz.volumebrowser/localization/volumebrowser/VbSources/sfcGrid.xml b/cave/com.raytheon.viz.volumebrowser/localization/volumebrowser/VbSources/sfcGrid.xml index e985e9cd1a..f0132417f3 100644 --- a/cave/com.raytheon.viz.volumebrowser/localization/volumebrowser/VbSources/sfcGrid.xml +++ b/cave/com.raytheon.viz.volumebrowser/localization/volumebrowser/VbSources/sfcGrid.xml @@ -68,7 +68,7 @@ - + From a0ee8f6cc03dcfab85f51e36044e538a040f1c15 Mon Sep 17 00:00:00 2001 From: "steve.naples" Date: Wed, 14 Oct 2015 15:58:14 +0000 Subject: [PATCH 16/21] ASM #17977 - MPE: Daily QC does not display subarea data. Change-Id: Ida8ed71ea8b39df58143cd69515ccfc3259d3e00 Former-commit-id: 415e268723240f6fcf56b44464aefb80afdae445 --- .../raytheon/viz/mpe/util/DailyQcUtils.java | 29 ++++++------------- .../viz/mpe/util/StationListManager.java | 19 ++++++------ 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/DailyQcUtils.java b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/DailyQcUtils.java index 93faa60379..2e5ff04a95 100644 --- a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/DailyQcUtils.java +++ b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/DailyQcUtils.java @@ -64,6 +64,8 @@ import com.vividsolutions.jts.geom.Coordinate; * Nov 24, 2014 16911 xwei The day of Hydrologic Date is set to the next day * if hour is greater than 18Z. * Mar 10, 2015 14575 snaples Added additional status flags. + * Oct 14, 2015 17977 snaples Fixed loadData to read station + * lists when new area, which means it needs to read some tokens also. * * * @@ -75,7 +77,6 @@ public class DailyQcUtils { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(DailyQcUtils.class); - // private static final int MAX_QC_DAYS = 10; private static DailyQcUtils instance; public double[][][] QPEaccum24hr; @@ -108,8 +109,6 @@ public class DailyQcUtils { private static AppsDefaults appsDefaults = AppsDefaults.getInstance(); - private String loc_area; - private String station_climo_file; private String hrap_gage_file; @@ -931,6 +930,7 @@ public class DailyQcUtils { if (lastQcArea == "") { newarea = true; lastQcArea = currentQcArea; + firstTok = 1; } curHrMinSec = getCurrentHrMinSec(currentDate); if (curHrMinSec != -1) { @@ -958,6 +958,7 @@ public class DailyQcUtils { Cursor prevCursor = shell.getCursor(); shell.setCursor(Display.getDefault().getSystemCursor( SWT.CURSOR_WAIT)); + firstTok = 1; int retval = loadDataSet(); if (retval == 2) { load_gage_data_once = 1; @@ -1292,7 +1293,6 @@ public class DailyQcUtils { + currentQcArea + "_stddev_"; temp_bad_file = mpe_bad_temperature_dir + "/temperature_" + currentQcArea + "_bad_"; - loc_area = appsDefaults.getToken("mpe_site_id").trim(); mpe_editor_logs_dir = appsDefaults.getToken("mpe_editor_logs_dir"); /* * create mpe_td_details_file to store the details of Time @@ -1359,21 +1359,12 @@ public class DailyQcUtils { } - if (currentQcArea.equals(loc_area)) { - master_file = true; - } - - // ReadFreezingStationList zl = new ReadFreezingStationList(); - // ReadPrecipStationList pl = new ReadPrecipStationList(); - // ReadTemperatureStationList tl = new ReadTemperatureStationList(); - if (newarea == true) { StationListManager slm = StationListManager.getInstance(); System.out.println("DQC: Reading Freezing Stations List. "); - // zl.read_freezing_station_list(currentQcArea, - // master_file); + try { - slm.getStationInfo(currentQcArea, master_file, + slm.getStationInfo(currentQcArea, newarea, freezing_stations, temperature_stations, precip_stations); } catch (FileNotFoundException e) { @@ -1387,8 +1378,7 @@ public class DailyQcUtils { return DAILYQC_FAILED; } System.out.println("DQC: Reading Temperature Stations List. "); - // tl.read_temperature_station_list( - // currentQcArea, master_file); + if (temperature_stations == null) { statusHandler .handle(Priority.PROBLEM, @@ -1396,8 +1386,7 @@ public class DailyQcUtils { return DAILYQC_FAILED; } System.out.println("DQC: Reading Precip Stations List. "); - // pl.read_precip_station_list(currentQcArea, - // master_file); + if (precip_stations == null) { statusHandler .handle(Priority.PROBLEM, @@ -2147,7 +2136,7 @@ public class DailyQcUtils { * the hrap_grid to set */ public void setHrap_grid(Hrap_Grid hrap_grid) { - this.hrap_grid = hrap_grid; + DailyQcUtils.hrap_grid = hrap_grid; } /** diff --git a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/StationListManager.java b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/StationListManager.java index 3e3d7e6814..f15e155e60 100644 --- a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/StationListManager.java +++ b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/StationListManager.java @@ -59,6 +59,8 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jul 7, 2011 snaples Initial creation + * Oct 14, 2015 17977 snaples Updated readStationLists to recognize + * sub area as a new area and not use masterFileFlag. * * * @@ -75,7 +77,7 @@ public class StationListManager { private final String station_dir = appsDefaults .getToken("mpe_station_list_dir"); - private final String sitename = appsDefaults.getToken("mpe_site_id"); + private final String sitename = ""; private final DailyQcUtils dqc = DailyQcUtils.getInstance(); @@ -96,7 +98,7 @@ public class StationListManager { return instance; } - public void getStationInfo(String qcArea, boolean masterFileFlag, + public void getStationInfo(String qcArea, boolean newarea, ArrayList freezingStationList, ArrayList temperatureStationList, ArrayList precipStationList) throws FileNotFoundException { @@ -119,8 +121,8 @@ public class StationListManager { currentLabelModifiedTime = labelPositionFile.lastModified(); currentStationsModifiedTime = stationListFile.lastModified(); - if ((currentLabelModifiedTime != previousLabelModifiedTime) - || (currentStationsModifiedTime != previousStationsModifiedTime)) { + if ((newarea == true) || (((currentLabelModifiedTime != previousLabelModifiedTime) + || (currentStationsModifiedTime != previousStationsModifiedTime)))) { LabelPositionManager labelPositionManager = new LabelPositionManager(); previousLabelModifiedTime = currentLabelModifiedTime; @@ -137,7 +139,7 @@ public class StationListManager { FileReader stationListFileReader = new FileReader(pathName); - readStationLists(stationListFileReader, masterFileFlag, + readStationLists(stationListFileReader, labelPositionManager, freezingStationList, temperatureStationList, precipStationList); @@ -165,7 +167,7 @@ public class StationListManager { */ private void readStationLists(FileReader stationListFileReader, - boolean masterFileFlag, LabelPositionManager labelPositionManager, + LabelPositionManager labelPositionManager, ArrayList freezingStationList, ArrayList temperatureStationList, ArrayList precipStationList) throws IOException { @@ -174,7 +176,6 @@ public class StationListManager { String inputLine; // one line of input BufferedReader inputReader = new BufferedReader(stationListFileReader); - if (masterFileFlag) { try { String[] commentTokens; // tokens broken into input and comments String[] stationTokens; // tokens from line of input (actual @@ -281,8 +282,6 @@ public class StationListManager { } /* finally */ - } /* if (master_file_flag) */ - } /* readStationLists */ private String getStationListPath(String qcArea) { @@ -337,7 +336,7 @@ public class StationListManager { public void computeClosestNeighbors(ArrayList stationList) { // String header = "StationListManager.computeClosestNeighbors(): "; - final int maxNeighborListSize = dqc.mpe_dqc_max_precip_neighbors; + final int maxNeighborListSize = DailyQcUtils.mpe_dqc_max_precip_neighbors; // System.out.println(header + "max_neighbor_list_size = " + // maxNeighborListSize); From 1234ccdfae5670b09d5727a00b45eee3da94e439 Mon Sep 17 00:00:00 2001 From: Jingtao Deng Date: Wed, 14 Oct 2015 13:31:58 -0400 Subject: [PATCH 17/21] VLab Issue #12477 - Hydrobase cannot update certain textfields with special char; fixes #12477 Change-Id: I1f97bc6c9c1610080297d7968f7653c446a107eb Former-commit-id: 37350d2119e037f22fb3c41090512b961347a84e --- .../viz/hydrobase/FloodReportDlg.java | 3 + .../viz/hydrobase/data/GeoDataManager.java | 48 +++--- .../cresthistory/CrestHistoryDataManager.java | 146 ++++++++--------- .../viz/hydrocommon/data/RiverStatData.java | 88 +++++----- .../datamanager/ContactsDataManager.java | 136 +++++++++------- .../datamanager/DescriptionDataManager.java | 135 +++++++++------- .../datamanager/FloodCategoryDataManager.java | 150 +++++++++--------- .../datamanager/FloodDataManager.java | 23 ++- .../datamanager/HydroDBDataManager.java | 10 ++ .../datamanager/HydroDataManager.java | 144 +++-------------- .../datamanager/LocationAreaManager.java | 117 ++++++++------ .../datamanager/LowWaterDataManager.java | 7 + .../LowWaterStatementDataManager.java | 25 +-- .../viz/hydrocommon/util/DbUtils.java | 62 +++++++- 14 files changed, 572 insertions(+), 522 deletions(-) diff --git a/cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/FloodReportDlg.java b/cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/FloodReportDlg.java index efc960d9eb..33b4e33a74 100644 --- a/cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/FloodReportDlg.java +++ b/cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/FloodReportDlg.java @@ -69,6 +69,7 @@ import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.requests.ThriftClient; import com.raytheon.viz.hydrocommon.HydroConstants; +import com.raytheon.viz.hydrocommon.util.DbUtils; import com.raytheon.viz.hydrocommon.util.RatingUtils; import com.raytheon.viz.ui.dialogs.CaveSWTDialog; @@ -1202,6 +1203,8 @@ public class FloodReportDlg extends CaveSWTDialog { sql.append(", q"); } + cremark = DbUtils.escapeSpecialCharforStr(cremark); + sql.append(") values('" + data.getLid() + "', "); sql.append("'" + dateFormat.format(eventDate) + "', "); sql.append("'" + hourFormat.format(eventDate) + "', "); diff --git a/cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/data/GeoDataManager.java b/cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/data/GeoDataManager.java index 9c25449d5a..40b9455a91 100644 --- a/cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/data/GeoDataManager.java +++ b/cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/data/GeoDataManager.java @@ -31,6 +31,7 @@ import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.HydroConstants; import com.raytheon.viz.hydrocommon.HydroConstants.ArealTypeSelection; import com.raytheon.viz.hydrocommon.datamanager.HydroDataManager; +import com.raytheon.viz.hydrocommon.util.DbUtils; /** * GeoData Data Manager class. @@ -49,7 +50,8 @@ import com.raytheon.viz.hydrocommon.datamanager.HydroDataManager; */ public class GeoDataManager extends HydroDataManager { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(GeoDataManager.class); + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(GeoDataManager.class); private static GeoDataManager instance = null; private GeoDataManager() { @@ -59,8 +61,7 @@ public class GeoDataManager extends HydroDataManager { /** * Get an instance of this class * - * @return - * The instance + * @return The instance */ public static synchronized GeoDataManager getInstance() { if (instance == null) { @@ -74,17 +75,15 @@ public class GeoDataManager extends HydroDataManager { * Get the GeoAreas. * * @param type - * The type of area looking for - * @return - * List of GeoAreaData objects + * The type of area looking for + * @return List of GeoAreaData objects * @throws VizException */ public ArrayList getGeoArea(ArealTypeSelection type) throws VizException { ArrayList returnList = new ArrayList(); StringBuilder query = new StringBuilder(); - query - .append("select area_id, name, boundary_type, interior_lat, interior_lon from geoarea "); + query.append("select area_id, name, boundary_type, interior_lat, interior_lon from geoarea "); query.append(" where boundary_type = '" + HydroConstants.GEOAREA_DATANAMES[type.ordinal()] + "' order by area_id"); @@ -110,9 +109,8 @@ public class GeoDataManager extends HydroDataManager { * Delete data from the linesegs table. * * @param type - * The type of data to delete - * @return - * The number of lines modified + * The type of data to delete + * @return The number of lines modified * @throws VizException */ public int deleteLineSegs(String type) throws VizException { @@ -128,10 +126,10 @@ public class GeoDataManager extends HydroDataManager { /** * Delete data from the geoarea table. + * * @param type - * The type of data to delete - * @return - * The number of lines modified + * The type of data to delete + * @return The number of lines modified * @throws VizException */ public int deleteGeoArea(String type) throws VizException { @@ -148,9 +146,8 @@ public class GeoDataManager extends HydroDataManager { * Write the GeoAreaData data to the IHFS * * @param data - * The GeoAreaData object to write - * @return - * The number of rows modified + * The GeoAreaData object to write + * @return The number of rows modified * @throws VizException */ public int putGeoArea(GeoAreaData data) throws VizException { @@ -170,6 +167,8 @@ public class GeoDataManager extends HydroDataManager { return status; } + DbUtils.escapeSpecialCharforData(data); + /* * if the interior lat, lon were provided from the input file, then use * them. otherwise compute them. @@ -229,9 +228,9 @@ public class GeoDataManager extends HydroDataManager { * Write thte line segments to the linesegs table * * @param areaId - * The area id + * The area id * @param binList - * The HrapBinList + * The HrapBinList */ public void putLineSegs(String areaId, HrapBinList binList) { int status = 0; @@ -244,7 +243,7 @@ public class GeoDataManager extends HydroDataManager { long hrapRow = binList.getRows().get(i); long hrapBegCol = binList.getBeginCols().get(i); long hrapEndCol = binList.getEndCols().get(i); - + where.setLength(0); query.setLength(0); @@ -274,13 +273,14 @@ public class GeoDataManager extends HydroDataManager { } } catch (VizException e) { status = -1; - statusHandler.handle(Priority.PROBLEM, - "Error putting data into LineSegs for area_id: " + areaId); + statusHandler.handle(Priority.PROBLEM, + "Error putting data into LineSegs for area_id: " + + areaId); } } else { /* delete the record and insert the new record */ String delete = "delete from linesegs " + where.toString(); - + try { runStatement(delete); status = DirectDbQuery.executeStatement(query.toString(), @@ -289,7 +289,7 @@ public class GeoDataManager extends HydroDataManager { throw new VizException(); } } catch (VizException e) { - statusHandler.handle(Priority.PROBLEM, + statusHandler.handle(Priority.PROBLEM, "Error updating LineSegs for area_id: " + areaId); } } diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/cresthistory/CrestHistoryDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/cresthistory/CrestHistoryDataManager.java index 8f56fa31b4..5bc49fe1fc 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/cresthistory/CrestHistoryDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/cresthistory/CrestHistoryDataManager.java @@ -32,8 +32,7 @@ package com.raytheon.viz.hydrocommon.cresthistory; * Nov 04, 2010 5518 lbousaid added all/above/bellow flag to * getRiverCrestData * Jan 09, 2015 16698 JingtaoD Crest History failed validation dialog pops up when OK button clicked - * April 08 2015 17338 JingtaoD "Apostrophe" entered into Hydrobase text fields in dialog window are not - * written to the IHFS database + * * * * @author dhladky @@ -50,6 +49,7 @@ import com.raytheon.viz.hydrocommon.HydroConstants; import com.raytheon.viz.hydrocommon.data.RiverDataPoint; import com.raytheon.viz.hydrocommon.datamanager.RiverDataManager; import com.raytheon.viz.hydrocommon.datamanager.HydroDBDataManager; +import com.raytheon.viz.hydrocommon.util.DbUtils; public class CrestHistoryDataManager { private static final transient IUFStatusHandler statusHandler = UFStatus @@ -82,12 +82,13 @@ public class CrestHistoryDataManager { * @param rdp * @return */ - public CrestHistoryData getRiverCrestData(String lid, boolean control, int allFlag) { + public CrestHistoryData getRiverCrestData(String lid, boolean control, + int allFlag) { RiverDataManager rdm = RiverDataManager.getInstance(); RiverDataPoint rdp = rdm.getRiverDataPoint(lid); // get crest data - return rdm.getRiverCrests(rdp, allFlag); + return rdm.getRiverCrests(rdp, allFlag); } /** @@ -96,27 +97,24 @@ public class CrestHistoryDataManager { * @param cd */ public void deleteCrest(CrestData cd, String lid) { - String deleteCrest = "delete from crest where lid = '" + lid + "' and datcrst = '" - + cd.getDateString() + "' and timcrst ='" + cd.getTimeString() - + "'"; + String deleteCrest = "delete from crest where lid = '" + lid + + "' and datcrst = '" + cd.getDateString() + "' and timcrst ='" + + cd.getTimeString() + "'"; try { AppsDefaults ad = AppsDefaults.getInstance(); - boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, false); + boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, + false); if (debug) { - System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + - ad.getToken(HydroConstants.PGPORT) + ":" + - ad.getToken(HydroConstants.DB_NAME)); + System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + + ad.getToken(HydroConstants.PGPORT) + ":" + + ad.getToken(HydroConstants.DB_NAME)); System.out.println("Query: " + deleteCrest); } - - // check if dataQuery contains any apostrophe, if does, replace it to two single appostrophe - deleteCrest = HydroDBDataManager.getInstance().checkAppostrophe(deleteCrest); - + DirectDbQuery.executeStatement(deleteCrest, HydroConstants.IHFS, QueryLanguage.SQL); } catch (VizException ve) { - statusHandler.error("Error deleting the crest: " - + lid, ve); + statusHandler.error("Error deleting the crest: " + lid, ve); } } @@ -124,42 +122,49 @@ public class CrestHistoryDataManager { * Insert/update a crest. * * @param cd - * The CrestData object holding data for database + * The CrestData object holding data for database * @param lid - * The current lid + * The current lid * @param selectedCrest - * The crest data currently in the database + * The crest data currently in the database * @param mode - * The mode, 1 = new, 2 = delete, 3 = update + * The mode, 1 = new, 2 = delete, 3 = update * @return Error Message, or null if no errors * @throws VizException */ - public String insertCrest(CrestData cd, String lid, CrestData selectedCrest, int mode) { + public String insertCrest(CrestData cd, String lid, + CrestData selectedCrest, int mode) { String errMsg = null; - + + DbUtils.escapeSpecialCharforData(cd); + if (mode == 3) { - + // Did the primary key change? - if ((selectedCrest != null) && (cd.getDateString().equals(selectedCrest.getDateString()) - && cd.getTimeString().equals(selectedCrest.getTimeString()))) { + if ((selectedCrest != null) + && (cd.getDateString() + .equals(selectedCrest.getDateString()) && cd + .getTimeString().equals( + selectedCrest.getTimeString()))) { // The PK is different, delete the record, then insert - String query = "delete from crest where lid = '" + lid + - "' and datcrst = '" + selectedCrest.getDateString() + - "' and timcrst = '" + selectedCrest.getTimeString() + "'"; - + String query = "delete from crest where lid = '" + lid + + "' and datcrst = '" + selectedCrest.getDateString() + + "' and timcrst = '" + selectedCrest.getTimeString() + + "'"; + try { AppsDefaults ad = AppsDefaults.getInstance(); - boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, false); + boolean debug = ad.getBoolean( + HydroConstants.DEBUG_HYDRO_DB_TOKEN, false); if (debug) { - System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + - ad.getToken(HydroConstants.PGPORT) + ":" + - ad.getToken(HydroConstants.DB_NAME)); + System.out.println(ad.getToken(HydroConstants.PGHOST) + + ":" + ad.getToken(HydroConstants.PGPORT) + + ":" + ad.getToken(HydroConstants.DB_NAME)); System.out.println("Query: " + query); } - // check if dataQuery contains any apostrophe, if does, replace it to two single appostrophe - query = HydroDBDataManager.getInstance().checkAppostrophe(query); - - DirectDbQuery.executeStatement(query, HydroConstants.IHFS, QueryLanguage.SQL); + + DirectDbQuery.executeStatement(query, HydroConstants.IHFS, + QueryLanguage.SQL); } catch (VizException e) { e.printStackTrace(); } @@ -176,7 +181,7 @@ public class CrestHistoryDataManager { remarks = remarks.replaceAll("\n", "\\n"); back.append("'" + remarks + "', "); front.append("cremark, "); -// back.append("'" + cd.getRemarks() + "', "); + // back.append("'" + cd.getRemarks() + "', "); } if (cd.isHighWater()) { front.append("hw, "); @@ -205,45 +210,44 @@ public class CrestHistoryDataManager { boolean executeUpdate = false; AppsDefaults ad = AppsDefaults.getInstance(); - boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, false); + boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, + false); if (debug) { - System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + - ad.getToken(HydroConstants.PGPORT) + ":" + - ad.getToken(HydroConstants.DB_NAME)); + System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + + ad.getToken(HydroConstants.PGPORT) + ":" + + ad.getToken(HydroConstants.DB_NAME)); System.out.println("Query: " + insertCrest); } try { - // check if dataQuery contains any apostrophe, if does, replace it to two single appostrophe - insertCrest = HydroDBDataManager.getInstance().checkAppostrophe(insertCrest); - + DirectDbQuery.executeStatement(insertCrest, HydroConstants.IHFS, QueryLanguage.SQL); - } catch (VizException e) { - - e.printStackTrace(); - - //exception with duplicate key value is throwed in the 2nd cause - - if (e.getCause().getCause().getMessage().contains("crest_pk")) { - executeUpdate = true; + } catch (VizException e) { + + e.printStackTrace(); + + // exception with duplicate key value is throwed in the 2nd cause + + if (e.getCause().getCause().getMessage().contains("crest_pk")) { + executeUpdate = true; } else { errMsg = "Error inserting data into database."; - } + } } if (executeUpdate) { /* execute an update */ StringBuilder query = new StringBuilder("update crest set "); - -// query.append("lid = '" + lid + "', "); -// query.append("datcrst = '" + cd.getDateString() + "', "); + + // query.append("lid = '" + lid + "', "); + // query.append("datcrst = '" + cd.getDateString() + "', "); if (cd.getRemarks() != null) { String remarks = cd.getRemarks(); remarks = remarks.replace("\n", "\\n"); query.append("cremark = E'" + remarks + "', "); -// query.append("cremark = '" + cd.getRemarks() + "', "); + // query.append("cremark = '" + cd.getRemarks() + "', "); } if (cd.isHighWater()) { @@ -251,19 +255,19 @@ public class CrestHistoryDataManager { } else { query.append("hw = '', "); } - + if (cd.isIce()) { query.append("jam = '" + insertmark + "', "); } else { query.append("jam = '', "); } - + if (cd.isOldDatum()) { query.append("olddatum = '" + insertmark + "', "); } else { query.append("olddatum = '', "); } - + query.append("q = " + cd.getFlow() + ", "); query.append("stage = " + cd.getStage() + ", "); @@ -272,29 +276,27 @@ public class CrestHistoryDataManager { } else { query.append("suppress = '', "); } - + query.append("prelim = '" + cd.getPrelim() + "' "); query.append(" where lid = '" + lid + "' "); query.append("and datcrst = '" + cd.getDateString() + "' "); query.append("and timcrst = '" + cd.getTimeString() + "' "); try { if (debug) { - System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + - ad.getToken(HydroConstants.PGPORT) + ":" + - ad.getToken(HydroConstants.DB_NAME)); + System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + + ad.getToken(HydroConstants.PGPORT) + ":" + + ad.getToken(HydroConstants.DB_NAME)); System.out.println("Query: " + query.toString()); } - - // check if dataQuery contains any apostrophe, if does, replace it to two single appostrophe - String newquery = HydroDBDataManager.getInstance().checkAppostrophe(query.toString()); - - DirectDbQuery.executeStatement(newquery, HydroConstants.IHFS, QueryLanguage.SQL); + + DirectDbQuery.executeStatement(query.toString(), + HydroConstants.IHFS, QueryLanguage.SQL); } catch (VizException e) { errMsg = "Error updating data in database"; e.printStackTrace(); } } - + return errMsg; } } diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/RiverStatData.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/RiverStatData.java index abfb6011ee..7fc8cf13b8 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/RiverStatData.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/RiverStatData.java @@ -38,7 +38,7 @@ import com.raytheon.viz.hydrocommon.HydroConstants; * Jan 3, 2013 15520 lbousaidi added a dollar-quoted string to getUpdate and * getInsert statements to always write literally * the string content. - * April 8, 2015 17338 jingtaoD "Apostrophes" entered into HB text fields are not written to IHFS database + * * * * @@ -224,32 +224,32 @@ public class RiverStatData extends HydroDBData implements IHydroDBData { setLid(getDBValue("lid", data, dataMap, "")); setPrimaryPE(getDBValue("primary_pe", data, dataMap, "")); - setBankFull(getDBValue("bf", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setCheckBar(getDBValue("cb", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setDrainageArea(getDBValue("da", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setResponseTime(getDBValue("response_time", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setThresholdRunoff(getDBValue("threshold_runoff", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setFloodFlow(getDBValue("fq", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setFloodStage(getDBValue("fs", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); + setBankFull(getDBValue("bf", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setCheckBar(getDBValue("cb", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setDrainageArea(getDBValue("da", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setResponseTime(getDBValue("response_time", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setThresholdRunoff(getDBValue("threshold_runoff", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setFloodFlow(getDBValue("fq", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setFloodStage(getDBValue("fs", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); setGageNumber(getDBValue("gsno", data, dataMap, "")); setLevel(getDBValue("level", data, dataMap, "")); - setRiverMile(getDBValue("mile", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setPool(getDBValue("pool", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); + setRiverMile(getDBValue("mile", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setPool(getDBValue("pool", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); setPeriodOfRecord(getDBValue("por", data, dataMap, "")); setRated(getDBValue("rated", data, dataMap, "")); - setLatitude(getDBValue("lat", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setLongitude(getDBValue("lon", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); + setLatitude(getDBValue("lat", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setLongitude(getDBValue("lon", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); setRemark(getDBValue("remark", data, dataMap, "")); setReviseDate(getDBValue("rrevise", data, dataMap, (Date) null)); setLatLonSource(getDBValue("rsource", data, dataMap, "")); @@ -257,12 +257,12 @@ public class RiverStatData extends HydroDBData implements IHydroDBData { setTidalEffect(getDBValue("tide", data, dataMap, "")); setBackWater(getDBValue("backwater", data, dataMap, "")); setVerticalDatum(getDBValue("vdatum", data, dataMap, "")); - setActionFlow(getDBValue("action_flow", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setActionStage(getDBValue("wstg", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); - setZeroDatum(getDBValue("zd", data, dataMap, Double - .valueOf(HydroConstants.MISSING_VALUE))); + setActionFlow(getDBValue("action_flow", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setActionStage(getDBValue("wstg", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); + setZeroDatum(getDBValue("zd", data, dataMap, + Double.valueOf(HydroConstants.MISSING_VALUE))); setDateOfRating(getDBValue("ratedat", data, dataMap, (Date) null)); setUsgsRateNumber(getDBValue("usgs_ratenum", data, dataMap, "")); setUnitHydrographDuration(getDBValue("uhgdur", data, dataMap, @@ -769,7 +769,7 @@ public class RiverStatData extends HydroDBData implements IHydroDBData { String rval = "INSERT INTO riverstat ( " + columns + " ) VALUES ( %s, %s, %s, %s, %s, %s, %s," - + " %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, $$%s$$, %s," + + " %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, '%s', %s," + " %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s )"; rval = String.format(rval, getDBString(lid), getDBString(primaryPE), @@ -780,12 +780,13 @@ public class RiverStatData extends HydroDBData implements IHydroDBData { getDBString(level), getDBString(riverMile), getDBString(pool), getDBString(periodOfRecord), getDBString(rated), getDBString(latitude), getDBString(longitude), - getDBStringNoQuote(remark), getDBString(reviseDate, dateFormat), - getDBString(latLonSource), getDBString(stream), - getDBString(tidalEffect), getDBString(backWater), - getDBString(verticalDatum), getDBString(actionFlow), - getDBString(actionStage), getDBString(zeroDatum), getDBString( - dateOfRating, dateFormat), getDBString(usgsRateNumber), + getDBStringNoQuote(remark), + getDBString(reviseDate, dateFormat), getDBString(latLonSource), + getDBString(stream), getDBString(tidalEffect), + getDBString(backWater), getDBString(verticalDatum), + getDBString(actionFlow), getDBString(actionStage), + getDBString(zeroDatum), getDBString(dateOfRating, dateFormat), + getDBString(usgsRateNumber), getDBString(unitHydrographDuration), getDBString(useLatestForecast)); @@ -813,7 +814,7 @@ public class RiverStatData extends HydroDBData implements IHydroDBData { public String getUpdateStatement() { // Set the basic update statement String rval = "UPDATE riverstat SET lid=%s, primary_pe=%s, bf=%s, cb=%s, da=%s, response_time=%s, threshold_runoff=%s," - + " fq=%s, fs=%s, gsno=%s, level=%s, mile=%s, pool=%s, por=%s, rated=%s, lat=%s, lon=%s, remark=$$%s$$, rrevise=%s," + + " fq=%s, fs=%s, gsno=%s, level=%s, mile=%s, pool=%s, por=%s, rated=%s, lat=%s, lon=%s, remark='%s', rrevise=%s," + " rsource=%s, stream=%s, tide=%s, backwater=%s, vdatum=%s, action_flow=%s, wstg=%s, zd=%s, ratedat=%s," + " usgs_ratenum=%s, uhgdur=%s, use_latest_fcst=%s WHERE %s"; @@ -826,12 +827,13 @@ public class RiverStatData extends HydroDBData implements IHydroDBData { getDBString(level), getDBString(riverMile), getDBString(pool), getDBString(periodOfRecord), getDBString(rated), getDBString(latitude), getDBString(longitude), - getDBStringNoQuote(remark), getDBString(reviseDate, dateFormat), - getDBString(latLonSource), getDBString(stream), - getDBString(tidalEffect), getDBString(backWater), - getDBString(verticalDatum), getDBString(actionFlow), - getDBString(actionStage), getDBString(zeroDatum), getDBString( - dateOfRating, dateFormat), getDBString(usgsRateNumber), + getDBStringNoQuote(remark), + getDBString(reviseDate, dateFormat), getDBString(latLonSource), + getDBString(stream), getDBString(tidalEffect), + getDBString(backWater), getDBString(verticalDatum), + getDBString(actionFlow), getDBString(actionStage), + getDBString(zeroDatum), getDBString(dateOfRating, dateFormat), + getDBString(usgsRateNumber), getDBString(unitHydrographDuration), getDBString(useLatestForecast), getPKStatement()); diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/ContactsDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/ContactsDataManager.java index 3181897347..f4f7179964 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/ContactsDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/ContactsDataManager.java @@ -25,59 +25,59 @@ import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.common.dataquery.db.QueryResultRow; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.data.ContactsData; +import com.raytheon.viz.hydrocommon.util.DbUtils; /** * This class is the data manager for the contacts data. * *

- *
+ * 
  * SOFTWARE HISTORY
- *
+ * 
  * Date         Ticket#     Engineer    Description
  * ------------ ----------  ----------- --------------------------
  * 20 Nov 2008             lvenable    Initial creation
  * 
  * 
- * + * * @author lvenable * @version 1.0 */ -public class ContactsDataManager extends HydroDataManager -{ +public class ContactsDataManager extends HydroDataManager { /** * Instance of this class. */ private static ContactsDataManager manager = null; - + /** * Select statement. */ private final String SELECT_STATEMENT = "SELECT * FROM contacts"; - + /** * Insert statement. */ private final String INSERT_STATEMENT = "INSERT INTO contacts (lid, contact, phone, email, remark, priority) VALUES ('%s', '%s', '%s', '%s', '%s', %d)"; - + /** * Delete statement. */ private final String DELETE_STATEMENT = "DELETE FROM contacts"; - + /** * Update statement. */ private final String UPDATE_STATEMENT = "UPDATE contacts SET contact='%s', phone='%s', email='%s', remark='%s', priority=%d WHERE lid='%s' AND contact='%s'"; - + /** * Constructor. */ - public ContactsDataManager() - { + public ContactsDataManager() { } - + /** * Get an instance of this class. + * * @return An instance of this class. */ public static synchronized ContactsDataManager getInstance() { @@ -87,93 +87,117 @@ public class ContactsDataManager extends HydroDataManager return manager; } - + /** * Get the list of contacts from the specified location ID. - * @param lid Location ID. + * + * @param lid + * Location ID. * @return ArrayList of ContactsData. - * @throws VizException Database exception. + * @throws VizException + * Database exception. */ - public ArrayList getContactData(String lid) throws VizException - { + public ArrayList getContactData(String lid) + throws VizException { ArrayList rval = new ArrayList(); - + QueryResult result = runMappedQuery(SELECT_STATEMENT + " WHERE lid='" + lid + "' ORDER BY priority ASC "); for (QueryResultRow currRow : result.getRows()) { rval.add(new ContactsData(currRow, result.getColumnNames())); } - + return rval; } - + /** - * Delete the record from the database the specified location ID and Contact. - * @param contactsData Contacts data. - * @throws VizException Database exception. + * Delete the record from the database the specified location ID and + * Contact. + * + * @param contactsData + * Contacts data. + * @throws VizException + * Database exception. */ - public void deleteRecord(ContactsData contactsData) throws VizException - { + public void deleteRecord(ContactsData contactsData) throws VizException { + DbUtils.escapeSpecialCharforData(contactsData); + StringBuilder query = new StringBuilder(DELETE_STATEMENT); - String whereClaus = String.format(" WHERE lid = '%s' AND contact = '%s' ", - contactsData.getLid(), contactsData.getContact()); + String whereClaus = String.format( + " WHERE lid = '%s' AND contact = '%s' ", contactsData.getLid(), + contactsData.getContact()); query.append(whereClaus); - + runStatement(query.toString()); } - + /** * Check if a specific record exists in the contacts table. - * @param lid Location ID. - * @param contactName Contact name. + * + * @param lid + * Location ID. + * @param contactName + * Contact name. * @return True if the record exists, false otherwise. - * @throws VizException Database exception. + * @throws VizException + * Database exception. */ - public boolean recordExists(String lid, String contactName) throws VizException - { + public boolean recordExists(String lid, String contactName) + throws VizException { + contactName = DbUtils.escapeSpecialCharforStr(contactName); + StringBuilder query = new StringBuilder(SELECT_STATEMENT); - String whereClaus = String.format(" WHERE lid = '%s' AND contact = '%s' ", - lid, contactName); - + String whereClaus = String.format( + " WHERE lid = '%s' AND contact = '%s' ", lid, contactName); + query.append(whereClaus); - + QueryResult result = runMappedQuery(query.toString()); - - if (result.getResultCount() == 0) - { + + if (result.getResultCount() == 0) { return false; } - + return true; } - + /** * Insert the new contact data into the database. - * @param data Contacts data. - * @throws VizException Database exception. + * + * @param data + * Contacts data. + * @throws VizException + * Database exception. */ - public void insertContactData(ContactsData data) throws VizException - { + public void insertContactData(ContactsData data) throws VizException { + DbUtils.escapeSpecialCharforData(data); + String query = String.format(INSERT_STATEMENT, data.getLid(), data.getContact(), data.getPhone(), data.getEmail(), data.getRemark(), data.getPriority()); - + runStatement(query); } - + /** * Update an existing record in the contacts table with the new information. - * @param data Contacts data. - * @throws VizException Database exception. + * + * @param data + * Contacts data. + * @throws VizException + * Database exception. */ - public void updateContactData(ContactsData data, - String originalContactName) throws VizException - { + public void updateContactData(ContactsData data, String originalContactName) + throws VizException { + DbUtils.escapeSpecialCharforData(data); + originalContactName = DbUtils + .escapeSpecialCharforStr(originalContactName); + String query = String.format(UPDATE_STATEMENT, data.getContact(), data.getPhone(), data.getEmail(), data.getRemark(), data.getPriority(), data.getLid(), originalContactName); - + runStatement(query); } } diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/DescriptionDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/DescriptionDataManager.java index 35493645ea..e3ac7e5b44 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/DescriptionDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/DescriptionDataManager.java @@ -25,61 +25,59 @@ import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.common.dataquery.db.QueryResultRow; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.data.DescriptionData; +import com.raytheon.viz.hydrocommon.util.DbUtils; /** * This class is the data manager for the description data. * *
- *
+ * 
  * SOFTWARE HISTORY
- *
+ * 
  * Date         Ticket#     Engineer    Description
  * ------------ ----------  ----------- --------------------------
  * 02 Dec 2008              lvenable    Initial creation
  * 
  * 
- * + * * @author lvenable * @version 1.0 */ -public class DescriptionDataManager extends HydroDataManager -{ +public class DescriptionDataManager extends HydroDataManager { /** * Instance of this class. */ private static DescriptionDataManager manager = null; - + /** * Select statement. */ private final String SELECT_STATEMENT = "SELECT * FROM descrip"; - + /** * Insert statement. */ - private final String INSERT_STATEMENT = - "INSERT INTO descrip (lid, bed, divert, remark, ice, proximity, reach, res, topo) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')"; - + private final String INSERT_STATEMENT = "INSERT INTO descrip (lid, bed, divert, remark, ice, proximity, reach, res, topo) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')"; + /** * Delete statement. */ private final String DELETE_STATEMENT = "DELETE FROM descrip"; - + /** * Update statement. */ - private final String UPDATE_STATEMENT = - "UPDATE descrip SET bed='%s', divert='%s', remark='%s', ice='%s', proximity='%s', reach='%s', res='%s', topo='%s' WHERE lid='%s'"; - + private final String UPDATE_STATEMENT = "UPDATE descrip SET bed='%s', divert='%s', remark='%s', ice='%s', proximity='%s', reach='%s', res='%s', topo='%s' WHERE lid='%s'"; + /** * Private Constructor. */ - private DescriptionDataManager() - { + private DescriptionDataManager() { } - + /** * Get an instance of this class. + * * @return An instance of this class. */ public static synchronized DescriptionDataManager getInstance() { @@ -89,91 +87,110 @@ public class DescriptionDataManager extends HydroDataManager return manager; } - + /** * Get the description data. - * @param lid Location ID. + * + * @param lid + * Location ID. * @return An array of description data. - * @throws VizException Database exception. + * @throws VizException + * Database exception. */ - public ArrayList getDescriptionData(String lid) throws VizException - { + public ArrayList getDescriptionData(String lid) + throws VizException { ArrayList rval = new ArrayList(); - + QueryResult result = runMappedQuery(SELECT_STATEMENT + " WHERE lid='" + lid + "'"); for (QueryResultRow currRow : result.getRows()) { rval.add(new DescriptionData(currRow, result.getColumnNames())); } - + return rval; } - + /** * Delete a specified description. - * @param lid Location ID. - * @throws VizException Database exception. + * + * @param lid + * Location ID. + * @throws VizException + * Database exception. */ - public void deleteDescription(String lid) throws VizException - { + public void deleteDescription(String lid) throws VizException { StringBuilder query = new StringBuilder(DELETE_STATEMENT); String whereClaus = String.format(" WHERE lid = '%s'", lid); query.append(whereClaus); - + runStatement(query.toString()); } - + /** * Insert description data. - * @param descData Description data. - * @throws VizException Database exception. + * + * @param descData + * Description data. + * @throws VizException + * Database exception. */ - public void insertDescriptionData(DescriptionData descData) throws VizException - { + public void insertDescriptionData(DescriptionData descData) + throws VizException { + DbUtils.escapeSpecialCharforData(descData); + String query = String.format(INSERT_STATEMENT, descData.getLid(), - descData.getStreamBed(), descData.getDivert(), descData.getRemark(), - descData.getIce(), descData.getProximity(), descData.getReach(), + descData.getStreamBed(), descData.getDivert(), + descData.getRemark(), descData.getIce(), + descData.getProximity(), descData.getReach(), descData.getRegulation(), descData.getTopo()); - + runStatement(query); } - + /** * Update description data. - * @param descData Description data. - * @throws VizException Database exception. + * + * @param descData + * Description data. + * @throws VizException + * Database exception. */ - public void updateDescriptionData(DescriptionData descData) throws VizException - { - String query = String.format(UPDATE_STATEMENT, - descData.getStreamBed(), descData.getDivert(), descData.getRemark(), - descData.getIce(), descData.getProximity(), descData.getReach(), - descData.getRegulation(), descData.getTopo(), descData.getLid()); - + public void updateDescriptionData(DescriptionData descData) + throws VizException { + DbUtils.escapeSpecialCharforData(descData); + + String query = String + .format(UPDATE_STATEMENT, descData.getStreamBed(), + descData.getDivert(), descData.getRemark(), + descData.getIce(), descData.getProximity(), + descData.getReach(), descData.getRegulation(), + descData.getTopo(), descData.getLid()); + runStatement(query); } - + /** * Check if a record exists. - * @param lid Location ID. + * + * @param lid + * Location ID. * @return True if the record exists, false otherwise. - * @throws VizException Database exception. + * @throws VizException + * Database exception. */ - public boolean recordExists(String lid) throws VizException - { + public boolean recordExists(String lid) throws VizException { StringBuilder query = new StringBuilder(SELECT_STATEMENT); String whereClaus = String.format(" WHERE lid = '%s'", lid); - + query.append(whereClaus); - + QueryResult result = runMappedQuery(query.toString()); - - if (result.getResultCount() == 0) - { + + if (result.getResultCount() == 0) { return false; } - + return true; } } diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/FloodCategoryDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/FloodCategoryDataManager.java index 728645b3de..95ae88a96a 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/FloodCategoryDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/FloodCategoryDataManager.java @@ -29,6 +29,7 @@ import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.HydroConstants; import com.raytheon.viz.hydrocommon.data.FloodCategoryData; +import com.raytheon.viz.hydrocommon.util.DbUtils; import com.raytheon.viz.hydrocommon.util.HydroDataUtils; /** @@ -50,13 +51,12 @@ import com.raytheon.viz.hydrocommon.util.HydroDataUtils; public class FloodCategoryDataManager extends HydroDataManager { protected static FloodCategoryDataManager manager = null; - private static final String INSERT_STATEMENT = "INSERT INTO floodcat (lid, major_stage, moderate_stage, minor_stage, major_flow, moderate_flow, minor_flow) VALUES ('%s', %s, %s, %s, %s, %s, %s)"; - + private static final String SELECT_STATEMENT = "SELECT lid, major_stage, moderate_stage, minor_stage, major_flow, moderate_flow, minor_flow FROM floodcat"; private static final String DELETE_STATEMENT = "DELETE from floodcat WHERE %s"; - + private static final String UPDATE_STATEMENT = "UPDATE floodcat SET major_stage=%s, moderate_stage=%s, minor_stage=%s, major_flow=%s, moderate_flow=%s, minor_flow=%s WHERE %s"; /** @@ -100,8 +100,8 @@ public class FloodCategoryDataManager extends HydroDataManager { */ public void deleteRecord(FloodCategoryData recordToDelete) throws VizException { - runStatement(String.format(DELETE_STATEMENT, HydroDataUtils - .getPKStatement(recordToDelete))); + runStatement(String.format(DELETE_STATEMENT, + HydroDataUtils.getPKStatement(recordToDelete))); } /** @@ -128,8 +128,8 @@ public class FloodCategoryDataManager extends HydroDataManager { QueryResult result = runMappedQuery(SELECT_STATEMENT + " WHERE lid='" + lid + "'"); - return (result.getResultCount() > 0) ? new FloodCategoryData(result - .getRows()[0], result.getColumnNames()) + return (result.getResultCount() > 0) ? new FloodCategoryData( + result.getRows()[0], result.getColumnNames()) : new FloodCategoryData(); } @@ -149,48 +149,54 @@ public class FloodCategoryDataManager extends HydroDataManager { private void updateFloodCategoryData(FloodCategoryData data) throws VizException { - Double majorS =null, minorS=null, moderateS=null, majorD=null, minorD=null, moderateD=null; - - if (data.getMajorStage() != HydroConstants.MISSING_VALUE) - majorS = data.getMajorStage(); - if (data.getModerateStage() != HydroConstants.MISSING_VALUE) - moderateS = data.getModerateStage(); - if (data.getMinorStage() != HydroConstants.MISSING_VALUE) - minorS = data.getMinorStage(); - if (data.getMajorDischarge() != HydroConstants.MISSING_VALUE) - majorD = data.getMajorDischarge(); - if (data.getModerateDischarge() != HydroConstants.MISSING_VALUE) - moderateD = data.getModerateDischarge(); - if (data.getMinorDischarge() != HydroConstants.MISSING_VALUE) - minorD = data.getMinorDischarge(); - - - /*check if any of the stages or flows is missing, then assign null into database;*/ - runStatement(String.format(UPDATE_STATEMENT, majorS, moderateS, minorS, majorD, - moderateD, minorD, HydroDataUtils.getPKStatement(data))); + Double majorS = null, minorS = null, moderateS = null, majorD = null, minorD = null, moderateD = null; + + DbUtils.escapeSpecialCharforData(data); + + if (data.getMajorStage() != HydroConstants.MISSING_VALUE) + majorS = data.getMajorStage(); + if (data.getModerateStage() != HydroConstants.MISSING_VALUE) + moderateS = data.getModerateStage(); + if (data.getMinorStage() != HydroConstants.MISSING_VALUE) + minorS = data.getMinorStage(); + if (data.getMajorDischarge() != HydroConstants.MISSING_VALUE) + majorD = data.getMajorDischarge(); + if (data.getModerateDischarge() != HydroConstants.MISSING_VALUE) + moderateD = data.getModerateDischarge(); + if (data.getMinorDischarge() != HydroConstants.MISSING_VALUE) + minorD = data.getMinorDischarge(); + + /* + * check if any of the stages or flows is missing, then assign null into + * database; + */ + runStatement(String.format(UPDATE_STATEMENT, majorS, moderateS, minorS, + majorD, moderateD, minorD, HydroDataUtils.getPKStatement(data))); } private void insertFloodData(FloodCategoryData currData) throws VizException { - - Double majorS =null, minorS=null, moderateS=null, majorD=null, minorD=null, moderateD=null; - - if (currData.getMajorStage() != HydroConstants.MISSING_VALUE) - majorS = currData.getMajorStage(); - if (currData.getModerateStage() != HydroConstants.MISSING_VALUE) - moderateS = currData.getModerateStage(); - if (currData.getMinorStage() != HydroConstants.MISSING_VALUE) - minorS = currData.getMinorStage(); - if (currData.getMajorDischarge() != HydroConstants.MISSING_VALUE) - majorD = currData.getMajorDischarge(); - if (currData.getModerateDischarge() != HydroConstants.MISSING_VALUE) - moderateD = currData.getModerateDischarge(); - if (currData.getMinorDischarge() != HydroConstants.MISSING_VALUE) - minorD = currData.getMinorDischarge(); - - /* if any of the stage or flows is missing, the assign null to database */ - runStatement(String.format(INSERT_STATEMENT, currData.getLid(), - majorS, moderateS, minorS, majorD, moderateD, minorD)); + + Double majorS = null, minorS = null, moderateS = null, majorD = null, minorD = null, moderateD = null; + + DbUtils.escapeSpecialCharforData(currData); + + if (currData.getMajorStage() != HydroConstants.MISSING_VALUE) + majorS = currData.getMajorStage(); + if (currData.getModerateStage() != HydroConstants.MISSING_VALUE) + moderateS = currData.getModerateStage(); + if (currData.getMinorStage() != HydroConstants.MISSING_VALUE) + minorS = currData.getMinorStage(); + if (currData.getMajorDischarge() != HydroConstants.MISSING_VALUE) + majorD = currData.getMajorDischarge(); + if (currData.getModerateDischarge() != HydroConstants.MISSING_VALUE) + moderateD = currData.getModerateDischarge(); + if (currData.getMinorDischarge() != HydroConstants.MISSING_VALUE) + minorD = currData.getMinorDischarge(); + + /* if any of the stage or flows is missing, the assign null to database */ + runStatement(String.format(INSERT_STATEMENT, currData.getLid(), majorS, + moderateS, minorS, majorD, moderateD, minorD)); } public boolean putFloodCategoryData(String lid, String majorStage, @@ -198,42 +204,42 @@ public class FloodCategoryDataManager extends HydroDataManager { String modDischarge, String minorDischarge, Shell shell) throws VizException { boolean rval = false; - String blankStr=""; + String blankStr = ""; FloodCategoryData newData = new FloodCategoryData(); newData.setLid(lid); try { - if (majorDischarge.equals(blankStr)) - newData.setMajorDischarge((double) HydroConstants.MISSING_VALUE); - else - newData.setMajorDischarge(Double.parseDouble(majorDischarge)); - - if (modDischarge.equals(blankStr)) - newData.setModerateDischarge((double) HydroConstants.MISSING_VALUE); - else - newData.setModerateDischarge(Double.parseDouble(modDischarge)); - - if (minorDischarge.equals(blankStr)) - newData.setMinorDischarge((double) HydroConstants.MISSING_VALUE); - else - newData.setMinorDischarge(Double.parseDouble(minorDischarge)); + if (majorDischarge.equals(blankStr)) + newData.setMajorDischarge((double) HydroConstants.MISSING_VALUE); + else + newData.setMajorDischarge(Double.parseDouble(majorDischarge)); - if (majorStage.equals(blankStr)) - newData.setMajorStage((double) HydroConstants.MISSING_VALUE); - else + if (modDischarge.equals(blankStr)) + newData.setModerateDischarge((double) HydroConstants.MISSING_VALUE); + else + newData.setModerateDischarge(Double.parseDouble(modDischarge)); + + if (minorDischarge.equals(blankStr)) + newData.setMinorDischarge((double) HydroConstants.MISSING_VALUE); + else + newData.setMinorDischarge(Double.parseDouble(minorDischarge)); + + if (majorStage.equals(blankStr)) + newData.setMajorStage((double) HydroConstants.MISSING_VALUE); + else newData.setMajorStage(Double.parseDouble(majorStage)); - - if (modStage.equals(blankStr)) - newData.setModerateStage((double) HydroConstants.MISSING_VALUE); - else + + if (modStage.equals(blankStr)) + newData.setModerateStage((double) HydroConstants.MISSING_VALUE); + else newData.setModerateStage(Double.parseDouble(modStage)); - - if (minorStage.equals(blankStr)) - newData.setMinorStage((double) HydroConstants.MISSING_VALUE); - else - newData.setMinorStage(Double.parseDouble(minorStage)); + + if (minorStage.equals(blankStr)) + newData.setMinorStage((double) HydroConstants.MISSING_VALUE); + else + newData.setMinorStage(Double.parseDouble(minorStage)); } catch (Exception e) { MessageBox mb = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK); mb.setText("Invalid Value"); diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/FloodDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/FloodDataManager.java index ee2164ae1e..970c15631c 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/FloodDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/FloodDataManager.java @@ -25,6 +25,7 @@ import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.common.dataquery.db.QueryResultRow; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.data.FloodData; +import com.raytheon.viz.hydrocommon.util.DbUtils; import com.raytheon.viz.hydrocommon.util.HydroDataUtils; /** @@ -93,8 +94,8 @@ public class FloodDataManager extends HydroDataManager { * @throws VizException */ public void deleteRecord(FloodData recordToDelete) throws VizException { - runStatement(String.format(DELETE_STATEMENT, HydroDataUtils - .getPKStatement(recordToDelete))); + runStatement(String.format(DELETE_STATEMENT, + HydroDataUtils.getPKStatement(recordToDelete))); } /** @@ -160,14 +161,22 @@ public class FloodDataManager extends HydroDataManager { } private void updateFloodData(FloodData data) throws VizException { - runStatement(String.format(UPDATE_STATEMENT, data.getDamage(), data - .getDisplayStatement(), HydroDataUtils.getPKStatement(data))); + + DbUtils.escapeSpecialCharforData(data); + + runStatement(String + .format(UPDATE_STATEMENT, data.getDamage(), + data.getDisplayStatement(), + HydroDataUtils.getPKStatement(data))); } private void insertFloodData(FloodData currData) throws VizException { - runStatement(String.format(INSERT_STATEMENT, currData.getLid(), String - .format("%8.2f", currData.getStage()), currData.getDamage(), - currData.getDisplayStatement())); + + DbUtils.escapeSpecialCharforData(currData); + + runStatement(String.format(INSERT_STATEMENT, currData.getLid(), + String.format("%8.2f", currData.getStage()), + currData.getDamage(), currData.getDisplayStatement())); } public void putFloodCategoryData(String lid, double stage, String damage, diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/HydroDBDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/HydroDBDataManager.java index 1f07c799ee..78797d4b90 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/HydroDBDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/HydroDBDataManager.java @@ -30,6 +30,7 @@ import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.common.dataquery.db.QueryResultRow; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.data.HydroDBData; +import com.raytheon.viz.hydrocommon.util.DbUtils; /** * Class for managing database query calls. @@ -89,6 +90,9 @@ public class HydroDBDataManager extends HydroDataManager { public void deleteRecord(T recordToDelete) throws VizException { try { + + DbUtils.escapeSpecialCharforData(recordToDelete); + String deleteQuery = (String) recordToDelete.getClass() .getMethod("getDeleteStatement").invoke(recordToDelete); @@ -215,6 +219,9 @@ public class HydroDBDataManager extends HydroDataManager { */ public void updateData(T data) throws VizException { try { + + DbUtils.escapeSpecialCharforData(data); + // Get the update statement with the values filled in String updateQuery = (String) data.getClass() .getMethod("getUpdateStatement").invoke(data); @@ -239,9 +246,11 @@ public class HydroDBDataManager extends HydroDataManager { throws VizException { try { + DbUtils.escapeSpecialCharforData(newData); String updateQuery = (String) newData.getClass() .getMethod("getUpdateStatement").invoke(newData); + DbUtils.escapeSpecialCharforData(updateData); String pkquery = (String) updateData.getClass() .getMethod("getPKStatement").invoke(updateData); @@ -268,6 +277,7 @@ public class HydroDBDataManager extends HydroDataManager { String insertQuery = null; try { + DbUtils.escapeSpecialCharforData(currData); // if (currData.getClass() == LocationAgencyOfficeData.class) { Method getSQLMethod = currData.getClass().getMethod( "getInsertStatement"); diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/HydroDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/HydroDataManager.java index f54876b4a3..32a74cb2d3 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/HydroDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/HydroDataManager.java @@ -19,7 +19,6 @@ **/ package com.raytheon.viz.hydrocommon.datamanager; -import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; @@ -44,7 +43,7 @@ import com.raytheon.viz.hydrocommon.data.RatingShift; * ------------ ---------- ----------- -------------------------- * Oct 22, 2008 1636 askripsky Initial Creation * Sep 09, 2009 2259 mpduff Added rating shift data - * April 8, 2015 17338 jingtaoD add checkAppostrophe method + * * * * @author askripsky @@ -74,11 +73,12 @@ public abstract class HydroDataManager { */ protected ArrayList runQuery(String dataQuery) { AppsDefaults ad = AppsDefaults.getInstance(); - boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, false); + boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, + false); if (debug) { - System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + - ad.getToken(HydroConstants.PGPORT) + ":" + - ad.getToken(HydroConstants.DB_NAME)); + System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + + ad.getToken(HydroConstants.PGPORT) + ":" + + ad.getToken(HydroConstants.DB_NAME)); System.out.println("Query: " + dataQuery); } ArrayList data = null; @@ -103,18 +103,16 @@ public abstract class HydroDataManager { */ public QueryResult runMappedQuery(String dataQuery) throws VizException { AppsDefaults ad = AppsDefaults.getInstance(); - boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, false); + boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, + false); if (debug) { - System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + - ad.getToken(HydroConstants.PGPORT) + ":" + - ad.getToken(HydroConstants.DB_NAME)); + System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + + ad.getToken(HydroConstants.PGPORT) + ":" + + ad.getToken(HydroConstants.DB_NAME)); System.out.println("Query: " + dataQuery); } QueryResult data = null; - - // check if dataQuery contains any apostrophe, if does, replace it to two single appostrophe - dataQuery = checkAppostrophe(dataQuery); - + data = DirectDbQuery.executeMappedQuery(dataQuery, HydroConstants.IHFS, QueryLanguage.SQL); @@ -127,120 +125,20 @@ public abstract class HydroDataManager { * @throws VizException */ public void runStatement(String dataQuery) throws VizException { - + AppsDefaults ad = AppsDefaults.getInstance(); - boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, false); + boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN, + false); if (debug) { - System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + - ad.getToken(HydroConstants.PGPORT) + ":" + - ad.getToken(HydroConstants.DB_NAME)); + System.out.println(ad.getToken(HydroConstants.PGHOST) + ":" + + ad.getToken(HydroConstants.PGPORT) + ":" + + ad.getToken(HydroConstants.DB_NAME)); System.out.println("Query: " + dataQuery); } - - // check if dataQuery contains any apostrophe, if does, replace it to two single appostrophe - dataQuery = checkAppostrophe(dataQuery); - + DirectDbQuery.executeStatement(dataQuery, HydroConstants.IHFS, - QueryLanguage.SQL); - - } - - public String checkAppostrophe (String dataQuery) { - /* Check if text fields include single apostrophe, if it does, replace to - two single apostrophe since it is treated as special char in Postgres */ - String newDataQuery = ""; - String PDCDataStr = ""; - int PDC_presetStr_begindex = 0; - - /* special handling for PDC*/ - if (dataQuery.toLowerCase().contains("preset_string")) - { - PDC_presetStr_begindex = dataQuery.toLowerCase().indexOf("'at="); - if (PDC_presetStr_begindex > 0) - { - PDCDataStr = dataQuery.substring(PDC_presetStr_begindex); - dataQuery = dataQuery.substring(0, PDC_presetStr_begindex); - } - } - - String[] dataElement = dataQuery.split(", "); - for (int j = 0; j < dataElement.length; j++) - { - String elem = dataElement[j]; - String newSubData = ""; - String[] subdataElement = elem.split("="); - - for (int i = 0; i < subdataElement.length; i++) - { - String subelem = subdataElement[i]; - String likeStr=""; - - // handle the where clause contains "like '%'" - if (subelem.toUpperCase().contains("WHERE") && - subelem.toUpperCase().contains("LIKE")) - { - int likeindex = subelem.toUpperCase().indexOf("LIKE"); - likeStr = subelem.substring(likeindex , subelem.length()); - subelem = subelem.substring(0, likeindex); - } - - String endStr = ""; - String beginStr = ""; - String checkStr; - int startappostraphe, endappostraphe; - - if (subelem.contains("'")) - { - if (subelem.startsWith("$$") && subelem.endsWith("$$")) - { - startappostraphe = subelem.indexOf("$$"); - endappostraphe = subelem.lastIndexOf("$$"); - checkStr = subelem.substring(startappostraphe+2, endappostraphe); - if (checkStr.contains("'")) - { - checkStr = checkStr.replace("'", "''"); - subelem = "'" + checkStr +"'"; - } - } - else - { - startappostraphe = subelem.indexOf("'"); - endappostraphe = subelem.lastIndexOf("'"); - checkStr = subelem.substring(startappostraphe+1, endappostraphe); - if (checkStr.contains("'")) - { - if (startappostraphe > 0) - beginStr = subelem.substring(0, startappostraphe); - if (endappostraphe + 1 < subelem.length()) - endStr = subelem.substring(endappostraphe + 1, subelem.length()); - - checkStr = checkStr.replace("'", "''"); - subelem = beginStr + "'" + checkStr +"'" + endStr; - } - } - } - - if (i == subdataElement.length -1 ) - newSubData = newSubData + subelem + likeStr; - else - newSubData = newSubData + subelem + "="; - } - if (j == dataElement.length - 1) - newDataQuery = newDataQuery + newSubData; - else - newDataQuery = newDataQuery + newSubData + ", "; - } - - if (PDC_presetStr_begindex > 0) - { - if (newDataQuery.toLowerCase().startsWith("insert")) - newDataQuery = newDataQuery + ", " + PDCDataStr; - else if (newDataQuery.toLowerCase().startsWith("update")) - newDataQuery = newDataQuery + PDCDataStr; - - } - - return newDataQuery; + QueryLanguage.SQL); + } /** diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LocationAreaManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LocationAreaManager.java index 015404226d..94456aefa4 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LocationAreaManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LocationAreaManager.java @@ -25,59 +25,59 @@ import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.common.dataquery.db.QueryResultRow; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.data.LocationAreaData; +import com.raytheon.viz.hydrocommon.util.DbUtils; /** * This class is the data manager for the location area data. * *
- *
+ * 
  * SOFTWARE HISTORY
- *
+ * 
  * Date         Ticket#     Engineer    Description
  * ------------ ----------  ----------- --------------------------
  * 02 Dec 2008              lvenable    Initial creation
  * 
  * 
- * + * * @author lvenable * @version 1.0 */ -public class LocationAreaManager extends HydroDataManager -{ +public class LocationAreaManager extends HydroDataManager { /** * Instance of this class. */ private static LocationAreaManager manager = null; - + /** * Select statement. */ private final String SELECT_STATEMENT = "SELECT * FROM locarea"; - + /** * Insert statement. */ private final String INSERT_STATEMENT = "INSERT INTO locarea (lid, area) VALUES ('%s', '%s')"; - + /** * Delete statement. */ private final String DELETE_STATEMENT = "DELETE FROM locarea"; - + /** * Update statement. */ private final String UPDATE_STATEMENT = "UPDATE locarea SET area='%s' WHERE lid='%s'"; - + /** * Private constructor. */ - private LocationAreaManager() - { + private LocationAreaManager() { } - + /** * Get an instance of this class. + * * @return An instance of this class. */ public static synchronized LocationAreaManager getInstance() { @@ -87,88 +87,103 @@ public class LocationAreaManager extends HydroDataManager return manager; } - + /** * Get the location area data. - * @param lid Location ID. + * + * @param lid + * Location ID. * @return Array of location area data. - * @throws VizException Database exception. + * @throws VizException + * Database exception. */ - public ArrayList getLocationAreaData(String lid) throws VizException - { + public ArrayList getLocationAreaData(String lid) + throws VizException { ArrayList rval = new ArrayList(); - + QueryResult result = runMappedQuery(SELECT_STATEMENT + " WHERE lid='" + lid + "'"); for (QueryResultRow currRow : result.getRows()) { rval.add(new LocationAreaData(currRow, result.getColumnNames())); } - + return rval; } - + /** * Delete an existing location area record. - * @param locationID Location ID. - * @throws VizException Database exception. + * + * @param locationID + * Location ID. + * @throws VizException + * Database exception. */ - public void deleteRecord(String locationID) throws VizException - { + public void deleteRecord(String locationID) throws VizException { StringBuilder query = new StringBuilder(DELETE_STATEMENT); - String whereClaus = String.format(" WHERE lid = '%s'", - locationID); + String whereClaus = String.format(" WHERE lid = '%s'", locationID); query.append(whereClaus); - + runStatement(query.toString()); } - + /** * Insert location area data. - * @param data Location area data. - * @throws VizException Database exception. + * + * @param data + * Location area data. + * @throws VizException + * Database exception. */ - public void insertLocationAreaData(LocationAreaData data) throws VizException - { + public void insertLocationAreaData(LocationAreaData data) + throws VizException { + DbUtils.escapeSpecialCharforData(data); + String query = String.format(INSERT_STATEMENT, data.getLid(), data.getArea()); - + runStatement(query); } - + /** * Update existing location area data. - * @param data Location area data. - * @throws VizException Database exception. + * + * @param data + * Location area data. + * @throws VizException + * Database exception. */ - public void updateLocationAreaData(LocationAreaData data) throws VizException - { + public void updateLocationAreaData(LocationAreaData data) + throws VizException { + DbUtils.escapeSpecialCharforData(data); + String query = String.format(UPDATE_STATEMENT, data.getArea(), data.getLid()); - + runStatement(query); } - + /** * Check of a location area record exists. - * @param lid Location ID. + * + * @param lid + * Location ID. * @return True if the record exists, false otherwise. - * @throws VizException Database exception. + * @throws VizException + * Database exception. */ - public boolean recordExists(String lid) throws VizException - { + public boolean recordExists(String lid) throws VizException { StringBuilder query = new StringBuilder(SELECT_STATEMENT); String whereClaus = String.format(" WHERE lid = '%s'", lid); - + query.append(whereClaus); - + QueryResult result = runMappedQuery(query.toString()); - - if (result.getResultCount() == 0) - { + + if (result.getResultCount() == 0) { return false; } - + return true; } } diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LowWaterDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LowWaterDataManager.java index 3ee82de9cd..f405a7a589 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LowWaterDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LowWaterDataManager.java @@ -29,6 +29,7 @@ import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.common.dataquery.db.QueryResultRow; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.data.LowWaterData; +import com.raytheon.viz.hydrocommon.util.DbUtils; import com.raytheon.viz.hydrocommon.util.HydroDataUtils; /** @@ -161,6 +162,9 @@ public class LowWaterDataManager extends HydroDataManager { } private void updateLowWaterData(LowWaterData data) throws VizException { + + DbUtils.escapeSpecialCharforData(data); + runStatement(String.format( UPDATE_STATEMENT, (data.getFlow() == LowWaterData.MISSING_VALUE) ? "null" : data @@ -170,6 +174,9 @@ public class LowWaterDataManager extends HydroDataManager { } private void insertLowWaterData(LowWaterData currData) throws VizException { + + DbUtils.escapeSpecialCharforData(currData); + runStatement(String.format(INSERT_STATEMENT, currData.getLid(), dateFormat.format(currData.getDate()), (currData.getFlow() == LowWaterData.MISSING_VALUE) ? "null" diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LowWaterStatementDataManager.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LowWaterStatementDataManager.java index 0e0c2497d5..27c1c04a1f 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LowWaterStatementDataManager.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/datamanager/LowWaterStatementDataManager.java @@ -25,6 +25,7 @@ import com.raytheon.uf.common.dataquery.db.QueryResult; import com.raytheon.uf.common.dataquery.db.QueryResultRow; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.hydrocommon.data.LowWaterStatementData; +import com.raytheon.viz.hydrocommon.util.DbUtils; import com.raytheon.viz.hydrocommon.util.HydroDataUtils; /** @@ -94,8 +95,8 @@ public class LowWaterStatementDataManager extends HydroDataManager { */ public void deleteRecord(LowWaterStatementData recordToDelete) throws VizException { - runStatement(String.format(DELETE_STATEMENT, HydroDataUtils - .getPKStatement(recordToDelete))); + runStatement(String.format(DELETE_STATEMENT, + HydroDataUtils.getPKStatement(recordToDelete))); } /** @@ -114,9 +115,7 @@ public class LowWaterStatementDataManager extends HydroDataManager { + lid + "' ORDER BY criteria_rank, lower_value ASC"); for (QueryResultRow currRow : result.getRows()) { - rval - .add(new LowWaterStatementData(currRow, result - .getColumnNames())); + rval.add(new LowWaterStatementData(currRow, result.getColumnNames())); } return rval; @@ -139,17 +138,23 @@ public class LowWaterStatementDataManager extends HydroDataManager { private void updateLowWaterStatementData(LowWaterStatementData data) throws VizException { - runStatement(String.format(UPDATE_STATEMENT, data - .getUpperValueDBString(), data.getStatement(), data - .getLowWaterCriteria(), data.getLowWaterSource(), + + DbUtils.escapeSpecialCharforData(data); + + runStatement(String.format(UPDATE_STATEMENT, + data.getUpperValueDBString(), data.getStatement(), + data.getLowWaterCriteria(), data.getLowWaterSource(), HydroDataUtils.getPKStatement(data))); } private void insertLowWaterData(LowWaterStatementData currData) throws VizException { + + DbUtils.escapeSpecialCharforData(currData); + runStatement(String.format(INSERT_STATEMENT, currData.getLid(), - currData.getPe(), currData.getLowerValue(), currData - .getUpperValueDBString(), currData.getCriteriaRank(), + currData.getPe(), currData.getLowerValue(), + currData.getUpperValueDBString(), currData.getCriteriaRank(), currData.getStatement(), currData.getLowWaterCriteria(), currData.getLowWaterSource())); } diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/util/DbUtils.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/util/DbUtils.java index 72f7e11e33..a6d18715e7 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/util/DbUtils.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/util/DbUtils.java @@ -23,8 +23,10 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.lang.reflect.Field; import com.raytheon.uf.common.ohd.AppsDefaults; +import com.raytheon.viz.hydrocommon.data.HydroDBData; /** * Hydro Database Utilities @@ -36,7 +38,8 @@ import com.raytheon.uf.common.ohd.AppsDefaults; * Jul 9, 2008 1194 mpduff Initial creation. * Mar 7, 2014 16692 lbousaidi Any Forecast source other than * H*,P*,Q*,T* should be handled by fcstother. - * + * Oct 10, 2015 17935 special char (e.g apostrophe) can not be saved/updated in Hyrobase + * * * * * @author mpduff @@ -80,8 +83,7 @@ public class DbUtils { } /* if observed data or processed data being treated as observed */ - if (ts.toUpperCase().startsWith("R") - || treatProcessedAsObserverd + if (ts.toUpperCase().startsWith("R") || treatProcessedAsObserverd || ts.toUpperCase().startsWith("XX")) { Set tableKeys = tableMap.keySet(); @@ -112,8 +114,8 @@ public class DbUtils { * data */ retVal = fcstTableMap.get(pe.substring(0, 1).toLowerCase()); - if (retVal==null) { - retVal="Fcstother"; + if (retVal == null) { + retVal = "Fcstother"; } matchFound = true; } else { /* if type-source not valid */ @@ -188,4 +190,54 @@ public class DbUtils { fcstTableMap.put("t", "Fcsttemperature"); } } + + /** + * replace string fields in table class which contains apostrophe + * + * @param curData + */ + public static void escapeSpecialCharforData(T curData) { + Class c = curData.getClass(); + + Field fields[] = c.getDeclaredFields(); + + for (Field f : fields) { + try { + if (f.getType().isAssignableFrom(String.class)) { + + f.setAccessible(true); + if (f.get(curData) != null) { + String value = (String) f.get(curData).toString(); + if (value != null) { + if (value.contains("'")) { + value = value.replace("'", "''"); + f.set(curData, value); + } + } + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + } + + /** + * replace apostrophe for string + * + * @param strValue + * @return + */ + public static String escapeSpecialCharforStr(String strValue) { + String rVal; + + if (strValue != null) { + if (strValue.contains("'")) { + strValue = strValue.replace("'", "''"); + } + } + rVal = strValue; + return rVal; + } } From 6a90a7c18f966cfb3607962382c7d953e89d0a66 Mon Sep 17 00:00:00 2001 From: Steve Harris Date: Mon, 19 Oct 2015 13:52:46 -0500 Subject: [PATCH 18/21] Omaha #5005 - License changes for 16.1.1 Former-commit-id: 6901cd2ab3f70b9177cbd5cde31e551de1ce360e --- .../Benjamin_Diedrichsen_c_2012.txt | 13 + .../John_D_Hunter_c_2002-2008.txt | 17 -- .../Matplotlib_1.0.1_License.txt | 11 - .../Mozilla_Public_License_v_1.0.txt | 278 ------------------ ...atial_Consortium_Inc_License_Agreement.txt | 24 -- ..._c_1997-2011_Fredrik_Lundh_c_1995-2011.txt | 10 + ...for_JavaBeans_Activation_Framework_1.1.txt | 26 ++ .../Thomas_G_Lane_c_1991-1998.txt | 72 +++++ .../FOSS_licenses/jMock_Project_License.txt | 30 ++ rpms/legal/Master_Rights_File.pdf | Bin 165063 -> 167334 bytes 10 files changed, 151 insertions(+), 330 deletions(-) create mode 100644 rpms/legal/FOSS_licenses/Benjamin_Diedrichsen_c_2012.txt delete mode 100644 rpms/legal/FOSS_licenses/John_D_Hunter_c_2002-2008.txt delete mode 100644 rpms/legal/FOSS_licenses/Matplotlib_1.0.1_License.txt delete mode 100644 rpms/legal/FOSS_licenses/Mozilla_Public_License_v_1.0.txt delete mode 100644 rpms/legal/FOSS_licenses/Open_Geospatial_Consortium_Inc_License_Agreement.txt create mode 100644 rpms/legal/FOSS_licenses/Secret_Labs_c_1997-2011_Fredrik_Lundh_c_1995-2011.txt create mode 100644 rpms/legal/FOSS_licenses/Sun_Microsystems_Inc_Entitlement_for_JavaBeans_Activation_Framework_1.1.txt create mode 100644 rpms/legal/FOSS_licenses/Thomas_G_Lane_c_1991-1998.txt create mode 100644 rpms/legal/FOSS_licenses/jMock_Project_License.txt diff --git a/rpms/legal/FOSS_licenses/Benjamin_Diedrichsen_c_2012.txt b/rpms/legal/FOSS_licenses/Benjamin_Diedrichsen_c_2012.txt new file mode 100644 index 0000000000..f8986b8216 --- /dev/null +++ b/rpms/legal/FOSS_licenses/Benjamin_Diedrichsen_c_2012.txt @@ -0,0 +1,13 @@ +MIT License + +Copyright (c) 2012 Benjamin Diedrichsen + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/rpms/legal/FOSS_licenses/John_D_Hunter_c_2002-2008.txt b/rpms/legal/FOSS_licenses/John_D_Hunter_c_2002-2008.txt deleted file mode 100644 index 55966fa58f..0000000000 --- a/rpms/legal/FOSS_licenses/John_D_Hunter_c_2002-2008.txt +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved. - -1. This LICENSE AGREEMENT is between John D. Hunter (“JDH”), and the Individual or Organization (“Licensee”) accessing and otherwise using matplotlib software in source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, JDH hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use matplotlib 0.98.3 alone or in any derivative version, provided, however, that JDH’s License Agreement and JDH’s notice of copyright, i.e., “Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved” are retained in matplotlib 0.98.3 alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on or incorporates matplotlib 0.98.3 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to matplotlib 0.98.3. - -4. JDH is making matplotlib 0.98.3 available to Licensee on an “AS IS” basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB 0.98.3 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - -5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB 0.98.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING MATPLOTLIB 0.98.3, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between JDH and Licensee. This License Agreement does not grant permission to use JDH trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using matplotlib 0.98.3, Licensee agrees to be bound by the terms and conditions of this License Agreement. diff --git a/rpms/legal/FOSS_licenses/Matplotlib_1.0.1_License.txt b/rpms/legal/FOSS_licenses/Matplotlib_1.0.1_License.txt deleted file mode 100644 index 5129a2cfc1..0000000000 --- a/rpms/legal/FOSS_licenses/Matplotlib_1.0.1_License.txt +++ /dev/null @@ -1,11 +0,0 @@ -License -Matplotlib only uses BSD compatible code, and its license is based on the PSF license. See the Open Source Initiative licenses page for details on individual licenses. Non-BSD compatible licenses (eg LGPL) are acceptable in matplotlib Toolkits. For a discussion of the motivations behind the licencing choice, see Testing. -License agreement for matplotlib 1.0.1¶ -1. This LICENSE AGREEMENT is between John D. Hunter (“JDH”), and the Individual or Organization (“Licensee”) accessing and otherwise using matplotlib software in source or binary form and its associated documentation. -2. Subject to the terms and conditions of this License Agreement, JDH hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use matplotlib 1.0.1 alone or in any derivative version, provided, however, that JDH’s License Agreement and JDH’s notice of copyright, i.e., “Copyright (c) 2002-2009 John D. Hunter; All Rights Reserved” are retained in matplotlib 1.0.1 alone or in any derivative version prepared by Licensee. -3. In the event Licensee prepares a derivative work that is based on or incorporates matplotlib 1.0.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to matplotlib 1.0.1. -4. JDH is making matplotlib 1.0.1 available to Licensee on an “AS IS” basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB 1.0.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. -5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB 1.0.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING MATPLOTLIB 1.0.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. -6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. -7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between JDH and Licensee. This License Agreement does not grant permission to use JDH trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. -8. By copying, installing or otherwise using matplotlib 1.0.1, Licensee agrees to be bound by the terms and conditions of this License Agreement. diff --git a/rpms/legal/FOSS_licenses/Mozilla_Public_License_v_1.0.txt b/rpms/legal/FOSS_licenses/Mozilla_Public_License_v_1.0.txt deleted file mode 100644 index 871560a077..0000000000 --- a/rpms/legal/FOSS_licenses/Mozilla_Public_License_v_1.0.txt +++ /dev/null @@ -1,278 +0,0 @@ -Mozilla Public License version 1.0MOZILLA PUBLIC LICENSE -Version 1.0 - - - -1. Definitions. - 1.1. ``Contributor'' means each entity that creates or contributes to the - creation of Modifications. - 1.2. ``Contributor Version'' means the combination of the Original Code, prior - Modifications used by a Contributor, and the Modifications made by that - particular Contributor. - 1.3. ``Covered Code'' means the Original Code or Modifications or the - combination of the Original Code and Modifications, in each case including - portions thereof. - 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally - accepted in the software development community for the electronic transfer of - data. - 1.5. ``Executable'' means Covered Code in any form other than Source Code. - 1.6. ``Initial Developer'' means the individual or entity identified as the - Initial Developer in the Source Code notice required by Exhibit A. - 1.7. ``Larger Work'' means a work which combines Covered Code or portions - thereof with code not governed by the terms of this License. - 1.8. ``License'' means this document. - 1.9. ``Modifications'' means any addition to or deletion from the substance or - structure of either the Original Code or any previous Modifications. When - Covered Code is released as a series of files, a Modification is: - A. Any addition to or deletion from the contents of a file containing - Original Code or previous Modifications. - B. Any new file that contains any part of the Original Code or previous - Modifications. - 1.10. ``Original Code'' means Source Code of computer software code which is - described in the Source Code notice required by Exhibit A as Original Code, - and which, at the time of its release under this License is not already - Covered Code governed by this License. - 1.11. ``Source Code'' means the preferred form of the Covered Code for making - modifications to it, including all modules it contains, plus any associated - interface definition files, scripts used to control compilation and - installation of an Executable, or a list of source code differential - comparisons against either the Original Code or another well known, available - Covered Code of the Contributor's choice. The Source Code can be in a - compressed or archival form, provided the appropriate decompression or - de-archiving software is widely available for no charge. - 1.12. ``You'' means an individual or a legal entity exercising rights under, - and complying with all of the terms of, this License or a future version of - this License issued under Section 6.1. For legal entities, ``You'' includes - any entity which controls, is controlled by, or is under common control with - You. For purposes of this definition, ``control'' means (a) the power, direct - or indirect, to cause the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of fifty percent (50%) or more of the - outstanding shares or beneficial ownership of such entity. -2. Source Code License. - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, royalty-free, - non-exclusive license, subject to third party intellectual property claims: - (a) to use, reproduce, modify, display, perform, sublicense and distribute - the Original Code (or portions thereof) with or without Modifications, or as - part of a Larger Work; and - (b) under patents now or hereafter owned or controlled by Initial Developer, - to make, have made, use and sell (``Utilize'') the Original Code (or - portions thereof), but solely to the extent that any such patent is - reasonably necessary to enable You to Utilize the Original Code (or portions - thereof) and not to any greater extent that may be necessary to Utilize - further Modifications or combinations. - 2.2. Contributor Grant. - Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive - license, subject to third party intellectual property claims: - (a) to use, reproduce, modify, display, perform, sublicense and distribute - the Modifications created by such Contributor (or portions thereof) either - on an unmodified basis, with other Modifications, as Covered Code or as part - of a Larger Work; and - (b) under patents now or hereafter owned or controlled by Contributor, to - Utilize the Contributor Version (or portions thereof), but solely to the - extent that any such patent is reasonably necessary to enable You to Utilize - the Contributor Version (or portions thereof), and not to any greater extent - that may be necessary to Utilize further Modifications or combinations. -3. Distribution Obligations. - 3.1. Application of License. - The Modifications which You create or to which You contribute are governed by - the terms of this License, including without limitation Section 2.2. The - Source Code version of Covered Code may be distributed only under the terms of - this License or a future version of this License released under Section 6.1, - and You must include a copy of this License with every copy of the Source Code - You distribute. You may not offer or impose any terms on any Source Code - version that alters or restricts the applicable version of this License or the - recipients' rights hereunder. However, You may include an additional document - offering the additional rights described in Section 3.5. - 3.2. Availability of Source Code. - Any Modification which You create or to which You contribute must be made - available in Source Code form under the terms of this License either on the - same media as an Executable version or via an accepted Electronic Distribution - Mechanism to anyone to whom you made an Executable version available; and if - made available via Electronic Distribution Mechanism, must remain available - for at least twelve (12) months after the date it initially became available, - or at least six (6) months after a subsequent version of that particular - Modification has been made available to such recipients. You are responsible - for ensuring that the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a third party. - 3.3. Description of Modifications. - You must cause all Covered Code to which you contribute to contain a file - documenting the changes You made to create that Covered Code and the date of - any change. You must include a prominent statement that the Modification is - derived, directly or indirectly, from Original Code provided by the Initial - Developer and including the name of the Initial Developer in (a) the Source - Code, and (b) in any notice in an Executable version or related documentation - in which You describe the origin or ownership of the Covered Code. - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If You have knowledge that a party claims an intellectual property right in - particular functionality or code (or its utilization under this License), - you must include a text file with the source code distribution titled - ``LEGAL'' which describes the claim and the party making the claim in - sufficient detail that a recipient will know whom to contact. If you obtain - such knowledge after You make Your Modification available as described in - Section 3.2, You shall promptly modify the LEGAL file in all copies You make - available thereafter and shall take other steps (such as notifying - appropriate mailing lists or newsgroups) reasonably calculated to inform - those who received the Covered Code that new knowledge has been obtained. - (b) Contributor APIs. - If Your Modification is an application programming interface and You own or - control patents which are reasonably necessary to implement that API, you - must also include this information in the LEGAL file. - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each file of the Source Code, - and this License in any documentation for the Source Code, where You describe - recipients' rights relating to Covered Code. If You created one or more - Modification(s), You may add your name as a Contributor to the notice - described in Exhibit A. If it is not possible to put such notice in a - particular Source Code file due to its structure, then you must include such - notice in a location (such as a relevant directory file) where a user would be - likely to look for such a notice. You may choose to offer, and to charge a fee - for, warranty, support, indemnity or liability obligations to one or more - recipients of Covered Code. However, You may do so only on Your own behalf, - and not on behalf of the Initial Developer or any Contributor. You must make - it absolutely clear than any such warranty, support, indemnity or liability - obligation is offered by You alone, and You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of warranty, support, - indemnity or liability terms You offer. - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form only if the requirements of - Section 3.1-3.5 have been met for that Covered Code, and if You include a - notice stating that the Source Code version of the Covered Code is available - under the terms of this License, including a description of how and where You - have fulfilled the obligations of Section 3.2. The notice must be - conspicuously included in any notice in an Executable version, related - documentation or collateral in which You describe recipients' rights relating - to the Covered Code. You may distribute the Executable version of Covered Code - under a license of Your choice, which may contain terms different from this - License, provided that You are in compliance with the terms of this License - and that the license for the Executable version does not attempt to limit or - alter the recipient's rights in the Source Code version from the rights set - forth in this License. If You distribute the Executable version under a - different license You must make it absolutely clear that any terms which - differ from this License are offered by You alone, not by the Initial - Developer or any Contributor. You hereby agree to indemnify the Initial - Developer and every Contributor for any liability incurred by the Initial - Developer or such Contributor as a result of any such terms You offer. - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code with other code not - governed by the terms of this License and distribute the Larger Work as a - single product. In such a case, You must make sure the requirements of this - License are fulfilled for the Covered Code. -4. Inability to Comply Due to Statute or Regulation. - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Code due to statute or regulation - then You must: (a) comply with the terms of this License to the maximum extent - possible; and (b) describe the limitations and the code they affect. Such - description must be included in the LEGAL file described in Section 3.4 and - must be included with all distributions of the Source Code. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. -5. Application of this License. - This License applies to code to which the Initial Developer has attached the - notice in Exhibit A, and to related Covered Code. -6. Versions of the License. - 6.1. New Versions. - Netscape Communications Corporation (``Netscape'') may publish revised and/or - new versions of the License from time to time. Each version will be given a - distinguishing version number. - 6.2. Effect of New Versions. - Once Covered Code has been published under a particular version of the - License, You may always continue to use it under the terms of that version. - You may also choose to use such Covered Code under the terms of any subsequent - version of the License published by Netscape. No one other than Netscape has - the right to modify the terms applicable to Covered Code created under this - License. - 6.3. Derivative Works. - If you create or use a modified version of this License (which you may only do - in order to apply it to code which is not already Covered Code governed by - this License), you must (a) rename Your license so that the phrases - ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any - confusingly similar phrase do not appear anywhere in your license and (b) - otherwise make it clear that your version of the license contains terms which - differ from the Mozilla Public License and Netscape Public License. (Filling - in the name of the Initial Developer, Original Code or Contributor in the - notice described in Exhibit A shall not of themselves be deemed to be - modifications of this License.) -7. DISCLAIMER OF WARRANTY. - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT - LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, - FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE - QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED - CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY - OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR - CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS - LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS - DISCLAIMER. -8. TERMINATION. - This License and the rights granted hereunder will terminate automatically if - You fail to comply with terms herein and fail to cure such breach within 30 - days of becoming aware of the breach. All sublicenses to the Covered Code - which are properly granted shall survive any termination of this License. - Provisions which, by their nature, must remain in effect beyond the - termination of this License shall survive. -9. LIMITATION OF LIABILITY. - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING - NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER - CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF - SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, - INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT - LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR - MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH - PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS - LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL - INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW - PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR - LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND - LIMITATION MAY NOT APPLY TO YOU. -10. U.S. GOVERNMENT END USERS. - The Covered Code is a ``commercial item,'' as that term is defined in 48 - C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and - ``commercial computer software documentation,'' as such terms are used in 48 - C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. - 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users - acquire Covered Code with only those rights set forth herein. -11. MISCELLANEOUS. - This License represents the complete agreement concerning subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. This License shall be governed by California law provisions - (except to the extent applicable law, if any, provides otherwise), excluding - its conflict-of-law provisions. With respect to disputes in which at least one - party is a citizen of, or an entity chartered or registered to do business in, - the United States of America: (a) unless otherwise agreed in writing, all - disputes relating to this License (excepting any dispute relating to - intellectual property rights) shall be subject to final and binding - arbitration, with the losing party paying all costs of arbitration; (b) any - arbitration relating to this Agreement shall be held in Santa Clara County, - California, under the auspices of JAMS/EndDispute; and (c) any litigation - relating to this Agreement shall be subject to the jurisdiction of the Federal - Courts of the Northern District of California, with venue lying in Santa Clara - County, California, with the losing party responsible for costs, including - without limitation, court costs and reasonable attorneys fees and expenses. - The application of the United Nations Convention on Contracts for the - International Sale of Goods is expressly excluded. Any law or regulation which - provides that the language of a contract shall be construed against the - drafter shall not apply to this License. -12. RESPONSIBILITY FOR CLAIMS. - Except in cases where another Contributor has failed to comply with Section - 3.4, You are responsible for damages arising, directly or indirectly, out of - Your utilization of rights under this License, based on the number of copies - of Covered Code you made available, the revenues you received from utilizing - such rights, and other relevant factors. You agree to work with affected - parties to distribute responsibility on an equitable basis. -EXHIBIT A. - ``The contents of this file are subject to the Mozilla Public License Version - 1.0 (the "License"); you may not use this file except in compliance with the - License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for - the specific language governing rights and limitations under the License. - The Original Code is ______________________________________. - The Initial Developer of the Original Code is ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. - Contributor(s): ______________________________________.'' diff --git a/rpms/legal/FOSS_licenses/Open_Geospatial_Consortium_Inc_License_Agreement.txt b/rpms/legal/FOSS_licenses/Open_Geospatial_Consortium_Inc_License_Agreement.txt deleted file mode 100644 index e06bea6978..0000000000 --- a/rpms/legal/FOSS_licenses/Open_Geospatial_Consortium_Inc_License_Agreement.txt +++ /dev/null @@ -1,24 +0,0 @@ -Open Geospatial Consortium, Inc. -License Agreement - -BEFORE YOU CLICK ON THE ACCEPT BUTTON AT THE END OF THIS DOCUMENT, CAREFULLY READ ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT. BY CLICKING ON THE ACCEPT BUTTON, YOU ARE CONSENTING TO BE BOUND BY AND ARE BECOMING A PARTY TO THIS AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THE TERMS OF THIS AGREEMENT, CLICK THE "DO NOT ACCEPT" BUTTON AND DO NOT DOWNLOAD THIS INTELLECTUAL PROPERTY. - -Readers of this document are requested to submit to Open Geospatial Consortium, Inc. ("Licensor"), with their comments, notification of any relevant patent rights or other intellectual property rights of which they may be aware which might be infringed by any use of the copyrighted material that follows (the "Intellectual Property"), as appropriate, and to provide supporting documentation. - -Open Geospatial Consortium Inc., OGC, OPENGIS, and the OGC CERTIFIED COMPLIANT logo are registered trademarks or trademarks of Licensor in the United States and in other countries. - -Permission is hereby granted, free of charge and subject to the terms set forth below, to any person obtaining a copy of this Intellectual Property and any associated documentation, to deal in the Intellectual Property without restriction (except as set forth below), including without limitation the rights to implement, use, copy, modify, merge, publish, distribute, and/or sublicense copies of the Intellectual Property, and to permit persons to whom the Intellectual Property is furnished to do so, provided that all copyright notices on the intellectual property are retained intact and that each person to whom the Intellectual Property is furnished agrees to the terms of this Agreement. - -If you modify the Intellectual Property, all copies of the modified Intellectual Property must include, in addition to the above copyright notice, a notice that the Intellectual Property includes modifications that have not been approved or adopted by LICENSOR. - -THIS LICENSE IS A COPYRIGHT LICENSE ONLY, AND DOES NOT CONVEY ANY RIGHTS UNDER ANY PATENTS THAT MAY BE IN FORCE ANYWHERE IN THE WORLD. - -THE INTELLECTUAL PROPERTY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE DO NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE INTELLECTUAL PROPERTY WILL MEET YOUR REQUIREMENTS OR THAT THE OPERATION OF THE INTELLECTUAL PROPERTY WILL BE UNINTERRUPTED OR ERROR FREE. ANY USE OF THE INTELLECTUAL PROPERTY SHALL BE MADE ENTIRELY AT THE USER’S OWN RISK. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ANY CONTRIBUTOR OF INTELLECTUAL PROPERTY RIGHTS TO THE INTELLECTUAL PROPERTY BE LIABLE FOR ANY CLAIM, OR ANY DIRECT, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM ANY ALLEGED INFRINGEMENT OR ANY LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR UNDER ANY OTHER LEGAL THEORY, ARISING OUT OF OR IN CONNECTION WITH THE IMPLEMENTATION, USE, COMMERCIALIZATION OR PERFORMANCE OF THIS INTELLECTUAL PROPERTY. - -This license is effective until terminated. You may terminate it at any time by destroying the Intellectual Property together with all copies in any form. It will also terminate if you fail to comply with any term or condition of this Agreement. Except as provided in the following sentence, no such termination of this license shall require the termination of any third party end-user sublicense to the Intellectual Property which is in force as of the date of notice of such termination. In addition, should the Intellectual Property, or the operation of the Intellectual Property, infringe, or in LICENSOR’s sole opinion be likely to infringe, any patent, copyright, trademark or other right of a third party, you agree that LICENSOR, in its sole discretion, may terminate this license without any compensation or liability to you, your licensees or any other party. You agree upon termination of any kind to destroy or cause to be destroyed the Intellectual Property together with all copies in any form, whether held by you or by any third party. - -Except as contained in this notice, the name of LICENSOR or of any other holder of a copyright in all or part of the Intellectual Property shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Intellectual Property without prior written authorization of LICENSOR or such copyright holder. LICENSOR is and shall at all times be the sole entity that may authorize you or any third party to use certification marks, trademarks or other special designations to indicate compliance with any LICENSOR standards or specifications. - -This Agreement is governed by the laws of the Commonwealth of Massachusetts. The application to this Agreement of the United Nations Convention on Contracts for the International Sale of Goods is hereby expressly excluded. In the event any provision of this Agreement shall be deemed unenforceable, void or invalid, such provision shall be modified so as to make it valid and enforceable, and as so modified the entire Agreement shall remain in full force and effect. No decision, action or inaction by LICENSOR shall be construed to be a waiver of any rights or remedies available to it. - -None of the Intellectual Property or underlying information or technology may be downloaded or otherwise exported or reexported in violation of U.S. export laws and regulations. In addition, you are responsible for complying with any local laws in your jurisdiction which may impact your right to import, export or use the Intellectual Property, and you represent that you have complied with any regulations or registration procedures required by applicable law to make this license enforceable. diff --git a/rpms/legal/FOSS_licenses/Secret_Labs_c_1997-2011_Fredrik_Lundh_c_1995-2011.txt b/rpms/legal/FOSS_licenses/Secret_Labs_c_1997-2011_Fredrik_Lundh_c_1995-2011.txt new file mode 100644 index 0000000000..c0f6cde5bb --- /dev/null +++ b/rpms/legal/FOSS_licenses/Secret_Labs_c_1997-2011_Fredrik_Lundh_c_1995-2011.txt @@ -0,0 +1,10 @@ +The Python Imaging Library (PIL) is + + Copyright © 1997-2011 by Secret Labs AB + Copyright © 1995-2011 by Fredrik Lundh + +By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply with the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its associated documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies, and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Secret Labs AB or the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/rpms/legal/FOSS_licenses/Sun_Microsystems_Inc_Entitlement_for_JavaBeans_Activation_Framework_1.1.txt b/rpms/legal/FOSS_licenses/Sun_Microsystems_Inc_Entitlement_for_JavaBeans_Activation_Framework_1.1.txt new file mode 100644 index 0000000000..b6af7bffc9 --- /dev/null +++ b/rpms/legal/FOSS_licenses/Sun_Microsystems_Inc_Entitlement_for_JavaBeans_Activation_Framework_1.1.txt @@ -0,0 +1,26 @@ +A. Sun Microsystems, Inc. ("Sun") ENTITLEMENT for +SOFTWARE + +Licensee/Company: Entity receiving Software. +Effective Date: Date of delivery of the Software to You. + +Software: JavaBeans Activation Framework 1.1. +License Term: Perpetual (subject to termination under the SLA). +Licensed Unit: Software Copy. +Licensed unit Count: Unlimited. + +Permitted Uses: + +1. You may reproduce and use the Software for Individual, Commercial, or Research and Instructional Use for the purposes of designing, developing, testing, and running Your applets andapplication("Programs"). + +2. Subject to the terms and conditions of this Agreement and restrictions and exceptions set forth in the Software's documentation, You may reproduce and distribute portions of Software identified as a redistributable in the documentation "Redistributable"), provided that: + +(a) you distribute Redistributable complete and unmodified and only bundled as part of Your Programs, +(b) your Programs add significant and primary functionality to the Redistributable, +(c) you distribute Redistributable for the sole purpose of running your Programs, +(d) you do not distribute additional software intended to replace any component(s) of the Redistributable, +(e) you do not remove or alter any proprietary legends or notices contained in or on the Redistributable. +(f) you only distribute the Redistributable subject to a license agreement that protects Sun's interests consistent with the terms contained in this Agreement, and +(g) you agree to defend and indemnify Sun and its licensors from and against any damages, costs, liabilities, settlement amounts and/or expenses (including attorneys' fees) incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of any and all Programs and/or Redistributable. + +3. Java Technology Restrictions. You may not create, modify, or change the behavior of, or authorize your licensees to create, modify, or change the behavior of, classes, interfaces, or subpackages that are in any way identified as "java", "javax", "sun" or similar convention as specified by Sun in any naming convention designation. diff --git a/rpms/legal/FOSS_licenses/Thomas_G_Lane_c_1991-1998.txt b/rpms/legal/FOSS_licenses/Thomas_G_Lane_c_1991-1998.txt new file mode 100644 index 0000000000..c28ea105fd --- /dev/null +++ b/rpms/legal/FOSS_licenses/Thomas_G_Lane_c_1991-1998.txt @@ -0,0 +1,72 @@ +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1998, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltconfig, ltmain.sh). Another support script, install-sh, is copyright +by M.I.T. but is also freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot +legally be used without obtaining one or more licenses. For this reason, +support for arithmetic coding has been removed from the free JPEG software. +(Since arithmetic coding provides only a marginal gain over the unpatented +Huffman mode, it is unlikely that very many implementations will support it.) +So far as we are aware, there are no patent restrictions on the remaining +code. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + diff --git a/rpms/legal/FOSS_licenses/jMock_Project_License.txt b/rpms/legal/FOSS_licenses/jMock_Project_License.txt new file mode 100644 index 0000000000..53d452d180 --- /dev/null +++ b/rpms/legal/FOSS_licenses/jMock_Project_License.txt @@ -0,0 +1,30 @@ + +jMock Project License + +Copyright (c) 2000-2007, jMock.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +Neither the name of jMock nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + + diff --git a/rpms/legal/Master_Rights_File.pdf b/rpms/legal/Master_Rights_File.pdf index 1e4260120a40e4566439f6df02230c74f1afea22..e589ebeacfa05af3ba7530cc1b109914e14dadc2 100644 GIT binary patch delta 124634 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 Twsas4gB%O#L_}0|)ad>X1NIQ9 delta 122713 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�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

yzJ$U><6HZ2@@mgAB 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 Wuirjr7dAMklMv2cx6Z)Kko`YuTSOWF From 0b082b592a9e14348221f55265886a7fd8c1d28a Mon Sep 17 00:00:00 2001 From: Bryan Kowal Date: Tue, 20 Oct 2015 15:35:45 -0500 Subject: [PATCH 19/21] Omaha #4759 - CAVE repository installation / upgrade script. Change-Id: Ia3ae80b428dde8609fa8e634ed1bf525bce46339 Former-commit-id: 9fdeb1874df73618721dd9bec6e29a9dae983243 --- cave/build/static/linux/cave/caveInstall.sh | 113 ++++++++++++++++++ .../dependency/evaluator/BuildFeature.java | 18 +++ .../src/awips/dependency/evaluator/Main.java | 12 +- 3 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 cave/build/static/linux/cave/caveInstall.sh diff --git a/cave/build/static/linux/cave/caveInstall.sh b/cave/build/static/linux/cave/caveInstall.sh new file mode 100644 index 0000000000..32bbbb83f0 --- /dev/null +++ b/cave/build/static/linux/cave/caveInstall.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +# This script can be used to install additional features into CAVE. This +# script will also handle the removal and installation of a feature if +# a feature is upgraded. + +# This script currently expects two arguments: the location of the Eclipse repository +# and the id of the feature that should be installed. + +# Only the root user and the awips user are able to successfully run this script. +if [ "${USER}" != "root" -a "${USER}" != "awips" ]; then + echo "ERROR: ${USER} does not have the required privileges to run ${0}." + exit 1 +fi + +_awips_tmp_dir=/awips2/tmp +_cave_install_prefix=cave-install- + +# Common function to print usage information. +function usage() { + echo "Usage: ${0} " + echo "Example: ${0} /path/to/repo-location/eclipse/v2.7 com.raytheon.uf.viz.base.feature" + exit 1 +} + +# Verify that the expected arguments have been provided. +if [ $# -ne 2 ]; then + echo "ERROR: Invalid arguments provided!" + usage +fi + +repository_loc=${1} +feature_id=${2} + +# Verify that the specified repository exists. +if [ ! -d ${repository_loc} ]; then + echo "ERROR: The specified repository does not exist!" + usage +fi + +_feature_zip=${repository_loc}/${feature_id}.zip + +# Verify that a feature repository exists for the specified feature. +if [ ! -f ${_feature_zip} ]; then + echo "ERROR: Unable to find a repository for the specified feature!" + usage +fi + +# Prepare to stage the repository. +_unique_ident=`echo $$` +_staging_dir=${_awips_tmp_dir}/${_cave_install_prefix}${_unique_ident} + +if [ -d ${_staging_dir} ]; then + rm -rf ${_staging_dir} + if [ $? -ne 0 ]; then + echo "ERROR: Failed to remove the existing staging directory: ${_staging_dir}!" + exit 1 + fi +fi +mkdir -p ${_staging_dir} +if [ $? -ne 0 ]; then + echo "ERROR: Failed to create the staging directory: ${_staging_dir}!" + exit 1 +fi + +unzip ${_feature_zip} -d ${_staging_dir} > /dev/null 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR: Failed to stage the repository: ${_feature_zip}!" + exit 1 +fi + +# Installation / Upgrade Constants. +CAVE_EXE="/awips2/cave/cave" +NOSPLASH_ARG="-nosplash" +DIRECTOR_APP="-application org.eclipse.equinox.p2.director" +DESTINATION_ARG="-destination /awips2/cave" +INSTALL_ARG="-i ${feature_id}.feature.group" +UNINSTALL_ARG="-u ${feature_id}.feature.group" +# Used to ensure that the awips2-java is used. +VM_ARG=/awips2/java/bin/java +REPO="-repository file:${_staging_dir}" + +COMMON_CMD="${CAVE_EXE} -vm ${VM_ARG} ${NOSPLASH_ARG} ${DIRECTOR_APP} ${DESTINATION_ARG}" +INSTALL_CMD="${COMMON_CMD} ${INSTALL_ARG} ${REPO}" +UNINSTALL_CMD="${COMMON_CMD} ${UNINSTALL_ARG}" + +# Determine if this is an upgrade. A version of the feature is currently +# already installed. +${UNINSTALL_CMD} -verifyOnly > /dev/null 2>&1 +if [ $? -eq 0 ]; then + # An existing feature is installed. Remove the existing for an upgrade. + ${UNINSTALL_CMD} + if [ $? -ne 0 ]; then + echo "ERROR: Failed to remove feature: ${feature_id} during upgrade preparation!" + exit 1 + fi +fi + +# Install the new feature. +${INSTALL_CMD} +if [ $? -ne 0 ]; then + echo "ERROR: Failed to install feature: ${feature_id}!" + exit 1 +fi + +rm -rf ${_staging_dir} +if [ $? -ne 0 ]; then + echo "WARNING: Failed to purge the staging directory: ${_staging_dir}!" + exit 1 +fi + +echo "Successfully installed feature: ${feature_id}." +exit 0 diff --git a/javaUtilities/awips.dependency.evaluator/src/awips/dependency/evaluator/BuildFeature.java b/javaUtilities/awips.dependency.evaluator/src/awips/dependency/evaluator/BuildFeature.java index f630b8deb4..bb51132065 100644 --- a/javaUtilities/awips.dependency.evaluator/src/awips/dependency/evaluator/BuildFeature.java +++ b/javaUtilities/awips.dependency.evaluator/src/awips/dependency/evaluator/BuildFeature.java @@ -34,6 +34,7 @@ import java.util.HashSet; * ------------ ---------- ----------- -------------------------- * Sep 29, 2015 4759 bkowal Initial creation * Oct 09, 2015 4759 bkowal Build cycles now cause failure. + * Oct 20, 2015 4759 bkowal Added {@link #eclipse}. * * * @@ -49,6 +50,11 @@ public class BuildFeature { private final Path featurePath; + /* + * Indicates that this feature is provided by Eclipse. + */ + private final boolean eclipse; + /* * A {@link Set} of the {@link BuildFeature}s that are dependent on this * {@link BuildFeature}. This {@link BuildFeature} must be built before the @@ -72,7 +78,12 @@ public class BuildFeature { private boolean topoMark = false; public BuildFeature(final Path featurePath) { + this(featurePath, false); + } + + public BuildFeature(final Path featurePath, boolean eclipse) { this.featurePath = featurePath; + this.eclipse = eclipse; } public void addDependentFeature(BuildFeature buildFeature) { @@ -158,6 +169,13 @@ public class BuildFeature { return topoMark; } + /** + * @return the eclipse + */ + public boolean isEclipse() { + return eclipse; + } + /* * (non-Javadoc) * diff --git a/javaUtilities/awips.dependency.evaluator/src/awips/dependency/evaluator/Main.java b/javaUtilities/awips.dependency.evaluator/src/awips/dependency/evaluator/Main.java index 62a70eb6c4..400e3eeed3 100644 --- a/javaUtilities/awips.dependency.evaluator/src/awips/dependency/evaluator/Main.java +++ b/javaUtilities/awips.dependency.evaluator/src/awips/dependency/evaluator/Main.java @@ -73,6 +73,8 @@ import org.eclipse.pde.internal.core.product.ProductModel; * ------------ ---------- ----------- -------------------------- * Sep 29, 2015 4759 bkowal Initial creation * Oct 09, 2015 4759 bkowal Added an exclude features parameter. + * Oct 20, 2015 4759 bkowal Handle non-Eclipse features that are + * embedded in other features. * * * @@ -424,6 +426,12 @@ public class Main { * all plugins and features in the baseline. */ for (BuildFeature buildFeature : orderedFeatures) { + if (buildFeature.isEclipse()) { + /* + * Do not copy Eclipse features. + */ + continue; + } final Path copyFeaturePath = this.buildFeaturesPath .resolve(buildFeature.getId()); Files.createDirectories(copyFeaturePath); @@ -731,11 +739,11 @@ public class Main { + featureChild.getId() + "!"); } embeddedBuildFeature = new BuildFeature(resourcePaths.get(0) - .resolve(BuildFeature.FILENAME)); + .resolve(BuildFeature.FILENAME), true); } this.scanFeature(embeddedBuildFeature, containingBuildFeature); } - this.buildFeaturesMap.put(feature.getId(), containingBuildFeature); + this.buildFeaturesMap.put(feature.getId(), buildFeature); } private void scanStagingPlugin(final BuildPlugin buildPlugin) From c477bb1c80bfd10f5e4c9571b589ddd1facc9ff4 Mon Sep 17 00:00:00 2001 From: Roger Ferrel Date: Wed, 21 Oct 2015 10:42:09 -0500 Subject: [PATCH 20/21] Omaha #5015 Fixed merge issue. Former-commit-id: 866f4e7f8e9854920cf593efb16edde150a22fc9 --- .../src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java index b7a4edbf7c..8d3edda713 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java @@ -103,6 +103,7 @@ 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.time.ISimulatedTimeChangeListener; +import com.raytheon.uf.common.time.SimulatedTime; import com.raytheon.uf.viz.core.RGBColors; import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.localization.LocalizationManager; From b37429757a2f7e959f012ba56d4ca3e7d1e6d869 Mon Sep 17 00:00:00 2001 From: Dave Hladky Date: Wed, 21 Oct 2015 13:49:27 -0500 Subject: [PATCH 21/21] Omaha #4821 Fixed bad ffgType processing and width. Change-Id: I87516525bd8b0233d961f786dd8037520f311a67 Former-commit-id: c3161b18131f1d6b11f8a3aa277a29bd387d40d6 --- .../uf/viz/monitor/ffmp/ui/dialogs/AttributesDlg.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/AttributesDlg.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/AttributesDlg.java index 81690f0405..c559da02ff 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/AttributesDlg.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/AttributesDlg.java @@ -17,6 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ + package com.raytheon.uf.viz.monitor.ffmp.ui.dialogs; import java.util.ArrayList; @@ -53,6 +54,7 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog; * ------------ ---------- ----------- -------------------------- * Initial creation * Dec 6, 2012 rferrel Change to non-blocking dialog. + * Oct, 21 2015 4821 dhladky Fixed bad ffgType subString and width. * * * @@ -243,11 +245,11 @@ public class AttributesDlg extends CaveSWTDialog { addSeparator(attrComp); gd.horizontalIndent = 15; - gd.widthHint = 140; + gd.widthHint = 180; String fcolumnName = ffmpTableCfgData.getTableColumnAttr( ffmpTableCfgData.getTableColumnKeys()[6]).getName(); - String ffgType = fcolumnName.substring(0, columnName.indexOf(" ")); + String ffgType = fcolumnName.substring(0, fcolumnName.indexOf("::")); ArrayList guidTypes = productRun.getGuidanceTypes(prodXml); for (String name : guidTypes) {