You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sdap.apache.org by le...@apache.org on 2017/10/27 22:41:48 UTC

[11/15] incubator-sdap-edge git commit: SDAP-1 Import all code under the SDAP SGA

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/dataset/gcmd/dif_template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/gcmd/dif_template.xml b/src/main/python/plugins/dataset/gcmd/dif_template.xml
new file mode 100644
index 0000000..1352024
--- /dev/null
+++ b/src/main/python/plugins/dataset/gcmd/dif_template.xml
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DIF xmlns="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/ http://gcmd.nasa.gov/Aboutus/xml/dif/dif_v9.8.2.xsd">
+{% if doc %}
+<Entry_ID>{{ Entry_ID }}</Entry_ID>
+<Entry_Title>{{ Entry_Title }}</Entry_Title>
+{% for citation in Dataset_Citation %}
+<Data_Set_Citation>
+<Dataset_Creator>{{ citation['Dataset_Creator'] }}</Dataset_Creator>
+<Dataset_Title>{{ citation['Dataset_Title'] }}</Dataset_Title>
+{% if citation['Dataset_Series_Name'].strip() %}
+<Dataset_Series_Name>{{ citation['Dataset_Series_Name'] }}</Dataset_Series_Name>
+{% endif %}
+{% if citation['Dataset_Release_Date'].strip() %}
+<Dataset_Release_Date>{{ citation['Dataset_Release_Date'] }}</Dataset_Release_Date>
+{% endif %}
+{% if citation['Dataset_Release_Place'].strip() %}
+<Dataset_Release_Place>{{ citation['Dataset_Release_Place'] }}</Dataset_Release_Place>
+{% endif %}
+{% if citation['Dataset_Publisher'].strip() %}
+<Dataset_Publisher>{{ citation['Dataset_Publisher'] }}</Dataset_Publisher>
+{% endif %}
+<Version>{{ citation['Version'] }}</Version>
+{% if citation['Other_Citation_Details'].strip() %}
+<Other_Citation_Details>{{ citation['Other_Citation_Details'] }}</Other_Citation_Details>
+{% endif %}
+{% if citation['Online_Resource'].strip() %}
+<Online_Resource>{{ citation['Online_Resource'] }}</Online_Resource>
+{% endif %}
+</Data_Set_Citation>
+{% endfor %}
+{% for personnel in Personnel %}
+<Personnel>
+<Role>{{ personnel['Role'] }}</Role>
+<First_Name>{{ personnel['First_Name'] }}</First_Name>
+{% if personnel['Middle_Name'] != 'none' and personnel['Middle_Name'].strip() %}
+<Middle_Name>{{ personnel['Middle_Name'] }}</Middle_Name>
+{% endif %}
+<Last_Name>{{ personnel['Last_Name'] }}</Last_Name>
+<Email>{{ personnel['Email'] }}</Email>
+{% if personnel['Phone'].strip() %}
+<Phone>{{ personnel['Phone'] }}</Phone>
+{% endif %}
+{% if personnel['Fax'].strip() %}
+<Fax>{{ personnel['Fax'] }}</Fax>
+{% endif %}
+</Personnel>
+{% endfor %}
+<Personnel>
+<Role>DIF AUTHOR</Role>
+<First_Name>{{ author['firstname'] }}</First_Name>
+<Last_Name>{{ author['lastname'] }}</Last_Name>
+<Email>{{ author['email'] }}</Email>
+</Personnel>
+{% for parameter in Parameters %}
+<Parameters>
+<Category>{{ parameter['Category'] }}</Category>
+<Topic>{{ parameter['Topic'] }}</Topic>
+<Term>{{ parameter['Term'] }}</Term>
+<Variable_Level_1>{{ parameter['Variable_Level_1'] }}</Variable_Level_1>
+{% if parameter['Detailed_Variable'].strip() %}
+<Detailed_Variable>{{ parameter['Detailed_Variable'] }}</Detailed_Variable>
+{% endif %}
+</Parameters>
+{% endfor %}
+<ISO_Topic_Category>Oceans</ISO_Topic_Category>
+<ISO_Topic_Category>Geoscientific Information</ISO_Topic_Category>
+{% for i in UniqueDatasetSensor %}
+<Sensor_Name>
+<Short_Name>{{ doc['DatasetSource-Sensor-ShortName'][i] }}</Short_Name>
+{% if doc['DatasetSource-Sensor-LongName'][i].strip() %}
+<Long_Name>{{ doc['DatasetSource-Sensor-LongName'][i] }}</Long_Name>
+{% endif %}
+</Sensor_Name>
+{% endfor %}
+{% for i in UniqueDatasetSource %}
+<Source_Name>
+<Short_Name>{{ doc['DatasetSource-Source-ShortName'][i] }}</Short_Name>
+{% if doc['DatasetSource-Source-LongName'][i].strip() %}
+<Long_Name>{{ doc['DatasetSource-Source-LongName'][i] }}</Long_Name>
+{% endif %}
+</Source_Name>
+{% endfor %}
+<Temporal_Coverage>
+<Start_Date>{{ Start_Date }}</Start_Date>
+{% if Stop_Date %}
+<Stop_Date>{{ Stop_Date }}</Stop_Date>
+{% endif %}
+</Temporal_Coverage>
+<Spatial_Coverage>
+{% if doc['DatasetCoverage-SouthLat'][0].strip() %}
+<Southernmost_Latitude>{{ doc['DatasetCoverage-SouthLat'][0] }}</Southernmost_Latitude>
+{% endif %}
+{% if doc['DatasetCoverage-NorthLat'][0].strip() %}
+<Northernmost_Latitude>{{ doc['DatasetCoverage-NorthLat'][0] }}</Northernmost_Latitude>
+{% endif %}
+{% if doc['DatasetCoverage-WestLon'][0].strip() %}
+<Westernmost_Longitude>{{ doc['DatasetCoverage-WestLon'][0] }}</Westernmost_Longitude>
+{% endif %}
+{% if doc['DatasetCoverage-EastLon'][0].strip() %}
+<Easternmost_Longitude>{{ doc['DatasetCoverage-EastLon'][0] }}</Easternmost_Longitude>
+{% endif %}
+{% if doc['DatasetCoverage-MinAltitude'][0].strip() %}
+<Minimum_Altitude>{{ doc['DatasetCoverage-MinAltitude'][0] }}</Minimum_Altitude>
+{% endif %}
+{% if doc['DatasetCoverage-MaxAltitude'][0].strip() %}
+<Maximum_Altitude>{{ doc['DatasetCoverage-MaxAltitude'][0] }}</Maximum_Altitude>
+{% endif %}
+{% if doc['DatasetCoverage-MinDepth'][0].strip() %}
+<Minimum_Depth>{{ doc['DatasetCoverage-MinDepth'][0] }}</Minimum_Depth>
+{% endif %}
+{% if doc['DatasetCoverage-MaxDepth'][0].strip() %}
+<Maximum_Depth>{{ doc['DatasetCoverage-MaxDepth'][0] }}</Maximum_Depth>
+{% endif %}
+</Spatial_Coverage>
+<Location>
+<Location_Category>Geographic Region</Location_Category>
+{% if 'DatasetRegion-Region' in doc %}
+<Location_Type>{{ doc['DatasetRegion-Region'][0] }}</Location_Type>
+{% endif %}
+</Location>
+<Data_Resolution>
+{% if doc['Dataset-LatitudeResolution'][0].strip() %}
+<Latitude_Resolution>{{ doc['Dataset-LatitudeResolution'][0] }}</Latitude_Resolution>
+{% endif %}
+{% if doc['Dataset-LongitudeResolution'][0].strip() %}
+<Longitude_Resolution>{{ doc['Dataset-LongitudeResolution'][0] }}</Longitude_Resolution>
+{% endif %}
+{% if doc['Dataset-HorizontalResolutionRange'][0].strip() %}
+<Horizontal_Resolution_Range>{{ doc['Dataset-HorizontalResolutionRange'][0] }}</Horizontal_Resolution_Range>
+{% endif %}
+{% if doc['Dataset-TemporalResolution'][0].strip() %}
+<Temporal_Resolution>{{ doc['Dataset-TemporalResolution'][0] }}</Temporal_Resolution>
+{% endif %}
+{% if doc['Dataset-TemporalResolutionRange'][0].strip() %}
+<Temporal_Resolution_Range>{{ doc['Dataset-TemporalResolutionRange'][0] }}</Temporal_Resolution_Range>
+{% endif %}
+</Data_Resolution>
+{% for project in Project %}
+<Project>
+<Short_Name>{{ project['Short_Name'] }}</Short_Name>
+<Long_Name>{{ project['Long_Name'] }}</Long_Name>
+</Project>
+{% endfor %}
+<Access_Constraints>{{ doc['DatasetPolicy-AccessConstraint'][0] }}</Access_Constraints>
+<Use_Constraints>{{ doc['DatasetPolicy-UseConstraint'][0] }}</Use_Constraints>
+<Data_Set_Language>English</Data_Set_Language>
+{% if doc['Dataset-OriginalProvider'][0].strip() %}
+<Originating_Center>{{ doc['Dataset-OriginalProvider'][0] }}</Originating_Center>
+{% endif %}
+{% macro buildDataCenter(dataCenter) %}
+<Data_Center>
+<Data_Center_Name>
+<Short_Name>{{ dataCenter['shortname'] }}</Short_Name>
+<Long_Name>{{ dataCenter['longname'] }}</Long_Name>
+</Data_Center_Name>
+<Data_Center_URL>{{ dataCenter['url'] }}</Data_Center_URL>
+<Personnel>
+<Role>Data Center Contact</Role>
+<First_Name>{{ dataCenter['firstname'] }}</First_Name>
+<Last_Name>{{ dataCenter['lastname'] }}</Last_Name>
+<Email>{{ dataCenter['email'] }}</Email>
+</Personnel>
+</Data_Center>
+{% endmacro %}
+{% if doc['DatasetPolicy-AccessType'][0] != 'REMOTE' %}
+{{ buildDataCenter(podaac) }}
+{% if doc['DatasetProject-Project-ShortName'][0] == 'GHRSST' and doc['DatasetPolicy-DataClass'][0] == 'ROLLING-STORE' %}
+{{ buildDataCenter(nodc) }}
+{% endif %}
+{% else %}
+<Data_Center>
+<Data_Center_Name>
+<Short_Name>{{ doc['Dataset-Provider-ShortName'][0] }}</Short_Name>
+<Long_Name>{{ doc['Dataset-Provider-LongName'][0] }}</Long_Name>
+</Data_Center_Name>
+{% if 'Dataset-Provider-ProviderResource-Path' in doc %}
+<Data_Center_URL>{{ doc['Dataset-Provider-ProviderResource-Path'][0] }}</Data_Center_URL>
+{% endif %}
+{% if doc['Dataset-ProviderDatasetName'][0].strip() %}
+<Data_Set_ID>{{ doc['Dataset-ProviderDatasetName'][0] }}</Data_Set_ID>
+{% endif %}
+{% if Provider_Personnel %}
+<Personnel>
+<Role>Data Center Contact</Role>
+<First_Name>{{ Provider_Personnel['First_Name'] }}</First_Name>
+{% if Provider_Personnel['Middle_Name'] != 'none' and Provider_Personnel['Middle_Name'].strip() %}
+<Middle_Name>{{ Provider_Personnel['Middle_Name'] }}</Middle_Name>
+{% endif %}
+<Last_Name>{{ Provider_Personnel['Last_Name'] }}</Last_Name>
+<Email>{{ Provider_Personnel['Email'] }}</Email>
+{% if Provider_Personnel['Phone'].strip() %}
+<Phone>{{ Provider_Personnel['Phone'] }}</Phone>
+{% endif %}
+{% if Provider_Personnel['Fax'].strip() %}
+<Fax>{{ Provider_Personnel['Fax'] }}</Fax>
+{% endif %}
+</Personnel>
+{% endif %}
+</Data_Center>
+{% endif %}
+{% if doc['Dataset-Reference'][0].strip() %}
+<Reference>{{ doc['Dataset-Reference'][0] }}</Reference>
+{% endif %}
+<Summary>
+<Abstract>{{ doc['Dataset-Description'][0] }}</Abstract>
+</Summary>
+<IDN_Node>
+<Short_Name>USA/NASA</Short_Name>
+</IDN_Node>
+<Metadata_Name>CEOS IDN DIF</Metadata_Name>
+<Metadata_Version>9.8</Metadata_Version>
+<DIF_Creation_Date>{{ DIF_Creation_Date }}</DIF_Creation_Date>
+<Last_DIF_Revision_Date>{{ Last_DIF_Revision_Date }}</Last_DIF_Revision_Date>
+<DIF_Revision_History>{{ DIF_Revision_History }}</DIF_Revision_History>
+{% endif %}
+</DIF>

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/dataset/gcmd/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/gcmd/plugin.conf b/src/main/python/plugins/dataset/gcmd/plugin.conf
new file mode 100644
index 0000000..07ff23f
--- /dev/null
+++ b/src/main/python/plugins/dataset/gcmd/plugin.conf
@@ -0,0 +1,32 @@
+[solr]
+datasetUrl=http://localhost:8983/solr.war/dataset
+entriesPerPage=7
+
+[portal]
+datasetUrl=http://localhost:8000/drupal/dataset
+
+[service]
+url=http://localhost:8890
+host=localhost:8890
+template=dif_template.xml
+
+[author]
+firstName=PO.DAAC
+lastName=User Services
+email=podaac@podaac.jpl.nasa.gov
+
+[podaac]
+shortName=NASA/JPL/PODAAC
+longName=Physical Oceanography Distributed Active Archive Center, Jet Propulsion Laboratory, NASA
+firstName=PO.DAAC
+lastName=User Services
+email=podaac@podaac.jpl.nasa.gov
+url=http://podaac.jpl.nasa.gov/
+
+[nodc]
+shortName=DOC/NOAA/NESDIS/NODC
+longName=National Oceanographic Data Center, NESDIS, NOAA, U.S. Department of Commerce
+firstName=NODC
+lastName=User Services
+email=NODC.Services@noaa.gov
+url=http://www.nodc.noaa.gov/

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/dataset/iso/IsoWriter.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/iso/IsoWriter.py b/src/main/python/plugins/dataset/iso/IsoWriter.py
new file mode 100644
index 0000000..a93bd76
--- /dev/null
+++ b/src/main/python/plugins/dataset/iso/IsoWriter.py
@@ -0,0 +1,28 @@
+import logging
+import os
+import os.path
+import codecs
+
+from edge.opensearch.datasetisoresponse import DatasetIsoResponse
+from edge.opensearch.datasetwriter import DatasetWriter
+
+class IsoWriter(DatasetWriter):
+    def __init__(self, configFilePath):
+        super(IsoWriter, 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 = DatasetIsoResponse()
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _readTemplate(self, path):
+        file = codecs.open(path, encoding='utf-8')
+        data = file.read()
+        file.close()
+
+        return data

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/dataset/iso/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/iso/__init__.py b/src/main/python/plugins/dataset/iso/__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/dataset/iso/iso_template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/iso/iso_template.xml b/src/main/python/plugins/dataset/iso/iso_template.xml
new file mode 100644
index 0000000..3c40854
--- /dev/null
+++ b/src/main/python/plugins/dataset/iso/iso_template.xml
@@ -0,0 +1,587 @@
+<?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">
+{% if doc %}
+<gmd:composedOf gco:nilReason="inapplicable" />
+<gmd:seriesMetadata>
+<gmi:MI_Metadata id="{{ doc['Dataset-ShortName'][0] }}">
+<gmd:fileIdentifier>
+<gco:CharacterString>{{ doc['Dataset-ShortName'][0] }}</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>
+<gmd:contact>
+<gmd:CI_ResponsibleParty id="seriesMetadataContact">
+<gmd:individualName>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-FirstName'][0] }}{% if doc['DatasetContact-Contact-MiddleName'][0] != 'none' %} {{ doc['DatasetContact-Contact-MiddleName'][0] }}{% endif %} {{ doc['DatasetContact-Contact-LastName'][0] }}</gco:CharacterString>
+</gmd:individualName>
+<gmd:organisationName>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Provider-ShortName'][0] }} &gt; {{ doc['DatasetContact-Contact-Provider-LongName'][0] }}</gco:CharacterString>
+</gmd:organisationName>
+<gmd:positionName>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Role'][0] }}</gco:CharacterString>
+</gmd:positionName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:phone>
+<gmd:CI_Telephone>
+<gmd:voice>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Phone'][0] }}</gco:CharacterString>
+</gmd:voice>
+<gmd:facsimile>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Fax'][0] }}</gco:CharacterString>
+</gmd:facsimile>
+</gmd:CI_Telephone>
+</gmd:phone>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:electronicMailAddress>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Email'][0] }}</gco:CharacterString>
+</gmd:electronicMailAddress>
+</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>
+</gmd:contact>
+<gmd:dateStamp>
+<gco:Date>{{ DateStamp }}</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>
+<gmd:title>
+<gco:CharacterString>{{ doc['Dataset-LongName'][0] }}</gco:CharacterString>
+</gmd:title>
+<gmd:alternateTitle>
+<gco:CharacterString>{{ doc['DatasetCitation-Title'][0] }}</gco:CharacterString>
+</gmd:alternateTitle>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>{{ DatasetCitation_ReleaseDate }}</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>
+<gmd:edition>
+<gco:CharacterString>{{ doc['DatasetCitation-Version'][0] }}</gco:CharacterString>
+</gmd:edition>
+<gmd:citedResponsibleParty>
+<gmd:CI_ResponsibleParty>
+<gmd:individualName>
+<gco:CharacterString>{{ doc['DatasetCitation-Creator'][0] }}</gco:CharacterString>
+</gmd:individualName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+{% if (doc['DatasetCitation-OnlineResource'][0] | trim)[0:4] == 'http' or (doc['DatasetCitation-OnlineResource'][0] | trim)[0:3] == 'ftp' %}
+<gmd:onlineResource>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>{{ doc['DatasetCitation-OnlineResource'][0] }}</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>
+</gmd:citedResponsibleParty>
+<gmd:citedResponsibleParty>
+<gmd:CI_ResponsibleParty>
+<gmd:organisationName>
+<gco:CharacterString>{{ doc['DatasetCitation-Publisher'][0] }}</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:city>
+<gco:CharacterString>{{ doc['DatasetCitation-ReleasePlace'][0] }}</gco:CharacterString>
+</gmd:city>
+</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>
+</gmd:citedResponsibleParty>
+</gmd:CI_Citation>
+</gmd:citation>
+<gmd:abstract>
+<gco:CharacterString>{{ doc['Dataset-Description'][0] }}</gco:CharacterString>
+</gmd:abstract>
+<gmd:credit>
+<gco:CharacterString>{{ doc['DatasetCitation-CitationDetail'][0] }}</gco:CharacterString>
+</gmd:credit>
+<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>
+<gmd:pointOfContact>
+<gmd:CI_ResponsibleParty>
+<gmd:individualName>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-FirstName'][0] }}{% if doc['DatasetContact-Contact-MiddleName'][0] != 'none' %} {{ doc['DatasetContact-Contact-MiddleName'][0] }}{% endif %} {{ doc['DatasetContact-Contact-LastName'][0] }}</gco:CharacterString>
+</gmd:individualName>
+<gmd:organisationName>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Provider-ShortName'][0] }} &gt; {{ doc['DatasetContact-Contact-Provider-LongName'][0] }}</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:phone>
+<gmd:CI_Telephone>
+<gmd:voice>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Phone'][0] }}</gco:CharacterString>
+</gmd:voice>
+<gmd:facsimile>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Fax'][0] }}</gco:CharacterString>
+</gmd:facsimile>
+</gmd:CI_Telephone>
+</gmd:phone>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:electronicMailAddress>
+<gco:CharacterString>{{ doc['DatasetContact-Contact-Email'][0] }}</gco:CharacterString>
+</gmd:electronicMailAddress>
+</gmd:CI_Address>
+</gmd:address>
+{% if (doc['DatasetCitation-OnlineResource'][0] | trim)[0:4] == 'http' or (doc['DatasetCitation-OnlineResource'][0] | trim)[0:3] == 'ftp' %}
+<gmd:onlineResource>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>{{ doc['DatasetCitation-OnlineResource'][0] }}</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>
+</gmd:pointOfContact>
+<gmd:resourceFormat>
+<gmd:MD_Format id="resourceFormat">
+<gmd:name>
+<gco:CharacterString>{{ doc['DatasetPolicy-DataFormat'][0] }}</gco:CharacterString>
+</gmd:name>
+<gmd:version>
+<gco:CharacterString>{{ DatasetPolicy_DataFormat_Version }}</gco:CharacterString>
+</gmd:version>
+<gmd:fileDecompressionTechnique>
+<gco:CharacterString>{{ doc['DatasetPolicy-CompressType'][0] }}</gco:CharacterString>
+</gmd:fileDecompressionTechnique>
+</gmd:MD_Format>
+</gmd:resourceFormat>
+{% for i in range(doc['DatasetParameter-Category']|count) %}
+<gmd:descriptiveKeywords>
+<gmd:MD_Keywords>
+<gmd:keyword>
+<gco:CharacterString>{{ doc['DatasetParameter-Category'][i] }} &gt; {{ doc['DatasetParameter-Topic'][i] }} &gt; {{ doc['DatasetParameter-Term'][i] }} &gt; {{ doc['DatasetParameter-Variable'][i] }}{% if doc['DatasetParameter-VariableDetail'][i] != ''  %} &gt; {{ doc['DatasetParameter-VariableDetail'][i] }}{% endif %}</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 %}
+<gmd:descriptiveKeywords>
+<gmd:MD_Keywords>
+<gmd:keyword>
+<gco:CharacterString>{{ doc['DatasetRegion-Region'][0] }}</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>
+<gmd:resourceConstraints>
+<gmd:MD_LegalConstraints>
+<gmd:useLimitation>
+<gco:CharacterString>{{ doc['DatasetPolicy-UseConstraint'][0] }}</gco:CharacterString>
+</gmd:useLimitation>
+<gmd:otherConstraints>
+<gco:CharacterString>{{ doc['DatasetPolicy-AccessConstraint'][0] }}</gco:CharacterString>
+</gmd:otherConstraints>
+</gmd:MD_LegalConstraints>
+</gmd:resourceConstraints>
+<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>
+<gmd:extent>
+<gmd:EX_Extent id="boundingExtent">
+<gmd:geographicElement>
+<gmd:EX_GeographicBoundingBox id="boundingBox">
+<gmd:extentTypeCode>
+<gco:Boolean>true</gco:Boolean>
+</gmd:extentTypeCode>
+<gmd:westBoundLongitude>
+<gco:Decimal>{{ doc['DatasetCoverage-WestLon'][0] }}</gco:Decimal>
+</gmd:westBoundLongitude>
+<gmd:eastBoundLongitude>
+<gco:Decimal>{{ doc['DatasetCoverage-EastLon'][0] }}</gco:Decimal>
+</gmd:eastBoundLongitude>
+<gmd:southBoundLatitude>
+<gco:Decimal>{{ doc['DatasetCoverage-SouthLat'][0] }}</gco:Decimal>
+</gmd:southBoundLatitude>
+<gmd:northBoundLatitude>
+<gco:Decimal>{{ doc['DatasetCoverage-NorthLat'][0] }}</gco:Decimal>
+</gmd:northBoundLatitude>
+</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">
+<beginPosition>{{ DatasetCoverage_StartTime }}</beginPosition>
+<endPosition>{{ DatasetCoverage_StopTime }}</endPosition>
+</TimePeriod>
+</gmd:extent>
+</gmd:EX_TemporalExtent>
+</gmd:temporalElement>
+<gmd:verticalElement gco:nilReason="inapplicable"/>
+</gmd:EX_Extent>
+</gmd:extent>
+</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>PO.DAAC User Services</gco:CharacterString>
+</gmd:individualName>
+<gmd:organisationName>
+<gco:CharacterString>NASA/JPL/PODAAC &gt; Physical Oceanography Distributed Active Archive Center, 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>podaac@podaac.jpl.nasa.gov</gco:CharacterString>
+</gmd:electronicMailAddress>
+</gmd:CI_Address>
+</gmd:address>
+<gmd:onlineResource>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>http://podaac.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>
+{% for i in range(doc['DatasetResource-Path']|count) if doc['DatasetResource-Type'][i] != 'Thumbnail' %}
+<gmd:transferOptions>
+<gmd:MD_DigitalTransferOptions>
+<gmd:onLine>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>{{ doc['DatasetResource-Path'][i] }}</gmd:URL>
+</gmd:linkage>
+<gmd:name>
+<gco:CharacterString>{{ doc['DatasetResource-Name'][i] }}</gco:CharacterString>
+</gmd:name>
+<gmd:description>
+<gco:CharacterString>{{ doc['DatasetResource-Description'][i] }}</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:onLine>
+</gmd:MD_DigitalTransferOptions>
+</gmd:transferOptions>
+{% endfor %}
+</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>
+{% for i in UniqueDatasetSensor %}
+<gmi:instrument>
+<gmi:MI_Instrument>
+<gmi:identifier>
+<gmd:MD_Identifier>
+<gmd:code>
+<gco:CharacterString>{{ doc['DatasetSource-Sensor-ShortName'][i] }} &gt; {{ doc['DatasetSource-Sensor-LongName'][i] }}</gco:CharacterString>
+</gmd:code>
+</gmd:MD_Identifier>
+</gmi:identifier>
+<gmi:type>
+<gco:CharacterString>sensor</gco:CharacterString>
+</gmi:type>
+<gmi:description>
+<gco:CharacterString>{{ doc['DatasetSource-Sensor-Description'][i] }}</gco:CharacterString>
+</gmi:description>
+</gmi:MI_Instrument>
+</gmi:instrument>
+{% endfor %}
+{% for i in UniqueDatasetSource %}
+<gmi:platform>
+<gmi:MI_Platform>
+<gmi:identifier>
+<gmd:MD_Identifier>
+<gmd:code>
+<gco:CharacterString>{{ doc['DatasetSource-Source-ShortName'][i] }} &gt; {{ doc['DatasetSource-Source-LongName'][i] }}</gco:CharacterString>
+</gmd:code>
+</gmd:MD_Identifier>
+</gmi:identifier>
+<gmi:description>
+<gco:CharacterString>{{ doc['DatasetSource-Source-Description'][i] }}</gco:CharacterString>
+</gmi:description>
+<gmi:sponsor>
+<gmd:CI_ResponsibleParty>
+<gmd:organisationName>
+<gco:CharacterString>{{ doc['DatasetCitation-Creator'][0] }}</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+{% if (doc['DatasetCitation-OnlineResource'][0] | trim)[0:4] == 'http' or (doc['DatasetCitation-OnlineResource'][0] | trim)[0:3] == 'ftp' %}
+<gmd:onlineResource>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>{{ doc['DatasetCitation-OnlineResource'][0] }}</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/PODAAC &gt; Physical Oceanography Distributed Active Archive Center, Jet Propulsion Laboratory, NASA</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:onlineResource>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>http://podaac.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="{{ doc['DatasetSource-Source-ShortName'][i] }}"/>
+</gmi:MI_Platform>
+</gmi:platform>
+{% endfor %}
+</gmi:MI_AcquisitionInformation>
+</gmi:acquisitionInformation>
+</gmi:MI_Metadata>
+</gmd:seriesMetadata>
+{% endif %}
+</gmd:DS_Series>

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/dataset/iso/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/iso/plugin.conf b/src/main/python/plugins/dataset/iso/plugin.conf
new file mode 100644
index 0000000..41e5e71
--- /dev/null
+++ b/src/main/python/plugins/dataset/iso/plugin.conf
@@ -0,0 +1,11 @@
+[solr]
+datasetUrl=http://localhost:8983/solr.war/dataset
+entriesPerPage=7
+
+[portal]
+datasetUrl=http://localhost:8000/drupal/dataset
+
+[service]
+url=http://localhost:8890
+host=localhost:8890
+template=iso_template.xml

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/dataset/rss/RssWriter.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/rss/RssWriter.py b/src/main/python/plugins/dataset/rss/RssWriter.py
new file mode 100644
index 0000000..3724528
--- /dev/null
+++ b/src/main/python/plugins/dataset/rss/RssWriter.py
@@ -0,0 +1,18 @@
+import logging
+
+from edge.opensearch.datasetrssresponse import DatasetRssResponse
+from edge.opensearch.datasetwriter import DatasetWriter
+
+class RssWriter(DatasetWriter):
+    def __init__(self, configFilePath):
+        super(RssWriter, self).__init__(configFilePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, searchParams, pretty):
+        response = DatasetRssResponse(self._configuration.get('portal', 'datasetUrl'), self._configuration.get('service', 'url'), self.datasets)
+
+        response.title = 'PO.DAAC Dataset Search Results'
+        response.description = 'Search result for "'+searchText+'"'
+        response.link = searchUrl
+        response.parameters = searchParams
+
+        return response.generate(solrResponse, pretty)

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/dataset/rss/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/rss/__init__.py b/src/main/python/plugins/dataset/rss/__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/dataset/rss/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/dataset/rss/plugin.conf b/src/main/python/plugins/dataset/rss/plugin.conf
new file mode 100644
index 0000000..eccb70e
--- /dev/null
+++ b/src/main/python/plugins/dataset/rss/plugin.conf
@@ -0,0 +1,10 @@
+[solr]
+datasetUrl=http://localhost:8983/solr.war/dataset
+granuleUrl=http://localhost:8983/solr.war/granule
+entriesPerPage=7
+
+[portal]
+datasetUrl=http://localhost:8000/drupal/dataset
+
+[service]
+url=http://localhost:8890

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/example/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/example/__init__.py b/src/main/python/plugins/example/__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/example/elastic/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/example/elastic/Writer.py b/src/main/python/plugins/example/elastic/Writer.py
new file mode 100644
index 0000000..f02bda4
--- /dev/null
+++ b/src/main/python/plugins/example/elastic/Writer.py
@@ -0,0 +1,45 @@
+import logging
+import os
+import os.path
+import urllib
+
+from edge.writer.estemplateresponsewriter import ESTemplateResponseWriter
+from edge.response.estemplateresponse import ESTemplateResponse
+
+class Writer(ESTemplateResponseWriter):
+    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 = ESTemplateResponse(searchUrl, searchParams, self._configuration.getint('solr', 'entriesPerPage'))
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructQuery(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))
+        if len(queries) == 0:
+            queries.append('*')
+
+        query = 'q='+'+AND+'.join(queries)+'&from='+str(startIndex)+'&size='+str(entriesPerPage)
+
+        if len(filterQueries) > 0:
+            query += '&fq='+'+AND+'.join(filterQueries)
+
+        if sort is not None:
+            query += '&sort=' + sort
+
+        logging.debug('elasticsearch query: '+query)
+
+        return query

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/example/elastic/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/example/elastic/__init__.py b/src/main/python/plugins/example/elastic/__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/example/elastic/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/example/elastic/plugin.conf b/src/main/python/plugins/example/elastic/plugin.conf
new file mode 100644
index 0000000..06950a7
--- /dev/null
+++ b/src/main/python/plugins/example/elastic/plugin.conf
@@ -0,0 +1,12 @@
+[solr]
+datasetUrl=http://localhost:9200/example
+entriesPerPage=10
+maxEntriesPerPage=2000
+defaultSearchParam=keyword
+parameters=keyword
+facets={}
+sortKeys={}
+
+[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/example/elastic/template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/example/elastic/template.xml b/src/main/python/plugins/example/elastic/template.xml
new file mode 100755
index 0000000..bddd11e
--- /dev/null
+++ b/src/main/python/plugins/example/elastic/template.xml
@@ -0,0 +1,35 @@
+<?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>support@echo.nasa.gov</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['_id'] }}</id>
+<dc:identifier>{{ doc['ShortName'] }}</dc:identifier>
+<author>
+<name>ECHO</name>
+<email>support@echo.nasa.gov</email>
+</author>
+<title type="text">{{ doc['LongName'] }}</title>
+<summary type="text">{{ doc['Description'] }}</summary>
+<updated>{{ doc['LastUpdate'] }}</updated>
+</entry>
+{% endfor %}
+</feed>

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/example/json/JsonWriter.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/example/json/JsonWriter.py b/src/main/python/plugins/example/json/JsonWriter.py
new file mode 100644
index 0000000..9fb87b6
--- /dev/null
+++ b/src/main/python/plugins/example/json/JsonWriter.py
@@ -0,0 +1,6 @@
+import requestresponder
+
+class JsonWriter(requestresponder.RequestResponder):
+    def get(self, requestHandler):
+        requestHandler.write('{"test": "aaa"}')
+        

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/example/json/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/example/json/__init__.py b/src/main/python/plugins/example/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/granule/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/__init__.py b/src/main/python/plugins/granule/__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/granule/atom/AtomWriter.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/atom/AtomWriter.py b/src/main/python/plugins/granule/atom/AtomWriter.py
new file mode 100644
index 0000000..b22f30f
--- /dev/null
+++ b/src/main/python/plugins/granule/atom/AtomWriter.py
@@ -0,0 +1,27 @@
+import logging
+import datetime
+
+from edge.opensearch.granuleatomresponse import GranuleAtomResponse
+from edge.opensearch.granulewriter import GranuleWriter
+
+class AtomWriter(GranuleWriter):
+    
+    def __init__(self, configFilePath):
+        super(AtomWriter, self).__init__(configFilePath, [['datasetId', 'shortName']])
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, searchParams, pretty):
+        response = GranuleAtomResponse(
+            self._configuration.get('service', 'linkToGranule'),
+            self._configuration.get('service', 'host'),
+            self._configuration.get('service', 'url')
+        )
+
+        response.title = 'PO.DAAC Granule Search Results'
+        #response.description = 'Search result for "'+searchText+'"'
+        response.link = searchUrl
+        response.authors.append('PO.DAAC Granule Search Service')
+        response.updated = datetime.datetime.utcnow().isoformat()+'Z'
+        response.id = 'tag:'+self._configuration.get('service', 'host')+','+datetime.datetime.utcnow().date().isoformat()
+        response.parameters = searchParams
+
+        return response.generate(solrResponse, pretty) 

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/atom/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/atom/__init__.py b/src/main/python/plugins/granule/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/granule/atom/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/atom/plugin.conf b/src/main/python/plugins/granule/atom/plugin.conf
new file mode 100644
index 0000000..3f14b5f
--- /dev/null
+++ b/src/main/python/plugins/granule/atom/plugin.conf
@@ -0,0 +1,12 @@
+[solr]
+datasetUrl=http://localhost:8983/solr.war/dataset
+granuleUrl=http://localhost:8983/solr.war/granule
+entriesPerPage=7
+
+[service]
+url=http://localhost:8890
+linkToGranule=LOCAL-FTP,REMOTE-FTP
+host=localhost:8890
+database=podaac_dev/podaac$dev@DAACDEV
+l2=http://biaxin.jpl.nasa.gov/ws/search/granule
+bbox=l2

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/datacasting/DatacastingWriter.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/datacasting/DatacastingWriter.py b/src/main/python/plugins/granule/datacasting/DatacastingWriter.py
new file mode 100644
index 0000000..c7ae490
--- /dev/null
+++ b/src/main/python/plugins/granule/datacasting/DatacastingWriter.py
@@ -0,0 +1,39 @@
+import logging
+import os
+import os.path
+import time
+
+from edge.opensearch.granuledatacastingresponse import GranuleDatacastingResponse
+from edge.opensearch.datasetgranulewriter import DatasetGranuleWriter
+
+class DatacastingWriter(DatasetGranuleWriter):
+    def __init__(self, configFilePath):
+        super(DatacastingWriter, self).__init__(configFilePath, [['datasetId', 'shortName']])
+        
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+        self.variables['sortBy'] = 'archiveTimeDesc'
+        self.variables['archiveTime'] = int(round(time.time() * 1000)) - (int(self._configuration.get('solr', 'archivedWithin')) * 3600000)
+
+    def _generateOpenSearchResponse(self, solrGranuleResponse, solrDatasetResponse, pretty):
+        response = GranuleDatacastingResponse(
+            self._configuration.get('portal', 'datasetUrl'), 
+            self._configuration.get('service', 'linkToGranule'),
+            int(self._configuration.get('solr', 'archivedWithin'))
+        )
+        response.setTemplate(self.template)
+
+        return response.generate(solrDatasetResponse, solrGranuleResponse, pretty)
+
+    def _onSolrGranuleResponse(self, response):
+        if response.error:
+            self._handleException(str(response.error))
+        else:
+            self.solrGranuleResponse = response.body
+            params = {}
+            if ('datasetId' in self.variables):
+                params['datasetId'] = self.variables['datasetId']
+            if ('shortName' in self.variables):
+                params['shortName'] = self.variables['shortName']
+            self._getSingleSolrDatasetResponse(params, self._onSolrDatasetResponse)

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/datacasting/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/datacasting/__init__.py b/src/main/python/plugins/granule/datacasting/__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/granule/datacasting/datacasting_template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/datacasting/datacasting_template.xml b/src/main/python/plugins/granule/datacasting/datacasting_template.xml
new file mode 100644
index 0000000..0f1b639
--- /dev/null
+++ b/src/main/python/plugins/granule/datacasting/datacasting_template.xml
@@ -0,0 +1,58 @@
+{% if doc %}
+<?xml version="1.0" encoding="UTF-8"?>
+<rss xmlns:datacasting="http://datacasting.jpl.nasa.gov/datacasting" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" version="2.0">
+<channel>
+<title>{{ doc['Dataset-LongName'][0] }}</title>
+<link>{{ DatasetPortalPage }}</link>
+<description>{{ doc['Dataset-Description'][0] }}</description>
+<datacasting:channelUID>{{ doc['Dataset-PersistentId'][0] }}</datacasting:channelUID>
+{% if 'DatasetSource-Source-ShortName' in doc %}
+<datacasting:dataSource>{{ doc['DatasetSource-Source-ShortName'][0] }}/{{ doc['DatasetSource-Sensor-ShortName'][0] }}</datacasting:dataSource>
+{% endif %}
+{% if 'LOCAL-FTP' in doc['DatasetLocationPolicy-Type'] or 'REMOTE-FTP' in doc['DatasetLocationPolicy-Type'] %}
+<datacasting:customEltDef displayName="FTP URL" type="string" name="FTPURL"/>
+{% endif %}
+{% if 'LOCAL-OPENDAP' in doc['DatasetLocationPolicy-Type'] or 'REMOTE-OPENDAP' in doc['DatasetLocationPolicy-Type'] %}
+<datacasting:customEltDef displayName="OPeNDAP URL" type="string" name="OPeNDAPURL"/>
+{% endif %}
+<language>en-us</language>
+<copyright>Copyright {{ DatasetCitation_ReleaseYear }}</copyright>
+<managingEditor>PO.DAAC &lt;podaac@podaac.jpl.nasa.gov&gt;</managingEditor>
+<webMaster>admin@seastar.jpl.nasa.gov</webMaster>
+<pubDate>{{ PubDate }}</pubDate>
+<generator>PO.DAAC Oceanographic Common Search Interface</generator>
+<docs>http://datacasting.jpl.nasa.gov/datacasting.html</docs>
+{% for granule in granules %}
+<item>
+<title>{{ granule['Granule-Name'][0] }}</title>
+<link>{{ DatasetPortalPage }}</link>
+<datacasting:acquisitionStartDate>{{ granule['Granule-StartTimeLong'][0] }}</datacasting:acquisitionStartDate>
+<datacasting:acquisitionEndDate>{{ granule['Granule-StopTimeLong'][0] }}</datacasting:acquisitionEndDate>
+{% if 'LOCAL-FTP' in granule['GranuleReference']  %}
+<datacasting:customElement name="FTPURL" value="{{ granule['GranuleReference']['LOCAL-FTP'] }}"/>
+{% elif 'REMOTE-FTP' in granule['GranuleReference']  %}
+<datacasting:customElement name="FTPURL" value="{{ granule['GranuleReference']['REMOTE-FTP'] }}"/>
+{% endif %}
+{% if 'LOCAL-OPENDAP' in granule['GranuleReference']  %}
+<datacasting:customElement name="OPeNDAPURL" value="{{ granule['GranuleReference']['LOCAL-OPENDAP'] }}"/>
+{% elif 'REMOTE-OPENDAP' in granule['GranuleReference']  %}
+<datacasting:customElement name="OPeNDAPURL" value="{{ granule['GranuleReference']['REMOTE-OPENDAP'] }}"/>
+{% endif %}
+{% if 'GranuleSpatial-EastLon' in granule %}
+<georss:where>
+<gml:Envelope>
+<gml:lowerCorner>{{ granule['GranuleSpatial-SouthLat'][0] }} {{ granule['GranuleSpatial-WestLon'][0] }}</gml:lowerCorner>
+<gml:upperCorner>{{ granule['GranuleSpatial-NorthLat'][0] }} {{ granule['GranuleSpatial-EastLon'][0] }}</gml:upperCorner>
+</gml:Envelope>
+</georss:where>
+{% endif %}
+<enclosure url="{{ granule['GranuleLink'] }}" length="{{ granule['GranuleFileSize']['DATA'] }}" type="application/x-{{ doc['DatasetPolicy-DataFormat'][0].lower() }}"/>
+<description>{{ granule['Granule-Name'][0] }}</description>
+<guid isPermaLink="true">{{ granule['GranuleLink'] }}</guid>
+<pubDate>{{ granule['Granule-ArchiveTimeLong'][0] }}</pubDate>
+<source url="{{ DatasetPortalPage }}">{{ doc['Dataset-LongName'][0] }}</source>
+</item>
+{% endfor %}
+</channel>
+</rss>
+{% endif %}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/datacasting/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/datacasting/plugin.conf b/src/main/python/plugins/granule/datacasting/plugin.conf
new file mode 100644
index 0000000..defb5ef
--- /dev/null
+++ b/src/main/python/plugins/granule/datacasting/plugin.conf
@@ -0,0 +1,13 @@
+[solr]
+datasetUrl=http://localhost:8983/solr.war/dataset
+granuleUrl=http://localhost:8983/solr.war/granule
+entriesPerPage=5000
+archivedWithin=24
+
+[portal]
+datasetUrl=http://localhost:8000/drupal/dataset
+
+[service]
+url=http://localhost:8890
+linkToGranule=LOCAL-FTP,REMOTE-FTP
+template=datacasting_template.xml

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/fgdc/FgdcWriter.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/fgdc/FgdcWriter.py b/src/main/python/plugins/granule/fgdc/FgdcWriter.py
new file mode 100644
index 0000000..eb37d11
--- /dev/null
+++ b/src/main/python/plugins/granule/fgdc/FgdcWriter.py
@@ -0,0 +1,21 @@
+import logging
+import os
+import os.path
+import codecs
+
+from edge.opensearch.granulefgdcresponse import GranuleFgdcResponse
+from edge.opensearch.datasetgranulewriter import DatasetGranuleWriter
+
+class FgdcWriter(DatasetGranuleWriter):
+    def __init__(self, configFilePath):
+        super(FgdcWriter, self).__init__(configFilePath)
+        
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrGranuleResponse, solrDatasetResponse, pretty):
+        response = GranuleFgdcResponse()
+        response.setTemplate(self.template)
+
+        return response.generate(solrDatasetResponse, solrGranuleResponse, pretty)

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/fgdc/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/fgdc/__init__.py b/src/main/python/plugins/granule/fgdc/__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/granule/fgdc/fgdc_template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/fgdc/fgdc_template.xml b/src/main/python/plugins/granule/fgdc/fgdc_template.xml
new file mode 100644
index 0000000..4a4aa8a
--- /dev/null
+++ b/src/main/python/plugins/granule/fgdc/fgdc_template.xml
@@ -0,0 +1,510 @@
+{% if doc %}
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE metadata SYSTEM "http://www.fgdc.gov/metadata/fgdc-std-001-1998.dtd">
+<metadata>
+<idinfo>
+<citation>
+<citeinfo>
+<origin>{{ doc['DatasetCitation-Creator'][0] }}</origin>
+<pubdate>{{ DatasetCitation_ReleaseDate }}</pubdate>
+<pubtime>{{ DatasetCitation_ReleaseTime }}</pubtime>
+<title>{{ doc['DatasetCitation-Title'][0] }}</title>
+<edition>{{ doc['DatasetCitation-Version'][0] }}</edition>
+<serinfo>
+<sername>{{ doc['DatasetCitation-SeriesName'][0] }}</sername>
+<issue>Not specified</issue>
+</serinfo>
+<pubinfo>
+<pubplace>{{ doc['DatasetCitation-ReleasePlace'][0] }}</pubplace>
+<publish>{{ doc['DatasetCitation-Publisher'][0] }}</publish>
+</pubinfo>
+<onlink>{% if doc['DatasetCitation-OnlineResource'][0].strip() != '' %}{{ doc['DatasetCitation-OnlineResource'][0] }}{% else %}Not specified{% endif %}</onlink>
+</citeinfo>
+</citation>
+<descript>
+<abstract>{{ doc['Dataset-Description'][0] }}</abstract>
+<purpose>The Global Ocean Data Assimilation Experiment (GODAE) high-resolution sea surface temperature (GHRSST) project data.</purpose>
+<supplinf>Entry ID: {{ doc['Dataset-ShortName'][0] }} 
+Projection_Information: 
+Projection Type: {{ doc['Dataset-ProjectionType'][0] }} 
+Ellipsoid_Type: {{ doc['Dataset-EllipsoidType'][0] }} 
+Other Projection Details: {{ doc['Dataset-ProjectionDetail'][0] }} 
+Data Resolution: 
+Latitude resolution: {{ Dataset_LatitudeResolution }} 
+Longitude resolution: {{ Dataset_LongitudeResolution }} 
+The temporal resolution: {{ doc['Dataset-TemporalResolution'][0] }} 
+This metadata record was generated from an original data set description (DSD) record in DIF format: http://www.ghrsst-pp.org 
+Reference: {{ doc['Dataset-Reference'][0] }} 
+Sources: 
+
+{% for i in UniqueDatasetSource %}
+{{ doc['DatasetSource-Source-ShortName'][i] }} 
+{{ doc['DatasetSource-Source-LongName'][i] }} 
+{% endfor %}
+
+Sensors: 
+
+{% for i in UniqueDatasetSensor %}
+{{ doc['DatasetSource-Sensor-ShortName'][i] }} 
+{{ doc['DatasetSource-Sensor-LongName'][i] }} 
+{% endfor %}
+</supplinf>
+</descript>
+<timeperd>
+<timeinfo>
+<sngdate>
+<caldate>{{ DatasetCitation_ReleaseDateTime }}</caldate>
+<time>{{ DatasetCitation_ReleaseDateTime }}</time>
+</sngdate>
+</timeinfo>
+<current>{{ DatasetCitation_ReleaseDateTime }}</current>
+</timeperd>
+<status>
+<progress>Complete</progress>
+<update>As needed</update>
+</status>
+<spdom>
+<bounding>
+<westbc>{{ doc['DatasetCoverage-WestLon'][0] }}</westbc>
+<eastbc>{{ doc['DatasetCoverage-EastLon'][0] }}</eastbc>
+<northbc>{{ doc['DatasetCoverage-NorthLat'][0] }}</northbc>
+<southbc>{{ doc['DatasetCoverage-SouthLat'][0] }}</southbc>
+</bounding>
+</spdom>
+<keywords>
+<theme>
+<themekt>GCMD</themekt>
+<themekey>{{ doc['DatasetParameter-Category'][-1] }}</themekey>
+<themekey>{{ doc['DatasetParameter-Topic'][-1] }}</themekey>
+<themekey>{{ doc['DatasetParameter-Term'][-1] }}</themekey>
+<themekey>{{ doc['DatasetParameter-Variable'][-1] }}</themekey>
+</theme>
+<theme>
+<themekt>None</themekt>
+{% for i in UniqueDatasetSensor %}
+<themekey>{{ doc['DatasetSource-Sensor-ShortName'][i] }}</themekey>
+<themekey>{{ doc['DatasetSource-Sensor-LongName'][i] }}</themekey>
+{% endfor %}
+</theme>
+{% if doc['DatasetRegion-Region'][0].strip() != '' %}
+<place>
+<placekt>GCMD</placekt>
+<placekey>{{ doc['DatasetRegion-Region'][0] }}</placekey>
+</place>
+{% endif %}
+{% if doc['DatasetRegion-RegionDetail'][0].strip() != '' %}
+<place>
+<placekt>none</placekt>
+<placekey>{{ doc['DatasetRegion-RegionDetail'][0].capitalize() }}</placekey>
+</place>
+{% endif %}
+</keywords>
+<accconst>{{ doc['DatasetPolicy-AccessConstraint'][0] }}</accconst>
+<useconst>GHRSST protocol describes data use as open.</useconst>
+{% if TechnicalContactIndex >= 0 %}
+<ptcontac>
+<cntinfo>
+<cntperp>
+<cntper>{{ doc['DatasetContact-Contact-FirstName'][TechnicalContactIndex] }}{% if doc['DatasetContact-Contact-MiddleName'][TechnicalContactIndex] != 'none' %} {{ doc['DatasetContact-Contact-MiddleName'][TechnicalContactIndex] }}{% endif %} {{ doc['DatasetContact-Contact-LastName'][TechnicalContactIndex] }}</cntper>
+<cntorg>{{ doc['Dataset-Provider-LongName'][0] }} ({{ doc['Dataset-Provider-ShortName'][0] }})</cntorg>
+</cntperp>
+<cntpos>{{ doc['DatasetContact-Contact-Role'][TechnicalContactIndex] }}</cntpos>
+<cntaddr>
+<addrtype>Mailing and Physical Address</addrtype>
+<address>{{ doc['DatasetContact-Contact-Address'][TechnicalContactIndex] }}</address>
+<city>{{ doc['DatasetContact-Contact-Address'][TechnicalContactIndex] }}</city>
+<state>{{ doc['DatasetContact-Contact-Address'][TechnicalContactIndex] }}</state>
+<postal>{{ doc['DatasetContact-Contact-Address'][TechnicalContactIndex] }}</postal>
+<country>{{ doc['DatasetContact-Contact-Address'][TechnicalContactIndex] }}</country>
+</cntaddr>
+<cntvoice>{{ doc['DatasetContact-Contact-Phone'][TechnicalContactIndex] }}</cntvoice>
+<cntfax>{% if doc['DatasetContact-Contact-Fax'][TechnicalContactIndex].strip() != '' %}{{ doc['DatasetContact-Contact-Fax'][TechnicalContactIndex] }}{% else %}Not specified{% endif %}</cntfax>
+<cntemail>{{ doc['DatasetContact-Contact-Email'][TechnicalContactIndex] }}</cntemail>
+<hours>Standard Business hours</hours>
+<cntinst>Phone/FAX/Email</cntinst>
+</cntinfo>
+</ptcontac>
+{% endif %}
+<datacred>{{ doc['DatasetCitation-Creator'][0] }}</datacred>
+{% if doc['Dataset-Reference'][0].strip() != '' %}
+<crossref>
+<citeinfo>
+<origin>{{ doc['DatasetCitation-Creator'][0] }}</origin>
+<pubdate>{{ DatasetCitation_ReleaseDateTime }}</pubdate>
+<title>{{ doc['Dataset-Reference'][0] }}</title>
+</citeinfo>
+</crossref>
+{% endif %}
+{% if 'Get Data' in DatasetResource and DatasetResource['Get Data'].strip() != '' %}
+<crossref>
+<citeinfo>
+<origin>{{ doc['DatasetCitation-Creator'][0] }}</origin>
+<pubdate>{{ DatasetCitation_ReleaseDateTime }}</pubdate>
+<title>Get Data</title>
+<onlink>{{ DatasetResource['Get Data'] }}</onlink>
+</citeinfo>
+</crossref>
+{% endif %}
+</idinfo>
+<spref>
+<horizsys>
+<geograph>
+<latres>{{ Dataset_LatitudeResolution }}</latres>
+<longres>{{ Dataset_LongitudeResolution }}</longres>
+<geogunit>Decimal degrees</geogunit>
+</geograph>
+</horizsys>
+<vertdef/>
+</spref>
+<eainfo>
+{% for granule in granules %}
+<detailed>
+<enttyp>
+<enttypl>{{ granule['Granule-Name'][0] }}</enttypl>
+<enttypd>GHRSST Formatted netCDF data file</enttypd>
+<enttypds>The Recommended GHRSST-PP Data Processing Specification
+GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17
+Compiled by Craig Donlon and the GHRSST-PP Science Team
+craig.donlon@metoffice.com
+
+Published by the International GHRSST-PP Project Office
+Met Office
+Fitzroy Road
+Exeter, EX3 1PB
+United Kingdom
+
+Tel: +44 (0)1392 886622
+Fax: +44 (0)1393 885681</enttypds>
+</enttyp>
+<attr>
+<attrlabl>Latitude</attrlabl>
+<attrdef>Latitude in decimal degrees following FGDC specifications. Here, the Range Domain Minimum given below is equivalent to a South Bounding Coordinate for this Entity. The Range Domain Maximum is the North Bounding Coordinate.</attrdef>
+<attrdefs>FGDC-STD-001-1998</attrdefs>
+<attrdomv>
+<rdom>
+{% if granule['GranuleBoundingBox'] %}
+<rdommin>{{ granule['GranuleBoundingBox']['southernmostLatitude'] }}</rdommin>
+<rdommax>{{ granule['GranuleBoundingBox']['northernmostLatitude'] }}</rdommax>
+{% else %}
+<rdommin>-90.000</rdommin>
+<rdommax>90.000</rdommax>
+{% endif %}
+</rdom>
+</attrdomv>
+<begdatea>{{ granule['Granule-StartTimeLong'][0] }}</begdatea>
+<enddatea>{{ granule['Granule-StopTimeLong'][0] }}</enddatea>
+</attr>
+<attr>
+<attrlabl>Longitude</attrlabl>
+<attrdef>Longitude in decimal degrees following FGDC specifications. Here, the Range Domain Minimum given below is equivalent to a West Bounding Coordinate for this entity.  The Range Domain Maximum is the East Bounding Coordinate.</attrdef>
+<attrdefs>FGDC-STD-001-1998</attrdefs>
+<attrdomv>
+<rdom>
+{% if granule['GranuleBoundingBox'] %}
+<rdommin>{{ granule['GranuleBoundingBox']['westernmostLongitude'] }}</rdommin>
+<rdommax>{{ granule['GranuleBoundingBox']['easternmostLongitude'] }}</rdommax>
+{% else %}
+<rdommin>-180.000</rdommin>
+<rdommax>180.000</rdommax>
+{% endif %}
+</rdom>
+</attrdomv>
+<begdatea>{{ granule['Granule-StartTimeLong'][0] }}</begdatea>
+<enddatea>{{ granule['Granule-StopTimeLong'][0] }}</enddatea>
+</attr>
+<attr>
+<attrlabl>Time</attrlabl>
+<attrdef>Universal Time (Greenwich Mean Time) values shall follow the 24 hour timekeeping system for Universal time of day in hours, minutes, and seconds, and decimal fractions of a second (expressed to the precision desired) without separators convention, with the upper case letter Z following the low order (or extreme right-hand) time element of the 24 hour hour time clock expression. The general form is HHMMSSSSZ.</attrdef>
+<attrdefs>American Standards Institute, 1975, Representations of universal time, local time differentials, and United States time zone reference for information interchange (ANSI X3.51-1975): New York, American National Standards Institute. For usage in these data see:  The Recommended GHRSST-PP Data Processing Specification GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17  Canned text; no .DIF match</attrdefs>
+<attrdomv>
+<rdom>
+<rdommin>{{ granule['Granule-StartTimeLong'][0] }}</rdommin>
+<rdommax>{{ granule['Granule-StopTimeLong'][0] }}</rdommax>
+</rdom>
+</attrdomv>
+<begdatea>{{ granule['Granule-StartTimeLong'][0] }}</begdatea>
+<enddatea>{{ granule['Granule-StopTimeLong'][0] }}</enddatea>
+</attr>
+</detailed>
+{% endfor %}
+<overview>
+<eaover>Within the GHRSST DIF-style metadata framework, every data set type is described by a static Data Set Description (DSD), and the individual netCDF files making up that dataset are described by dynamic File Records (FR).  These FRs contain the spatial and temporal domain contained in each data file.  The DIF-style metadata (the DSD and its children FRs) are converted to a single FGDC record for each NODC GHRSST accession, which can consist of several discrete data files.  This conversion is accomplished using an XML stylesheet which builds a framework FGDC record based on the DSD, and populates it with one Entity for each data file based on the FRs.  These Entities are given three Attributes: Latitude, Longitude, and Time.  The Range Domain Minimum and Maximum elements within each of those Attributes are use to describe the spatial and temporal domain contained in the data file.  So, for example, the Range Domain Minimum for the Attribute Latitude corresponds to a South Bound
 ing Coordinate for that Entity.</eaover>
