http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/product_type/iso/template.xml ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/product_type/iso/template.xml b/src/main/python/plugins/product_type/iso/template.xml new file mode 100644 index 0000000..bb0d415 --- /dev/null +++ b/src/main/python/plugins/product_type/iso/template.xml @@ -0,0 +1,914 @@ +<?xml version="1.0" encoding="UTF-8"?> +<gmd:DS_Series xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://www.ngdc.noaa.gov/metadata/published/xsd/schema.xsd" + xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" + xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gss="http://www.isotc211.org/2005/gss" + xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gmx="http://www.isotc211.org/2005/gmx" + xmlns:gmi="http://www.isotc211.org/2005/gmi"> + <gmd:composedOf gco:nilReason="inapplicable" /> + <gmd:seriesMetadata> + <gmi:MI_Metadata id="{{ docs[0]['id'] }}"> + <gmd:fileIdentifier> + <gco:CharacterString>{{ docs[0]['product_type_identifier'] }}</gco:CharacterString> + </gmd:fileIdentifier> + <gmd:language> + <gco:CharacterString>eng</gco:CharacterString> + </gmd:language> + <gmd:characterSet> + <gmd:MD_CharacterSetCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" + codeListValue="UTF8">UTF8 + </gmd:MD_CharacterSetCode> + </gmd:characterSet> + <gmd:hierarchyLevel> + <gmd:MD_ScopeCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" + codeListValue="series">series + </gmd:MD_ScopeCode> + </gmd:hierarchyLevel> + {% if docs[0].__contains__('product_type_provider_contact_role_list') and + docs[0]['product_type_provider_contact_role_list'].__contains__('POINT_OF_CONTACT') %} + <gmd:contact> + {% for i in range(docs[0]['product_type_provider_contact_role_list'].__len__()) %} + {% if docs[0]['product_type_provider_contact_role_list'][i] == 'POINT_OF_CONTACT' %} + <gmd:CI_ResponsibleParty id="seriesMetadataContact"> + <gmd:individualName> + <gco:CharacterString> + {% if docs[0]['product_type_provider_contact_first_name_list'][i] != 'null' %} + {{ docs[0]['product_type_provider_contact_first_name_list'][i] }} + {% endif %} + {% if docs[0]['product_type_provider_contact_middle_name_list'][i] != 'null' %} + {{ docs[0]['product_type_provider_contact_middle_name_list'][i] }} + {% endif %} + {{ docs[0]['product_type_provider_contact_last_name_list'][i] }} + </gco:CharacterString> + </gmd:individualName> + <gmd:organisationName> + <gco:CharacterString>{{ docs[0]['product_type_provider_short_name'] }} > {{ docs[0]['product_type_provider_long_name'] }}</gco:CharacterString> + </gmd:organisationName> + <gmd:positionName> + <gco:CharacterString>{{ docs[0]['product_type_provider_contact_role_list'][i] }}</gco:CharacterString> + </gmd:positionName> + <gmd:contactInfo> + <gmd:CI_Contact> + <gmd:phone> + <gmd:CI_Telephone> + {% if docs[0]['product_type_provider_contact_phone_list'][i] != 'null' %} + <gmd:voice> + <gco:CharacterString>{{ docs[0]['product_type_provider_contact_phone_list'][i] }}</gco:CharacterString> + </gmd:voice> + {% else %} + <gmd:voice gco:nilReason="missing" /> + {% endif %} + {% if docs[0]['product_type_provider_contact_fax_list'][i] != 'null' %} + <gmd:facsimile> + <gco:CharacterString>{{ docs[0]['product_type_provider_contact_fax_list'][i] }}</gco:CharacterString> + </gmd:facsimile> + {% else %} + <gmd:facsimile gco:nilReason="missing" /> + {% endif %} + </gmd:CI_Telephone> + </gmd:phone> + <gmd:address> + <gmd:CI_Address> + {% if docs[0]['product_type_provider_contact_address_list'][i] != 'null' %} + <gmd:electronicMailAddress> + <gco:CharacterString>{{ docs[0]['product_type_provider_contact_address_list'][i] }}</gco:CharacterString> + </gmd:electronicMailAddress> + {% else %} + <gmd:electronicMailAddress gco:nilReason="missing" /> + {% endif %} + </gmd:CI_Address> + </gmd:address> + <gmd:contactInstructions> + <gco:CharacterString>Phone/FAX/E-mail</gco:CharacterString> + </gmd:contactInstructions> + </gmd:CI_Contact> + </gmd:contactInfo> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="pointOfContact">pointOfContact + </gmd:CI_RoleCode> + </gmd:role> + </gmd:CI_ResponsibleParty> + {% endif %} + {% endfor %} + </gmd:contact> + {% else %} + <gmd:contact gco:nilReason="missing" /> + {% endif %} + <gmd:dateStamp> + <gco:Date>{{ docs[0]['product_type_last_updated_string'] }}</gco:Date> + </gmd:dateStamp> + <gmd:metadataStandardName> + <gco:CharacterString>ISO 19115-2 Geographic information â Metadata â Part 2: Extensions for imagery and gridded data</gco:CharacterString> + </gmd:metadataStandardName> + <gmd:metadataStandardVersion> + <gco:CharacterString>ISO 19115-2:2009-02-15</gco:CharacterString> + </gmd:metadataStandardVersion> + <gmd:locale> + <gmd:PT_Locale> + <gmd:languageCode> + <gmd:LanguageCode + codeList="http://www.loc.gov/standards/iso639-2/php/English_list.php" + codeListValue="eng">eng + </gmd:LanguageCode> + </gmd:languageCode> + <gmd:country> + <gmd:Country + codeList="http://www.iso.org/iso/iso_3166-1_list_en.zip" + codeListValue="US">US + </gmd:Country> + </gmd:country> + <gmd:characterEncoding> + <gmd:MD_CharacterSetCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" + codeListValue="UTF8">UTF8 + </gmd:MD_CharacterSetCode> + </gmd:characterEncoding> + </gmd:PT_Locale> + </gmd:locale> + <gmd:metadataExtensionInfo> + <gmd:MD_MetadataExtensionInformation> + <gmd:extensionOnLineResource> + <gmd:CI_OnlineResource> + <gmd:linkage> + <gmd:URL>http://www.ngdc.noaa.gov/metadata/published/19115/GHRSST/ISO/CoverageExtensions.xml</gmd:URL> + </gmd:linkage> + <gmd:applicationProfile> + <gco:CharacterString>Web Browser</gco:CharacterString> + </gmd:applicationProfile> + <gmd:description> + <gco:CharacterString>A description of extensions developed at NGDC to classify coverages.</gco:CharacterString> + </gmd:description> + <gmd:function> + <gmd:CI_OnLineFunctionCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_OnlineFunctionCode" + codeListValue="information">information + </gmd:CI_OnLineFunctionCode> + </gmd:function> + </gmd:CI_OnlineResource> + </gmd:extensionOnLineResource> + </gmd:MD_MetadataExtensionInformation> + </gmd:metadataExtensionInfo> + <gmd:identificationInfo> + <gmd:MD_DataIdentification id="seriesIdentification"> + <gmd:citation> + <gmd:CI_Citation> + {% if docs[0].__contains__('product_type_title') %} + <gmd:title> + <gco:CharacterString>{{ docs[0]['product_type_title'] }}</gco:CharacterString> + </gmd:title> + {% else %} + <gmd:title gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_identifier') %} + <gmd:alternateTitle> + <gco:CharacterString>{{ docs[0]['product_type_identifier'] }}</gco:CharacterString> + </gmd:alternateTitle> + {% else %} + <gmd:alternateTitle gco:nilReason="missing" /> + {% endif %} + <gmd:date> + <gmd:CI_Date> + <gmd:date> + <gco:Date>{{ docs[0]['product_type_last_updated_string'] }}</gco:Date> + </gmd:date> + <gmd:dateType> + <gmd:CI_DateTypeCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" + codeListValue="creation">creation + </gmd:CI_DateTypeCode> + </gmd:dateType> + </gmd:CI_Date> + </gmd:date> + {% if docs[0].__contains__('product_type_version') %} + <gmd:edition> + <gco:CharacterString>{{ docs[0]['product_type_version'] }}</gco:CharacterString> + </gmd:edition> + {% else %} + <gmd:edition gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_provider_resource_type_list') and + docs[0]['product_type_provider_resource_type_list'].__contains__('ORIGINATOR') %} + <gmd:citedResponsibleParty> + {% for i in range(docs[0]['product_type_provider_resource_type_list'].__len__()) %} + {% if docs[0]['product_type_provider_resource_type_list'][i] == 'ORIGINATOR' %} + <gmd:CI_ResponsibleParty id="seriesMetadataContact"> + <gmd:individualName> + <gco:CharacterString>{{ docs[0]['product_type_provider_resource_name_list'][i] }}</gco:CharacterString> + </gmd:individualName> + <gmd:contactInfo> + <gmd:CI_Contact> + {% if docs[0]['product_type_provider_resource_path_list'][i] != 'null' %} + <gmd:onlineResource> + <gmd:CI_OnlineResource> + <gmd:linkage> + <gmd:URL>{{ docs[0]['product_type_provider_resource_path_list'][i] }}</gmd:URL> + </gmd:linkage> + </gmd:CI_OnlineResource> + </gmd:onlineResource> + {% else %} + <gmd:onlineResource gco:nilReason="missing" /> + {% endif %} + </gmd:CI_Contact> + </gmd:contactInfo> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="originator">originator + </gmd:CI_RoleCode> + </gmd:role> + </gmd:CI_ResponsibleParty> + {% endif %} + {% endfor %} + </gmd:citedResponsibleParty> + {% else %} + <gmd:citedResponsibleParty> + <gmd:CI_ResponsibleParty id="seriesMetadataContact"> + <gmd:individualName gco:nilReason="missing" /> + <gmd:contactInfo gco:nilReason="missing" /> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="originator">originator + </gmd:CI_RoleCode> + </gmd:role> + </gmd:CI_ResponsibleParty> + </gmd:citedResponsibleParty> + {% endif %} + {% if docs[0].__contains__('product_type_provider_resource_type_list') and + docs[0]['product_type_provider_resource_type_list'].__contains__('PUBLISHER') %} + <gmd:citedResponsibleParty> + {% for i in range(docs[0]['product_type_provider_resource_type_list'].__len__()) %} + {% if docs[0]['product_type_provider_resource_type_list'][i] == 'PUBLISHER' %} + <gmd:CI_ResponsibleParty id="seriesMetadataContact"> + <gmd:individualName> + <gco:CharacterString>{{ docs[0]['product_type_provider_resource_name_list'][i] }}</gco:CharacterString> + </gmd:individualName> + <gmd:organisationName> + <gco:CharacterString>{{ docs[0]['product_type_provider_short_name'] }} > {{ docs[0]['product_type_provider_long_name'] }}</gco:CharacterString> + </gmd:organisationName> + <gmd:contactInfo> + <gmd:CI_Contact> + <gmd:address> + <gmd:CI_Address> + <gmd:city gco:nilReason="missing" /> + </gmd:CI_Address> + </gmd:address> + </gmd:CI_Contact> + </gmd:contactInfo> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="publisher">publisher + </gmd:CI_RoleCode> + </gmd:role> + </gmd:CI_ResponsibleParty> + {% endif %} + {% endfor %} + </gmd:citedResponsibleParty> + {% else %} + <gmd:citedResponsibleParty> + <gmd:CI_ResponsibleParty id="seriesMetadataContact"> + <gmd:individualName gco:nilReason="missing" /> + <gmd:contactInfo gco:nilReason="missing" /> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="publisher">publisher + </gmd:CI_RoleCode> + </gmd:role> + </gmd:CI_ResponsibleParty> + </gmd:citedResponsibleParty> + {% endif %} + </gmd:CI_Citation> + </gmd:citation> + {% if docs[0].__contains__('product_type_description') %} + <gmd:abstract> + <gco:CharacterString>{{ docs[0]['product_type_description'] }}</gco:CharacterString> + </gmd:abstract> + {% else %} + <gmd:abstract gco:nilReason="missing" /> + {% endif %} + <gmd:credit gco:nilReason="missing" /> + <gmd:status> + <gmd:MD_ProgressCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ProgressCode" + codeListValue="onGoing">onGoing + </gmd:MD_ProgressCode> + </gmd:status> + {% if docs[0].__contains__('product_type_provider_contact_role_list') and + docs[0]['product_type_provider_contact_role_list'].__contains__('POINT_OF_CONTACT') %} + <gmd:pointOfContact> + {% for i in range(docs[0]['product_type_provider_contact_role_list'].__len__()) %} + {% if docs[0]['product_type_provider_contact_role_list'][i] == 'POINT_OF_CONTACT' %} + <gmd:CI_ResponsibleParty id="seriesMetadataContact"> + <gmd:individualName> + <gco:CharacterString> + {% if docs[0]['product_type_provider_contact_first_name_list'][i] != 'null' %} + {{ docs[0]['product_type_provider_contact_first_name_list'][i] }} + {% endif %} + {% if docs[0]['product_type_provider_contact_middle_name_list'][i] != 'null' %} + {{ docs[0]['product_type_provider_contact_middle_name_list'][i] }} + {% endif %} + {{ docs[0]['product_type_provider_contact_last_name_list'][i] }} + </gco:CharacterString> + </gmd:individualName> + <gmd:organisationName> + <gco:CharacterString>{{ docs[0]['product_type_provider_short_name'] }} > {{ docs[0]['product_type_provider_long_name'] }}</gco:CharacterString> + </gmd:organisationName> + <gmd:contactInfo> + <gmd:CI_Contact> + <gmd:phone> + <gmd:CI_Telephone> + <gmd:voice> + {% if docs[0]['product_type_provider_contact_phone_list'][i] != 'null' %} + <gco:CharacterString>{{ docs[0]['product_type_provider_contact_phone_list'][i] }}</gco:CharacterString> + {% else %} + <gco:CharacterString>GIBS: status-pointOfContact-contactInfo-phone-voice not provided</gco:CharacterString> + {% endif %} + </gmd:voice> + <gmd:facsimile> + {% if docs[0]['product_type_provider_contact_fax_list'][i] != 'null' %} + <gco:CharacterString>{{ docs[0]['product_type_provider_contact_fax_list'][i] }}</gco:CharacterString> + {% else %} + <gco:CharacterString>GIBS: status-pointOfContact-contactInfo-phone-facsimile not provided</gco:CharacterString> + {% endif %} + </gmd:facsimile> + </gmd:CI_Telephone> + </gmd:phone> + <gmd:address> + <gmd:CI_Address> + <gmd:electronicMailAddress> + {% if docs[0]['product_type_provider_contact_address_list'][i] != 'null' %} + <gco:CharacterString>{{ docs[0]['product_type_provider_contact_address_list'][i] }}</gco:CharacterString> + {% else %} + <gco:CharacterString>GIBS: status-pointOfContact-contactInfo-address-electronicMailAddress not provided</gco:CharacterString> + {% endif %} + </gmd:electronicMailAddress> + </gmd:CI_Address> + </gmd:address> + <gmd:contactInstructions> + <gco:CharacterString>Phone/FAX/E-mail</gco:CharacterString> + </gmd:contactInstructions> + {% if docs[0]['product_type_provider_resource_path_list'][i] != 'null' %} + <gmd:onlineResource> + <gmd:CI_OnlineResource> + <gmd:linkage> + <gmd:URL>{{ docs[0]['product_type_provider_resource_path_list'][i] }}</gmd:URL> + </gmd:linkage> + </gmd:CI_OnlineResource> + </gmd:onlineResource> + {% else %} + <gmd:onlineResource gco:nilReason="missing" /> + {% endif %} + </gmd:CI_Contact> + </gmd:contactInfo> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="pointOfContact">pointOfContact + </gmd:CI_RoleCode> + </gmd:role> + </gmd:CI_ResponsibleParty> + {% endif %} + {% endfor %} + </gmd:pointOfContact> + {% else %} + <gmd:pointOfContact gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_resource_name_list') %} + <gmd:resourceFormat> + {% for i in range(docs[0]['product_type_resource_name_list'].__len__()) %} + <gmd:MD_Format id="resourceFormat"> + {% if docs[0].__contains__('product_type_resource_name_list') %} + <gmd:name> + <gco:CharacterString>{{ docs[0]['product_type_resource_name_list'][i] }}</gco:CharacterString> + </gmd:name> + {% else %} + <gmd:name gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_policy_version_list') %} + <gmd:version> + <gco:CharacterString>{{ docs[0]['product_type_policy_version_list'][i] }}</gco:CharacterString> + </gmd:version> + {% else %} + <gmd:version gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_policy_compress_type_list') %} + <gmd:fileDecompressionTechnique> + <gco:CharacterString>{{ docs[0]['product_type_policy_compress_type_list'][i] }}</gco:CharacterString> + </gmd:fileDecompressionTechnique> + {% else %} + <gmd:fileDecompressionTechnique gco:nilReason="missing" /> + {% endif %} + </gmd:MD_Format> + {% endfor %} + </gmd:resourceFormat> + {% else %} + <gmd:resourceFormat gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_resource_name_list') %} + {% for i in range(docs[0]['product_type_resource_name_list'].__len__()) %} + <gmd:descriptiveKeywords> + <gmd:MD_Keywords> + <gmd:keyword> + <gco:CharacterString> + {{ docs[0]['product_type_resource_name_list'][i] }} > + {{ docs[0]['product_type_resource_description_list'][i] }} > + {{ docs[0]['product_type_resource_path_list'][i] }} > + Type: {{ docs[0]['product_type_resource_type_list'][i] }} + </gco:CharacterString> + </gmd:keyword> + <gmd:type> + <gmd:MD_KeywordTypeCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" + codeListValue="theme">theme + </gmd:MD_KeywordTypeCode> + </gmd:type> + <gmd:thesaurusName> + <gmd:CI_Citation> + <gmd:title> + <gco:CharacterString>NASA/GCMD Earth Science Keywords</gco:CharacterString> + </gmd:title> + <gmd:date gco:nilReason="unknown" /> + </gmd:CI_Citation> + </gmd:thesaurusName> + </gmd:MD_Keywords> + </gmd:descriptiveKeywords> + {% endfor %} + {% else %} + <gmd:descriptiveKeywords> + <gmd:MD_Keywords> + <gmd:keyword gco:nilReason="missing" /> + <gmd:type> + <gmd:MD_KeywordTypeCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" + codeListValue="theme">theme + </gmd:MD_KeywordTypeCode> + </gmd:type> + <gmd:thesaurusName> + <gmd:CI_Citation> + <gmd:title> + <gco:CharacterString>NASA/GCMD Earth Science Keywords</gco:CharacterString> + </gmd:title> + <gmd:date gco:nilReason="unknown" /> + </gmd:CI_Citation> + </gmd:thesaurusName> + </gmd:MD_Keywords> + </gmd:descriptiveKeywords> + {% endif %} + {% if docs[0].__contains__('product_type_metadata_region_coverage') %} + <gmd:descriptiveKeywords> + <gmd:MD_Keywords> + <gmd:keyword> + <gco:CharacterString>{{docs[0]['product_type_metadata_region_coverage'] }}</gco:CharacterString> + </gmd:keyword> + <gmd:type> + <gmd:MD_KeywordTypeCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" + codeListValue="place">place + </gmd:MD_KeywordTypeCode> + </gmd:type> + <gmd:thesaurusName> + <gmd:CI_Citation> + <gmd:title> + <gco:CharacterString>NASA/GCMD Location Keywords</gco:CharacterString> + </gmd:title> + <gmd:date gco:nilReason="unknown" /> + </gmd:CI_Citation> + </gmd:thesaurusName> + </gmd:MD_Keywords> + </gmd:descriptiveKeywords> + {% else %} + <gmd:descriptiveKeywords> + <gmd:MD_Keywords> + <gmd:keyword gco:nilReason="missing" /> + <gmd:type> + <gmd:MD_KeywordTypeCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" + codeListValue="place">place + </gmd:MD_KeywordTypeCode> + </gmd:type> + <gmd:thesaurusName> + <gmd:CI_Citation> + <gmd:title> + <gco:CharacterString>NASA/GCMD Location Keywords</gco:CharacterString> + </gmd:title> + <gmd:date gco:nilReason="unknown" /> + </gmd:CI_Citation> + </gmd:thesaurusName> + </gmd:MD_Keywords> + </gmd:descriptiveKeywords> + {% endif %} + {% if docs[0].__contains__('product_type_policy_use_constraint_list') %} + {% for i in range(docs[0]['product_type_policy_use_constraint_list'].__len__()) %} + <gmd:resourceConstraints> + <gmd:MD_LegalConstraints> + <gmd:useLimitation> + <gco:CharacterString>{{docs[0]['product_type_policy_use_constraint_list'][i] }}</gco:CharacterString> + </gmd:useLimitation> + {% if docs[0]['product_type_policy_use_constraint_list'][i] != 'null' %} + <gmd:otherConstraints> + <gco:CharacterString>{{docs[0]['product_type_policy_use_constraint_list'][i] }}</gco:CharacterString> + </gmd:otherConstraints> + {% endif %} + </gmd:MD_LegalConstraints> + </gmd:resourceConstraints> + {% endfor %} + {% else %} + <gmd:resourceConstraints gco:nilReason="unknown" /> + {% endif %} + <gmd:spatialRepresentationType> + <gmd:MD_SpatialRepresentationTypeCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_SpatialRepresentationTypeCode" + codeListValue="grid">grid + </gmd:MD_SpatialRepresentationTypeCode> + </gmd:spatialRepresentationType> + + <gmd:language> + <gco:CharacterString>eng</gco:CharacterString> + </gmd:language> + + <gmd:characterSet> + <gmd:MD_CharacterSetCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" + codeListValue="UTF8">UTF8 + </gmd:MD_CharacterSetCode> + </gmd:characterSet> + + {% if docs[0].__contains__('product_type_coverage_west_longitude_list') %} + <gmd:extent> + {% for i in range(docs[0]['product_type_coverage_west_longitude_list'].__len__()) %} + <gmd:EX_Extent id="boundingExtent"> + <gmd:geographicElement> + <gmd:EX_GeographicBoundingBox id="boundingBox"> + <gmd:extentTypeCode> + <gco:Boolean>true</gco:Boolean> + </gmd:extentTypeCode> + {% if docs[0].__contains__('product_type_coverage_west_longitude_list') %} + <gmd:westBoundLongitude> + <gco:Decimal>{{ docs[0]['product_type_coverage_west_longitude_list'][i] }}</gco:Decimal> + </gmd:westBoundLongitude> + {% else %} + <gmd:westBoundLongitude gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_coverage_east_longitude_list') %} + <gmd:eastBoundLongitude> + <gco:Decimal>{{ docs[0]['product_type_coverage_east_longitude_list'][i] }}</gco:Decimal> + </gmd:eastBoundLongitude> + {% else %} + <gmd:eastBoundLongitude gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_coverage_south_latitude_list') %} + <gmd:southBoundLongitude> + <gco:Decimal>{{ docs[0]['product_type_coverage_south_latitude_list'][i] }}</gco:Decimal> + </gmd:southBoundLongitude> + {% else %} + <gmd:southBoundLongitude gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_coverage_north_latitude_list') %} + <gmd:northBoundLongitude> + <gco:Decimal>{{ docs[0]['product_type_coverage_north_latitude_list'][i] }}</gco:Decimal> + </gmd:northBoundLongitude> + {% else %} + <gmd:northBoundLongitude gco:nilReason="missing" /> + {% endif %} + </gmd:EX_GeographicBoundingBox> + </gmd:geographicElement> + <gmd:geographicElement> + <gmd:EX_GeographicDescription> + <gmd:extentTypeCode> + <gco:Boolean>true</gco:Boolean> + </gmd:extentTypeCode> + <gmd:geographicIdentifier> + <gmd:MD_Identifier> + <gmd:code /> + </gmd:MD_Identifier> + </gmd:geographicIdentifier> + </gmd:EX_GeographicDescription> + </gmd:geographicElement> + <gmd:temporalElement> + <gmd:EX_TemporalExtent id="temporalExtent"> + <gmd:extent> + <TimePeriod + xmlns="http://www.opengis.net/gml/3.2" + xmlns:ns1="http://www.opengis.net/gml/3.2" ns1:id="timePeriod"> + {% if docs[0].__contains__('product_type_coverage_start_time_list') %} + <beginPosition>{{ docs[0]['product_type_coverage_start_time_list'][i] }}</beginPosition> + {% else %} + <beginPosition gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_coverage_stop_time_list') %} + <endPosition>{{ docs[0]['product_type_coverage_stop_time_list'][i] }}</endPosition> + {% else %} + <endPosition gco:nilReason="missing" /> + {% endif %} + </TimePeriod> + </gmd:extent> + </gmd:EX_TemporalExtent> + </gmd:temporalElement> + <gmd:verticalElement gco:nilReason="inapplicable" /> + </gmd:EX_Extent> + {% endfor %} + </gmd:extent> + {% else %} + <gmd:extent gco:nilReason="missing" /> + {% endif %} + </gmd:MD_DataIdentification> + </gmd:identificationInfo> + <gmd:contentInfo> + <gmi:MI_CoverageDescription id="referenceInformation"> + <gmd:attributeDescription> + <gco:RecordType xlink:href="http://www.ghrsst.org/documents.htm?parent=475" /> + </gmd:attributeDescription> + <gmd:contentType> + <gmd:MD_CoverageContentTypeCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CoverageContentTypeCode" + codeListValue="referenceInformation">referenceInformation + </gmd:MD_CoverageContentTypeCode> + </gmd:contentType> + <gmd:dimension> + <gmd:MD_Band> + <gmd:sequenceIdentifier> + <gco:MemberName> + <gco:aName> + <gco:CharacterString>lat</gco:CharacterString> + </gco:aName> + <gco:attributeType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>float</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gco:attributeType> + </gco:MemberName> + </gmd:sequenceIdentifier> + </gmd:MD_Band> + </gmd:dimension> + <gmd:dimension> + <gmd:MD_Band> + <gmd:sequenceIdentifier> + <gco:MemberName> + <gco:aName> + <gco:CharacterString>lon</gco:CharacterString> + </gco:aName> + <gco:attributeType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>float</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gco:attributeType> + </gco:MemberName> + </gmd:sequenceIdentifier> + </gmd:MD_Band> + </gmd:dimension> + <gmd:dimension> + <gmd:MD_Band> + <gmd:sequenceIdentifier> + <gco:MemberName> + <gco:aName> + <gco:CharacterString>time</gco:CharacterString> + </gco:aName> + <gco:attributeType> + <gco:TypeName> + <gco:aName> + <gco:CharacterString>int</gco:CharacterString> + </gco:aName> + </gco:TypeName> + </gco:attributeType> + </gco:MemberName> + </gmd:sequenceIdentifier> + </gmd:MD_Band> + </gmd:dimension> + </gmi:MI_CoverageDescription> + </gmd:contentInfo> + <gmd:distributionInfo> + <gmd:MD_Distribution> + <gmd:distributionFormat xlink:href="#resourceFormat" /> + <gmd:distributor> + <gmd:MD_Distributor> + <gmd:distributorContact> + <gmd:CI_ResponsibleParty> + <gmd:individualName> + <gco:CharacterString>GIBS User Services</gco:CharacterString> + </gmd:individualName> + <gmd:organisationName> + <gco:CharacterString>NASA/JPL/GIBS > Global Imagery Browse Services, Jet Propulsion Laboratory, NASA</gco:CharacterString> + </gmd:organisationName> + <gmd:contactInfo> + <gmd:CI_Contact> + <gmd:address> + <gmd:CI_Address> + <gmd:deliveryPoint> + <gco:CharacterString>4800 Oak Grove Drive</gco:CharacterString> + </gmd:deliveryPoint> + <gmd:city> + <gco:CharacterString>Pasadena</gco:CharacterString> + </gmd:city> + <gmd:administrativeArea> + <gco:CharacterString>CA</gco:CharacterString> + </gmd:administrativeArea> + <gmd:postalCode> + <gco:CharacterString>91109-8099</gco:CharacterString> + </gmd:postalCode> + <gmd:country> + <gco:CharacterString>USA</gco:CharacterString> + </gmd:country> + <gmd:electronicMailAddress> + <gco:CharacterString>[email protected]</gco:CharacterString> + </gmd:electronicMailAddress> + </gmd:CI_Address> + </gmd:address> + <gmd:onlineResource> + <gmd:CI_OnlineResource> + <gmd:linkage> + <gmd:URL>http://gibs.jpl.nasa.gov</gmd:URL> + </gmd:linkage> + </gmd:CI_OnlineResource> + </gmd:onlineResource> + </gmd:CI_Contact> + </gmd:contactInfo> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="distributor">distributor + </gmd:CI_RoleCode> + </gmd:role> + </gmd:CI_ResponsibleParty> + </gmd:distributorContact> + </gmd:MD_Distributor> + </gmd:distributor> + {% if docs[0].__contains__('product_type_resource_type_list') and docs[0]['product_type_resource_type_list'][i] != 'Thumbnail' %} + {% for i in range(docs[0]['product_type_resource_type_list'].__len__()) %} + {% if docs[0]['product_type_resource_type_list'][i] != 'Thumbnail' %} + <gmd:transferOptions> + <gmd:MD_DigitalTransferOptions> + <gmd:onLine> + <gmd:CI_OnlineResource> + {% if docs[0].__contains__('product_type_resource_path_list') %} + <gmd:linkage> + <gmd:URL>{{ docs[0]['product_type_resource_path_list'][i] }}</gmd:URL> + </gmd:linkage> + {% else %} + <gmd:linkage gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_resource_name_list') %} + <gmd:name> + <gmd:CharacterString>{{ docs[0]['product_type_resource_name_list'][i] }}</gmd:CharacterString> + </gmd:name> + {% else %} + <gmd:name gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_resource_description_list') %} + <gmd:description> + <gmd:CharacterString>{{ docs[0]['product_type_resource_description_list'][i] }}</gmd:CharacterString> + </gmd:description> + {% else %} + <gmd:description gco:nilReason="missing" /> + {% endif %} + <gmd:function> + <gmd:CI_OnLineFunctionCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_OnlineFunctionCode" + codeListValue="information">information + </gmd:CI_OnLineFunctionCode> + </gmd:function> + </gmd:CI_OnlineResource> + </gmd:onLine> + </gmd:MD_DigitalTransferOptions> + </gmd:transferOptions> + {% endif %} + {% endfor %} + {% else %} + <gmd:transferOptions gco:nilReason="missing" /> + {% endif %} + </gmd:MD_Distribution> + </gmd:distributionInfo> + <gmd:metadataMaintenance> + <gmd:MD_MaintenanceInformation> + <gmd:maintenanceAndUpdateFrequency> + <gmd:MD_MaintenanceFrequencyCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_MaintenanceFrequencyCode" + codeListValue="asNeeded">asNeeded + </gmd:MD_MaintenanceFrequencyCode> + </gmd:maintenanceAndUpdateFrequency> + <gmd:maintenanceNote> + <gco:CharacterString>Translated from GCMD DIF</gco:CharacterString> + </gmd:maintenanceNote> + </gmd:MD_MaintenanceInformation> + </gmd:metadataMaintenance> + <gmi:acquisitionInformation> + <gmi:MI_AcquisitionInformation> + <gmi:instrument> + <gmi:MI_Instrument> + {% if docs[0].__contains__('product_type_identifier') %} + <gmi:identifier> + <gmd:MD_Identifier> + <gmd:code> + <gco:CharacterString>{{ docs[0]['product_type_identifier'] }}</gco:CharacterString> + </gmd:code> + </gmd:MD_Identifier> + </gmi:identifier> + {% else %} + <gmi:identifier gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_metadata_instrument') %} + <gmi:description> + <gco:CharacterString>{{ docs[0]['product_type_metadata_instrument'] }}</gco:CharacterString> + </gmi:description> + {% else %} + <gmd:description gco:nilReason="missing" /> + {% endif %} + </gmi:MI_Instrument> + </gmi:instrument> + <gmi:platform> + <gmi:MI_Platform> + {% if docs[0].__contains__('product_type_identifier') %} + <gmi:identifier> + <gmd:MD_Identifier> + <gmd:code> + <gco:CharacterString>{{ docs[0]['product_type_identifier'] }}</gco:CharacterString> + </gmd:code> + </gmd:MD_Identifier> + </gmi:identifier> + {% else %} + <gmi:identifier gco:nilReason="missing" /> + {% endif %} + {% if docs[0].__contains__('product_type_metadata_platform') %} + <gmi:description> + <gco:CharacterString>{{ docs[0]['product_type_metadata_platform'] }}</gco:CharacterString> + </gmi:description> + {% else %} + <gmd:description gco:nilReason="missing" /> + {% endif %} + <gmi:sponsor> + <gmd:CI_ResponsibleParty> + {% if docs[0].__contains__('product_type_metadata_project') %} + <gmd:organisationName> + <gco:CharacterString>{{ docs[0]['product_type_metadata_project'] }}</gco:CharacterString> + </gmd:organisationName> + {% else %} + <gmd:organisationName gco:nilReason="missing" /> + {% endif %} + <gmd:contactInfo> + <gmd:CI_Contact> + {% if docs[0]['product_type_provider_resource_path_list'][i] != 'null' %} + <gmd:onlineResource> + <gmd:CI_OnlineResource> + <gmd:linkage> + <gmd:URL>{{ docs[0]['product_type_provider_resource_path_list'][i] }}</gmd:URL> + </gmd:linkage> + </gmd:CI_OnlineResource> + </gmd:onlineResource> + {% else %} + <gmd:onlineResource gco:nilReason="missing" /> + {% endif %} + </gmd:CI_Contact> + </gmd:contactInfo> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="sponsor" /> + </gmd:role> + </gmd:CI_ResponsibleParty> + </gmi:sponsor> + <gmi:sponsor> + <gmd:CI_ResponsibleParty> + <gmd:organisationName> + <gco:CharacterString>NASA/JPL/GIBS > Global Imagery Browse Services, Jet Propulsion Laboratory, NASA</gco:CharacterString> + </gmd:organisationName> + <gmd:contactInfo> + <gmd:CI_Contact> + <gmd:onlineResource> + <gmd:CI_OnlineResource> + <gmd:linkage> + <gmd:URL>http://gibs.jpl.nasa.gov</gmd:URL> + </gmd:linkage> + <gmd:function> + <gmd:CI_OnLineFunctionCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode" + codeListValue="information" /> + </gmd:function> + </gmd:CI_OnlineResource> + </gmd:onlineResource> + </gmd:CI_Contact> + </gmd:contactInfo> + <gmd:role> + <gmd:CI_RoleCode + codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode" + codeListValue="sponsor" /> + </gmd:role> + </gmd:CI_ResponsibleParty> + </gmi:sponsor> + <gmi:instrument xlink:href="{{ docs[0]['product_type_title'] }}" /> + </gmi:MI_Platform> + </gmi:platform> + </gmi:MI_AcquisitionInformation> + </gmi:acquisitionInformation> + </gmi:MI_Metadata> + </gmd:seriesMetadata> +</gmd:DS_Series>
http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/samos/__init__.py ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/samos/__init__.py b/src/main/python/plugins/samos/__init__.py new file mode 100644 index 0000000..e69de29 http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/samos/json/Writer.py ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/samos/json/Writer.py b/src/main/python/plugins/samos/json/Writer.py new file mode 100644 index 0000000..3b2ac7d --- /dev/null +++ b/src/main/python/plugins/samos/json/Writer.py @@ -0,0 +1,89 @@ +import logging +import os +import os.path +import urllib + +from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter +from edge.response.solrjsontemplateresponse import SolrJsonTemplateResponse + +class Writer(SolrTemplateResponseWriter): + def __init__(self, configFilePath): + super(Writer, self).__init__(configFilePath) + + self.contentType = 'application/json' + + templatePath = os.path.dirname(configFilePath) + os.sep + templatePath += self._configuration.get('service', 'template') + self.template = self._readTemplate(templatePath) + + def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, searchParams, pretty): + response = SolrJsonTemplateResponse(searchUrl, searchParams) + response.setTemplate(self.template) + + return response.generate(solrResponse, pretty=pretty) + + def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, facets): + queries = [] + filterQueries = [] + sort = None + + for key, value in parameters.iteritems(): + if value != "": + if key == 'keyword': + queries.append(urllib.quote(value)) + elif key == 'startTime': + filterQueries.append('time:['+value+'%20TO%20*]') + elif key == 'endTime': + filterQueries.append('time:[*%20TO%20'+value+']') + elif key == 'bbox': + coordinates = value.split(",") + filterQueries.append('loc:[' + coordinates[1] + ',' + coordinates[0] + '%20TO%20' + coordinates[3] + ',' + coordinates[2] + ']') + elif key == 'variable': + if value.lower() == 'sss': + filterQueries.append('SSS:[*%20TO%20*]') + elif value.lower() == 'sst': + filterQueries.append('SST:[*%20TO%20*]') + elif value.lower() == 'wind': + filterQueries.append('wind_speed:[*%20TO%20*]') + elif key == "minDepth": + if 'variable' in parameters: + if parameters['variable'].lower() == 'sss': + filterQueries.append('(SSS_depth:['+value+'%20TO%20*]+OR+(*:*%20NOT%20SSS_depth:*))') + elif parameters['variable'].lower() == 'sst': + filterQueries.append('(SST_depth:['+value+'%20TO%20*]+OR+(*:*%20NOT%20SST_depth:*))') + elif parameters['variable'].lower() == 'wind': + filterQueries.append('(wind_depth:['+value+'%20TO%20*]+OR+(*:*%20NOT%20wind_depth:*))') + elif key == "maxDepth": + if 'variable' in parameters: + if parameters['variable'].lower() == 'sss': + filterQueries.append('(SSS_depth:[*%20TO%20'+value+']+OR+(*:*%20NOT%20SSS_depth:*))') + elif parameters['variable'].lower() == 'sst': + filterQueries.append('(SST_depth:[*%20TO%20'+value+']+OR+(*:*%20NOT%20SST_depth:*))') + elif parameters['variable'].lower() == 'wind': + filterQueries.append('(wind_depth:[*%20TO%20'+value+']+OR+(*:*%20NOT%20wind_depth:*))') + elif key == 'platform': + if type(value) is list: + filterQueries.append('platform:(' + '+OR+'.join(value) + ')') + else: + filterQueries.append('platform:'+value) + + if len(queries) == 0: + queries.append('*:*') + + query = 'q='+'+AND+'.join(queries)+'&wt=json&start='+str(startIndex)+'&rows='+str(entriesPerPage) + + if len(filterQueries) > 0: + query += '&fq='+'+AND+'.join(filterQueries) + + if sort is not None: + query += '&sort=' + sort + + if 'stats' in parameters and parameters['stats'].lower() == 'true': + query += '&stats=true&stats.field={!min=true%20max=true}SSS_depth&stats.field={!min=true%20max=true}SST_depth&stats.field={!min=true%20max=true}wind_depth' + + if 'facet' in parameters and parameters['facet'].lower() == 'true': + query += '&facet=true&facet.field=platform&facet.field=device&facet.limit=-1&facet.mincount=1' + + logging.debug('solr query: '+query) + + return query http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/samos/json/__init__.py ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/samos/json/__init__.py b/src/main/python/plugins/samos/json/__init__.py new file mode 100644 index 0000000..e69de29 http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/samos/json/plugin.conf ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/samos/json/plugin.conf b/src/main/python/plugins/samos/json/plugin.conf new file mode 100644 index 0000000..2df9aa0 --- /dev/null +++ b/src/main/python/plugins/samos/json/plugin.conf @@ -0,0 +1,11 @@ +[solr] +datasetUrl=http://localhost:8983/solr/samos +entriesPerPage=10 +maxEntriesPerPage=100000 +defaultSearchParam=keyword +parameters=keyword,startTime,endTime,bbox,minDepth,maxDepth,variable,stats,platform,facet +facets={} + +[service] +url=http://doms.coaps.fsu.edu +template=template.json http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/samos/json/template.json ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/samos/json/template.json b/src/main/python/plugins/samos/json/template.json new file mode 100755 index 0000000..e3071b5 --- /dev/null +++ b/src/main/python/plugins/samos/json/template.json @@ -0,0 +1,63 @@ +{ +{% if last %}"last": "{{ last }}",{% endif %} +{% if prev %}"prev": "{{ prev }}",{% endif %} +{% if next %}"next": "{{ next }}",{% endif %} +{% if first %}"first": "{{ first }}",{% endif %} +"results":[ +{% for doc in docs %} +{ +"time": "{{ doc['time'] }}", +"point": "Point({{ doc['loc'].split(',')[1] }} {{ doc['loc'].split(',')[0] }})", +"sea_water_temperature": {{ doc['SST'] | jsonify }}, +"sea_water_temperature_depth": {{ doc['SST_depth'] | jsonify }}, +"sea_water_temperature_quality": {% if doc['SST_quality'] == False %}0{% elif doc['SST_quality'] == True %}1{% else %}null{% endif %}, +"wind_speed": {{ doc['wind_speed'] | jsonify }}, +"eastward_wind": {{ doc['wind_u'] | jsonify }}, +"northward_wind": {{ doc['wind_v'] | jsonify }}, +"wind_depth": {{ doc['wind_depth'] | jsonify }}, +"wind_quality": {% if doc['wind_quality'] == False %}0{% elif doc['wind_quality'] == True %}1{% else %}null{% endif %}, +"sea_water_salinity": {{ doc['SSS'] | jsonify }}, +"sea_water_salinity_depth": {{ doc['SSS_depth'] | jsonify }}, +"sea_water_salinity_quality": {% if doc['SSS_quality'] == False %}0{% elif doc['SSS_quality'] == True %}1{% else %}null{% endif %}, +"platform": {{ doc['platform'] | jsonify }}, +"device": {{ doc['device'] | jsonify }}, +"mission": {{ doc['mission'] | jsonify }}, +"metadata": "{{ doc['meta'] }}" +} +{% if not loop.last %} +, +{% endif %} +{% endfor %} +] +,"totalResults":{{ numFound }} +,"startIndex":{{ startIndex }} +,"itemsPerPage":{{ itemsPerPage }} +{% if stats %} +, +"stats_fields": {{ stats['stats_fields'] | jsonify }} +{% endif %} +{% if facets %} +, +"facets":[ +{% for key, facet in facets['facet_fields'].iteritems() %} +{ +"field": "{{ key }}", +"values":[ +{% for i in range(0, facet|count, 2) %} +{ +"count":{{facet[i+1] }}, +"value": "{{ facet[i] }}" +} +{% if not loop.last %} +, +{% endif %} +{% endfor %} +] +} +{% if not loop.last %} +, +{% endif %} +{% endfor %} +] +{% endif %} +} http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/__init__.py ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/__init__.py b/src/main/python/plugins/slcp/__init__.py new file mode 100644 index 0000000..e69de29 http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/atom/Writer.py ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/atom/Writer.py b/src/main/python/plugins/slcp/atom/Writer.py new file mode 100644 index 0000000..7bdae8c --- /dev/null +++ b/src/main/python/plugins/slcp/atom/Writer.py @@ -0,0 +1,86 @@ +import logging +import os +import os.path +import urllib +import json + +from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter +from edge.opensearch.solrtemplateresponse import SolrTemplateResponse + +class Writer(SolrTemplateResponseWriter): + def __init__(self, configFilePath): + super(Writer, self).__init__(configFilePath) + + templatePath = os.path.dirname(configFilePath) + os.sep + templatePath += self._configuration.get('service', 'template') + self.template = self._readTemplate(templatePath) + + def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, searchParams, pretty): + response = SolrTemplateResponse(self._configuration, searchUrl, searchParams) + response.setTemplate(self.template) + response.variables['serviceUrl'] = self._configuration.get('service', 'url') + + return response.generate(solrResponse, pretty=pretty) + + def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, facets): + sortKeys = json.loads(self._configuration.get('solr', 'sortKeys')) + + queries = [] + filterQueries = [] + sort = None + sortDir = 'asc' + start = '*' + end = '*' + + for key, value in parameters.iteritems(): + if value != "": + if key == 'keyword': + queries.append(urllib.quote(value)) + elif key == 'startTime': + start = value + elif key == 'endTime': + end = value + elif key == 'bbox': + coordinates = value.split(",") + filterQueries.append('Spatial-Geometry:[' + coordinates[1] + ',' + coordinates[0] + '%20TO%20' + coordinates[3] + ',' + coordinates[2] + ']') + elif key == 'concept_id': + queries.append('concept-id:' + self._urlEncodeSolrQueryValue(value)) + elif key == 'sortKey': + if value in sortKeys.keys(): + sort = sortKeys[value] + elif key == 'sortDir': + sortDir = value + elif key == 'inDAT': + filterQueries.append('InDAT:%s' % value) + queries.append('(BeginningEndingDateTime:['+start+'%20TO%20' + end + ']+OR+(*:*%20NOT%20BeginningEndingDateTime:*))') + + for key, value in facets.iteritems(): + if type(value) is list: + if (len(value) == 1): + filterQueries.append(key + ':' + self._urlEncodeSolrQueryValue(value[0])) + else: + filterQueries.append(key + ':(' + '+OR+'.join([ self._urlEncodeSolrQueryValue(x) for x in value ]) + ")") + else: + filterQueries.append(key + ':' + self._urlEncodeSolrQueryValue(value)) + + if len(queries) == 0: + queries.append('*:*') + + query = 'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json' + + if len(filterQueries) > 0: + query += '&fq='+'+AND+'.join(filterQueries) + + if self.facet: + query += '&rows=0&facet=true&facet.limit=-1&facet.mincount=1&' + query += '&'.join(['facet.field=' + facet for facet in self.facetDefs.values()]) + else: + query += '&start='+str(startIndex)+'&rows='+str(entriesPerPage) + if sort is not None: + query += '&sort=' + urllib.quote(sort + ' ' + sortDir + ",InternalVersion desc") + else: + query += '&sort=' + urllib.quote("score desc,InternalVersion desc") + + logging.debug('solr query: '+query) + + return query http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/atom/__init__.py ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/atom/__init__.py b/src/main/python/plugins/slcp/atom/__init__.py new file mode 100644 index 0000000..e69de29 http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/atom/plugin.conf ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/atom/plugin.conf b/src/main/python/plugins/slcp/atom/plugin.conf new file mode 100644 index 0000000..428406f --- /dev/null +++ b/src/main/python/plugins/slcp/atom/plugin.conf @@ -0,0 +1,12 @@ +[solr] +datasetUrl=http://localhost:8983/solr/dataset +entriesPerPage=10 +maxEntriesPerPage=2000 +defaultSearchParam=keyword +parameters=keyword,startTime,endTime,bbox,concept_id,sortKey,sortDir,inDAT +facets={"Collection": "Collection", "Processing_Level": "ProcessingLevelBin", "Swath_Spatial_Resolution": "SwathSpatialResolution", "Grid_Spatial_Resolution": "GridSpatialResolution", "Temporal_Resolution": "TemporalResolution", "Parameter": "TermKeyword"} +sortKeys={"Relevance": "score", "Long_Name": "LongName", "Short_Name": "ShortName", "Processing_Level": "ProcessingLevelId", "Start_Date": "BeginningDateTime", "Stop_Date": "EndingDateTime", "Last_Updated": "LastUpdate"} + +[service] +url=http://localhost:8890 +template=template.xml http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/atom/template.xml ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/atom/template.xml b/src/main/python/plugins/slcp/atom/template.xml new file mode 100755 index 0000000..3b7fdce --- /dev/null +++ b/src/main/python/plugins/slcp/atom/template.xml @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding="UTF-8"?> +<feed esipdiscovery:version="1.2" xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/terms/" xmlns:echo="http://www.echo.nasa.gov/esip" xmlns:esipdiscovery="http://commons.esipfed.org/ns/discovery/1.2/" xmlns:georss="http://www.georss.org/georss/10" xmlns:gml="http://www.opengis.net/gml" xmlns:os="http://a9.com/-/spec/opensearch/1.1/" xmlns:time="http://a9.com/-/opensearch/extensions/time/1.0/"> +<updated>{{ updated }}</updated> +<id>https://api.echo.nasa.gov:443/opensearch/datasets.atom</id> +<author> +<name>ECHO</name> +<email>[email protected]</email> +</author> +<title type="text">ECHO dataset metadata</title> +<os:totalResults>{{ numFound }}</os:totalResults> +<os:itemsPerPage>{{ itemsPerPage }}</os:itemsPerPage> +<os:startIndex>{{ startIndex }}</os:startIndex> +<os:Query role="request" xmlns:echo="http://www.echo.nasa.gov/esip" xmlns:geo="http://a9.com/-/opensearch/extensions/geo/1.0/" xmlns:time="http://a9.com/-/opensearch/extensions/time/1.0/" /> +<subtitle type="text">Search parameters: None</subtitle> +<link href="https://api.echo.nasa.gov:443/opensearch/granules/descriptor_document.xml" hreflang="en-US" rel="search" type="application/opensearchdescription+xml" /> +<link href="{{ myself }}" hreflang="en-US" rel="self" type="application/atom+xml" /> +{% if last %}<link href="{{ last }}" hreflang="en-US" rel="last" type="application/atom+xml" />{% endif %} +{% if prev %}<link href="{{ prev }}" hreflang="en-US" rel="previous" type="application/atom+xml" />{% endif %} +{% if next %}<link href="{{ next }}" hreflang="en-US" rel="next" type="application/atom+xml" />{% endif %} +{% if first %}<link href="{{ first }}" hreflang="en-US" rel="first" type="application/atom+xml" />{% endif %} +<link href="https://wiki.earthdata.nasa.gov/display/echo/Open+Search+API+release+information" hreflang="en-US" rel="describedBy" title="Release Notes" type="text/html" /> +{% for doc in docs %} +<entry> +<id>{{ link }}?concept_id={{ doc['concept-id'] }}</id> +<dc:identifier>{{ doc['SlcpShortName'] }}</dc:identifier> +<author> +<name>ECHO</name> +<email>[email protected]</email> +</author> +<title type="text">{{ doc['LongName'] }}</title> +<summary type="text">{{ doc['Description'] }}</summary> +<updated>{{ doc['LastUpdate'] }}</updated> +<echo:datasetId>{{ doc['DataSetId'] }}</echo:datasetId> +<echo:shortName>{{ doc['ShortName'] }}</echo:shortName> +<echo:longName>{{ doc['LongName'] }}</echo:longName> +<echo:versionId>{{ doc['VersionId'] }}</echo:versionId> +<echo:dataCenter>{{ doc['ArchiveCenter'] }}</echo:dataCenter> +{% if doc['ProcessingLevelId'] %} +<echo:processingLevelId>{{ doc['ProcessingLevelId'] }}</echo:processingLevelId> +{% endif %} +{% if doc['DataFormat'] %} +<echo:dataFormat>{{ doc['DataFormat'] }}</echo:dataFormat> +{% endif %} +{% if doc['CategoryKeyword'] %} +<echo:scienceKeywords> +{% for i in range(doc['CategoryKeyword']|count) %} +<echo:scienceKeyword> +<echo:categoryKeyword>{{ doc['CategoryKeyword'][i] }}</echo:categoryKeyword> +<echo:topicKeyword>{{ doc['TopicKeyword'][i] }}</echo:topicKeyword> +<echo:termKeyword>{{ doc['TermKeyword'][i] }}</echo:termKeyword> +<echo:variableLevel1Keyword> +<echo:value>{{ doc['VariableLevel1Keyword'][i] }}</echo:value> +</echo:variableLevel1Keyword> +{% if doc['DetailedVariableKeyword'] %} +<echo:detailedVariableKeyword>{{ doc['DetailedVariableKeyword'][i] }}</echo:detailedVariableKeyword> +{% endif %} +</echo:scienceKeyword> +{% endfor %} +</echo:scienceKeywords> +{% endif %} +<echo:platforms> +{% for i in range(doc['Platform-ShortName']|count) %} +<echo:platform> +<echo:shortName>{{ doc['Platform-ShortName'][i] }}</echo:shortName> +<echo:longName>{{ doc['Platform-LongName'][i] }}</echo:longName> +{% if doc['Instrument-ShortName_' + i|string] %} +<echo:instruments> +{% for j in range(doc['Instrument-ShortName_' + i|string]|count) %} +<echo:instrument> +<echo:shortName>{{ doc['Instrument-ShortName_' + i|string][j] }}</echo:shortName> +<echo:longName>{{ doc['Instrument-LongName_' + i|string][j] }}</echo:longName> +{% if doc['Sensor-ShortName_' + i|string + '_' + j|string] %} +<echo:sensors> +{% for k in range(doc['Sensor-ShortName_' + i|string + '_' + j|string]|count) %} +<echo:sensor> +<echo:shortName>{{ doc['Sensor-ShortName_' + i|string + '_' + j|string][k] }}</echo:shortName> +<echo:longName>{{ doc['Sensor-LongName_' + i|string + '_' + j|string][k] }}</echo:longName> +</echo:sensor> +{% endfor %} +</echo:sensors> +{% endif %} +</echo:instrument> +{% endfor %} +</echo:instruments> +{% endif %} +</echo:platform> +{% endfor %} +</echo:platforms> +<echo:additionalAttributes> +{% for key in ['GlobalAttrTitle', 'GlobalAttrDescription', 'GlobalAttrSource', 'GlobalAttrContact', 'GlobalAttrUnits'] %} +{% if doc[key] %} +<echo:additionalAttribute> +<echo:name>{{ key }}</echo:name> +<echo:value>{{ doc[key] }}</echo:value> +</echo:additionalAttribute> +{% endif %} +{% endfor %} +</echo:additionalAttributes> +{% for i in range(doc['OnlineAccessURL-URL']|count) %} +{% if doc['OnlineAccessURL-URLDescription'][i].endswith('PO.DAAC') %} +{% elif doc['OnlineAccessURL-URLDescription'][i].endswith('NODC') %} +<link href="{{ doc['OnlineAccessURL-URL'][i] }}" hreflang="en-US" rel="enclosure" {% if doc['OnlineAccessURL-URLDescription'] and doc['OnlineAccessURL-URLDescription'][i] != '' %} title="Data Access {{ doc['OnlineAccessURL-URLDescription'][i][:-5] }}" {% endif %} /> +{% else %} +<link href="{{ doc['OnlineAccessURL-URL'][i] }}" hreflang="en-US" rel="enclosure" {% if doc['OnlineAccessURL-URLDescription'] and doc['OnlineAccessURL-URLDescription'][i] != '' %} title="Data Access {{ doc['OnlineAccessURL-URLDescription'][i] }}" {% endif %} /> +{% endif %} +{% endfor %} +{% for i in range(doc['OnlineResource-URL']|count) %} +<link href="{{ doc['OnlineResource-URL'][i] }}" hreflang="en-US" rel="describedBy" {% if doc['OnlineResource-Description'] and doc['OnlineResource-Description'][i] != '' %} title="{{ doc['OnlineResource-Description'][i] }}" {% endif %} /> +{% endfor %} +{% if doc['CoordinateSystem'] %} +<echo:coordinateSystem>{{ doc['CoordinateSystem'] }}</echo:coordinateSystem> +{% endif %} +{% if 0 == 1 %} +<echo:orbitParameters /> +<relevance:score>0.5</relevance:score> +{% endif %} +{% for point in doc['Spatial-Point'] %} +<georss:point>{{ point }}</georss:point> +{% endfor %} +{% for line in doc['Spatial-Line'] %} +<georss:line>{{ line }}</georss:line> +{% endfor %} +{% for box in doc['Spatial-Box'] %} +<georss:box>{{ box }}</georss:box> +{% endfor %} +{% for polygon in doc['Spatial-Polygon'] %} +<georss:polygon>{{ polygon }}</georss:polygon> +{% endfor %} +{% if 0 == 1 %} +<link href="http://gcmd.nasa.gov/getdif.htm?FIFE_STRM_15M" hreflang="en-US" rel="enclosure" title="doi:10.3334/ORNLDAAC/1" type="text/html" /> +{% endif %} +{% if doc['has-granules'] == 'true' %} +<link href="https://api.echo.nasa.gov:443/opensearch/granules.atom?clientId=&shortName={{ doc['ShortName'] }}&versionId={{ doc['VersionId'] }}&dataCenter={{ doc['ArchiveCenter'] }}" hreflang="en-US" rel="search" title="Search for granules" type="application/atom+xml" /> +{% endif %} +{% if 0 == 1 %} +<link href="https://api.echo.nasa.gov:443/opensearch/granules/descriptor_document.xml?clientId=&shortName=doi:10.3334/ORNLDAAC/1&versionId=1&dataCenter=ORNL_DAAC" hreflang="en-US" rel="search" title="Custom ECHO Granule Open Search Descriptor Document" type="application/opensearchdescription+xml" /> +{% endif %} +<link href="{{ serviceUrl }}/ws/metadata/dataset?slcpShortName={{ doc['SlcpShortName'] }}" hreflang="en-US" rel="alternate" title="Product metadata" type="application/xml" /> +{% for dt in doc['BeginningEndingDateTime'] %} +{% if ' ' not in dt %} +<dc:date>{{ dt }}/{{ dt }}</dc:date> +{% else %} +<dc:date>{{ dt[1:dt.index(' ')] }}/{% if '*' not in dt %}{{ dt[dt.rindex(' ')+1:-1] }}{% endif %}</dc:date> +{% endif %} +{% endfor %} +</entry> +{% endfor %} +</feed> http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/basin/Writer.py ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/basin/Writer.py b/src/main/python/plugins/slcp/basin/Writer.py new file mode 100644 index 0000000..77bfc9a --- /dev/null +++ b/src/main/python/plugins/slcp/basin/Writer.py @@ -0,0 +1,35 @@ +import logging +import os +import os.path +import urllib + +from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter +from edge.response.solrjsontemplateresponse import SolrJsonTemplateResponse + +class Writer(SolrTemplateResponseWriter): + def __init__(self, configFilePath): + super(Writer, self).__init__(configFilePath) + + self.contentType = 'application/json' + + templatePath = os.path.dirname(configFilePath) + os.sep + templatePath += self._configuration.get('service', 'template') + self.template = self._readTemplate(templatePath) + + def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, searchParams, pretty): + response = SolrJsonTemplateResponse() + response.setTemplate(self.template) + + return response.generate(solrResponse, pretty=pretty) + + def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, facets): + queries = [] + + if len(queries) == 0: + queries.append('*:*') + + query = 'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json&start='+str(startIndex)+'&rows='+str(entriesPerPage) + + logging.debug('solr query: '+query) + + return query http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/basin/__init__.py ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/basin/__init__.py b/src/main/python/plugins/slcp/basin/__init__.py new file mode 100644 index 0000000..e69de29 http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/basin/plugin.conf ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/basin/plugin.conf b/src/main/python/plugins/slcp/basin/plugin.conf new file mode 100644 index 0000000..ea5d9e3 --- /dev/null +++ b/src/main/python/plugins/slcp/basin/plugin.conf @@ -0,0 +1,11 @@ +[solr] +datasetUrl=http://localhost:8983/solr/basin +entriesPerPage=201 +maxEntriesPerPage=201 +defaultSearchParam=keyword +parameters=keyword +facets={} + +[service] +url=http://localhost:8890 +template=template.json http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/basin/template.json ---------------------------------------------------------------------- diff --git a/src/main/python/plugins/slcp/basin/template.json b/src/main/python/plugins/slcp/basin/template.json new file mode 100755 index 0000000..8947699 --- /dev/null +++ b/src/main/python/plugins/slcp/basin/template.json @@ -0,0 +1,68 @@ +[ +{% for doc in docs %} +{ +"name": {{ doc['name'] | jsonify }}, +{% set bbox = doc['bbox'][9:-1].split(',') %} +"bbox": { +"maxx": {{ bbox[1] }}, +"maxy": {{ bbox[2] }}, +"minx": {{ bbox[0] }}, +"miny": {{ bbox[3] }} +}, +"polygon": [ +{% if doc['polygon'].startswith('POLYGON') %} +[ +{% set points = doc['polygon'][9:-2].split(',') %} +{% for pt in points %} +[ +{{ pt.replace(' ', ',') }} +] +{% if not loop.last %} +, +{% endif %} +{% endfor %} +] +{% else %} +{% set polygons = doc['polygon'][16:-3].split(')), ((') %} +{% for polygon in polygons %} +[ +{% set points = polygon.split(', ') %} +{% for pt in points %} +[ +{{ pt.replace(' ', ',') }} +] +{% if not loop.last %} +, +{% endif %} +{% endfor %} +] +{% if not loop.last %} +, +{% endif %} +{% endfor %} +{% endif %} +], +"esri": {{ doc['esri'] | jsonify }}, +"articCode": {{ doc['articCode'] }}, +"subContinentName": {{ doc['subContinentName'] | jsonify }}, +"color": {{ doc['color'] }}, +"seaName": {{ doc['seaName'] | jsonify }}, +"seaBasinCode": {{ doc['seaBasinCode'] }}, +"basinArea": {{ doc['basinArea'] }}, +"basinOrder": {{ doc['basinOrder'] }}, +"oceanCode": {{ doc['oceanCode'] }}, +"symbolFLD": {{ doc['symbolFLD'] | jsonify }}, +"basinLength": {{ doc['basinLength'] }}, +"seaCode": {{ doc['seaCode'] }}, +"oceanName": {{ doc['oceanName'] | jsonify }}, +"up6": {{ doc['up6'] | jsonify }}, +"subContinentCode": {{ doc['subContinentCode'] }}, +"hydro": {{ doc['hydro'] | jsonify }}, +"seaBasinName": {{ doc['seaBasinName'] | jsonify }}, +"id": {{ doc['id'] }} +} +{% if not loop.last %} +, +{% endif %} +{% endfor %} +]
