From 7bdad7b89a2e06a18e6c4b0e0d1b2da63a5cc9d4 Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Thu, 3 Jun 2021 09:58:51 +0300 Subject: [PATCH 01/11] ISSUE #80 Add bulletin parser tests and test resources for IWXXM 3.0 regular and cancellation message parsing. --- .../v1_2/GenericBulletinParserTest.java | 45 +++++ .../iwxxm/bulletin/v1_2/iwxxm-30-bulletin.xml | 170 ++++++++++++++++++ .../v1_2/iwxxm-30-cancellation-bulletin.xml | 47 +++++ 3 files changed, 262 insertions(+) create mode 100644 src/test/resources/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/iwxxm-30-bulletin.xml create mode 100644 src/test/resources/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/iwxxm-30-cancellation-bulletin.xml diff --git a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java index c917683c..e94065e4 100644 --- a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java +++ b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java @@ -22,6 +22,9 @@ import fi.fmi.avi.converter.ConversionResult; import fi.fmi.avi.converter.iwxxm.IWXXMTestConfiguration; import fi.fmi.avi.converter.iwxxm.conf.IWXXMConverter; +import fi.fmi.avi.model.Aerodrome; +import fi.fmi.avi.model.AviationWeatherMessage; +import fi.fmi.avi.model.GenericAviationWeatherMessage; import fi.fmi.avi.model.bulletin.GenericMeteorologicalBulletin; /** @@ -68,4 +71,46 @@ public void testParserWithSIGMET() throws Exception { ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); } + + @Test + public void testParserWithIWXXM30() throws Exception { + final Document input = this.getBulletinDocument("iwxxm-30-bulletin.xml"); + final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO, + ConversionHints.EMPTY); + assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); + + GenericAviationWeatherMessage message = result.getConvertedMessage().get().getMessages().get(0); + + //check validtime + assertEquals("2012-08-16T00:00Z", message.getValidityTime().get().getStartTime().get().getCompleteTime().get().toString()); + assertEquals("2012-08-16T18:00Z", message.getValidityTime().get().getEndTime().get().getCompleteTime().get().toString()); + + //check aerodrome + Aerodrome aerodrome = message.getTargetAerodrome().get(); + assertEquals("YUDO", aerodrome.getDesignator()); + assertEquals("DONLON/INTERNATIONAL", aerodrome.getName().get()); + assertEquals("YUDO", aerodrome.getLocationIndicatorICAO().get()); + assertEquals("DON", aerodrome.getDesignatorIATA().get()); + //check status + assertEquals(AviationWeatherMessage.ReportStatus.NORMAL, message.getReportStatus()); + } + + @Test + public void testParserWithIWXXM30Cancellation() throws Exception { + final Document input = this.getBulletinDocument("iwxxm-30-cancellation-bulletin.xml"); + final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO, + ConversionHints.EMPTY); + assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); + + GenericAviationWeatherMessage message = result.getConvertedMessage().get().getMessages().get(0); + assertEquals("2012-08-16T00:00Z", message.getValidityTime().get().getStartTime().get().getCompleteTime().get().toString()); + assertEquals("2012-08-16T18:00Z", message.getValidityTime().get().getEndTime().get().getCompleteTime().get().toString()); + + Aerodrome aerodrome = message.getTargetAerodrome().get(); + assertEquals("YUDO", aerodrome.getDesignator()); + assertEquals("DONLON/INTERNATIONAL", aerodrome.getName().get()); + assertEquals("YUDO", aerodrome.getLocationIndicatorICAO().get()); + + assertEquals(AviationWeatherMessage.ReportStatus.AMENDMENT, message.getReportStatus()); + } } diff --git a/src/test/resources/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/iwxxm-30-bulletin.xml b/src/test/resources/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/iwxxm-30-bulletin.xml new file mode 100644 index 00000000..29856eef --- /dev/null +++ b/src/test/resources/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/iwxxm-30-bulletin.xml @@ -0,0 +1,170 @@ + + + + + + + 2012-08-15T18:00:00Z + + + + + + + + SNAPSHOT + YUDO + DONLON/INTERNATIONAL + YUDO + DON + 123.45 + + + 12.34 -12.34 + 12 + EGM_96 + + + + + + + + + + 2012-08-16T00:00:00Z + 2012-08-16T18:00:00Z + + + + + + + 9000.0 + + + 130.0 + 5.0 + + + + + + + + 2000.0 + + + + + + + + + + + + 2012-08-16T06:00:00Z + 2012-08-16T08:00:00Z + + + + + + + + 1500.0 + + + + + + + 2000.0 + + + + + + + + + + + + 2012-08-16T08:00:00Z + 2012-08-16T12:00:00Z + + + 1000.0 + + + 170.0 + 6.0 + 12.0 + + + + + + + + + 1000.0 + + + + + + + 2000.0 + + + + + + + + + + + + 2012-08-16T12:30:00Z + 2012-08-16T18:00:00Z + + + 10000.0 + ABOVE + + + 150.0 + 4.0 + + + + + + + + 2000.0 + + + + + + + + + A_LYXX31YUDO251600_C_YUDO_201208251600--.xml + \ No newline at end of file diff --git a/src/test/resources/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/iwxxm-30-cancellation-bulletin.xml b/src/test/resources/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/iwxxm-30-cancellation-bulletin.xml new file mode 100644 index 00000000..d746e6a7 --- /dev/null +++ b/src/test/resources/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/iwxxm-30-cancellation-bulletin.xml @@ -0,0 +1,47 @@ + + + + + + + + 2012-08-16T15:00:00Z + + + + + + + + + SNAPSHOT + YUDO + DONLON/INTERNATIONAL + YUDO + + + + + + + + 2012-08-16T00:00:00Z + 2012-08-16T18:00:00Z + + + + + + A_LYXX31YUDO251600_C_YUDO_201208251600--.xml + \ No newline at end of file From 3a59fb089d6497c06fe5b43675100d1076bcc200 Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Thu, 3 Jun 2021 10:01:48 +0300 Subject: [PATCH 02/11] SSUE #80 Add IWXXM builletin parsing to configurations --- .../java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java | 5 +++++ .../fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java | 1 + 2 files changed, 6 insertions(+) diff --git a/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java b/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java index cfbee2ab..9248321d 100644 --- a/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java +++ b/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java @@ -266,4 +266,9 @@ public class IWXXMConverter { public static final ConversionSpecification IWXXM21_STRING_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( String.class, GenericMeteorologicalBulletin.class, "XML/WMO COLLECT 1.2", null); + /** + * Pre-configured spec for WMO COLLECT 1.2 XML DOM document to {@link GenericMeteorologicalBulletin} + */ + public static final ConversionSpecification IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( + Document.class, GenericMeteorologicalBulletin.class, "XML/WMO COLLECT 1.2", null); } diff --git a/src/test/java/fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java b/src/test/java/fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java index 3046d63e..3dd971a5 100644 --- a/src/test/java/fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java +++ b/src/test/java/fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java @@ -204,6 +204,7 @@ public AviMessageConverter aviMessageConverter() { // Generic bulletin messages: p.setMessageSpecificConverter(IWXXMConverter.IWXXM21_DOM_TO_GENERIC_BULLETIN_POJO, genericBulletinIWXXMDOMParser); p.setMessageSpecificConverter(IWXXMConverter.IWXXM21_STRING_TO_GENERIC_BULLETIN_POJO, genericBulletinIWXXMStringParser); + p.setMessageSpecificConverter(IWXXMConverter.IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO, genericBulletinIWXXMDOMParser); return p; } From 7a656a9768c269705dcca6ab40995f718fe3689b Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Thu, 3 Jun 2021 10:03:35 +0300 Subject: [PATCH 03/11] ISSUE #80 Add IWXXM 3.0 parsing to IWXXMGenericBulletinScanner. Refactor small parts of code for less code repetition. --- .../v1_2/IWXXMGenericBulletinScanner.java | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java b/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java index 63009e83..a82594f9 100644 --- a/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java +++ b/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java @@ -27,6 +27,7 @@ import fi.fmi.avi.converter.IssueList; import fi.fmi.avi.converter.iwxxm.IWXXMNamespaceContext; import fi.fmi.avi.model.Aerodrome; +import fi.fmi.avi.model.AviationWeatherMessage; import fi.fmi.avi.model.GenericAviationWeatherMessage; import fi.fmi.avi.model.MessageType; import fi.fmi.avi.model.PartialOrCompleteTimeInstant; @@ -82,14 +83,41 @@ private static IssueList collectTAFMessage(final Element featureElement, final X "./iwxxm:baseForecast/om:OM_Observation/om:featureOfInterest/sams:SF_SpatialSamplingFeature/sam:sampledFeature/" + "aixm:AirportHeliport"); } if (expr != null) { - final NodeList nodes = (NodeList) expr.evaluate(featureElement, XPathConstants.NODESET); - if (nodes.getLength() == 1) { - builder.setTargetAerodrome(parseAerodromeInfo((Element) nodes.item(0), xpath, retval)); - } else { - retval.add(ConversionIssue.Severity.ERROR, ConversionIssue.Type.SYNTAX, "Aerodrome info not available for TAF of status " + status); - } + parseAerodromeInfo(featureElement, expr, xpath, builder, retval, status); + } + + return retval; + } + + private static IssueList collectTAF30Message(final Element featureElement, final XPath xpath, final GenericAviationWeatherMessageImpl.Builder builder) + throws XPathExpressionException { + final IssueList retval = new IssueList(); + //Issue time: + final String timeStr; + XPathExpression expr = xpath.compile("./iwxxm30:issueTime/gml:TimeInstant/gml:timePosition"); + timeStr = expr.evaluate(featureElement); + if (!timeStr.isEmpty()) { + builder.setIssueTime(PartialOrCompleteTimeInstant.of(ZonedDateTime.parse(timeStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME))); + } else { + retval.add(ConversionIssue.Severity.ERROR, ConversionIssue.Type.MISSING_DATA, "No issue time found for IWXXM TAF"); } + expr = xpath.compile("@isCancelReport"); + final boolean isCancelMessage = (expr.evaluate(featureElement) != null && expr.evaluate(featureElement).toLowerCase().equals("true")) ? true : false; + if(isCancelMessage) { + collectValidTime(featureElement, "./iwxxm30:cancelledReportValidPeriod", xpath, builder); + } else { + collectValidTime(featureElement, "./iwxxm30:validPeriod", xpath, builder); + } + + expr = xpath.compile("@reportStatus"); + final String status = expr.evaluate(featureElement); + builder.setReportStatus(AviationWeatherMessage.ReportStatus.valueOf(status)); + + //target aerodrome + expr = xpath.compile("./iwxxm30:aerodrome/aixm:AirportHeliport"); + parseAerodromeInfo(featureElement, expr, xpath, builder, retval, status); + return retval; } @@ -118,6 +146,16 @@ private static IssueList collectValidTime(final Element featureElement, final St return retval; } + private static void parseAerodromeInfo(final Element featureElement, final XPathExpression timeSliceExpretion, final XPath xpath, + final GenericAviationWeatherMessageImpl.Builder builder, final IssueList issues, String status) throws XPathExpressionException { + final NodeList nodes = (NodeList) timeSliceExpretion.evaluate(featureElement, XPathConstants.NODESET); + if (nodes.getLength() == 1) { + builder.setTargetAerodrome(parseAerodromeInfo((Element) nodes.item(0), xpath, issues)); + } else { + issues.add(ConversionIssue.Severity.ERROR, ConversionIssue.Type.SYNTAX, "Aerodrome info not available for TAF of status " + status); + } + } + private static Optional parseAerodromeInfo(final Element airportHeliport, final XPath xpath, final IssueList issues) throws XPathExpressionException { Optional retval = Optional.empty(); @@ -196,7 +234,11 @@ protected ConversionResult createAviationWeatherM switch (messageType) { case "TAF": builder.setMessageType(MessageType.TAF); - retval.addIssue(collectTAFMessage(featureElement, xpath, builder)); + if(featureElement.getNamespaceURI().equals("http://icao.int/iwxxm/3.0")) { + retval.addIssue(collectTAF30Message(featureElement, xpath, builder)); + } else { + retval.addIssue(collectTAFMessage(featureElement, xpath, builder)); + } break; case "METAR": From d311e31e08b3a38ce6d983bc64587ad31096e165 Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Thu, 3 Jun 2021 12:07:05 +0300 Subject: [PATCH 04/11] ISSUE #80 Code style fixes --- .../iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java b/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java index a82594f9..2008b680 100644 --- a/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java +++ b/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java @@ -103,7 +103,7 @@ private static IssueList collectTAF30Message(final Element featureElement, final } expr = xpath.compile("@isCancelReport"); - final boolean isCancelMessage = (expr.evaluate(featureElement) != null && expr.evaluate(featureElement).toLowerCase().equals("true")) ? true : false; + final boolean isCancelMessage = (expr.evaluate(featureElement) != null && expr.evaluate(featureElement).toLowerCase().equals("true")); if(isCancelMessage) { collectValidTime(featureElement, "./iwxxm30:cancelledReportValidPeriod", xpath, builder); } else { @@ -147,7 +147,7 @@ private static IssueList collectValidTime(final Element featureElement, final St } private static void parseAerodromeInfo(final Element featureElement, final XPathExpression timeSliceExpretion, final XPath xpath, - final GenericAviationWeatherMessageImpl.Builder builder, final IssueList issues, String status) throws XPathExpressionException { + final GenericAviationWeatherMessageImpl.Builder builder, final IssueList issues, final String status) throws XPathExpressionException { final NodeList nodes = (NodeList) timeSliceExpretion.evaluate(featureElement, XPathConstants.NODESET); if (nodes.getLength() == 1) { builder.setTargetAerodrome(parseAerodromeInfo((Element) nodes.item(0), xpath, issues)); From 70ebfeb2c42b9c81a63157c3dd216e7cf7c29e17 Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Fri, 18 Jun 2021 10:17:20 +0300 Subject: [PATCH 05/11] CR: Add illegal argument exception --- .../iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java b/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java index 2008b680..ec551202 100644 --- a/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java +++ b/src/main/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/IWXXMGenericBulletinScanner.java @@ -112,7 +112,11 @@ private static IssueList collectTAF30Message(final Element featureElement, final expr = xpath.compile("@reportStatus"); final String status = expr.evaluate(featureElement); - builder.setReportStatus(AviationWeatherMessage.ReportStatus.valueOf(status)); + try { + builder.setReportStatus(AviationWeatherMessage.ReportStatus.valueOf(status)); + } catch (IllegalArgumentException e) { + retval.add(ConversionIssue.Severity.ERROR, "The report status could not be parsed"); + } //target aerodrome expr = xpath.compile("./iwxxm30:aerodrome/aixm:AirportHeliport"); From d0856bdf44b21e748da06c5693471af235e32b20 Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Fri, 18 Jun 2021 10:18:05 +0300 Subject: [PATCH 06/11] CR: Rename IWXXM21_DOM_TO_GENERIC_BULLETIN_POJO -> WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO && IWXXM21_STRING_TO_GENERIC_BULLETIN_POJO -> WMO_COLLECT_STRING_TO_GENERIC_BULLETIN_POJO. Remove IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO and replace references with WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO. --- .../avi/converter/iwxxm/conf/IWXXMConverter.java | 14 ++++---------- .../converter/iwxxm/IWXXMTestConfiguration.java | 5 ++--- .../bulletin/v1_2/GenericBulletinParserTest.java | 8 ++++---- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java b/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java index 9248321d..491cb67c 100644 --- a/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java +++ b/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java @@ -255,20 +255,14 @@ public class IWXXMConverter { // ******************* /** - * Pre-configured spec for WMO COLLECT 1.2 XML DOM document to {@link GenericMeteorologicalBulletin} + * Pre-configured spec for WMO COLLECT 1.2 and 1.3 XML DOM document to {@link GenericMeteorologicalBulletin} */ - public static final ConversionSpecification IWXXM21_DOM_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( + public static final ConversionSpecification WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( Document.class, GenericMeteorologicalBulletin.class, "XML/WMO COLLECT 1.2", null); /** - * Pre-configured spec for WMO COLLECT 1.2 XML document String to {@link GenericMeteorologicalBulletin} + * Pre-configured spec for WMO COLLECT 1.2 and 1.3 XML document String to {@link GenericMeteorologicalBulletin} */ - public static final ConversionSpecification IWXXM21_STRING_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( + public static final ConversionSpecification WMO_COLLECT_STRING_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( String.class, GenericMeteorologicalBulletin.class, "XML/WMO COLLECT 1.2", null); - - /** - * Pre-configured spec for WMO COLLECT 1.2 XML DOM document to {@link GenericMeteorologicalBulletin} - */ - public static final ConversionSpecification IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( - Document.class, GenericMeteorologicalBulletin.class, "XML/WMO COLLECT 1.2", null); } diff --git a/src/test/java/fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java b/src/test/java/fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java index 3dd971a5..9152d845 100644 --- a/src/test/java/fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java +++ b/src/test/java/fi/fmi/avi/converter/iwxxm/IWXXMTestConfiguration.java @@ -202,9 +202,8 @@ public AviMessageConverter aviMessageConverter() { p.setMessageSpecificConverter(IWXXMConverter.WMO_COLLECT_DOM_TO_SWX_BULLETIN_POJO, spaceWeatherBulletinIWXXMDOMParser); // Generic bulletin messages: - p.setMessageSpecificConverter(IWXXMConverter.IWXXM21_DOM_TO_GENERIC_BULLETIN_POJO, genericBulletinIWXXMDOMParser); - p.setMessageSpecificConverter(IWXXMConverter.IWXXM21_STRING_TO_GENERIC_BULLETIN_POJO, genericBulletinIWXXMStringParser); - p.setMessageSpecificConverter(IWXXMConverter.IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO, genericBulletinIWXXMDOMParser); + p.setMessageSpecificConverter(IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, genericBulletinIWXXMDOMParser); + p.setMessageSpecificConverter(IWXXMConverter.WMO_COLLECT_STRING_TO_GENERIC_BULLETIN_POJO, genericBulletinIWXXMStringParser); return p; } diff --git a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java index e94065e4..eaef1f0b 100644 --- a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java +++ b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java @@ -59,7 +59,7 @@ public void testScanner() throws Exception { @Test public void testParserWithTAF() throws Exception { final Document input = this.getBulletinDocument("taf-bulletin.xml"); - final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.IWXXM21_DOM_TO_GENERIC_BULLETIN_POJO, + final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); } @@ -67,7 +67,7 @@ public void testParserWithTAF() throws Exception { @Test public void testParserWithSIGMET() throws Exception { final Document input = this.getBulletinDocument("sigmet-bulletin.xml"); - final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.IWXXM21_DOM_TO_GENERIC_BULLETIN_POJO, + final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); } @@ -75,7 +75,7 @@ public void testParserWithSIGMET() throws Exception { @Test public void testParserWithIWXXM30() throws Exception { final Document input = this.getBulletinDocument("iwxxm-30-bulletin.xml"); - final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO, + final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); @@ -98,7 +98,7 @@ public void testParserWithIWXXM30() throws Exception { @Test public void testParserWithIWXXM30Cancellation() throws Exception { final Document input = this.getBulletinDocument("iwxxm-30-cancellation-bulletin.xml"); - final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.IWXXM30_DOM_TO_GENERIC_BULLETIN_POJO, + final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); From 68cdd61688016f207c783a158f4cba76231d09e1 Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Fri, 18 Jun 2021 11:23:42 +0300 Subject: [PATCH 07/11] Add checks for some missing properties --- .../iwxxm/bulletin/v1_2/GenericBulletinParserTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java index eaef1f0b..750f1754 100644 --- a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java +++ b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java @@ -25,6 +25,7 @@ import fi.fmi.avi.model.Aerodrome; import fi.fmi.avi.model.AviationWeatherMessage; import fi.fmi.avi.model.GenericAviationWeatherMessage; +import fi.fmi.avi.model.MessageType; import fi.fmi.avi.model.bulletin.GenericMeteorologicalBulletin; /** @@ -93,6 +94,10 @@ public void testParserWithIWXXM30() throws Exception { assertEquals("DON", aerodrome.getDesignatorIATA().get()); //check status assertEquals(AviationWeatherMessage.ReportStatus.NORMAL, message.getReportStatus()); + assertTrue(message.getMessageType().isPresent()); + assertEquals(MessageType.TAF, message.getMessageType().get()); + assertEquals(GenericAviationWeatherMessage.Format.IWXXM, message.getMessageFormat()); + } @Test From 20032b117b4d637a70a8c5868f2d1e0d02d147dc Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Fri, 18 Jun 2021 11:50:47 +0300 Subject: [PATCH 08/11] Fix tests that failed do to code merge from feature-archiver-v1.0-support branch --- .../bulletin/v1_2/GenericBulletinParserTest.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java index 750f1754..1cd92dac 100644 --- a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java +++ b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java @@ -87,11 +87,8 @@ public void testParserWithIWXXM30() throws Exception { assertEquals("2012-08-16T18:00Z", message.getValidityTime().get().getEndTime().get().getCompleteTime().get().toString()); //check aerodrome - Aerodrome aerodrome = message.getTargetAerodrome().get(); - assertEquals("YUDO", aerodrome.getDesignator()); - assertEquals("DONLON/INTERNATIONAL", aerodrome.getName().get()); - assertEquals("YUDO", aerodrome.getLocationIndicatorICAO().get()); - assertEquals("DON", aerodrome.getDesignatorIATA().get()); + assertEquals(message.getLocationIndicators().get(GenericAviationWeatherMessage.LocationIndicatorType.AERODROME), "YUDO"); + //check status assertEquals(AviationWeatherMessage.ReportStatus.NORMAL, message.getReportStatus()); assertTrue(message.getMessageType().isPresent()); @@ -111,10 +108,7 @@ public void testParserWithIWXXM30Cancellation() throws Exception { assertEquals("2012-08-16T00:00Z", message.getValidityTime().get().getStartTime().get().getCompleteTime().get().toString()); assertEquals("2012-08-16T18:00Z", message.getValidityTime().get().getEndTime().get().getCompleteTime().get().toString()); - Aerodrome aerodrome = message.getTargetAerodrome().get(); - assertEquals("YUDO", aerodrome.getDesignator()); - assertEquals("DONLON/INTERNATIONAL", aerodrome.getName().get()); - assertEquals("YUDO", aerodrome.getLocationIndicatorICAO().get()); + assertEquals(message.getLocationIndicators().get(GenericAviationWeatherMessage.LocationIndicatorType.AERODROME), "YUDO"); assertEquals(AviationWeatherMessage.ReportStatus.AMENDMENT, message.getReportStatus()); } From 22d29550d09a7cc1a4354249409dc5dca3553ffc Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Fri, 18 Jun 2021 12:00:16 +0300 Subject: [PATCH 09/11] Add issue time to test aserion --- .../iwxxm/bulletin/v1_2/GenericBulletinParserTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java index 1cd92dac..31e9239e 100644 --- a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java +++ b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java @@ -86,6 +86,9 @@ public void testParserWithIWXXM30() throws Exception { assertEquals("2012-08-16T00:00Z", message.getValidityTime().get().getStartTime().get().getCompleteTime().get().toString()); assertEquals("2012-08-16T18:00Z", message.getValidityTime().get().getEndTime().get().getCompleteTime().get().toString()); + assertTrue(message.getIssueTime().isPresent()); + assertEquals("2012-08-15T18:00Z", message.getIssueTime().get().getCompleteTime().get().toString()); + //check aerodrome assertEquals(message.getLocationIndicators().get(GenericAviationWeatherMessage.LocationIndicatorType.AERODROME), "YUDO"); @@ -108,6 +111,9 @@ public void testParserWithIWXXM30Cancellation() throws Exception { assertEquals("2012-08-16T00:00Z", message.getValidityTime().get().getStartTime().get().getCompleteTime().get().toString()); assertEquals("2012-08-16T18:00Z", message.getValidityTime().get().getEndTime().get().getCompleteTime().get().toString()); + assertTrue(message.getIssueTime().isPresent()); + assertEquals("2012-08-16T15:00Z", message.getIssueTime().get().getCompleteTime().get().toString()); + assertEquals(message.getLocationIndicators().get(GenericAviationWeatherMessage.LocationIndicatorType.AERODROME), "YUDO"); assertEquals(AviationWeatherMessage.ReportStatus.AMENDMENT, message.getReportStatus()); From 886121687b6c01adf90397d46d859de7e83707aa Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Mon, 21 Jun 2021 08:28:19 +0300 Subject: [PATCH 10/11] CR Fix Remove part of javadoc comment added by me in the last code review. It was a confudiion with IWXXM versions --- .../java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java b/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java index 491cb67c..501cec9b 100644 --- a/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java +++ b/src/main/java/fi/fmi/avi/converter/iwxxm/conf/IWXXMConverter.java @@ -255,13 +255,13 @@ public class IWXXMConverter { // ******************* /** - * Pre-configured spec for WMO COLLECT 1.2 and 1.3 XML DOM document to {@link GenericMeteorologicalBulletin} + * Pre-configured spec for WMO COLLECT 1.2 XML DOM document to {@link GenericMeteorologicalBulletin} */ public static final ConversionSpecification WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( Document.class, GenericMeteorologicalBulletin.class, "XML/WMO COLLECT 1.2", null); /** - * Pre-configured spec for WMO COLLECT 1.2 and 1.3 XML document String to {@link GenericMeteorologicalBulletin} + * Pre-configured spec for WMO COLLECT 1.2 XML document String to {@link GenericMeteorologicalBulletin} */ public static final ConversionSpecification WMO_COLLECT_STRING_TO_GENERIC_BULLETIN_POJO = new ConversionSpecification<>( String.class, GenericMeteorologicalBulletin.class, "XML/WMO COLLECT 1.2", null); From 004930b52bfa6315e6779afb482ca915bfbcc5bb Mon Sep 17 00:00:00 2001 From: patrick-alaspaa Date: Mon, 21 Jun 2021 09:54:26 +0300 Subject: [PATCH 11/11] CR fixes Add assertions for message type and format. Modify some assertions that handle optionals --- .../v1_2/GenericBulletinParserTest.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java index 31e9239e..19ae3871 100644 --- a/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java +++ b/src/test/java/fi/fmi/avi/converter/iwxxm/bulletin/v1_2/GenericBulletinParserTest.java @@ -4,6 +4,8 @@ import static org.junit.Assert.assertTrue; import java.io.InputStream; +import java.time.ZonedDateTime; +import java.util.Optional; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; @@ -22,10 +24,10 @@ import fi.fmi.avi.converter.ConversionResult; import fi.fmi.avi.converter.iwxxm.IWXXMTestConfiguration; import fi.fmi.avi.converter.iwxxm.conf.IWXXMConverter; -import fi.fmi.avi.model.Aerodrome; import fi.fmi.avi.model.AviationWeatherMessage; import fi.fmi.avi.model.GenericAviationWeatherMessage; import fi.fmi.avi.model.MessageType; +import fi.fmi.avi.model.PartialOrCompleteTimeInstant; import fi.fmi.avi.model.bulletin.GenericMeteorologicalBulletin; /** @@ -60,24 +62,24 @@ public void testScanner() throws Exception { @Test public void testParserWithTAF() throws Exception { final Document input = this.getBulletinDocument("taf-bulletin.xml"); - final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, - ConversionHints.EMPTY); + final ConversionResult result = this.converter.convertMessage(input, + IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); } @Test public void testParserWithSIGMET() throws Exception { final Document input = this.getBulletinDocument("sigmet-bulletin.xml"); - final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, - ConversionHints.EMPTY); + final ConversionResult result = this.converter.convertMessage(input, + IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); } @Test public void testParserWithIWXXM30() throws Exception { final Document input = this.getBulletinDocument("iwxxm-30-bulletin.xml"); - final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, - ConversionHints.EMPTY); + final ConversionResult result = this.converter.convertMessage(input, + IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); GenericAviationWeatherMessage message = result.getConvertedMessage().get().getMessages().get(0); @@ -86,11 +88,11 @@ public void testParserWithIWXXM30() throws Exception { assertEquals("2012-08-16T00:00Z", message.getValidityTime().get().getStartTime().get().getCompleteTime().get().toString()); assertEquals("2012-08-16T18:00Z", message.getValidityTime().get().getEndTime().get().getCompleteTime().get().toString()); - assertTrue(message.getIssueTime().isPresent()); - assertEquals("2012-08-15T18:00Z", message.getIssueTime().get().getCompleteTime().get().toString()); + assertEquals("2012-08-15T18:00Z", + message.getIssueTime().map(PartialOrCompleteTimeInstant::getCompleteTime).map(Optional::get).map(ZonedDateTime::toString).orElse(null)); //check aerodrome - assertEquals(message.getLocationIndicators().get(GenericAviationWeatherMessage.LocationIndicatorType.AERODROME), "YUDO"); + assertEquals("YUDO", message.getLocationIndicators().get(GenericAviationWeatherMessage.LocationIndicatorType.AERODROME)); //check status assertEquals(AviationWeatherMessage.ReportStatus.NORMAL, message.getReportStatus()); @@ -103,19 +105,21 @@ public void testParserWithIWXXM30() throws Exception { @Test public void testParserWithIWXXM30Cancellation() throws Exception { final Document input = this.getBulletinDocument("iwxxm-30-cancellation-bulletin.xml"); - final ConversionResult result = this.converter.convertMessage(input, IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, - ConversionHints.EMPTY); + final ConversionResult result = this.converter.convertMessage(input, + IWXXMConverter.WMO_COLLECT_DOM_TO_GENERIC_BULLETIN_POJO, ConversionHints.EMPTY); assertEquals(ConversionResult.Status.SUCCESS, result.getStatus()); GenericAviationWeatherMessage message = result.getConvertedMessage().get().getMessages().get(0); assertEquals("2012-08-16T00:00Z", message.getValidityTime().get().getStartTime().get().getCompleteTime().get().toString()); assertEquals("2012-08-16T18:00Z", message.getValidityTime().get().getEndTime().get().getCompleteTime().get().toString()); - assertTrue(message.getIssueTime().isPresent()); - assertEquals("2012-08-16T15:00Z", message.getIssueTime().get().getCompleteTime().get().toString()); + assertEquals("2012-08-16T15:00Z", + message.getIssueTime().map(PartialOrCompleteTimeInstant::getCompleteTime).map(Optional::get).map(ZonedDateTime::toString).orElse(null)); - assertEquals(message.getLocationIndicators().get(GenericAviationWeatherMessage.LocationIndicatorType.AERODROME), "YUDO"); + assertEquals("YUDO", message.getLocationIndicators().get(GenericAviationWeatherMessage.LocationIndicatorType.AERODROME)); assertEquals(AviationWeatherMessage.ReportStatus.AMENDMENT, message.getReportStatus()); + assertEquals(MessageType.TAF, message.getMessageType().get()); + assertEquals(GenericAviationWeatherMessage.Format.IWXXM, message.getMessageFormat()); } }