+<eadetcit>The Recommended GHRSST-PP Data Processing Specification
+GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17
+Compiled by Craig Donlon and the GHRSST-PP Science Team
+craig.donlon@metoffice.com
+
+Published by the International GHRSST-PP Project Office
+Met Office
+Fitzroy Road
+Exeter, EX3 1PB
+United Kingdom
+
+Tel: +44 (0)1392 886622
+Fax: +44 (0)1393 885681
+
+Metadata records converted to FGDC format and archived at the National Oceanographic Data Center</eadetcit>
+</overview>
+</eainfo>
+<distinfo>
+<distrib>
+<cntinfo>
+<cntperp>
+<cntper>Dr. Kenneth Casey</cntper>
+<cntorg>NOAA National Oceanographic Data Center</cntorg>
+</cntperp>
+<cntpos>Physical scientist</cntpos>
+<cntaddr>
+<addrtype>mailing address</addrtype>
+<address>NOAA National Oceanographic Data Center
+SSMC3, 4th Floor, Room 4853, Route:  E/OC1
+1315 East-West Highway</address>
+<city>Silver Spring</city>
+<state>Maryland</state>
+<postal>20910</postal>
+<country>U.S.A.</country>
+</cntaddr>
+<cntvoice>(301)713-3300</cntvoice>
+<cntfax>FAX: (301) 713-3300</cntfax>
+<cntemail>Kenneth.Casey@noaa.gov</cntemail>
+<hours>9:00 AM-4:00 PM, EST</hours>
+<cntinst>Phone/FAX/E-mail/letter</cntinst>
+</cntinfo>
+</distrib>
+<resdesc>NODC Accession #0000000</resdesc>
+<distliab>NOAA makes no warranty regarding these data, expressed or implied, nor does the fact of distribution constitute such a warranty. NOAA and NODC cannot assume liability for any damages caused by any errors or omissions in these data, nor as a result of the failure of these data to function on a particular system.</distliab>
+<stdorder>
+<digform>
+<digtinfo>
+<formname>netCDF</formname>
+<formverd>{{ DatasetCitation_ReleaseDateTime }}</formverd>
+<formspec>GHRSST formatted file (netCDF version 3); see:  The Recommended GHRSST-PP Data Processing Specification, GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17.</formspec>
+<formcont>sea surface temperature data</formcont>
+<filedec>See:  The Recommended GHRSST-PP Data Processing Specification, GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17.</filedec>
+<transize>15000000</transize>
+</digtinfo>
+<digtopt>
+<onlinopt>
+<computer>
+<networka>
+<networkr>http://www.nodc.noaa.gov/search/prod/</networkr>
+</networka>
+</computer>
+<accinstr>Data may be directly downloaded through the NODC Ocean Archive System at: URL: http://www.nodc.noaa.gov/search/prod/. NODC can be contacted directly for custom orders. When requesting data from the NODC, the desired data set may be referred to by the 7-digit number given in the RESOURCE DESCRIPTION field of this metadata record. For more information see the NODC GHRSST project web site: URL: http://ghrsst.nodc.noaa.gov</accinstr>
+<oncomp>Standard Internet browser and FTP capability</oncomp>
+</onlinopt>
+<onlinopt>
+<computer>
+<networka>
+<networkr>ftp://data.nodc.noaa.gov/pub/data.nodc/ghrsst</networkr>
+</networka>
+</computer>
+<accinstr>Direct FTP access:  Navigate to ftp://data.nodc.noaa.gov/pub/data.nodc/ghrsst using any FTP client to begin downloading data. For more information see the NODC GHRSST project web site: URL: http://ghrsst.nodc.noaa.gov</accinstr>
+<oncomp>Any FTP client</oncomp>
+</onlinopt>
+<onlinopt>
+<computer>
+<networka>
+<networkr>http://data.nodc.noaa.gov/ghrsst</networkr>
+</networka>
+</computer>
+<accinstr>Simple Web access:  Using any web browser, navigate to URL: http://data.nodc.noaa.gov/ghrsst and begin browsing through the file hierarchy. Clicking on any of the files will prompt you to download that file or will launch any application associated with netCDF files. For more information see the NODC GHRSST project web site: URL: http://ghrsst.nodc.noaa.gov</accinstr>
+<oncomp>Standard Internet browser and/or software capable of utilizing netCDF files</oncomp>
+</onlinopt>
+<onlinopt>
+<computer>
+<networka>
+<networkr>http://data.nodc.noaa.gov/cgi-bin/nph-dods/ghrsst</networkr>
+</networka>
+</computer>
+<accinstr>These data are also served using OPeNDAP (formerly DODS) server. The base URL is: URL: http://data.nodc.noaa.gov/cgi-bin/nph-dods/ghrsst For more information see the NODC GHRSST project web site: URL: http://ghrsst.nodc.noaa.gov For a listing of OPeNDAP clients which may be used to access OPeNDAP-enabled data sets, please see the OPeNDAP web site at URL: URL: http://opendap.org/</accinstr>
+<oncomp>Standard Internet browsers can browse OPeNDAP servers and specialized OPeNDAP software can enable more sophisticated data access and visualizations.</oncomp>
+</onlinopt>
+</digtopt>
+</digform>
+<fees>none</fees>
+<ordering>Data may be directly downloaded through the NODC website at: http://www.nodc.noaa.gov/search/prod/. NODC can be contacted directly for custom orders. (When requesting data from the NODC, the desired data set may be referred to by the 7-digit number given in the RESOURCE DESCRIPTION field of this metadata record).</ordering>
+<turnarnd>Within 24 hours if directly downloaded, depending on size</turnarnd>
+</stdorder>
+<custom>Contact the NODC User Services Group via phone/FAX/E-mail:  nodc.services@noaa.gov</custom>
+<techpreq>Working knowlege of netCDF files and ability to work with satellite data strongly recommended.</techpreq>
+<availabl>
+<timeinfo>
+<rngdates>
+<begdate>{{ DatasetCoverage_StartTime }}</begdate>
+<begtime>Unknown</begtime>
+<enddate>Present</enddate>
+<endtime>Unknown</endtime>
+</rngdates>
+</timeinfo>
+</availabl>
+</distinfo>
+<distinfo>
+<distrib>
+<cntinfo>
+<cntperp>
+<cntper>{{ doc['DatasetContact-Contact-FirstName'][0] }}{% if doc['DatasetContact-Contact-MiddleName'][0] != 'none' %} {{ doc['DatasetContact-Contact-MiddleName'][0] }}{% endif %} {{ doc['DatasetContact-Contact-LastName'][0] }}</cntper>
+<cntorg>{{ doc['Dataset-Provider-LongName'][0] }} ({{ doc['Dataset-Provider-ShortName'][0] }})</cntorg>
+</cntperp>
+<cntpos>{{ doc['DatasetContact-Contact-Role'][0] }}</cntpos>
+<cntaddr>
+<addrtype>mailing address</addrtype>
+<address>{{ doc['DatasetContact-Contact-Address'][0] }}</address>
+<city>{{ doc['DatasetContact-Contact-Address'][0] }}</city>
+<state>{{ doc['DatasetContact-Contact-Address'][0] }}</state>
+<postal>{{ doc['DatasetContact-Contact-Address'][0] }}</postal>
+<country>{{ doc['DatasetContact-Contact-Address'][0] }}</country>
+</cntaddr>
+<cntvoice>{{ doc['DatasetContact-Contact-Phone'][0] }}</cntvoice>
+<cntfax>{% if doc['DatasetContact-Contact-Fax'][0].strip() != '' %}{{ doc['DatasetContact-Contact-Fax'][0] }}{% else %}Not specified{% endif %}</cntfax>
+<cntemail>{{ doc['DatasetContact-Contact-Email'][0] }}</cntemail>
+<hours>Standard Business hours</hours>
+<cntinst>Phone/FAX/Email</cntinst>
+</cntinfo>
+</distrib>
+<resdesc>DSD-{{ doc['Dataset-ShortName'][0] }}.xml</resdesc>
+<distliab>Unknown; see {{ doc['Dataset-Provider-ProviderResource-Path'][-1] }}</distliab>
+<stdorder>
+<digform>
+<digtinfo>
+<formname>netCDF</formname>
+<formverd>{{ DatasetCitation_ReleaseDateTime }}</formverd>
+<formspec>GHRSST formatted file (netCDF version 3); see:  The Recommended GHRSST-PP Data Processing Specification, GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17.</formspec>
+<formcont>sea surface temperature data</formcont>
+<filedec>See:  The Recommended GHRSST-PP Data Processing Specification, GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17.</filedec>
+<transize>15000000</transize>
+</digtinfo>
+<digtopt>
+<onlinopt>
+<computer>
+<networka>
+<networkr>{{ doc['Dataset-Provider-ProviderResource-Path'][-1] }}</networkr>
+</networka>
+</computer>
+<accinstr>Access {{ doc['Dataset-Provider-ShortName'][0] }} site: {{ doc['Dataset-Provider-ProviderResource-Path'][-1] }}; some products may require authorization (restricted access)</accinstr>
+<oncomp>PC, Mac, Linux, Unix; standard Internet browser</oncomp>
+</onlinopt>
+</digtopt>
+</digform>
+<fees>See URL at: {{ doc['Dataset-Provider-ProviderResource-Path'][-1] }}</fees>
+<ordering>See URL at: {{ doc['Dataset-Provider-ProviderResource-Path'][-1] }}. Some products may have restricted access.</ordering>
+<turnarnd>Within 24 hours if directly downloaded, depending on size</turnarnd>
+</stdorder>
+<custom>See {{ doc['Dataset-Provider-ShortName'][0] }} website at URL: {{ doc['Dataset-Provider-ProviderResource-Path'][-1] }}</custom>
+<techpreq>Ability to work with netCDF files, working knowledge of satellite data strongly recommended</techpreq>
+<availabl>
+<timeinfo>
+<rngdates>
+<begdate>{{ DatasetCoverage_StartTime }}</begdate>
+<begtime>Unknown</begtime>
+<enddate>Present</enddate>
+<endtime>Unknown</endtime>
+</rngdates>
+</timeinfo>
+</availabl>
+</distinfo>
+<distinfo>
+<distrib>
+<cntinfo>
+<cntperp>
+<cntper>Edward Armstrong</cntper>
+<cntorg>Jet Propulsion Laboratory (JPL), Physical Oceanography Distributed Active Archive Center (PO.DAAC)</cntorg>
+</cntperp>
+<cntpos>Technical Contact</cntpos>
+<cntaddr>
+<addrtype>mailing address</addrtype>
+<address>4800 Oak Grove Dr.</address>
+<city>Pasadena</city>
+<state>California</state>
+<postal>91109</postal>
+<country>USA</country>
+</cntaddr>
+<cntvoice>818 393 6710</cntvoice>
+<cntfax>818 393 2718</cntfax>
+<cntemail>ghrsst@podaac.jpl.nasa.gov</cntemail>
+<hours>Standard Business hours, Pacific Time</hours>
+<cntinst>Phone/FAX/Email</cntinst>
+</cntinfo>
+</distrib>
+<resdesc>DSD-{{ doc['Dataset-ShortName'][0] }}.xml</resdesc>
+<distliab>JPL makes no warranty regarding these data, expressed or implied, nor does the fact of distribution constitute such a warranty. JPL cannot assume liability for any damages caused by any errors or omissions in these data, nor as a result of the failure of these data to function on a particular system.</distliab>
+<stdorder>
+<digform>
+<digtinfo>
+<formname>netCDF</formname>
+<formverd>{{ DatasetCitation_ReleaseDateTime }}</formverd>
+<formspec>GHRSST formatted file (netCDF version 3); see:  The Recommended GHRSST-PP Data Processing Specification, GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17.</formspec>
+<formcont>sea surface temperature data</formcont>
+<filedec>See:  The Recommended GHRSST-PP Data Processing Specification, GDS (Version 1 revision 1.5), GHRSST-PP Report Number 17.</filedec>
+<transize>15000000</transize>
+</digtinfo>
+<digtopt>
+<onlinopt>
+<computer>
+<networka>
+<networkr>ftp://podaac.jpl.nasa.gov/pub/sea_surface_temperature/GHRSST</networkr>
+</networka>
+</computer>
+<accinstr>The direct FTP link is: ftp://podaac.jpl.nasa.gov/pub/sea_surface_temperature/GHRSST Data, documentation, and read software may also be downloaded through the JPL Global Data Assembly Center (GDAC) at: URL: http://ghrsst.jpl.nasa.gov/data_access.html For more information see the GDAC GHRSST project web site: URL: http://ghrsst.nasa.noaa.gov GHRSST products are generally only stored and available for a period of 30 days after satellite observation. After this time they can be acquired from the NOAA NODC.</accinstr>
+<oncomp>PC, Mac, Linux, Unix; standard Internet browser </oncomp>
+</onlinopt>
+</digtopt>
+</digform>
+<fees>None </fees>
+<ordering>See URL at: http:/ghrsst.jpl.nasa.gov . Some products may have restricted access. GHRSST products are available for a period of about 30 days after observation. After this time they can be acquired from the NOAA NODC.</ordering>
+<turnarnd>Within 24 hours if directly downloaded, depending on size</turnarnd>
+</stdorder>
+<custom>Contact the PO.DAAC User Services Office:  ghrsst@podaac.jpl.nasa.gov </custom>
+<techpreq>Ability to work with netCDF files, working knowledge of satellite data strongly recommended</techpreq>
+<availabl>
+<timeinfo>
+<rngdates>
+<begdate>{{ DatasetCoverage_StartTime }}</begdate>
+<begtime>Unknown</begtime>
+<enddate>Present</enddate>
+<endtime>Unknown</endtime>
+</rngdates>
+</timeinfo>
+</availabl>
+</distinfo>
+<metainfo>
+<metd>20041023</metd>
+<metrd>20041023</metrd>
+<metfrd>20050331</metfrd>
+<metc>
+<cntinfo>
+<cntperp>
+<cntper>Dr. Kenneth Casey</cntper>
+<cntorg>NOAA National Oceanographic Data Center</cntorg>
+</cntperp>
+<cntpos>Physical scientist</cntpos>
+<cntaddr>
+<addrtype>mailing address</addrtype>
+<address>NOAA National Oceanographic Data Center
+SSMC3, 4th Floor, Room 4853, Route:  E/OC1
+1315 East-West Highway</address>
+<city>Silver Spring</city>
+<state>Maryland</state>
+<postal>20910</postal>
+<country>U.S.A.</country>
+</cntaddr>
+<cntvoice>(301)713-3300</cntvoice>
+<cntfax>FAX: (301) 713-3300</cntfax>
+<cntemail>Kenneth.Casey@noaa.gov</cntemail>
+<hours>9:00 AM-4:00 PM, EST</hours>
+<cntinst>Phone/FAX/E-mail/letter</cntinst>
+</cntinfo>
+</metc>
+<metstdn>FGDC Content Standards for Digital Geospatial Metadata</metstdn>
+<metstdv>FGDC-STD-001-1998</metstdv>
+<mettc>local time</mettc>
+<metac>None</metac>
+<metuc>None</metuc>
+<metsi>
+<metscs>None</metscs>
+<metsc>Unclassified</metsc>
+<metshd>Not applicable</metshd>
+</metsi>
+</metainfo>
+</metadata>
+{% endif %}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/fgdc/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/fgdc/plugin.conf b/src/main/python/plugins/granule/fgdc/plugin.conf
new file mode 100644
index 0000000..8574828
--- /dev/null
+++ b/src/main/python/plugins/granule/fgdc/plugin.conf
@@ -0,0 +1,10 @@
+[solr]
+datasetUrl=http://localhost:8983/solr.war/dataset
+granuleUrl=http://localhost:8983/solr.war/granule
+entriesPerPage=7
+
+[service]
+url=http://localhost:8890
+linkToGranule=LOCAL-FTP,REMOTE-FTP
+database=podaac_dev/podaac$dev@DAACDEV
+template=fgdc_template.xml

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/iso/IsoWriter.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/iso/IsoWriter.py b/src/main/python/plugins/granule/iso/IsoWriter.py
new file mode 100644
index 0000000..8e24fe7
--- /dev/null
+++ b/src/main/python/plugins/granule/iso/IsoWriter.py
@@ -0,0 +1,23 @@
+import logging
+import os
+import os.path
+import codecs
+
+from edge.opensearch.granuleisoresponse import GranuleIsoResponse
+from edge.opensearch.datasetgranulewriter import DatasetGranuleWriter
+
+class IsoWriter(DatasetGranuleWriter):
+    def __init__(self, configFilePath):
+        super(IsoWriter, self).__init__(configFilePath)
+        
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrGranuleResponse, solrDatasetResponse, pretty):
+        response = GranuleIsoResponse(
+            self._configuration.get('service', 'linkToGranule')
+        )
+        response.setTemplate(self.template)
+
+        return response.generate(solrDatasetResponse, solrGranuleResponse, pretty)

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/granule/iso/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/granule/iso/__init__.py b/src/main/python/plugins/granule/iso/__init__.py
new file mode 100644
index 0000000..e69de29