From a9e8bf9ddc93534df8f4ccd7c14927f3d902928e Mon Sep 17 00:00:00 2001 From: Jocelyn Date: Wed, 11 May 2022 13:05:05 -0700 Subject: [PATCH] PODAAC-4327 - Migrate NSIDC ISO changes (#1) * Migrate NSIDC ISO changes Migrated NSIDC ISO related changes from old repo to new, cleaned up codebase. * Fix ISO method call Make sure we call the new wrapper readIsoMetadataFile method --- .../aggregator/CMRRestClientProvider.java | 2 +- .../metadata/aggregator/IsoMendsXPath.java | 38 ++ .../metadata/aggregator/IsoSmapXPath.java | 25 ++ .../cumulus/metadata/aggregator/IsoXPath.java | 51 +-- .../aggregator/MetadataAggregatorCLI.java | 2 +- .../aggregator/MetadataAggregatorLambda.java | 16 +- .../aggregator/MetadataFilesToEcho.java | 326 ++++++++++++------ .../metadata/aggregator/UMMGranule.java | 19 + .../metadata/aggregator/UMMGranuleFile.java | 291 ++++++++-------- .../nasa/cumulus/metadata/test/UMMTest.java | 17 +- 10 files changed, 493 insertions(+), 294 deletions(-) create mode 100644 src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoMendsXPath.java create mode 100644 src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoSmapXPath.java diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/CMRRestClientProvider.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/CMRRestClientProvider.java index 91bb95a..17326b0 100644 --- a/src/main/java/gov/nasa/cumulus/metadata/aggregator/CMRRestClientProvider.java +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/CMRRestClientProvider.java @@ -79,7 +79,7 @@ public static CMRLambdaRestClient getClient(String lambdaInputStr, * cloud environment setup. * @return */ - public static CMRLambdaRestClient getECHOLambdaRestClient() { + public static CMRLambdaRestClient getLambdaRestClient() { return _elrc; } diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoMendsXPath.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoMendsXPath.java new file mode 100644 index 0000000..74aab84 --- /dev/null +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoMendsXPath.java @@ -0,0 +1,38 @@ +package gov.nasa.cumulus.metadata.aggregator; + +/** + * Class to define ISO-MENDS XPath Expressions + */ +public final class IsoMendsXPath extends IsoXPath { + public static final String PRODUCTION_DATE_TIME = "/gmi:MI_Metadata/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:processStep/gmi:LE_ProcessStep/gmd:dateTime/gco:DateTime"; + public static final String CREATION_DATE_TIME = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/gco:DateTime"; + public static final String BEGINNING_DATE_TIME = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition"; + public static final String ENDING_DATE_TIME = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition"; + public static final String POLYGON = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_BoundingPolygon/gmd:polygon/gml:Polygon/gml:exterior/gml:LinearRing/gml:posList"; + public static final String WEST_BOUNDING_COORDINATE = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:westBoundLongitude/gco:Decimal"; + public static final String SOUTH_BOUNDING_COORDINATE = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:southBoundLatitude/gco:Decimal"; + public static final String EAST_BOUNDING_COORDINATE = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:eastBoundLongitude/gco:Decimal"; + public static final String NORTH_BOUNDING_COORDINATE = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:northBoundLatitude/gco:Decimal"; + public static final String DATA_FILE = "/gmi:MI_Metadata/gmd:describes/gmx:MX_DataSet/gmx:dataFile[@xlink:href]"; + public static final String DATA_FILE_FILE_NAME = "gmx:MX_DataFile/gmx:fileName/gmx:FileName"; + public static final String DATA_FILE_FILE_DESCRIPTION = "gmx:MX_DataFile/gmx:fileDescription/gco:CharacterString"; + public static final String DATA_FILE_FILE_FORMAT = "gmx:MX_DataFile/gmx:fileFormat/gmd:MD_Format/gmd:name/gco:CharacterString"; + public static final String DATA_FILE_FILE_MIME_TYPE = "gmx:MX_DataFile/gmx:fileType/gmx:MimeFileType"; + + public static final String PARAMETER_NAME = "/gmi:MI_Metadata/gmd:contentInfo/gmd:MD_CoverageDescription/gmd:dimension/gmd:MD_Band/gmd:sequenceIdentifier/gco:MemberName/gco:aName/gco:CharacterString"; + public static final String QA_PERCENT_MISSING_DATA = "/gmi:MI_Metadata/gmd:contentInfo/gmd:MD_CoverageDescription/gmd:dimension/gmd:MD_Band/gmd:otherProperty/gco:Record/eos:AdditionalAttributes/eos:AdditionalAttribute[eos:reference/eos:EOS_AdditionalAttributeDescription/eos:name/gco:CharacterString[text()=\"QAPercentMissingData\"]]/eos:value/gco:CharacterString"; + public static final String QA_PERCENT_OUT_OF_BOUNDS_DATA = "/gmi:MI_Metadata/gmd:contentInfo/gmd:MD_CoverageDescription/gmd:dimension/gmd:MD_Band/gmd:otherProperty/gco:Record/eos:AdditionalAttributes/eos:AdditionalAttribute[eos:reference/eos:EOS_AdditionalAttributeDescription/eos:name/gco:CharacterString[text()=\"QAPercentOutOfBoundsData\"]]/eos:value/gco:CharacterString"; + + public static final String PRODUCER_GRANULE_ID = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier[gmd:codeSpace/gco:CharacterString[text()=\"gov.nasa.esdis.umm.producergranuleid\"]]/gmd:code/gco:CharacterString"; + public static final String CRID = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier[gmd:codeSpace/gco:CharacterString[text()=\"gov.nasa.esdis.umm.crid\"]]/gmd:code/gco:CharacterString"; + public static final String IDENTIFIERS = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier[gmd:codeSpace/gco:CharacterString[text()=\"gov.nasa.esdis.umm.otherid\"]]"; + public static final String IDENTIFIER_DESCRIPTION = "gmd:description/gco:CharacterString"; + + public static final String REPROCESSING_PLANNED = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceNote/gco:CharacterString"; + public static final String REPROCESSING_ACTUAL = "/gmi:MI_Metadata/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:processStep/gmi:LE_ProcessStep/gmd:description/gco:CharacterString"; + + // AscendingCrossing, StartLatitude, StartDirection, EndLatitude, EndDirection + public static final String ORBIT = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription[@id=\"Orbit\"]/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; + + public static final String GRANULE_INPUT = "/gmi:MI_Metadata/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:source/gmi:LE_Source[gmd:description/gco:CharacterString[text()=\"GranuleInput\"]]/gmd:sourceCitation/gmd:CI_Citation/gmd:title/gmx:FileName"; +} diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoSmapXPath.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoSmapXPath.java new file mode 100644 index 0000000..8420a3d --- /dev/null +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoSmapXPath.java @@ -0,0 +1,25 @@ +package gov.nasa.cumulus.metadata.aggregator; + +/** + * Class to define ISO-SMAP XPath Expressions + */ +public final class IsoSmapXPath extends IsoXPath { + private static final String BASE = "/gmd:DS_Series/gmd:composedOf/gmd:DS_DataSet/gmd:has/gmi:MI_Metadata"; + private static final String CI_CITATION = "/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation"; + public static final String PRODUCTION_DATE_TIME = BASE + "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:processStep/gmi:LE_ProcessStep/gmd:dateTime/gco:DateTime"; + public static final String CREATION_DATE_TIME = BASE + CI_CITATION + "/gmd:date/gmd:CI_Date/gmd:date/gco:DateTime"; + public static final String BEGINNING_DATE_TIME = BASE + "/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition"; + public static final String ENDING_DATE_TIME = BASE + "/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition"; + + public static final String PRODUCER_GRANULE_ID = BASE + CI_CITATION + "/gmd:title/gmx:FileName"; + public static final String CRID = BASE + CI_CITATION + "/gmd:identifier[0]/gmd:MD_Identifier/gmd:code/gco:CharacterString"; + public static final String IDENTIFIERS = BASE + CI_CITATION + "/gmd:identifier[1]/gmd:MD_Identifier/gmd:code/gco:CharacterString"; + public static final String IDENTIFIER_DESCRIPTION = BASE + CI_CITATION + "/gmd:identifier[1]/gmd:MD_Identifier/gmd:description/gco:CharacterString"; + + public static final String ORBIT = BASE + "/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent[@id=\"boundingExtent\"]/gmd:geographicElement/gmd:EX_GeographicDescription[@id=\"Orbit\"]/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; + + // OrbitNumber, EquatorCrossingLongitude, EquatorCrossingDateTime + public static final String OrbitCalculatedSpatialDomains = BASE + "/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent[@id=\"boundingExtent\"]/gmd:geographicElement/gmd:EX_GeographicDescription[@id=\"OrbitCalculatedSpatialDomains0\"]/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; + + public static final String GRANULE_INPUT = BASE + CI_CITATION + "/gmd:title/gmx:FileName"; +} diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoXPath.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoXPath.java index d6e54be..b5d5774 100644 --- a/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoXPath.java +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/IsoXPath.java @@ -1,43 +1,26 @@ package gov.nasa.cumulus.metadata.aggregator; /** - * Class to define ISO-MENDS XPath Expressions + * Base class to define ISO XPath Expressions */ -public final class IsoXPath { - public static final String PRODUCTION_DATE_TIME = "/gmi:MI_Metadata/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:processStep/gmi:LE_ProcessStep/gmd:dateTime/gco:DateTime"; - public static final String CREATION_DATE_TIME = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/gco:DateTime"; - public static final String BEGINNING_DATE_TIME = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition"; - public static final String ENDING_DATE_TIME = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition"; - public static final String POLYGON = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_BoundingPolygon/gmd:polygon/gml:Polygon/gml:exterior/gml:LinearRing/gml:posList"; - public static final String WEST_BOUNDING_COORDINATE = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:westBoundLongitude/gco:Decimal"; - public static final String SOUTH_BOUNDING_COORDINATE = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:southBoundLatitude/gco:Decimal"; - public static final String EAST_BOUNDING_COORDINATE = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:eastBoundLongitude/gco:Decimal"; - public static final String NORTH_BOUNDING_COORDINATE = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:northBoundLatitude/gco:Decimal"; - public static final String DATA_FILE = "/gmi:MI_Metadata/gmd:describes/gmx:MX_DataSet/gmx:dataFile[@xlink:href]"; - public static final String DATA_FILE_FILE_NAME = "gmx:MX_DataFile/gmx:fileName/gmx:FileName"; - public static final String DATA_FILE_FILE_DESCRIPTION = "gmx:MX_DataFile/gmx:fileDescription/gco:CharacterString"; - public static final String DATA_FILE_FILE_FORMAT = "gmx:MX_DataFile/gmx:fileFormat/gmd:MD_Format/gmd:name/gco:CharacterString"; - public static final String DATA_FILE_FILE_MIME_TYPE = "gmx:MX_DataFile/gmx:fileType/gmx:MimeFileType"; +public class IsoXPath { + public static String PRODUCTION_DATE_TIME; + public static String CREATION_DATE_TIME; + public static String BEGINNING_DATE_TIME; + public static String ENDING_DATE_TIME; - public static final String PARAMETER_NAME = "/gmi:MI_Metadata/gmd:contentInfo/gmd:MD_CoverageDescription/gmd:dimension/gmd:MD_Band/gmd:sequenceIdentifier/gco:MemberName/gco:aName/gco:CharacterString"; - public static final String QA_PERCENT_MISSING_DATA = "/gmi:MI_Metadata/gmd:contentInfo/gmd:MD_CoverageDescription/gmd:dimension/gmd:MD_Band/gmd:otherProperty/gco:Record/eos:AdditionalAttributes/eos:AdditionalAttribute[eos:reference/eos:EOS_AdditionalAttributeDescription/eos:name/gco:CharacterString[text()=\"QAPercentMissingData\"]]/eos:value/gco:CharacterString"; - public static final String QA_PERCENT_OUT_OF_BOUNDS_DATA = "/gmi:MI_Metadata/gmd:contentInfo/gmd:MD_CoverageDescription/gmd:dimension/gmd:MD_Band/gmd:otherProperty/gco:Record/eos:AdditionalAttributes/eos:AdditionalAttribute[eos:reference/eos:EOS_AdditionalAttributeDescription/eos:name/gco:CharacterString[text()=\"QAPercentOutOfBoundsData\"]]/eos:value/gco:CharacterString"; + public static String PRODUCER_GRANULE_ID; + public static String CRID; + public static String IDENTIFIERS; + public static String IDENTIFIER_CODE = "gmd:code/gco:CharacterString"; + public static String IDENTIFIER_DESCRIPTION; - public static final String PRODUCER_GRANULE_ID = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier[gmd:codeSpace/gco:CharacterString[text()=\"gov.nasa.esdis.umm.producergranuleid\"]]/gmd:code/gco:CharacterString"; - public static final String CRID = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier[gmd:codeSpace/gco:CharacterString[text()=\"gov.nasa.esdis.umm.crid\"]]/gmd:code/gco:CharacterString"; - public static final String IDENTIFIERS = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier[gmd:codeSpace/gco:CharacterString[text()=\"gov.nasa.esdis.umm.otherid\"]]"; - public static final String IDENTIFIER_CODE = "gmd:code/gco:CharacterString"; - public static final String IDENTIFIER_DESCRIPTION = "gmd:description/gco:CharacterString"; + public static String SWOT_TRACK = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription[@id=\"SWOTTrack\"]/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; + public static String ORBIT; - public static final String REPROCESSING_PLANNED = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceNote/gco:CharacterString"; - public static final String REPROCESSING_ACTUAL = "/gmi:MI_Metadata/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:processStep/gmi:LE_ProcessStep/gmd:description/gco:CharacterString"; + public static String PLATFORM = "/gmi:MI_Metadata/gmi:acquisitionInformation/gmi:MI_AcquisitionInformation/gmi:platform/eos:EOS_Platform/gmi:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; + public static String INSTRUMENT = "/gmi:MI_Metadata/gmi:acquisitionInformation/gmi:MI_AcquisitionInformation/gmi:platform/eos:EOS_Platform/gmi:instrument/eos:EOS_Instrument/gmi:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; - public static final String SWOT_TRACK = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription[@id=\"SWOTTrack\"]/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; - public static final String ORBIT = "/gmi:MI_Metadata/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription[@id=\"Orbit\"]/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; - - public static final String PLATFORM = "/gmi:MI_Metadata/gmi:acquisitionInformation/gmi:MI_AcquisitionInformation/gmi:platform/eos:EOS_Platform/gmi:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; - public static final String INSTRUMENT = "/gmi:MI_Metadata/gmi:acquisitionInformation/gmi:MI_AcquisitionInformation/gmi:platform/eos:EOS_Platform/gmi:instrument/eos:EOS_Instrument/gmi:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; - - public static final String GRANULE_INPUT = "/gmi:MI_Metadata/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:source/gmi:LE_Source[gmd:description/gco:CharacterString[text()=\"GranuleInput\"]]/gmd:sourceCitation/gmd:CI_Citation/gmd:title/gmx:FileName"; - public static final String PGE_VERSION_CLASS = "/gmi:MI_Metadata/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:processStep/gmi:LE_ProcessStep[gmd:description/gco:CharacterString[text()=\"PGEVersionClass\"]]/gmi:processingInformation/eos:EOS_Processing/gmi:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; + public static String GRANULE_INPUT; + public static String PGE_VERSION_CLASS = "/gmi:MI_Metadata/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:processStep/gmi:LE_ProcessStep[gmd:description/gco:CharacterString[text()=\"PGEVersionClass\"]]/gmi:processingInformation/eos:EOS_Processing/gmi:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString"; } diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataAggregatorCLI.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataAggregatorCLI.java index 5e9c7d4..2d6d777 100644 --- a/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataAggregatorCLI.java +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataAggregatorCLI.java @@ -131,7 +131,7 @@ public static void processIsoMetadata(String granuleId, String s3Location, Strin MetadataFilesToEcho mtfe = new MetadataFilesToEcho(true); try { mtfe.readConfiguration(configFile); - mtfe.readIsoMendsMetadataFile(isoFile, s3Location); + mtfe.readIsoMetadataFile(isoFile, s3Location); } catch (Exception e) { log.error(e.getMessage()); e.printStackTrace(); diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataAggregatorLambda.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataAggregatorLambda.java index a91bb67..f5c0922 100644 --- a/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataAggregatorLambda.java +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataAggregatorLambda.java @@ -128,18 +128,22 @@ public String PerformFunction(String input, Context context) throws Exception { } MetadataFilesToEcho mtfe; - if (iso != null) { - mtfe = new MetadataFilesToEcho(true); - mtfe.setDatasetValues(collectionName, collectionVersion, rangeIs360, boundingBox); + boolean isIsoFile = (iso != null); + + mtfe = new MetadataFilesToEcho(isIsoFile); + mtfe.setDatasetValues(collectionName, collectionVersion, rangeIs360, boundingBox); + if (granules != null && granules.size() > 0) { + mtfe.setGranuleFileSizeAndChecksum(granules); + } + + if (isIsoFile) { try { - mtfe.readIsoMendsMetadataFile(iso, s3Location); + mtfe.readIsoMetadataFile(iso, s3Location); } catch (IOException e) { AdapterLogger.LogError(this.className + " MetadataFilesToEcho input TRUE read error:" + e.getMessage()); e.printStackTrace(); } } else { - mtfe = new MetadataFilesToEcho(false); - mtfe.setDatasetValues(collectionName, collectionVersion, rangeIs360, boundingBox); try { AdapterLogger.LogInfo(this.className + " Creating UMM-G data structure"); if (meta != null) mtfe.readCommonMetadataFile(meta, s3Location); diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataFilesToEcho.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataFilesToEcho.java index 271cd48..20d44ec 100644 --- a/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataFilesToEcho.java +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/MetadataFilesToEcho.java @@ -4,6 +4,7 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.math.BigDecimal; import java.net.URISyntaxException; import java.text.SimpleDateFormat; import java.util.Date; @@ -36,6 +37,11 @@ import org.xml.sax.SAXException; import cumulus_message_adapter.message_parser.AdapterLogger; +enum Iso { + MENDS, + SMAP +} + public class MetadataFilesToEcho { String className = this.getClass().getName(); private UMMGranule granule; @@ -247,119 +253,215 @@ public void setGranuleFileSizeAndChecksum(JSONArray input_granules) { AdapterLogger.LogInfo(this.className + " GranuleArchive HashSet:" + granule.getGranuleArchiveSet()); } - public void readIsoMendsMetadataFile(String file, String s3Location) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { - DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); - docBuilderFactory.setNamespaceAware(true); - DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); - Document doc = docBuilder.parse(new File(file)); - - XPath xpath = XPathFactory.newInstance().newXPath(); - xpath.setNamespaceContext(new NamespaceResolver(doc)); - - granule.setStartTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoXPath.BEGINNING_DATE_TIME, doc)).getTime()); - granule.setStopTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoXPath.ENDING_DATE_TIME, doc)).getTime()); - - String productionDateTime = xpath.evaluate(IsoXPath.PRODUCTION_DATE_TIME, doc); - if (productionDateTime != "") { - granule.setCreateTime(DatatypeConverter.parseDateTime(productionDateTime).getTime()); - } else { - granule.setCreateTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoXPath.CREATION_DATE_TIME, doc)).getTime()); - } - - if (xpath.evaluate(IsoXPath.NORTH_BOUNDING_COORDINATE, doc) != "") { - setGranuleBoundingBox( - Double.parseDouble(xpath.evaluate(IsoXPath.NORTH_BOUNDING_COORDINATE, doc)), - Double.parseDouble(xpath.evaluate(IsoXPath.SOUTH_BOUNDING_COORDINATE, doc)), - Double.parseDouble(xpath.evaluate(IsoXPath.EAST_BOUNDING_COORDINATE, doc)), - Double.parseDouble(xpath.evaluate(IsoXPath.WEST_BOUNDING_COORDINATE, doc))); - } - ((IsoGranule) granule).setPolygon(xpath.evaluate(IsoXPath.POLYGON, doc)); - - GranuleReference gr = new GranuleReference(); - gr.setDescription("S3 datafile."); - gr.setPath(s3Location); - gr.setStatus(GranuleArchiveStatus.ONLINE.toString()); - gr.setType(GranuleArchiveType.DATA.toString()); - granule.add(gr); - - NodeList nodes = (NodeList) xpath.evaluate(IsoXPath.DATA_FILE, doc, XPathConstants.NODESET); - for (int i = 0; i < nodes.getLength(); i++) { - Element dataFile = (Element) nodes.item(i); - - String description = xpath.evaluate(IsoXPath.DATA_FILE_FILE_DESCRIPTION, dataFile); - Pattern p = Pattern.compile("Size:\\s(.*)\\sSizeUnit:\\s(.*)\\sChecksumValue:\\s(.*)\\sChecksumAlgorithm:\\s(.*)\\sDescription:\\s(.*)"); - Matcher m = p.matcher(description); - if (m.find()) { - String type = m.group(5); - if (type.equals("Science data file") || type.equals("ISO/Archive metadata file") - || type.equals("Quicklook Image of the Science data file")) { - String fileFormat = xpath.evaluate(IsoXPath.DATA_FILE_FILE_FORMAT, dataFile); - if (type.equals("Science data file")) { - granule.setDataFormat(fileFormat); - } - - IsoGranuleArchive ga = new IsoGranuleArchive(); - ga.setType(fileFormat); - ga.setFileSize(Long.parseLong(m.group(1))); - ga.setSizeUnit(m.group(2)); - ga.setName(xpath.evaluate(IsoXPath.DATA_FILE_FILE_NAME, dataFile)); - ga.setMimeType(xpath.evaluate(IsoXPath.DATA_FILE_FILE_MIME_TYPE, dataFile)); - ga.setChecksum(m.group(3)); - ga.setChecksumAlgorithm(m.group(4)); - granule.add(ga); - } - } - } - - ((IsoGranule) granule).setProducerGranuleId(xpath.evaluate(IsoXPath.PRODUCER_GRANULE_ID, doc)); - ((IsoGranule) granule).setCrid(xpath.evaluate(IsoXPath.CRID, doc)); - - NodeList identifiers = (NodeList) xpath.evaluate(IsoXPath.IDENTIFIERS, doc, XPathConstants.NODESET); - for (int i = 0; i < identifiers.getLength(); i++) { - Element identifier = (Element) identifiers.item(i); - String identifierDescription = xpath.evaluate(IsoXPath.IDENTIFIER_DESCRIPTION, identifier); - ((IsoGranule) granule).addIdentifier(identifierDescription.substring(identifierDescription.indexOf(" ") + 1), xpath.evaluate(IsoXPath.IDENTIFIER_CODE, identifier)); - } - - String reprocessingPlanned = xpath.evaluate(IsoXPath.REPROCESSING_PLANNED, doc); - ((IsoGranule) granule).setReprocessingPlanned(reprocessingPlanned.substring(reprocessingPlanned.indexOf(" ") + 1)); - - String reprocessingActual = xpath.evaluate(IsoXPath.REPROCESSING_ACTUAL, doc); - ((IsoGranule) granule).setReprocessingActual(reprocessingActual.substring(reprocessingActual.indexOf(" ") + 1)); + public void readIsoMetadataFile(String file, String s3Location) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { + Iso isoType = getIsoType(file); + if (isoType == Iso.MENDS) { + AdapterLogger.LogInfo("Found MENDS file"); + readIsoMendsMetadataFile(file, s3Location); + } + else if (isoType == Iso.SMAP) { + AdapterLogger.LogInfo("Found SMAP file"); + readIsoSmapMetadataFile(file, s3Location); + } else { + throw new IOException(isoType.name() + " didn't match any expected ISO type."); + } + } + + private Iso getIsoType(String file) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException { + Document doc = makeDoc(file); + XPath xpath = makeXpath(doc); + String ds_series_val = xpath.evaluate("/gmd:DS_Series", doc); + return (ds_series_val == "") ? Iso.MENDS : Iso.SMAP; + } + + private Document makeDoc(String file) throws ParserConfigurationException, SAXException, IOException { + DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); + docBuilderFactory.setNamespaceAware(true); + DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); + Document doc = docBuilder.parse(new File(file)); + return doc; + } + + private XPath makeXpath(Document doc) { + XPath xpath = XPathFactory.newInstance().newXPath(); + xpath.setNamespaceContext(new NamespaceResolver(doc)); + return xpath; + } + + public void readIsoMendsMetadataFile(String file, String s3Location) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { + Document doc = makeDoc(file); + XPath xpath = makeXpath(doc); + + granule.setStartTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoMendsXPath.BEGINNING_DATE_TIME, doc)).getTime()); + granule.setStopTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoMendsXPath.ENDING_DATE_TIME, doc)).getTime()); + + String productionDateTime = xpath.evaluate(IsoMendsXPath.PRODUCTION_DATE_TIME, doc); + if (productionDateTime != "") { + granule.setCreateTime(DatatypeConverter.parseDateTime(productionDateTime).getTime()); + } else { + granule.setCreateTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoMendsXPath.CREATION_DATE_TIME, doc)).getTime()); + } + + if (xpath.evaluate(IsoMendsXPath.NORTH_BOUNDING_COORDINATE, doc) != "") { + setGranuleBoundingBox( + Double.parseDouble(xpath.evaluate(IsoMendsXPath.NORTH_BOUNDING_COORDINATE, doc)), + Double.parseDouble(xpath.evaluate(IsoMendsXPath.SOUTH_BOUNDING_COORDINATE, doc)), + Double.parseDouble(xpath.evaluate(IsoMendsXPath.EAST_BOUNDING_COORDINATE, doc)), + Double.parseDouble(xpath.evaluate(IsoMendsXPath.WEST_BOUNDING_COORDINATE, doc))); + } + ((IsoGranule) granule).setPolygon(xpath.evaluate(IsoMendsXPath.POLYGON, doc)); + + GranuleReference gr = new GranuleReference(); + gr.setDescription("S3 datafile."); + gr.setPath(s3Location); + gr.setStatus(GranuleArchiveStatus.ONLINE.toString()); + gr.setType(GranuleArchiveType.DATA.toString()); + granule.add(gr); + + NodeList nodes = (NodeList) xpath.evaluate(IsoMendsXPath.DATA_FILE, doc, XPathConstants.NODESET); + for (int i = 0; i < nodes.getLength(); i++) { + Element dataFile = (Element) nodes.item(i); + + String description = xpath.evaluate(IsoMendsXPath.DATA_FILE_FILE_DESCRIPTION, dataFile); + Pattern p = Pattern.compile("Size:\\s(.*)\\sSizeUnit:\\s(.*)\\sChecksumValue:\\s(.*)\\sChecksumAlgorithm:\\s(.*)\\sDescription:\\s(.*)"); + Matcher m = p.matcher(description); + if (m.find()) { + String type = m.group(5); + if (type.equals("Science data file") || type.equals("ISO/Archive metadata file") + || type.equals("Quicklook Image of the Science data file")) { + String fileFormat = xpath.evaluate(IsoMendsXPath.DATA_FILE_FILE_FORMAT, dataFile); + if (type.equals("Science data file")) { + granule.setDataFormat(fileFormat); + } + + IsoGranuleArchive ga = new IsoGranuleArchive(); + ga.setType(fileFormat); + ga.setFileSize(Long.parseLong(m.group(1))); + ga.setSizeUnit(m.group(2)); + ga.setName(xpath.evaluate(IsoMendsXPath.DATA_FILE_FILE_NAME, dataFile)); + ga.setMimeType(xpath.evaluate(IsoMendsXPath.DATA_FILE_FILE_MIME_TYPE, dataFile)); + ga.setChecksum(m.group(3)); + ga.setChecksumAlgorithm(m.group(4)); + granule.add(ga); + } + } + } + + ((IsoGranule) granule).setProducerGranuleId(xpath.evaluate(IsoMendsXPath.PRODUCER_GRANULE_ID, doc)); + ((IsoGranule) granule).setCrid(xpath.evaluate(IsoMendsXPath.CRID, doc)); + + NodeList identifiers = (NodeList) xpath.evaluate(IsoMendsXPath.IDENTIFIERS, doc, XPathConstants.NODESET); + for (int i = 0; i < identifiers.getLength(); i++) { + Element identifier = (Element) identifiers.item(i); + String identifierDescription = xpath.evaluate(IsoMendsXPath.IDENTIFIER_DESCRIPTION, identifier); + ((IsoGranule) granule).addIdentifier(identifierDescription.substring(identifierDescription.indexOf(" ") + 1), xpath.evaluate(IsoMendsXPath.IDENTIFIER_CODE, identifier)); + } + + String reprocessingPlanned = xpath.evaluate(IsoMendsXPath.REPROCESSING_PLANNED, doc); + ((IsoGranule) granule).setReprocessingPlanned(reprocessingPlanned.substring(reprocessingPlanned.indexOf(" ") + 1)); + + String reprocessingActual = xpath.evaluate(IsoMendsXPath.REPROCESSING_ACTUAL, doc); + ((IsoGranule) granule).setReprocessingActual(reprocessingActual.substring(reprocessingActual.indexOf(" ") + 1)); + + ((IsoGranule) granule).setParameterName(xpath.evaluate(IsoMendsXPath.PARAMETER_NAME, doc)); + String qaPercentMissingData = xpath.evaluate(IsoMendsXPath.QA_PERCENT_MISSING_DATA, doc); + if (qaPercentMissingData != "") { + ((IsoGranule) granule).setQAPercentMissingData(Double.parseDouble(qaPercentMissingData)); + } + String qaPercentOutOfBoundsData = xpath.evaluate(IsoMendsXPath.QA_PERCENT_OUT_OF_BOUNDS_DATA, doc); + if (qaPercentOutOfBoundsData != "") { + ((IsoGranule) granule).setQAPercentOutOfBoundsData(Double.parseDouble(qaPercentOutOfBoundsData)); + } + ((IsoGranule) granule).setOrbit(xpath.evaluate(IsoMendsXPath.ORBIT, doc)); + ((IsoGranule) granule).setSwotTrack(xpath.evaluate(IsoMendsXPath.SWOT_TRACK, doc)); + + Source source = new Source(); + source.setSourceShortName(xpath.evaluate(IsoMendsXPath.PLATFORM, doc)); + + Sensor sensor = new Sensor(); + sensor.setSensorShortName(xpath.evaluate(IsoMendsXPath.INSTRUMENT, doc)); + + DatasetSource datasetSource = new DatasetSource(); + DatasetSource.DatasetSourcePK datasetSourcePK = new DatasetSource.DatasetSourcePK(); + datasetSourcePK.setSource(source); + datasetSourcePK.setSensor(sensor); + datasetSource.setDatasetSourcePK(datasetSourcePK); + + dataset.add(datasetSource); + + NodeList inputGranules = (NodeList) xpath.evaluate(IsoMendsXPath.GRANULE_INPUT, doc, XPathConstants.NODESET); + for (int i = 0; i < inputGranules.getLength(); i++) { + ((IsoGranule) granule).addInputGranule(inputGranules.item(i).getTextContent()); + } + + ((IsoGranule) granule).setPGEVersionClass(xpath.evaluate(IsoMendsXPath.PGE_VERSION_CLASS, doc)); + } + + private void readIsoSmapMetadataFile(String file, String s3Location) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { + Document doc = makeDoc(file); + XPath xpath = makeXpath(doc); + + granule.setStartTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoSmapXPath.BEGINNING_DATE_TIME, doc)).getTime()); + granule.setStopTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoSmapXPath.ENDING_DATE_TIME, doc)).getTime()); + + String productionDateTime = xpath.evaluate(IsoSmapXPath.PRODUCTION_DATE_TIME, doc); + if (productionDateTime != "") { + granule.setCreateTime(DatatypeConverter.parseDateTime(productionDateTime).getTime()); + } else { + granule.setCreateTime(DatatypeConverter.parseDateTime(xpath.evaluate(IsoSmapXPath.CREATION_DATE_TIME, doc)).getTime()); + } + GranuleReference gr = new GranuleReference(); + gr.setDescription("S3 datafile."); + gr.setPath(s3Location); + gr.setStatus(GranuleArchiveStatus.ONLINE.toString()); + gr.setType(GranuleArchiveType.DATA.toString()); + granule.add(gr); + + String orbitInformation = xpath.evaluate(IsoSmapXPath.OrbitCalculatedSpatialDomains, doc); + if (orbitInformation != null) { + Pattern p = Pattern.compile("OrbitNumber:\\s*([^\\s]+)\\s*EquatorCrossingLongitude:\\s*([^\\s]+)\\s*EquatorCrossingDateTime:\\s*([^\\s]+)\\s*"); + Matcher m = p.matcher(orbitInformation); + if (m.find()) { + granule.setOrbitNumber(Integer.parseInt(m.group(1))); + granule.setEquatorCrossingLongitude(new BigDecimal(m.group(2))); + granule.setEquatorCrossingDateTime(m.group(3)); + } else { + AdapterLogger.LogInfo("Couldn't match pattern with " + orbitInformation); + } + } else { + AdapterLogger.LogInfo("Couldn't find orbit information from " + IsoSmapXPath.OrbitCalculatedSpatialDomains); + } + + ((IsoGranule) granule).setProducerGranuleId(xpath.evaluate(IsoSmapXPath.PRODUCER_GRANULE_ID, doc)); + ((IsoGranule) granule).setCrid(xpath.evaluate(IsoXPath.CRID, doc)); + ((IsoGranule) granule).setParameterName("Parameter name placeholder"); + ((IsoGranule) granule).setReprocessingPlanned("No"); + + ((IsoGranule) granule).setOrbit(xpath.evaluate(IsoSmapXPath.ORBIT, doc)); + + ((IsoGranule) granule).setSwotTrack(xpath.evaluate(IsoSmapXPath.SWOT_TRACK, doc)); + + Source source = new Source(); + source.setSourceShortName(xpath.evaluate(IsoXPath.PLATFORM, doc)); + Sensor sensor = new Sensor(); + sensor.setSensorShortName(xpath.evaluate(IsoXPath.INSTRUMENT, doc)); + + DatasetSource datasetSource = new DatasetSource(); + DatasetSource.DatasetSourcePK datasetSourcePK = new DatasetSource.DatasetSourcePK(); + datasetSourcePK.setSource(source); + datasetSourcePK.setSensor(sensor); + datasetSource.setDatasetSourcePK(datasetSourcePK); + + dataset.add(datasetSource); + + NodeList inputGranules = (NodeList) xpath.evaluate(IsoSmapXPath.GRANULE_INPUT, doc, XPathConstants.NODESET); + for (int i = 0; i < inputGranules.getLength(); i++) { + ((IsoGranule) granule).addInputGranule(inputGranules.item(i).getTextContent()); + } + + ((IsoGranule) granule).setPGEVersionClass(xpath.evaluate(IsoSmapXPath.PGE_VERSION_CLASS, doc)); + } - ((IsoGranule) granule).setParameterName(xpath.evaluate(IsoXPath.PARAMETER_NAME, doc)); - String qaPercentMissingData = xpath.evaluate(IsoXPath.QA_PERCENT_MISSING_DATA, doc); - if (qaPercentMissingData != "") { - ((IsoGranule) granule).setQAPercentMissingData(Double.parseDouble(qaPercentMissingData)); - } - String qaPercentOutOfBoundsData = xpath.evaluate(IsoXPath.QA_PERCENT_OUT_OF_BOUNDS_DATA, doc); - if (qaPercentOutOfBoundsData != "") { - ((IsoGranule) granule).setQAPercentOutOfBoundsData(Double.parseDouble(qaPercentOutOfBoundsData)); - } - ((IsoGranule) granule).setOrbit(xpath.evaluate(IsoXPath.ORBIT, doc)); - ((IsoGranule) granule).setSwotTrack(xpath.evaluate(IsoXPath.SWOT_TRACK, doc)); - - Source source = new Source(); - source.setSourceShortName(xpath.evaluate(IsoXPath.PLATFORM, doc)); - - Sensor sensor = new Sensor(); - sensor.setSensorShortName(xpath.evaluate(IsoXPath.INSTRUMENT, doc)); - - DatasetSource datasetSource = new DatasetSource(); - DatasetSource.DatasetSourcePK datasetSourcePK = new DatasetSource.DatasetSourcePK(); - datasetSourcePK.setSource(source); - datasetSourcePK.setSensor(sensor); - datasetSource.setDatasetSourcePK(datasetSourcePK); - - dataset.add(datasetSource); - - NodeList inputGranules = (NodeList) xpath.evaluate(IsoXPath.GRANULE_INPUT, doc, XPathConstants.NODESET); - for (int i = 0; i < inputGranules.getLength(); i++) { - ((IsoGranule) granule).addInputGranule(inputGranules.item(i).getTextContent()); - } - - ((IsoGranule) granule).setPGEVersionClass(xpath.evaluate(IsoXPath.PGE_VERSION_CLASS, doc)); - } /** * Parses SWOT archive.xml for metadata. diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/UMMGranule.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/UMMGranule.java index 818a6ea..d03b802 100644 --- a/src/main/java/gov/nasa/cumulus/metadata/aggregator/UMMGranule.java +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/UMMGranule.java @@ -3,6 +3,8 @@ import gov.nasa.podaac.inventory.model.Granule; +import java.math.BigDecimal; + public class UMMGranule extends Granule { private Integer cycle; private Integer pass; @@ -14,6 +16,8 @@ public class UMMGranule extends Granule { private Double bbxSouthernLatitude; private Double bbxEasternLongitude; private Double bbxWesternLongitude; + private BigDecimal equatorCrossingLongitude; + private String equatorCrossingDateTime; public Integer getPass() { return pass; @@ -85,5 +89,20 @@ public void setBbxWesternLongitude(Double bbxWesternLongitude) { this.bbxWesternLongitude = bbxWesternLongitude; } + public String getEquatorCrossingDateTime() { + return equatorCrossingDateTime; + } + + public void setEquatorCrossingDateTime(String equatorCrossingDateTime) { + this.equatorCrossingDateTime = equatorCrossingDateTime; + } + + public BigDecimal getEquatorCrossingLongitude() { + return equatorCrossingLongitude; + } + + public void setEquatorCrossingLongitude(BigDecimal equatorCrossingLongitude) { + this.equatorCrossingLongitude = equatorCrossingLongitude; + } } diff --git a/src/main/java/gov/nasa/cumulus/metadata/aggregator/UMMGranuleFile.java b/src/main/java/gov/nasa/cumulus/metadata/aggregator/UMMGranuleFile.java index 0ba1c21..a31181f 100644 --- a/src/main/java/gov/nasa/cumulus/metadata/aggregator/UMMGranuleFile.java +++ b/src/main/java/gov/nasa/cumulus/metadata/aggregator/UMMGranuleFile.java @@ -230,8 +230,23 @@ private JSONArray exportOrbitCalculatedSpatialDomain() { UMMGranule ummGranule = null; if(this.granule instanceof gov.nasa.cumulus.metadata.aggregator.UMMGranule) { ummGranule = (UMMGranule) granule; - if (ummGranule.getOrbitNumber() != null) { - orbitJsonObject.put("OrbitNumber", ummGranule.getOrbitNumber()); + Integer orbitNumber = ummGranule.getOrbitNumber(); + + if (orbitNumber != null) { + orbitJsonObject.put("OrbitNumber", orbitNumber); + } + + String equatorCrossingDateTime = ummGranule.getEquatorCrossingDateTime(); + if (equatorCrossingDateTime != null) { + orbitJsonObject.put("EquatorCrossingDateTime", equatorCrossingDateTime); + } + + BigDecimal equatorCrossingLongitude = ummGranule.getEquatorCrossingLongitude(); + if (equatorCrossingLongitude != null) { + orbitJsonObject.put("EquatorCrossingLongitude", equatorCrossingLongitude); + } + + if (!orbitJsonObject.isEmpty()) { orbitDomains.add(orbitJsonObject); } if (ummGranule.getStartOrbit() != null && ummGranule.getEndOrbit() != null) { @@ -334,155 +349,31 @@ private JSONObject exportTemporal() { private JSONObject exportSpatial() { JSONObject spatialExtent = new JSONObject(); - + JSONObject geometry = new JSONObject(); JSONObject horizontalSpatialDomain = new JSONObject(); + Boolean foundOrbitalData = false; spatialExtent.put("HorizontalSpatialDomain", horizontalSpatialDomain); - JSONObject geometry = new JSONObject(); - horizontalSpatialDomain.put("Geometry", geometry); - - JSONArray boundingRectangles = new JSONArray(); - geometry.put("BoundingRectangles", boundingRectangles); - - double north = 0, south = 0, east = 0, west = 0; - if(granule !=null && granule instanceof gov.nasa.cumulus.metadata.aggregator.UMMGranule) { - east= ((UMMGranule) granule).getBbxEasternLongitude()!=null ? - ((UMMGranule) granule).getBbxEasternLongitude().doubleValue():0; - west= ((UMMGranule) granule).getBbxWesternLongitude()!=null? - ((UMMGranule) granule).getBbxWesternLongitude().doubleValue():0; - north = ((UMMGranule) granule).getBbxNorthernLatitude() !=null? - ((UMMGranule) granule).getBbxNorthernLatitude().doubleValue():0; - south = ((UMMGranule) granule).getBbxSouthernLatitude()!=null? - ((UMMGranule) granule).getBbxSouthernLatitude().doubleValue():0; - } else { - Set grs = granule.getGranuleRealSet(); - - for (GranuleReal gr : grs) { - switch (gr.getDatasetElement().getElementDD().getElementId()) { - case 28: - west = gr.getValue(); - break; - case 15: - north = gr.getValue(); - break; - case 8: - east = gr.getValue(); - break; - case 23: - south = gr.getValue(); - break; - } - } - } - - // first, check to see if any of the spatial values are bad/invalid - if (BoundingTools.coordsInvalid(north, south, east, west)) { - AdapterLogger.LogWarning(this.className + "Bounding coordinates invalid: \'North: " + north + - ", \'South: " + south + - ", \'West: " + west + - ", \'East: " + east + - "\' using placeholder values for bounding box."); - // If so, use the placeholder values over the south pole - west = -180.0; - east = -179.0; - north = -89.0; - south = -90.0; - // and make sure we turn off the rangeIs360 flag - this.rangeIs360 = false; - } - - BigDecimal nrth = new BigDecimal(north); - BigDecimal sth = new BigDecimal(south); - nrth = nrth.setScale(3, RoundingMode.HALF_UP); - sth = sth.setScale(3, RoundingMode.HALF_UP); - - BigDecimal wst = BigDecimal.valueOf(west); - BigDecimal est = BigDecimal.valueOf(east); - wst = wst.setScale(3, RoundingMode.HALF_UP); - est = est.setScale(3, RoundingMode.HALF_UP); - - - // If we get here, it means we have valid values for spatial data, so continue - // with the spatial extent export. - AdapterLogger.LogDebug(this.className + " After BigDecimal conversion: rangeIs360:" + rangeIs360+ - " west"+ wst + " east:" + est + - " north:"+nrth + " south:"+sth); - if (rangeIs360) { - BigDecimal bdeast = BoundingTools.convertBoundingVal(est, true); - BigDecimal bdwest = BoundingTools.convertBoundingVal(wst, true); - - if (bdeast.compareTo(bdwest) == 1) { - boundingRectangles.add(createBoundingBoxJson(nrth, sth, BoundingTools.convertBoundingVal(est, true), BoundingTools.convertBoundingVal(wst, true))); - } else { - log.debug("East Longitude is less than West Longitude: separating bounding boxes."); - - if (bdwest.compareTo(BigDecimal.valueOf(180)) != 0) { - boundingRectangles.add(createBoundingBoxJson(nrth, sth, BigDecimal.valueOf(180), BoundingTools.convertBoundingVal(wst, true))); - } - - boundingRectangles.add(createBoundingBoxJson(nrth, sth, BoundingTools.convertBoundingVal(est, true), BigDecimal.valueOf(-180))); - } - } else { - if (est.doubleValue() >= wst.doubleValue()) { - boundingRectangles.add(createBoundingBoxJson(nrth, sth, est, wst)); - } else { - log.debug("East Longitude is less than West Longitude: separating bounding boxes."); - if (wst.doubleValue() != 180d) { - boundingRectangles.add(createBoundingBoxJson(nrth, sth, BigDecimal.valueOf(180), wst)); - } - - if (est.doubleValue() != -180d) { - boundingRectangles.add(createBoundingBoxJson(nrth, sth, est, BigDecimal.valueOf(-180))); - } - } - } - - // Export track if cycle and pass exists - if (granule instanceof UMMGranule) { - UMMGranule ummGranule = (UMMGranule) granule; - if (ummGranule.getCycle() != null && ummGranule.getPass() != null) { - JSONObject track = new JSONObject(); - horizontalSpatialDomain.put("Track", track); - track.put("Cycle", ummGranule.getCycle()); - JSONArray passes = new JSONArray(); - track.put("Passes", passes); - JSONObject pass = new JSONObject(); - pass.put("Pass", ummGranule.getPass()); - passes.add(pass); - } - } - - // Export footprint if it exists - Set granuleCharacters = granule.getGranuleCharacterSet(); - - for (GranuleCharacter granuleCharacter : granuleCharacters) { - if (granuleCharacter.getDatasetElement().getElementDD().getShortName().equals("line")) { - this.isLineFormattedPolygon = true; - geometry = line2Polygons(geometry,granuleCharacter.getValue()); - break; - } - } - if (granule instanceof IsoGranule) { - if (((IsoGranule) granule).getPolygon() != "") { + String polygon = ((IsoGranule) granule).getPolygon(); + if (polygon != "" && polygon != null) { // Export Polygon - addPolygon(geometry, ((IsoGranule) granule).getPolygon()); + addPolygon(geometry, polygon); } // Export Orbit // Commented out for now since UMM v1.5 only allows for either Geometry or Orbit not both - /* JSONObject orbit = new JSONObject(); horizontalSpatialDomain.put("Orbit", orbit); - Pattern p = Pattern.compile("AscendingCrossing:\\s(.*)\\sStartLatitude:\\s(.*)\\sStartDirection:\\s(.*)\\sEndLatitude:\\s(.*)\\sEndDirection:\\s(.*)"); + Pattern p = Pattern.compile("AscendingCrossing:\\s?(.*)\\s?StartLatitude:\\s?(.*)\\s?StartDirection:\\s?(.*)\\s?EndLatitude:\\s?(.*)\\s?EndDirection:\\s?(.*)"); Matcher m = p.matcher(((IsoGranule) granule).getOrbit()); - if (m.find()) { + foundOrbitalData = m.find(); + if (foundOrbitalData) { orbit.put("AscendingCrossing", Double.parseDouble(m.group(1))); orbit.put("StartLatitude", Double.parseDouble(m.group(2))); - orbit.put("StartDirection", m.group(3)); + orbit.put("StartDirection", m.group(3).trim()); orbit.put("EndLatitude", Double.parseDouble(m.group(4))); - orbit.put("EndDirection", m.group(5)); + orbit.put("EndDirection", m.group(5).trim()); } - */ // Export track if (((IsoGranule) granule).getSwotTrack() != "") { @@ -515,6 +406,132 @@ private JSONObject exportSpatial() { } } } + + // We can only include orbital or bounding-box data, not both + if (foundOrbitalData == false) { + + horizontalSpatialDomain.put("Geometry", geometry); + + JSONArray boundingRectangles = new JSONArray(); + geometry.put("BoundingRectangles", boundingRectangles); + + double north = 0, south = 0, east = 0, west = 0; + if(granule !=null && granule instanceof gov.nasa.cumulus.metadata.aggregator.UMMGranule) { + east = ((UMMGranule) granule).getBbxEasternLongitude() != null ? + ((UMMGranule) granule).getBbxEasternLongitude() : 0; + west = ((UMMGranule) granule).getBbxWesternLongitude() != null? + ((UMMGranule) granule).getBbxWesternLongitude() : 0; + north = ((UMMGranule) granule).getBbxNorthernLatitude() != null? + ((UMMGranule) granule).getBbxNorthernLatitude() : 0; + south = ((UMMGranule) granule).getBbxSouthernLatitude() != null? + ((UMMGranule) granule).getBbxSouthernLatitude() : 0; + } else { + Set grs = granule.getGranuleRealSet(); + + for (GranuleReal gr : grs) { + switch (gr.getDatasetElement().getElementDD().getElementId()) { + case 28: + west = gr.getValue(); + break; + case 15: + north = gr.getValue(); + break; + case 8: + east = gr.getValue(); + break; + case 23: + south = gr.getValue(); + break; + } + } + } + + // first, check to see if any of the spatial values are bad/invalid + if (BoundingTools.coordsInvalid(north, south, east, west)) { + log.warn("Bounding coordinates invalid: \'North: " + north + + ", \'South: " + south + + ", \'West: " + west + + ", \'East: " + east + + "\' using placeholder values for bounding box."); + // If so, use the placeholder values over the south pole + west = -180.0; + east = -179.0; + north = -89.0; + south = -90.0; + // and make sure we turn off the rangeIs360 flag + this.rangeIs360 = false; + } + + BigDecimal nrth = new BigDecimal(north); + BigDecimal sth = new BigDecimal(south); + nrth = nrth.setScale(3, RoundingMode.HALF_UP); + sth = sth.setScale(3, RoundingMode.HALF_UP); + + BigDecimal wst = BigDecimal.valueOf(west); + BigDecimal est = BigDecimal.valueOf(east); + wst = wst.setScale(3, RoundingMode.HALF_UP); + est = est.setScale(3, RoundingMode.HALF_UP); + + + // If we get here, it means we have valid values for spatial data, so continue + // with the spatial extent export. + if (rangeIs360) { + BigDecimal bdeast = BoundingTools.convertBoundingVal(est, true); + BigDecimal bdwest = BoundingTools.convertBoundingVal(wst, true); + + if (bdeast.compareTo(bdwest) == 1) { + boundingRectangles.add(createBoundingBoxJson(nrth, sth, BoundingTools.convertBoundingVal(est, true), BoundingTools.convertBoundingVal(wst, true))); + } else { + log.debug("East Longitude is less than West Longitude: separating bounding boxes."); + + if (bdwest.compareTo(BigDecimal.valueOf(180)) != 0) { + boundingRectangles.add(createBoundingBoxJson(nrth, sth, BigDecimal.valueOf(180), BoundingTools.convertBoundingVal(wst, true))); + } + + boundingRectangles.add(createBoundingBoxJson(nrth, sth, BoundingTools.convertBoundingVal(est, true), BigDecimal.valueOf(-180))); + } + } else { + if (est.doubleValue() >= wst.doubleValue()) { + boundingRectangles.add(createBoundingBoxJson(nrth, sth, est, wst)); + } else { + log.debug("East Longitude is less than West Longitude: separating bounding boxes."); + + if (wst.doubleValue() != 180d) { + boundingRectangles.add(createBoundingBoxJson(nrth, sth, BigDecimal.valueOf(180), wst)); + } + + if (est.doubleValue() != -180d) { + boundingRectangles.add(createBoundingBoxJson(nrth, sth, est, BigDecimal.valueOf(-180))); + } + } + } + } + + // Export track if cycle and pass exists + if (granule instanceof UMMGranule) { + UMMGranule ummGranule = (UMMGranule) granule; + if (ummGranule.getCycle() != null && ummGranule.getPass() != null) { + JSONObject track = new JSONObject(); + horizontalSpatialDomain.put("Track", track); + track.put("Cycle", ummGranule.getCycle()); + JSONArray passes = new JSONArray(); + track.put("Passes", passes); + JSONObject pass = new JSONObject(); + pass.put("Pass", ummGranule.getPass()); + passes.add(pass); + } + } + + // Export footprint if it exists + + Set granuleCharacters = granule.getGranuleCharacterSet(); + for (GranuleCharacter granuleCharacter : granuleCharacters) { + if (granuleCharacter.getDatasetElement().getElementDD().getShortName().equals("line")) { + geometry = line2Polygons(geometry,granuleCharacter.getValue()); + break; + } + } + return spatialExtent; } @@ -658,7 +675,7 @@ public JSONObject addPolygons(JSONObject geometry, ArrayList mockedECHORestClientProvider = mockStatic(CMRRestClientProvider.class); - when(CMRRestClientProvider.getECHOLambdaRestClient()).thenReturn(mockedEchoLambdaRestClient); + when(CMRRestClientProvider.getLambdaRestClient()).thenReturn(mockedEchoLambdaRestClient); //write UMM-G to file mtfe.writeJson(testDir + "/" + granuleId + ".cmr.json");