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 protected]
+
+[podaac]
+shortName=NASA/JPL/PODAAC
+longName=Physical Oceanography Distributed Active Archive Center, Jet 
Propulsion Laboratory, NASA
+firstName=PO.DAAC
+lastName=User Services
[email protected]
+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 protected]
+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>[email protected]</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>[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['_id'] }}</id>
+<dc:identifier>{{ doc['ShortName'] }}</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>
+</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;[email protected]&gt;</managingEditor>
+<webMaster>[email protected]</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
[email protected]
+
+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
[email protected]
+
+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>[email protected]</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:  
[email protected]</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>[email protected]</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:  [email protected] 
</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>[email protected]</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

Reply via email to