http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/content/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/content/Writer.py 
b/src/main/python/plugins/slcp/content/Writer.py
new file mode 100644
index 0000000..c0e27ab
--- /dev/null
+++ b/src/main/python/plugins/slcp/content/Writer.py
@@ -0,0 +1,76 @@
+import logging
+import os
+import os.path
+import urllib
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.response.solrjsontemplateresponse import SolrJsonTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+        
+        self.contentType = 'application/json'
+
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrJsonTemplateResponse()
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        queries = []
+        filterQueries = []
+        filterQueries.append('status:1')
+        sort = None
+
+        for key, value in parameters.iteritems():
+            if value != "":
+                if key == 'keyword':
+                    #Special case keyword search on glossary_items only match 
title
+                    if 'table' in parameters and parameters['table'] == 
'glossary_items':
+                        queries.append('title_t:('+urllib.quote(value) + ')')
+                    else:
+                        queries.append(urllib.quote(value))
+                elif key == 'year':
+                    start = value + "-01-01T00:00:00.000Z"
+                    end = value + "-12-31T23:59:59.999Z"
+                    
filterQueries.append('created_at:['+start+'%20TO%20'+end+']')
+                elif key == 'table':
+                    filterQueries.append('type:' + value)
+                elif key == 'glossary_title':
+                    range = value.lower().split('-')
+                    filterQueries.append('{!frange%20l=' + range[0] + '%20u=' 
+ range[1] + 'z}' + 'title_lc')
+                elif key == 'sort':
+                    sort = urllib.quote(value)
+                elif key == 'topic_id':
+                    filterQueries.append('categories_id:' + value)
+                elif key == 'mission_id':
+                    filterQueries.append('mission_ids_array:' + value)
+                else:
+                    if type(value) is list:
+                        if 'table' in parameters and parameters['table'] == 
'news_items':
+                            filterQueries.append(key + ':(' + 
'+OR+'.join([self._urlEncodeSolrQueryValue(v) for v in value]) + ')')
+                        else:
+                            for v in value:
+                                filterQueries.append(key + ':' + 
self._urlEncodeSolrQueryValue(v))
+                    else:
+                        filterQueries.append(key + ':' + 
self._urlEncodeSolrQueryValue(value))
+        if len(queries) == 0:
+            queries.append('*:*')
+
+        query = 
'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json&start='+str(startIndex)+'&rows='+str(entriesPerPage)
+
+        if len(filterQueries) > 0:
+            query += '&fq='+'+AND+'.join(filterQueries)
+
+        if sort is not None:
+            query += '&sort=' + sort
+
+        logging.debug('solr query: '+query)
+
+        return query

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

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/content/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/content/plugin.conf 
b/src/main/python/plugins/slcp/content/plugin.conf
new file mode 100644
index 0000000..3e74010
--- /dev/null
+++ b/src/main/python/plugins/slcp/content/plugin.conf
@@ -0,0 +1,11 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/content
+entriesPerPage=10
+maxEntriesPerPage=2000
+defaultSearchParam=keyword
+parameters=keyword,sort,categories_id,status,is_in_resource_list,category_type_id,is_faq,table,featured,year,publication_year,glossary_title,id,topic_id,mission_id
+facets={}
+
+[service]
+url=http://localhost:8890
+template=template.xml

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/content/template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/content/template.xml 
b/src/main/python/plugins/slcp/content/template.xml
new file mode 100755
index 0000000..357ff59
--- /dev/null
+++ b/src/main/python/plugins/slcp/content/template.xml
@@ -0,0 +1,158 @@
+{"items":[
+{% for doc in docs %}
+{
+{% if doc['type'] == 'resources' %}
+    "alt_text": {{ doc['alt_text'] | jsonify }},
+    "created_at": {{ doc['created_at'] | jsonify }},
+    "credit": {{ doc['credit'] | jsonify }},
+    "detail_content_type": {{ doc['detail_content_type'] | jsonify }},
+    "detail_file_name": {{ doc['detail_file_name'] | jsonify }},
+    "detail_file_size": {{ doc['detail_file_size'] | jsonify }},
+    "detail_image": {{ doc['detail_image'] | jsonify }},
+    "embed_code": {{ doc['embed_code'] | jsonify }},
+    "external_url": {{ doc['external_url'] | jsonify }},
+    "featured": {{ doc['featured'] | jsonify }},
+    "id": {{ doc['id'] }},
+    "is_in_resource_list": {{ doc['is_in_resource_list'] | jsonify }},
+    "is_latest": {{ doc['is_latest'] | jsonify }},
+    "latest_image_file_name": {{ doc['latest_image_file_name'] | jsonify }},
+    "list_image_content_type": {{ doc['list_image_content_type'] | jsonify }},
+    "list_image_file_name": {{ doc['list_image_file_name'] | jsonify }},
+    "list_image_file_size": {{ doc['list_image_file_size'] | jsonify }},
+    "list_image_src": "/system/resources/list_images/{{ doc['id'] }}_{{ 
doc['list_image_file_name'] }}",
+    "long_description": {{ doc['long_description'] | jsonify }},
+    "pub_date": {{ doc['pub_date'] | jsonify }},
+    "short_description": {{ doc['short_description'] | jsonify }},
+    "status": {{ doc['status'] }},
+    "table": {{ doc['type'] | jsonify }},
+    "title": {{ doc['title'] | jsonify }},
+    "updated_at": {{ doc['updated_at'] | jsonify }},
+    "updated_by": {{ doc['updated_by'] | jsonify }},
+    "url": {{ doc['permalink_path'] | jsonify }}
+{% elif doc['type'] == 'publications' %}
+    "abstract": {{ doc['abstract'] | jsonify }},
+    "author_address": {{ doc['author_address'] | jsonify }},
+    "authors": {{ doc['authors'] | jsonify }},
+    "category": {{ doc['category'] | jsonify }},
+    "citation": {{ doc['citation'] | jsonify }},
+    "created_at": {{ doc['created_at'] | jsonify }},
+    "external_uid": {{ doc['external_uid'] | jsonify }} ,
+    "file_content_type": {{ doc['file_content_type'] | jsonify }},
+    "file_file_name": {{ doc['file_file_name'] | jsonify }},
+    "file_file_size": {{ doc['file_file_size'] | jsonify }},
+    "graph_category": {{ doc['graph_category'] | jsonify }},
+    "id": {{ doc['id'] }},
+    "is_peer_reviewed": {{ doc['is_peer_reviewed'] | lower }},
+    "keywords": {{ doc['keywords'] | jsonify }},
+    "link": {{ doc['link'] | jsonify }},
+    "periodical": {
+        "created_at": {{ doc['periodical_created_at'] | jsonify }},
+        "id": {{ doc['periodical_id'] }},
+        "title": {{ doc['periodical_title'] | jsonify }},
+        "updated_at": {{ doc['periodical_updated_at'] | jsonify }},
+        "updated_by": {{ doc['periodical_updated_by'] | jsonify }}
+    },
+    "periodical_id": {{ doc['periodical_id'] }},
+    "publication_year": {{ doc['publication_year'] | jsonify }},
+    "status": {{ doc['status'] }},
+    "table": {{ doc['type'] | jsonify }},
+    "title": {{ doc['title'] | jsonify }},
+    "updated_at": {{ doc['updated_at'] | jsonify }},
+    "updated_by": {{ doc['updated_by'] | jsonify }},
+    "url": {{ doc['permalink_path'] | jsonify }}
+{% elif doc['type'] == 'news_items' %}
+    "categories_id": {{ doc['categories_id'] | jsonify }},
+    "categories_title": {{ doc['categories_title'] | jsonify }},
+    "date": "{{ doc['publish_date'] | convertISOTime('%B %-d, %Y') }}",
+    "description": {{ doc['long_description'] | jsonify }},
+    "id": {{ doc['id']}},
+    "main_image_alt": {{ doc['main_image_alt'] | jsonify }},
+    "main_image_caption": {{ doc['main_image_caption'] | jsonify }},
+    "main_image_file_name": {{ doc['main_image_file_name'] | jsonify }},
+    "status": {{ doc['status'] }},
+    "table": {{ doc['type'] | jsonify }},
+    "target": "_self",
+    "thumb": "/system/news_items/list_view_images/{{ doc['id']}}_{{ 
doc['list_view_image_file_name']}}",
+    "title": {{ doc['title'] | jsonify }},
+    "url": {{ doc['permalink_path'] | jsonify }},
+    "mission_ids": {{ doc['mission_ids_array'] | jsonify }}
+{% elif doc['type'] == 'glossary_items' %}
+    "caption": {{ doc['caption'] | jsonify }},
+    "created_at": {{ doc['created_at'] | jsonify }},
+    "credit": {{ doc['credit'] | jsonify }},
+    "definition": {{ doc['definition'] | jsonify }},
+    "id": {{ doc['id']}},
+    "list_view_image_alt": {{ doc['list_view_image_alt'] | jsonify }},
+    "list_view_image_file_name": {{ doc['list_view_image_file_name'] | jsonify 
}},
+    "status": {{ doc['status'] }},
+    "table": {{ doc['type'] | jsonify }},
+    "title": {{ doc['title'] | jsonify }},
+    "updated_at": {{ doc['updated_at'] | jsonify }},
+    "url": {{ doc['permalink_path'] | jsonify }},
+    "video_embed_code": {{ doc['video_embed_code'] | jsonify }}
+{% elif doc['type'] == 'content_pages' %}
+    "body": {{ doc['body'] | jsonify }},
+    "created_at": {{ doc['created_at'] | jsonify }},
+    "id": {{ doc['id']}},
+    "main_image_alt": {{ doc['main_image_alt'] | jsonify }},
+    "main_image_caption": {{ doc['main_image_caption'] | jsonify }},
+    "main_image_file_name": {{ doc['main_image_file_name'] | jsonify }},
+    "meta_desc": {{ doc['meta_desc'] | jsonify }},
+    "status": {{ doc['status'] }},
+    "subnav_title": {{ doc['subnav_title'] | jsonify }},
+    "table": {{ doc['type'] | jsonify }},
+    "title": {{ doc['title'] | jsonify }},
+    "updated_at": {{ doc['updated_at'] | jsonify }},
+    "updated_by": {{ doc['updated_by'] | jsonify }},
+    "url": {{ doc['permalink_path'] | jsonify }}
+{% elif doc['type'] == 'faq_items' %}
+    "answer": {{ doc['answer'] | jsonify }},
+    "created_at": {{ doc['created_at'] | jsonify }},
+    "data_release_version": {{ doc['data_release_version'] | jsonify }},
+    "id": {{ doc['id']}},
+    "is_faq": {{ doc['is_faq'] | jsonify }},
+    "keywords": {{ doc['keywords'] | jsonify }},
+    "physical_product": {{ doc['physical_product'] | jsonify }},
+    "post_date": {{ doc['post_date'] | jsonify }},
+    "question": {{ doc['question'] | jsonify }},
+    "question_type": {{ doc['question_type'] | jsonify }},
+    "sent_by": {{ doc['sent_by'] | jsonify }},
+    "status": {{ doc['status'] }},
+    "subject": {{ doc['subject'] | jsonify }},
+    "table": {{ doc['type'] | jsonify }},
+    "updated_at": {{ doc['updated_at'] | jsonify }},
+    "updated_by": {{ doc['updated_by'] | jsonify }},
+    "url": {{ doc['permalink_path'] | jsonify }}
+{% elif doc['type'] == 'missions' %}
+    "start_date": {{ doc['start_date'] | jsonify }},
+    "end_date": {{ doc['end_date'] | jsonify }},
+    "title": {{ doc['title'] | jsonify }},
+    "id": {{ doc['id']}},
+    "url": {{ doc['permalink_path'] | jsonify }},
+    "short_description": {{ doc['short_description'] | jsonify }},
+    "body": {{ doc['body'] | jsonify }},
+    "image_file_name": {{ doc['image_file_name'] | jsonify }},
+    "list_view_image_file_name": {{ doc['list_view_image_file_name'] | jsonify 
}},
+    "list_view_image_alt": {{ doc['list_view_image_alt'] | jsonify }},
+    "image_alt": {{ doc['image_alt'] | jsonify }},
+    "status": {{ doc['status'] }},
+    "created_at": {{ doc['created_at'] | jsonify }},
+    "short_title": {{ doc['short_title'] | jsonify }},
+    "updated_at": {{ doc['updated_at'] | jsonify }},
+    "sidebar_body": {{ doc['sidebar_body'] | jsonify }}
+{% endif %}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+,"more":
+{% if (startIndex + itemsPerPage) < numFound %}
+true
+{% else %}
+false
+{% endif %}
+,"total":{{ numFound }}
+,"page":{{ (startIndex / itemsPerPage + 1) | int }}
+,"per_page":{{ itemsPerPage }}}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/dat/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/dat/Writer.py 
b/src/main/python/plugins/slcp/dat/Writer.py
new file mode 100644
index 0000000..1bdfe55
--- /dev/null
+++ b/src/main/python/plugins/slcp/dat/Writer.py
@@ -0,0 +1,53 @@
+import logging
+import os
+import os.path
+import urllib
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.response.solrjsontemplateresponse import SolrJsonTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+
+        self.contentType = 'application/json'
+
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrJsonTemplateResponse()
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        queries = []
+        filterQueries = []
+
+        for key, value in parameters.iteritems():
+            if key == 'id':
+                queries.append('id:' + self._urlEncodeSolrQueryValue(value))
+            elif key == 'slcpShortName':
+                queries.append('SlcpShortName:' + 
self._urlEncodeSolrQueryValue(value))
+            elif key == 'shortName':
+                queries.append('ShortName:' + 
self._urlEncodeSolrQueryValue(value))
+            elif key == 'nexusShortName':
+                queries.append('GlobalAttrNexusShortName:' + 
self._urlEncodeSolrQueryValue(value))
+            elif key == 'inDAT':
+                filterQueries.append('InDAT:%s' % value)
+
+        if len(queries) == 0:
+            queries.append('*:*')
+
+        query = 
'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json'+'&rows='+str(entriesPerPage)
+
+        if len(filterQueries) > 0:
+            query += '&fq='+'+AND+'.join(filterQueries)
+
+        query += '&sort=' + urllib.quote("DATOrder desc,ShortName asc")
+
+        logging.debug('solr query: '+query)
+
+        return query

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

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/dat/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/dat/plugin.conf 
b/src/main/python/plugins/slcp/dat/plugin.conf
new file mode 100644
index 0000000..2c69d4f
--- /dev/null
+++ b/src/main/python/plugins/slcp/dat/plugin.conf
@@ -0,0 +1,9 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/dataset
+entriesPerPage=10
+maxEntriesPerPage=2000
+parameters=id,slcpShortName,shortName,nexusShortName,inDAT
+
+[service]
+url=http://localhost:8890
+template=template.json

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/dat/template.json
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/dat/template.json 
b/src/main/python/plugins/slcp/dat/template.json
new file mode 100644
index 0000000..f7e96ae
--- /dev/null
+++ b/src/main/python/plugins/slcp/dat/template.json
@@ -0,0 +1,33 @@
+{
+"Datasets": [
+{% for doc in docs %}
+
+{% for i in range(doc['GlobalAttrTitle']|count)  %}
+{
+"GlobalAttrShortName": "{{ doc['ShortName'] }}",
+"GlobalAttrNexusShortName": "{{ doc['GlobalAttrNexusShortName'][i] }}",
+"GlobalAttrTitle": "{{ doc['GlobalAttrTitle'][i] }}",
+"GlobalAttrDescription": "{{ doc['GlobalAttrDescription'][i] }}",
+"GlobalAttrSource": "{{ doc['GlobalAttrSource'][i] }}",
+"GlobalAttrContact": "{{ doc['GlobalAttrContact'][i] }}",
+"GlobalAttrUnits": "{{ doc['GlobalAttrUnits'][i] }}"
+{% if 'SupportsBasin' in doc %}
+,"SupportsBasin": {{ doc['SupportsBasin'] | jsonify }}
+{% endif %}
+{% if 'Climatology' in doc %}
+,"Climatology": {{ doc['Climatology'] | jsonify }}
+{% endif %}
+{% if 'IsClimatology' in doc %}
+,"IsClimatology": {{ doc['IsClimatology'] | jsonify }}
+{% endif %}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/echo10/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/echo10/Writer.py 
b/src/main/python/plugins/slcp/echo10/Writer.py
new file mode 100644
index 0000000..ebafc40
--- /dev/null
+++ b/src/main/python/plugins/slcp/echo10/Writer.py
@@ -0,0 +1,39 @@
+import logging
+import os
+import os.path
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.opensearch.solrtemplateresponse import SolrTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrTemplateResponse(self._configuration, searchUrl, 
searchParams)
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        queries = []
+
+        for key, value in parameters.iteritems():
+            if key == 'id':
+                queries.append('id:' + self._urlEncodeSolrQueryValue(value))
+            elif key == 'slcpShortName':
+                queries.append('SlcpShortName:' + 
self._urlEncodeSolrQueryValue(value))
+            elif key == 'shortName':
+                queries.append('ShortName:' + 
self._urlEncodeSolrQueryValue(value))
+            elif key == 'nexusShortName':
+                queries.append('GlobalAttrNexusShortName:' + 
self._urlEncodeSolrQueryValue(value))
+
+        query = 
'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json'+'&rows='+str(entriesPerPage)
+
+        logging.debug('solr query: '+query)
+
+        return query

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

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/echo10/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/echo10/plugin.conf 
b/src/main/python/plugins/slcp/echo10/plugin.conf
new file mode 100644
index 0000000..b9f3e23
--- /dev/null
+++ b/src/main/python/plugins/slcp/echo10/plugin.conf
@@ -0,0 +1,8 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/dataset
+entriesPerPage=1
+parameters=id,slcpShortName,shortName,nexusShortName
+
+[service]
+url=http://localhost:8890
+template=template.xml

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/echo10/template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/echo10/template.xml 
b/src/main/python/plugins/slcp/echo10/template.xml
new file mode 100644
index 0000000..99de2f8
--- /dev/null
+++ b/src/main/python/plugins/slcp/echo10/template.xml
@@ -0,0 +1,190 @@
+<Collection>
+<ShortName>{{ docs[0]['ShortName'] }}</ShortName>
+<VersionId>{{ docs[0]['VersionId'] }}</VersionId>
+<LastUpdate>{{ docs[0]['LastUpdate'] }}</LastUpdate>
+<LongName>{{ docs[0]['LongName'] }}</LongName>
+<DataSetId>{{ docs[0]['DataSetId'] }}</DataSetId>
+<Description>{{ docs[0]['Description'] }}</Description>
+<ProcessingCenter>{{ docs[0]['ProcessingCenter'] }}</ProcessingCenter>
+<ProcessingLevelId>{{ docs[0]['ProcessingLevelId'] }}</ProcessingLevelId>
+<ArchiveCenter>{{ docs[0]['ArchiveCenter'] }}</ArchiveCenter>
+<DataFormat>{{ docs[0]['DataFormat'] }}</DataFormat>
+<SpatialKeywords>
+{% for keyword in docs[0]['SpatialKeywords-Keyword']  %}
+<Keyword>{{ keyword }}</Keyword>
+{% endfor %}
+</SpatialKeywords>
+<Temporal>
+{% for dt in docs[0]['BeginningEndingDateTime']  %}
+<RangeDateTime>
+{% if ' ' not in dt %}
+<BeginningDateTime>{{ dt }}</BeginningDateTime>
+<EndingDateTime>{{ dt }}</EndingDateTime>
+{% else %}
+{% if '*' not in dt[1:dt.index(' ')] %}
+<BeginningDateTime>{{ dt[1:dt.index(' ')] }}</BeginningDateTime>
+{% else %}
+<BeginningDateTime></BeginningDateTime>
+{% endif %}
+{% if '*' not in dt %}
+<EndingDateTime>{{ dt[dt.rindex(' ')+1:-1] }}</EndingDateTime>
+{% else %}
+<EndingDateTime></EndingDateTime>
+{% endif %}
+{% endif %}
+</RangeDateTime>
+{% endfor %}
+</Temporal>
+{% if docs[0]['CategoryKeyword'] %}
+<ScienceKeywords>
+{% for i in range(docs[0]['CategoryKeyword']|count)  %}
+<ScienceKeyword>
+<CategoryKeyword>{{ docs[0]['CategoryKeyword'][i] }}</CategoryKeyword>
+<TopicKeyword>{{ docs[0]['TopicKeyword'][i] }}</TopicKeyword>
+<TermKeyword>{{ docs[0]['TermKeyword'][i] }}</TermKeyword>
+<VariableLevel1Keyword>
+<Value>{{ docs[0]['VariableLevel1Keyword'][i] }}</Value>
+</VariableLevel1Keyword>
+{% if docs[0]['DetailedVariableKeyword'] %}
+<DetailedVariableKeyword>{{ docs[0]['DetailedVariableKeyword'][i] 
}}</DetailedVariableKeyword>
+{% endif %}
+</ScienceKeyword>
+{% endfor %}
+</ScienceKeywords>
+{% endif %}
+<Platforms>
+{% for i in range(docs[0]['Platform-ShortName']|count)  %}
+<Platform>
+<ShortName>{{ docs[0]['Platform-ShortName'][i] }}</ShortName>
+<LongName>{{ docs[0]['Platform-LongName'][i] }}</LongName>
+{% if docs[0]['Instrument-ShortName_' + i|string] %}
+<Instruments>
+{% for j in range(docs[0]['Instrument-ShortName_' + i|string]|count)  %}
+<Instrument>
+<ShortName>{{ docs[0]['Instrument-ShortName_' + i|string][j] }}</ShortName>
+<LongName>{{ docs[0]['Instrument-LongName_' + i|string][j] }}</LongName>
+{% if docs[0]['Sensor-ShortName_' + i|string + '_' + j|string] %}
+<Sensors>
+{% for k in range(docs[0]['Sensor-ShortName_' + i|string + '_' + 
j|string]|count)  %}
+<Sensor>
+<ShortName>{{ docs[0]['Sensor-ShortName_' + i|string + '_' + j|string][k] 
}}</ShortName>
+<LongName>{{ docs[0]['Sensor-LongName_' + i|string + '_' + j|string][k] 
}}</LongName>
+</Sensor>
+{% endfor %}
+</Sensors>
+{% endif %}
+</Instrument>
+{% endfor %}
+</Instruments>
+{% endif %}
+</Platform>
+{% endfor %}
+</Platforms>
+<AdditionalAttributes>
+{% if docs[0]['TemporalResolution'] %}
+<AdditionalAttribute>
+<Name>Temporal Resolution</Name>
+<Value>{{docs[0]['TemporalResolution']}}</Value>
+</AdditionalAttribute>
+{% endif %}
+{% if docs[0]['LatitudeResolution'] %}
+<AdditionalAttribute>
+<Name>Spatial Resolution</Name>
+<Value>{{docs[0]['LatitudeResolution']}} degrees (Latitude) x 
{{docs[0]['LongitudeResolution']}} degrees (Longitude)</Value>
+</AdditionalAttribute>
+{% endif %}
+{% if docs[0]['AcrossTrackResolution'] %}
+<AdditionalAttribute>
+<Name>Spatial Resolution</Name>
+<Value>{{docs[0]['AlongTrackResolution'] / 1000 }} km (Along) x 
{{docs[0]['AcrossTrackResolution'] / 1000 }} km (Across)</Value>
+</AdditionalAttribute>
+{% endif %}
+{% if docs[0]['DOI'] %}
+<AdditionalAttribute>
+<Name>DOI</Name>
+<Value>{{docs[0]['DOI']}}</Value>
+</AdditionalAttribute>
+{% endif %}
+{% for key in ['GlobalAttrTitle', 'GlobalAttrDescription', 'GlobalAttrSource', 
'GlobalAttrContact', 'GlobalAttrUnits'] %}
+{% if docs[0][key] %}
+<AdditionalAttribute>
+<Name>{{ key }}</Name>
+<Value>{{ docs[0][key] }}</Value>
+</AdditionalAttribute>
+{% endif %}
+{% endfor %}
+</AdditionalAttributes>
+<Campaigns>
+{% for i in range(docs[0]['Campaign-ShortName']|count)  %}
+<Campaign>
+<ShortName>{{ docs[0]['Campaign-ShortName'][i] }}</ShortName>
+<LongName>{{ docs[0]['Campaign-LongName'][i] }}</LongName>
+</Campaign>
+{% endfor %}
+</Campaigns>
+{% if docs[0]['OnlineAccessURL-URL'] %}
+<OnlineAccessURLs>
+{% for i in range(docs[0]['OnlineAccessURL-URL']|count)  %}
+<OnlineAccessURL>
+<URL>{{ docs[0]['OnlineAccessURL-URL'][i] }}</URL>
+<URLDescription>{{ docs[0]['OnlineAccessURL-URLDescription'][i] 
}}</URLDescription>
+</OnlineAccessURL>
+{% endfor %}
+</OnlineAccessURLs>
+{% endif %}
+{% if docs[0]['OnlineResource-URL'] %}
+<OnlineResources>
+{% for i in range(docs[0]['OnlineResource-URL']|count)  %}
+<OnlineResource>
+<URL>{{ docs[0]['OnlineResource-URL'][i] }}</URL>
+{% if docs[0]['OnlineResource-Description'] %}
+<Description>{{ docs[0]['OnlineResource-Description'][i] }}</Description>
+{% endif %}
+<Type>{{ docs[0]['OnlineResource-Type'][i] }}</Type>
+</OnlineResource>
+{% endfor %}
+</OnlineResources>
+{% endif %}
+{% if docs[0]['Spatial-Geometry'] %}
+<Spatial>
+<HorizontalSpatialDomain>
+<Geometry>
+{% for box in docs[0]['Spatial-Box']  %}
+<BoundingRectangle>
+<WestBoundingCoordinate>{{ box.split()[1] }}</WestBoundingCoordinate>
+<NorthBoundingCoordinate>{{ box.split()[2] }}</NorthBoundingCoordinate>
+<EastBoundingCoordinate>{{ box.split()[3] }}</EastBoundingCoordinate>
+<SouthBoundingCoordinate>{{ box.split()[0] }}</SouthBoundingCoordinate>
+</BoundingRectangle>
+{% endfor %}
+{% for polygon in docs[0]['Spatial-Polygon']  %}
+<GPolygon>
+<Boundary>
+{% for i in range(0, polygon.split()|count, 2) %}
+<Point>
+<PointLongitude>{{ polygon.split()[i+1] }}</PointLongitude>
+<PointLatitude>{{ polygon.split()[i] }}</PointLatitude>
+</Point>
+{% endfor %}
+</Boundary>
+</GPolygon>
+{% endfor %}
+</Geometry>
+</HorizontalSpatialDomain>
+</Spatial>
+{% endif %}
+<CollectionAssociations>
+{% for i in range(docs[0]['CollectionAssociation-ShortName']|count)  %}
+<CollectionAssociation>
+<ShortName>{{ docs[0]['CollectionAssociation-ShortName'][i] }}</ShortName>
+<LongName>{{ docs[0]['CollectionAssociation-LongName'][i] }}</LongName>
+<VersionId>{{ docs[0]['CollectionAssociation-VersionId'][i] }}</VersionId>
+<CollectionType>{{ docs[0]['CollectionAssociation-CollectionType'][i] 
}}</CollectionType>
+<CollectionUse>{{ docs[0]['CollectionAssociation-CollectionUse'][i] 
}}</CollectionUse>
+{% if 'CollectionAssociation-URL' in docs[0] %}
+<URL>{{ docs[0]['CollectionAssociation-URL'][i] }}</URL>
+{% endif %}
+</CollectionAssociation>
+{% endfor %}
+</CollectionAssociations>
+</Collection>

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/facet/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/facet/Writer.py 
b/src/main/python/plugins/slcp/facet/Writer.py
new file mode 100644
index 0000000..4194bde
--- /dev/null
+++ b/src/main/python/plugins/slcp/facet/Writer.py
@@ -0,0 +1,70 @@
+import logging
+import os
+import os.path
+import urllib
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.response.solrfacettemplateresponse import SolrFacetTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+        
+        self.facet = True
+        self.contentType = 'application/json'
+        
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrFacetTemplateResponse(self.facetDefs)
+        response.setTemplate(self.template)
+        
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        queries = []
+        filterQueries = []
+
+        for key, value in parameters.iteritems():
+            if value != "":
+                if key == 'keyword':
+                    queries.append(urllib.quote(value))
+                elif key == 'startTime':
+                    
queries.append('EndingDateTime-Internal:['+value+'%20TO%20*]')
+                elif key == 'endTime':
+                    queries.append('BeginningDateTime:[*%20TO%20'+value+']')
+                elif key == 'bbox':
+                    coordinates = value.split(",")
+                    filterQueries.append('Spatial-Geometry:[' + coordinates[1] 
+ ',' + coordinates[0] + '%20TO%20' + coordinates[3] + ',' + coordinates[2] + 
']')
+                elif key == 'concept_id':
+                    queries.append('concept-id:' + 
self._urlEncodeSolrQueryValue(value))
+
+        for key, value in facets.iteritems():
+            tagKey = '{!tag=' + key + '}' + key
+            if type(value) is list:
+                if (len(value) == 1):
+                    filterQueries.append(tagKey + ':' + 
self._urlEncodeSolrQueryValue(value[0]))
+                else:
+                    filterQueries.append(tagKey + ':(' + '+OR+'.join([ 
self._urlEncodeSolrQueryValue(x) for x in value ]) + ")")
+            else:    
+                filterQueries.append(tagKey + ':' + 
self._urlEncodeSolrQueryValue(value))
+
+        if len(queries) == 0:
+            queries.append('*:*')
+
+        query = 'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json'
+
+        if len(filterQueries) > 0:
+            query += '&fq='+'&fq='.join(filterQueries)
+        
+        if self.facet:
+            query += '&rows=0&facet=true&facet.limit=-1&'
+            query += '&'.join(['facet.field={!ex=' + facet +'}' + facet if 
facet in facets else 'facet.field=' + facet for facet in 
self.facetDefs.values()])
+        else:
+            query += '&start='+str(startIndex)+'&rows='+str(entriesPerPage)
+
+        logging.debug('solr query: '+query)
+
+        return query

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

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/facet/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/facet/plugin.conf 
b/src/main/python/plugins/slcp/facet/plugin.conf
new file mode 100644
index 0000000..21627fd
--- /dev/null
+++ b/src/main/python/plugins/slcp/facet/plugin.conf
@@ -0,0 +1,11 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/dataset
+entriesPerPage=10
+maxEntriesPerPage=2000
+defaultSearchParam=keyword
+parameters=keyword,startTime,endTime,bbox,concept_id
+facets={"Collection": "Collection", "Processing_Level": "ProcessingLevelBin", 
"Swath_Spatial_Resolution": "SwathSpatialResolution", 
"Grid_Spatial_Resolution": "GridSpatialResolution", "Temporal_Resolution": 
"TemporalResolution", "Parameter": "TermKeyword"}
+
+[service]
+url=http://localhost:8890
+template=template.xml

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/facet/template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/facet/template.xml 
b/src/main/python/plugins/slcp/facet/template.xml
new file mode 100644
index 0000000..c202f54
--- /dev/null
+++ b/src/main/python/plugins/slcp/facet/template.xml
@@ -0,0 +1,41 @@
+{
+"facets":[
+{% for key, facet in facetDefs.iteritems() %}
+{
+"field":"{{ key }}",
+"values":[
+{% if facet == 'GridSpatialResolution' or facet == 'SwathSpatialResolution'  %}
+{% for i in range(facets['facet_fields'][facet]|count, 0, -2) %}
+{
+"count":{{ facets['facet_fields'][facet][i-1] }},
+"value":"{{ facets['facet_fields'][facet][i-2] }}",
+"displayedValue":"{{ facets['facet_fields'][facet][i-2] }}{% if facet == 
'GridSpatialResolution' %} degree(s){% endif %}{% if facet == 
'SwathSpatialResolution' %} km{% endif %}"
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+{% else %}
+{% for i in range(0, facets['facet_fields'][facet]|count, 2) %}
+{
+"count":{{ facets['facet_fields'][facet][i+1] }},
+"value":"{{ facets['facet_fields'][facet][i] }}",
+{% if facet == 'ProcessingLevelBin' %}
+"displayedValue":"Level-{{ facets['facet_fields'][facet][i] }}{% if 
facets['facet_fields'][facet][i] == '2' %} (Swath){% elif 
facets['facet_fields'][facet][i] == '3' %} (Grid){% elif 
facets['facet_fields'][facet][i] == '4' %} (Blended){% endif %}"
+{% else %}
+"displayedValue":"{{ facets['facet_fields'][facet][i] }}"
+{% endif %}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+{% endif %}
+]
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/granule/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/granule/Writer.py 
b/src/main/python/plugins/slcp/granule/Writer.py
new file mode 100644
index 0000000..e462e1c
--- /dev/null
+++ b/src/main/python/plugins/slcp/granule/Writer.py
@@ -0,0 +1,79 @@
+import logging
+import os
+import os.path
+import urllib
+import json
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.opensearch.solrtemplateresponse import SolrTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrTemplateResponse(self._configuration, searchUrl, 
searchParams)
+        response.setTemplate(self.template)
+        response.variables['serviceUrl'] = self._configuration.get('service', 
'url')
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        sortKeys = json.loads(self._configuration.get('solr', 'sortKeys'))
+
+        queries = []
+        filterQueries = []
+        sort = None
+        sortDir = 'asc'
+
+        for key, value in parameters.iteritems():
+            if value != "":
+                if key == 'keyword':
+                    queries.append(urllib.quote(value))
+                elif key == 'startTime':
+                    queries.append('EndingDateTime:['+value+'%20TO%20*]')
+                elif key == 'endTime':
+                    queries.append('BeginningDateTime:[*%20TO%20'+value+']')
+                elif key == 'bbox':
+                    coordinates = value.split(",")
+                    filterQueries.append('Spatial-Geometry:[' + coordinates[1] 
+ ',' + coordinates[0] + '%20TO%20' + coordinates[3] + ',' + coordinates[2] + 
']')
+                elif key == 'shortName':
+                    queries.append('ShortName:' + 
self._urlEncodeSolrQueryValue(value))
+                elif key == 'sortKey':
+                    if value in sortKeys.keys():
+                        sort = sortKeys[value]
+                elif key == 'sortDir':
+                    sortDir = value
+
+        for key, value in facets.iteritems():
+            if type(value) is list:
+                if (len(value) == 1):
+                    filterQueries.append(key + ':' + 
self._urlEncodeSolrQueryValue(value[0]))
+                else:
+                    filterQueries.append(key + ':(' + '+OR+'.join([ 
self._urlEncodeSolrQueryValue(x) for x in value ]) + ")")
+            else:    
+                filterQueries.append(key + ':' + 
self._urlEncodeSolrQueryValue(value))
+
+        if len(queries) == 0:
+            queries.append('*:*')
+
+        query = 'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json'
+
+        if len(filterQueries) > 0:
+            query += '&fq='+'+AND+'.join(filterQueries)
+        
+        if self.facet:
+            query += '&rows=0&facet=true&facet.limit=-1&facet.mincount=1&'
+            query += '&'.join(['facet.field=' + facet for facet in 
self.facetDefs.values()])
+        else:
+            query += '&start='+str(startIndex)+'&rows='+str(entriesPerPage)
+            if sort is not None:
+                query += '&sort=' + urllib.quote(sort + ' ' + sortDir)
+
+        logging.debug('solr query: '+query)
+
+        return query

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/granule/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/granule/__init__.py 
b/src/main/python/plugins/slcp/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/slcp/granule/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/granule/plugin.conf 
b/src/main/python/plugins/slcp/granule/plugin.conf
new file mode 100644
index 0000000..2095306
--- /dev/null
+++ b/src/main/python/plugins/slcp/granule/plugin.conf
@@ -0,0 +1,12 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/granule
+entriesPerPage=10
+maxEntriesPerPage=2000
+defaultSearchParam=keyword
+parameters=keyword,startTime,endTime,bbox,sortKey,sortDir,shortName
+facets={}
+sortKeys={"Relevance": "score", "Start_Date": "BeginningDateTime", 
"Stop_Date": "EndingDateTime", "Last_Updated": "LastUpdate"}
+
+[service]
+url=http://localhost:8890
+template=template.xml

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/granule/template.xml
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/granule/template.xml 
b/src/main/python/plugins/slcp/granule/template.xml
new file mode 100755
index 0000000..8457aa4
--- /dev/null
+++ b/src/main/python/plugins/slcp/granule/template.xml
@@ -0,0 +1,49 @@
+<?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"; 
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></id>
+<author>
+<name>SLCP</name>
+<email></email>
+</author>
+<title type="text">SLCP granule metadata</title>
+<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"/>
+<os:totalResults>{{ numFound }}</os:totalResults>
+<os:itemsPerPage>{{ itemsPerPage }}</os:itemsPerPage>
+<os:startIndex>{{ startIndex }}</os:startIndex>
+{% for doc in docs %}
+<entry>
+{% if 0 == 1 %}
+<id>https://api.echo.nasa.gov:443/opensearch/granules.atom?uid=G752080-PODAAC</id>
+{% endif %}
+<title type="text">{{ doc['GranuleUR'] }}</title>
+<updated>{{ doc['LastUpdate'] }}</updated>
+{% for i in range(doc['OnlineAccessURL-URL']|count)  %}
+<link href="{{ doc['OnlineAccessURL-URL'][i] }}" hreflang="en-US" 
rel="enclosure" {% if doc['OnlineAccessURL-URLDescription'] and 
doc['OnlineAccessURL-URLDescription'][i] != ''  %} title="Data Access {{ 
doc['OnlineAccessURL-URLDescription'][i] }}" {% endif %} />
+{% endfor %}
+{% if 0 == 1 %}
+<dc:identifier>G752080-PODAAC</dc:identifier>
+{% endif %}
+<dc:date>{{ doc['BeginningDateTime'] }}/{{ doc['EndingDateTime'] }}</dc:date>
+{% if 0 == 1 %}
+<echo:datasetId>GHRSST Level 2P USA NASA MODIS Aqua SST:1</echo:datasetId>
+{% endif %}
+<echo:granuleSizeMB>{{ doc['FileSize'] / 1048576  }}</echo:granuleSizeMB>
+{% if 0 == 1 %}
+<echo:originalFormat>ECHO10</echo:originalFormat>
+<echo:dataCenter>PODAAC</echo:dataCenter>
+<echo:orbitCalSpatialDomain/>
+<echo:coordinateSystem>CARTESIAN</echo:coordinateSystem>
+{% endif %}
+{% if doc['Spatial-Geometry'][0].startswith('ENVELOPE')  %}
+{% set box = doc['Spatial-Geometry'][0][9:-1].split(',') %}
+<georss:box>{{ box[3] }} {{ box[0] }} {{ box[2] }} {{ box[1] }}</georss:box>
+{% endif %}
+</entry>
+{% endfor %}
+</feed>

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/indicator/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/indicator/Writer.py 
b/src/main/python/plugins/slcp/indicator/Writer.py
new file mode 100644
index 0000000..2d02f45
--- /dev/null
+++ b/src/main/python/plugins/slcp/indicator/Writer.py
@@ -0,0 +1,64 @@
+import logging
+import urllib
+import json
+
+from edge.writer.proxywriter import ProxyWriter
+
+class Writer(ProxyWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+
+    def _generateUrl(self, requestHandler):
+        url = self._configuration.get('solr', 'url')
+        parameters = {}
+        parameters['wt'] = 'json'
+        parameters['omitHeader'] = 'true'
+        parameters['q'] = '*:*'
+        try:
+            parameters['fq'] = 'id:"' + requestHandler.get_argument('id') + '"'
+        except:
+            parameters['fl'] = 
'id,name,rate,uncertainties,unit,shortenUnit,abbrUnit,updated_at'
+        try:
+            if requestHandler.get_argument('latest').lower() == 'true':
+                parameters['fl'] = 'xLatest,yLatest,unit,abbrUnit,updated_at'
+        except:
+            pass
+        url += '/select?' + urllib.urlencode(parameters)
+        logging.debug("proxy to url : " + url)
+        return url
+
+    def onResponse(self, response):
+        if response.error:
+            self.requestHandler.set_status(404)
+            self.requestHandler.write(str(response.error))
+            self.requestHandler.finish()
+        else:
+            for name, value in response.headers.iteritems():
+                logging.debug('header: '+name+':'+value)
+                self.requestHandler.set_header(name, value)
+            self.requestHandler.set_header('Access-Control-Allow-Origin', '*')
+
+            solrJson = json.loads(response.body)
+            if len(solrJson['response']['docs']) > 1:
+                # Need to order indicators accordingly
+                solrJsonClone = {}
+                solrJsonClone['response'] = {}
+                solrJsonClone['response']['start'] = 
solrJson['response']['start']
+                solrJsonClone['response']['numFound'] = 
solrJson['response']['numFound']
+                solrJsonClone['response']['docs'] = []
+
+                indicators = {}
+                for doc in solrJson['response']['docs']:
+                    indicators[doc['id']] = doc
+                for indicator in self._configuration.get('solr', 
'ordering').split(','):
+                    if indicator in indicators:
+                        
solrJsonClone['response']['docs'].append(indicators[indicator])
+                solrJson = solrJsonClone
+            for doc in solrJson['response']['docs']:
+                if 'uncertainties' in doc:
+                    if doc['id'] in self._configuration.get('solr', 
'uncertainties').split(','):
+                        doc['uncertainties'] = int(round(doc['uncertainties']))
+                        doc['rate'] = int(round(doc['rate']))
+
+            self.requestHandler.write(solrJson)
+            self.requestHandler.finish()

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

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/indicator/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/indicator/plugin.conf 
b/src/main/python/plugins/slcp/indicator/plugin.conf
new file mode 100644
index 0000000..5f6b9a6
--- /dev/null
+++ b/src/main/python/plugins/slcp/indicator/plugin.conf
@@ -0,0 +1,4 @@
+[solr]
+url=http://localhost:8983/solr/indicator
+ordering=Global_Mean_Sea_Level,Ocean_Mass,Steric_Height,Greenland_Mass_Variation,Antarctica_Mass_Variation
+uncertainties=Greenland_Mass_Variation,Antarctica_Mass_Variation

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/stats/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/stats/Writer.py 
b/src/main/python/plugins/slcp/stats/Writer.py
new file mode 100644
index 0000000..f7675af
--- /dev/null
+++ b/src/main/python/plugins/slcp/stats/Writer.py
@@ -0,0 +1,57 @@
+import logging
+import os
+import os.path
+import urllib
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.response.solrjsontemplateresponse import SolrJsonTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+        
+        self.contentType = 'application/json'
+
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrJsonTemplateResponse(parameters=searchParams)
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        queries = []
+        filterQueries = []
+        start = '*'
+        end = '*'
+
+        for key, value in parameters.iteritems():
+            if value != "":
+                if key == 'keyword':
+                    queries.append(urllib.quote(value))
+                elif key == 'ds':
+                    filterQueries.append('datasetShortName:%s' % value)
+                elif key == 'startTime':
+                    start = value
+                elif key == 'endTime':
+                    end = value
+                elif key == 'basinId':
+                    filterQueries.append('basinId_i:%s' % value)
+                elif key == 'basinName':
+                    filterQueries.append('basinName:%s' % value)
+        filterQueries.append('(time:[' + start + '%20TO%20' + end + '])')
+
+        if len(queries) == 0:
+            queries.append('*:*')
+
+        query = 
'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json&start='+str(startIndex)+'&rows='+str(entriesPerPage)
+
+        if len(filterQueries) > 0:
+            query += '&fq='+'+AND+'.join(filterQueries)
+
+        logging.debug('solr query: '+query)
+
+        return query

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

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/stats/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/stats/plugin.conf 
b/src/main/python/plugins/slcp/stats/plugin.conf
new file mode 100644
index 0000000..7ea6616
--- /dev/null
+++ b/src/main/python/plugins/slcp/stats/plugin.conf
@@ -0,0 +1,11 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/stats
+entriesPerPage=2147483647
+maxEntriesPerPage=2147483647
+defaultSearchParam=keyword
+parameters=keyword,ds,basinId,basinName,startTime,endTime
+facets={}
+
+[service]
+url=http://localhost:8890
+template=template.json

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/stats/template.json
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/stats/template.json 
b/src/main/python/plugins/slcp/stats/template.json
new file mode 100755
index 0000000..3b21951
--- /dev/null
+++ b/src/main/python/plugins/slcp/stats/template.json
@@ -0,0 +1,40 @@
+{
+    "stats": {},
+    "meta": [
+        {
+            "shortName": "{{ parameters['ds'] }}",
+            "basinId": {{ parameters['basinId'] | jsonify }},
+            "time": {
+                "start": {{ parameters['startTime'] }},
+                "stop": {{ parameters['endTime'] }}
+            }
+        }
+    ],
+    "data": [
+      {% for doc in docs %}
+[
+            {
+                "std": {{ doc['std'] }},
+                "cnt": {{ doc['cnt'] }},
+                "minSeasonalLowPass": {{ doc['minSeasonalLowPass'] | jsonify 
}},
+                "minSeasonal": {{ doc['minSeasonal'] | jsonify }},
+                "maxLowPass": {{ doc['maxLowPass'] | jsonify }},
+                "min": {{ doc['min'] }},
+                "max": {{ doc['max'] }},
+                "meanSeasonal": {{ doc['meanSeasonal'] | jsonify }},
+                "ds": 0,
+                "meanSeasonalLowPass": {{ doc['meanSeasonalLowPass'] | jsonify 
}},
+                "maxSeasonalLowPass": {{ doc['maxSeasonalLowPass'] | jsonify 
}},
+                "time": {{ doc['time'] }},
+                "maxSeasonal": {{ doc['maxSeasonal'] | jsonify }},
+                "meanLowPass": {{ doc['meanLowPass'] | jsonify }},
+                "minLowPass": {{ doc['minLowPass'] | jsonify }},
+                "mean": {{ doc['mean'] }}
+            }
+        ]
+      {% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+          ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/suggest/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/suggest/Writer.py 
b/src/main/python/plugins/slcp/suggest/Writer.py
new file mode 100644
index 0000000..5fec63d
--- /dev/null
+++ b/src/main/python/plugins/slcp/suggest/Writer.py
@@ -0,0 +1,22 @@
+import logging
+import urllib
+
+from edge.writer.proxywriter import ProxyWriter
+
+class Writer(ProxyWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+
+    def _generateUrl(self, requestHandler):
+        url = self._configuration.get('solr', 'url')
+        parameters = {}
+        parameters['wt'] = 'json'
+        parameters['suggest'] = 'true'
+        #parameters['suggest.build'] = 'true'
+        try:
+            parameters['suggest.q'] = requestHandler.get_argument('keyword')
+            url += '/suggest?' + urllib.urlencode(parameters)
+        except:
+            raise Exception('Missing keyword parameter.')
+        logging.debug("proxy to url : " + url)
+        return url

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

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/suggest/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/suggest/plugin.conf 
b/src/main/python/plugins/slcp/suggest/plugin.conf
new file mode 100644
index 0000000..55aa1a3
--- /dev/null
+++ b/src/main/python/plugins/slcp/suggest/plugin.conf
@@ -0,0 +1,2 @@
+[solr]
+url=http://localhost:8983/solr/dataset

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/umm-json/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/umm-json/Writer.py 
b/src/main/python/plugins/slcp/umm-json/Writer.py
new file mode 100644
index 0000000..388e610
--- /dev/null
+++ b/src/main/python/plugins/slcp/umm-json/Writer.py
@@ -0,0 +1,39 @@
+import logging
+import os
+import os.path
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.response.solrjsontemplateresponse import SolrJsonTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+
+        self.contentType = 'application/json'
+
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrJsonTemplateResponse()
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        queries = []
+
+        for key, value in parameters.iteritems():
+            if key == 'id':
+                queries.append('id:' + self._urlEncodeSolrQueryValue(value))
+            elif key == 'slcpShortName':
+                queries.append('SlcpShortName:' + 
self._urlEncodeSolrQueryValue(value))
+            elif key == 'shortName':
+                queries.append('ShortName:' + 
self._urlEncodeSolrQueryValue(value))
+
+        query = 
'q='+'+AND+'.join(queries)+'&version=2.2&indent=on&wt=json'+'&rows='+str(entriesPerPage)
+
+        logging.debug('solr query: '+query)
+
+        return query

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/umm-json/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/umm-json/__init__.py 
b/src/main/python/plugins/slcp/umm-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/slcp/umm-json/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/umm-json/plugin.conf 
b/src/main/python/plugins/slcp/umm-json/plugin.conf
new file mode 100644
index 0000000..3836fac
--- /dev/null
+++ b/src/main/python/plugins/slcp/umm-json/plugin.conf
@@ -0,0 +1,8 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/dataset
+entriesPerPage=1
+parameters=id,slcpShortName,shortName
+
+[service]
+url=http://localhost:8890
+template=template.json

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/slcp/umm-json/template.json
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/slcp/umm-json/template.json 
b/src/main/python/plugins/slcp/umm-json/template.json
new file mode 100644
index 0000000..1e00e8d
--- /dev/null
+++ b/src/main/python/plugins/slcp/umm-json/template.json
@@ -0,0 +1,274 @@
+{
+"Projects": [
+{% for i in range(docs[0]['Campaign-ShortName']|count)  %}
+{
+"ShortName" : {{ docs[0]['Campaign-ShortName'][i] | jsonify }},
+"LongName" : {{ docs[0]['Campaign-LongName'][i] | jsonify }}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+],
+{% if docs[0]['Spatial-Geometry'] %}
+"SpatialExtent" : {
+"SpatialCoverageType" : "HORIZONTAL",
+"HorizontalSpatialDomain" : {
+"Geometry" : {
+"CoordinateSystem" : {{ docs[0]['CoordinateSystem'] | jsonify }},
+"BoundingRectangles" : [
+{% for box in docs[0]['Spatial-Box']  %}
+{
+"WestBoundingCoordinate" : {{ box.split()[1] }},
+"NorthBoundingCoordinate" : {{ box.split()[2] }},
+"EastBoundingCoordinate" : {{ box.split()[3] }},
+"SouthBoundingCoordinate" : {{ box.split()[0] }}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+}
+},
+"GranuleSpatialRepresentation" : {{ docs[0]['CoordinateSystem'] | jsonify }}
+},
+{% endif %}
+"Distributions" : [ {
+"DistributionFormat" : {{ docs[0]['DataFormat'] | jsonify }}
+} ],
+{% if docs[0]['CategoryKeyword'] %}
+"ScienceKeywords" : [
+{% for i in range(docs[0]['CategoryKeyword']|count)  %}
+{
+"Category" : {{ docs[0]['CategoryKeyword'][i] | jsonify }},
+"Topic" : {{ docs[0]['TopicKeyword'][i] | jsonify }},
+"Term" : {{ docs[0]['TermKeyword'][i] | jsonify }},
+"VariableLevel1" : {{ docs[0]['VariableLevel1Keyword'][i] | jsonify }}
+{% if docs[0]['DetailedVariableKeyword'] %}
+,"DetailedVariable" : {{ docs[0]['DetailedVariableKeyword'][i] | jsonify }}
+{% endif %}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+],
+{% endif %}
+"TemporalExtents" : [ {
+ "RangeDateTimes" : [
+{% for dt in docs[0]['BeginningEndingDateTime']  %}
+{
+{% if ' ' not in dt %}
+"BeginningDateTime" : "{{ dt }}",
+"EndingDateTime" : "{{ dt }}"
+{% else %}
+"BeginningDateTime" : "{{ dt[1:dt.index(' ')] }}"
+{% if '*' not in dt %}
+,
+"EndingDateTime" : "{{ dt[dt.rindex(' ')+1:-1] }}"
+{% endif %}
+{% endif %}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+} ],
+"ProcessingLevel" : {
+"Id" : {{ docs[0]['ProcessingLevelId'] | jsonify }}
+},
+"ShortName" : {{ docs[0]['ShortName'] | jsonify }},
+"EntryTitle" : {{ docs[0]['LongName'] | jsonify }},
+"RelatedUrls" : [
+{% for i in range(docs[0]['OnlineAccessURL-URL']|count)  %}
+{
+"Description" : {{ docs[0]['OnlineAccessURL-URLDescription'][i] | jsonify }},
+"Relation" : [ "GET DATA" ],
+"URLs" : [ {{ docs[0]['OnlineAccessURL-URL'][i] | jsonify }} ]
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+{% if docs[0]['OnlineResource-URL'] %}
+,
+{% endif %}
+{% for i in range(docs[0]['OnlineResource-URL']|count)  %}
+{
+{% if docs[0]['OnlineResource-Description'][i] != '' %}
+"Description" : {{ docs[0]['OnlineResource-Description'][i] | jsonify }},
+{% endif %}
+"URLs" : [ {{ docs[0]['OnlineResource-URL'][i] | jsonify }} ]
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+],
+"DataDates" : [ {
+"Date" : "{{ docs[0]['LastUpdate'] }}",
+"Type" : "UPDATE"
+} ],
+"Abstract" : {{ docs[0]['Description'] | jsonify }},
+"Version" : {{ docs[0]['VersionId'] | jsonify }},
+"LocationKeywords" : [
+{% for keyword in docs[0]['SpatialKeywords-Keyword']  %}
+{
+"Category": "GEOGRAPHIC REGION",
+ "Type": {{ keyword | jsonify }}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+],
+"Platforms" : [
+{% for i in range(docs[0]['Platform-ShortName']|count)  %}
+{
+"Type" : "SPACECRAFT",
+"ShortName" : {{ docs[0]['Platform-ShortName'][i] | jsonify }},
+"LongName" : {{ docs[0]['Platform-LongName'][i] | jsonify }}
+{% if docs[0]['Instrument-ShortName_' + i|string] %}
+,
+"Instruments" : [
+{% for j in range(docs[0]['Instrument-ShortName_' + i|string]|count)  %}
+{
+"ShortName" : {{ docs[0]['Instrument-ShortName_' + i|string][j] | jsonify }},
+"LongName" : {{ docs[0]['Instrument-LongName_' + i|string][j] | jsonify }}
+{% if docs[0]['Sensor-ShortName_' + i|string + '_' + j|string] %}
+,
+"Sensors" : [
+{% for k in range(docs[0]['Sensor-ShortName_' + i|string + '_' + 
j|string]|count)  %}
+{
+"ShortName" : {{ docs[0]['Sensor-ShortName_' + i|string + '_' + j|string][k] | 
jsonify }},
+"LongName" : {{ docs[0]['Sensor-LongName_' + i|string + '_' + j|string][k] | 
jsonify }}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+{% endif %}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+{% endif %}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+{% if docs[0]['DOI'] %}
+,
+"DOI" : {"DOI" : {{ docs[0]['DOI'] | jsonify }}}
+{% endif %}
+,
+"AncillaryKeywords" : [
+{% for keyword in docs[0]['Keyword']  %}
+{{ keyword | jsonify }}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+],
+"DataCenters": [
+{% if docs[0]['ProcessingCenter'] %}
+{
+"Roles": ["PROCESSOR"],
+"ShortName": {{ docs[0]['ProcessingCenter'] | jsonify }}
+}
+{% endif %}
+{% if docs[0]['ArchiveCenter'] %}
+{% if docs[0]['ProcessingCenter'] %}
+,
+{% endif %}
+{
+"Roles": ["ARCHIVER"],
+"ShortName": {{ docs[0]['ArchiveCenter'] | jsonify }}
+}
+{% endif %}
+],
+{% if docs[0]['LatitudeResolution'] %}
+"GeographicCoordinateSystemType" : {
+"GeographicCoordinateUnits" : "degrees",
+"LatitudeResolution" : {{ docs[0]['LatitudeResolution'] }},
+"LongitudeResolution" : {{ docs[0]['LongitudeResolution'] }}
+},
+{% endif %}
+{% if docs[0]['TemporalResolution'] %}
+"TemporalKeywords" : [
+{{ docs[0]['TemporalResolution'] | jsonify }}
+],
+{% endif %}
+"MetadataAssociations":[
+{% for i in range(docs[0]['CollectionAssociation-ShortName']|count)  %}
+{
+"EntryId": {{ docs[0]['CollectionAssociation-ShortName'][i] | jsonify }},
+"Description": {{ docs[0]['CollectionAssociation-CollectionUse'][i] | jsonify 
}},
+"Type": {{ docs[0]['CollectionAssociation-CollectionType'][i] | jsonify }},
+"Version": {{ docs[0]['CollectionAssociation-VersionId'][i] | jsonify }},
+"EntryTitle": {{ docs[0]['CollectionAssociation-LongName'][i] | jsonify }}
+{% if 'CollectionAssociation-URL' in docs[0] %}
+,"URL": {{ docs[0]['CollectionAssociation-URL'][i] | jsonify }}
+{% endif %}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+],
+"PublicationReferences":[
+{% set publicationKeys = {"PublicationReferences-Title": "Title", 
"PublicationReferences-Publisher": "Publisher", "PublicationReferences-Author": 
"Author", "PublicationReferences-PublicationDate": "PublicationDate", 
"PublicationReferences-Series": "Series", "PublicationReferences-Edition": 
"Edition", "PublicationReferences-Volume": "Volume", 
"PublicationReferences-Issue": "Issue", "PublicationReferences-ReportNumber": 
"ReportNumber", "PublicationReferences-PublicationPlace": "PublicationPlace", 
"PublicationReferences-Pages": "Pages", "PublicationReferences-ISBN": "ISBN", 
"PublicationReferences-OtherReferenceDetails": "OtherReferenceDetails"} %}
+{% for i in range(docs[0]['PublicationReferences-Title']|count)  %}
+{
+{% for key, value in publicationKeys.iteritems() %}
+"{{ value }}": {{ docs[0][key][i].strip() | jsonify }},
+{% endfor %}
+"DOI": {"DOI" : {{ docs[0]['PublicationReferences-DOI'][i] | jsonify}} }
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+],
+"AdditionalAttributes" : [
+{% set hasAttrs = False %}
+{% if docs[0]['NexusDataBeginningDateTime'] %}
+{% set hasAttrs = True %}
+{"Name": "NexusDataBeginningDateTime", "Description": "Beginning date of data 
available in Nexus", "DataType": "DATETIME", "Value": "{{ 
docs[0]['NexusDataBeginningDateTime'] }}"}
+{% endif %}
+{% if docs[0]['NexusDataEndingDateTime'] %}
+{% if hasAttrs %},{% endif %}
+{% set hasAttrs = True %}
+{"Name": "NexusDataEndingDateTime", "Description": "Ending date of data 
available in Nexus", "DataType": "DATETIME", "Value": "{{ 
docs[0]['NexusDataEndingDateTime'] }}"}
+{% endif %}
+{% if docs[0]['NexusShortName'] %}
+{% if hasAttrs %},{% endif %}
+{% set hasAttrs = True %}
+{"Name": "NexusShortName", "Description": "Name of dataset in Nexus", 
"DataType": "STRING", "Value": "{{ docs[0]['NexusShortName'][0] }}"}
+{% endif %}
+{% if docs[0]['LatitudeResolution'] %}
+{% if hasAttrs %},{% endif %}
+{% set hasAttrs = True %}
+{"Name": "Spatial Resolution", "Description": "Spatial resolution of dataset", 
"DataType": "STRING", "Value": "{{docs[0]['LatitudeResolution']}} degrees 
(Latitude) x {{docs[0]['LongitudeResolution']}} degrees (Longitude)"}
+{% endif %}
+{% if docs[0]['AcrossTrackResolution'] %}
+{% if hasAttrs %},{% endif %}
+{% set hasAttrs = True %}
+{"Name": "Spatial Resolution", "Description": "Spatial resolution of dataset", 
"DataType": "STRING", "Value": "{{docs[0]['AlongTrackResolution'] / 1000 }} km 
(Along) x {{docs[0]['AcrossTrackResolution'] / 1000 }} km (Across)"}
+{% endif %}
+{% for key in ['GlobalAttrTitle', 'GlobalAttrDescription', 'GlobalAttrSource', 
'GlobalAttrContact', 'GlobalAttrUnits'] %}
+{% if docs[0][key] %}
+{% if hasAttrs %},{% endif %}
+{% set hasAttrs = True %}
+{"Name": "{{ key }}", "DataType": "STRING", "Value": {{ docs[0][key] | jsonify 
}}}
+{% endif %}
+{% endfor %}
+]
+}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/spurs/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs/__init__.py 
b/src/main/python/plugins/spurs/__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/spurs/json/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs/json/Writer.py 
b/src/main/python/plugins/spurs/json/Writer.py
new file mode 100644
index 0000000..126089f
--- /dev/null
+++ b/src/main/python/plugins/spurs/json/Writer.py
@@ -0,0 +1,76 @@
+import logging
+import os
+import os.path
+import urllib
+import json
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.response.solrjsontemplateresponse import SolrJsonTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+        
+        self.contentType = 'application/json'
+
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrJsonTemplateResponse(searchUrl, searchParams)
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        variable = json.loads(self._configuration.get('solr', 'variable'))
+
+        queries = []
+        filterQueries = []
+        sort = None
+
+        for key, value in parameters.iteritems():
+            if value != "":
+                if key == 'keyword':
+                    queries.append(urllib.quote(value))
+                elif key == 'startTime':
+                    filterQueries.append('time:['+value+'%20TO%20*]')
+                elif key == 'endTime':
+                    filterQueries.append('time:[*%20TO%20'+value+']')
+                elif key == 'bbox':
+                    coordinates = value.split(",")
+                    filterQueries.append('point_srpt:[' + coordinates[1] + ',' 
+ coordinates[0] + '%20TO%20' + coordinates[3] + ',' + coordinates[2] + ']')
+                elif key == 'variable':
+                    if value.lower() in variable:
+                        filterQueries.append("(" + "+OR+".join([x + 
":[*%20TO%20*]" for x in variable[value.lower()]]) + ")")
+                elif key == 'minDepth':
+                    filterQueries.append('depth:['+value+'%20TO%20*]')
+                elif key == 'maxDepth':
+                    filterQueries.append('depth:[*%20TO%20'+value+']')
+                elif key == 'platform':
+                    if type(value) is list:
+                        filterQueries.append('platform:(' + '+OR+'.join(value) 
+ ')')
+                    else:
+                        filterQueries.append('platform:'+value)
+
+        if len(queries) == 0:
+            queries.append('*:*')
+
+        query = 
'q='+'+AND+'.join(queries)+'&wt=json&start='+str(startIndex)+'&rows='+str(entriesPerPage)
+
+        if len(filterQueries) > 0:
+            query += '&fq='+'+AND+'.join(filterQueries)
+
+        if sort is not None:
+            query += '&sort=' + sort
+
+        if 'stats' in parameters and parameters['stats'].lower() == 'true':
+            query += '&stats=true&stats.field={!min=true%20max=true}depth'
+
+        if 'facet' in parameters and parameters['facet'].lower() == 'true':
+            query += 
'&facet=true&facet.field=platform&facet.field=device&facet.limit=-1&facet.mincount=1'
+
+        logging.debug('solr query: '+query)
+
+        return query

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/spurs/json/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs/json/__init__.py 
b/src/main/python/plugins/spurs/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/spurs/json/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs/json/plugin.conf 
b/src/main/python/plugins/spurs/json/plugin.conf
new file mode 100644
index 0000000..76c39c8
--- /dev/null
+++ b/src/main/python/plugins/spurs/json/plugin.conf
@@ -0,0 +1,12 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/spurs
+entriesPerPage=10
+maxEntriesPerPage=100000
+defaultSearchParam=keyword
+parameters=keyword,startTime,endTime,bbox,minDepth,maxDepth,variable,stats,platform,facet
+facets={}
+variable={"sss" : ["salinity", "salinity1", "salinity_ctd"], "sst" : 
["temperature", "temperature1", "TEMP", "temperature_ctd"], "wind" : 
["RELWSPD"]}
+
+[service]
+url=http://localhost:8890
+template=template.json

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/spurs/json/template.json
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs/json/template.json 
b/src/main/python/plugins/spurs/json/template.json
new file mode 100755
index 0000000..c445f12
--- /dev/null
+++ b/src/main/python/plugins/spurs/json/template.json
@@ -0,0 +1,63 @@
+{
+{% if last %}"last": "{{ last }}",{% endif %}
+{% if prev %}"prev": "{{ prev }}",{% endif %}
+{% if next %}"next": "{{ next }}",{% endif %}
+{% if first %}"first": "{{ first }}",{% endif %}
+"results":[
+{% for doc in docs %}
+{
+"id": "{{ doc['id'] }}",
+"time": "{{ doc['time'] }}",
+"point": "Point({{ doc['point_srpt'] }})",
+"sea_water_temperature": {% if 'temperature' in doc %}{{ doc['temperature'] | 
jsonify }}{% elif 'temperature1' in doc %}{{ doc['temperature1'] | jsonify }}{% 
elif 'TEMP' in doc %}{{ doc['TEMP'] | jsonify }}{% elif 'temperature_ctd' in 
doc %}{{ doc['temperature_ctd'] | jsonify }}{% else %}null{% endif %},
+"sea_water_temperature_depth": {% if 'temperature' in doc or 'temperature1' in 
doc or 'TEMP' in doc or 'temperature_ctd' in doc %}{{ doc['depth'] | jsonify 
}}{% else %}null{% endif %},
+"sea_water_temperature_quality": {% if 'temperature' in doc or 'temperature1' 
in doc or 'TEMP' in doc or 'temperature_ctd' in doc %}0{% else %}null{% endif 
%},
+"wind_speed": {{ doc['RELWSPD'] | jsonify }},
+"eastward_wind": {% if 'eastward_wind' in doc %}{{ doc['eastward_wind'][0] | 
jsonify }}{% else %}null{% endif %},
+"northward_wind": {% if 'northward_wind' in doc %}{{ doc['northward_wind'][0] 
| jsonify }}{% else %}null{% endif %},
+"wind_depth": {% if 'RELWSPD' in doc %}{{ doc['depth'] | jsonify }}{% else 
%}null{% endif %},
+"wind_quality": {% if 'RELWSPD' in doc %}0{% else %}null{% endif %},
+"sea_water_salinity": {% if 'salinity' in doc %}{{ doc['salinity'] | jsonify 
}}{% elif 'salinity1' in doc %}{{ doc['salinity1'] | jsonify }}{% elif 
'salinity_ctd' in doc %}{{ doc['salinity_ctd'] | jsonify }}{% else %}null{% 
endif %},
+"sea_water_salinity_depth": {% if 'salinity' in doc or 'salinity1' in doc or 
'salinity_ctd' in doc %}{{ doc['depth'] | jsonify }}{% else %}null{% endif %},
+"sea_water_salinity_quality": {% if 'salinity' in doc or 'salinity1' in doc or 
'salinity_ctd' in doc %}0{% else %}null{% endif %},
+"platform": {{ doc['platform'] | jsonify }},
+"device": {{ doc['device'] | jsonify }},
+"fileurl": {{ doc['fileurl'] | jsonify }}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+,"totalResults":{{ numFound }}
+,"startIndex":{{ startIndex  }}
+,"itemsPerPage":{{ itemsPerPage }}
+{% if stats %}
+,
+"stats_fields": {{ stats['stats_fields'] | jsonify }}
+{% endif %}
+{% if facets %}
+,
+"facets":[
+{% for key, facet in facets['facet_fields'].iteritems() %}
+{
+"field": "{{ key }}",
+"values":[
+{% for i in range(0, facet|count, 2) %}
+{
+"count":{{facet[i+1] }},
+"value": "{{ facet[i] }}"
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+{% endif %}
+}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/spurs2/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs2/__init__.py 
b/src/main/python/plugins/spurs2/__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/spurs2/json/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs2/json/Writer.py 
b/src/main/python/plugins/spurs2/json/Writer.py
new file mode 100644
index 0000000..126089f
--- /dev/null
+++ b/src/main/python/plugins/spurs2/json/Writer.py
@@ -0,0 +1,76 @@
+import logging
+import os
+import os.path
+import urllib
+import json
+
+from edge.writer.solrtemplateresponsewriter import SolrTemplateResponseWriter
+from edge.response.solrjsontemplateresponse import SolrJsonTemplateResponse
+
+class Writer(SolrTemplateResponseWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+        
+        self.contentType = 'application/json'
+
+        templatePath = os.path.dirname(configFilePath) + os.sep
+        templatePath += self._configuration.get('service', 'template')
+        self.template = self._readTemplate(templatePath)
+
+    def _generateOpenSearchResponse(self, solrResponse, searchText, searchUrl, 
searchParams, pretty):
+        response = SolrJsonTemplateResponse(searchUrl, searchParams)
+        response.setTemplate(self.template)
+
+        return response.generate(solrResponse, pretty=pretty)
+
+    def _constructSolrQuery(self, startIndex, entriesPerPage, parameters, 
facets):
+        variable = json.loads(self._configuration.get('solr', 'variable'))
+
+        queries = []
+        filterQueries = []
+        sort = None
+
+        for key, value in parameters.iteritems():
+            if value != "":
+                if key == 'keyword':
+                    queries.append(urllib.quote(value))
+                elif key == 'startTime':
+                    filterQueries.append('time:['+value+'%20TO%20*]')
+                elif key == 'endTime':
+                    filterQueries.append('time:[*%20TO%20'+value+']')
+                elif key == 'bbox':
+                    coordinates = value.split(",")
+                    filterQueries.append('point_srpt:[' + coordinates[1] + ',' 
+ coordinates[0] + '%20TO%20' + coordinates[3] + ',' + coordinates[2] + ']')
+                elif key == 'variable':
+                    if value.lower() in variable:
+                        filterQueries.append("(" + "+OR+".join([x + 
":[*%20TO%20*]" for x in variable[value.lower()]]) + ")")
+                elif key == 'minDepth':
+                    filterQueries.append('depth:['+value+'%20TO%20*]')
+                elif key == 'maxDepth':
+                    filterQueries.append('depth:[*%20TO%20'+value+']')
+                elif key == 'platform':
+                    if type(value) is list:
+                        filterQueries.append('platform:(' + '+OR+'.join(value) 
+ ')')
+                    else:
+                        filterQueries.append('platform:'+value)
+
+        if len(queries) == 0:
+            queries.append('*:*')
+
+        query = 
'q='+'+AND+'.join(queries)+'&wt=json&start='+str(startIndex)+'&rows='+str(entriesPerPage)
+
+        if len(filterQueries) > 0:
+            query += '&fq='+'+AND+'.join(filterQueries)
+
+        if sort is not None:
+            query += '&sort=' + sort
+
+        if 'stats' in parameters and parameters['stats'].lower() == 'true':
+            query += '&stats=true&stats.field={!min=true%20max=true}depth'
+
+        if 'facet' in parameters and parameters['facet'].lower() == 'true':
+            query += 
'&facet=true&facet.field=platform&facet.field=device&facet.limit=-1&facet.mincount=1'
+
+        logging.debug('solr query: '+query)
+
+        return query

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/spurs2/json/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs2/json/__init__.py 
b/src/main/python/plugins/spurs2/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/spurs2/json/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs2/json/plugin.conf 
b/src/main/python/plugins/spurs2/json/plugin.conf
new file mode 100644
index 0000000..37313d1
--- /dev/null
+++ b/src/main/python/plugins/spurs2/json/plugin.conf
@@ -0,0 +1,12 @@
+[solr]
+datasetUrl=http://localhost:8983/solr/spurs2
+entriesPerPage=10
+maxEntriesPerPage=100000
+defaultSearchParam=keyword
+parameters=keyword,startTime,endTime,bbox,minDepth,maxDepth,variable,stats,platform,facet
+facets={}
+variable={"sss" : ["salinity", "salinity1", "salinity_ctd", "S_41"], "sst" : 
["temperature", "temperature1", "TEMP", "temperature_ctd", "T_20"], "wind" : 
["RELWSPD"]}
+
+[service]
+url=http://localhost:8890
+template=template.json

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/spurs2/json/template.json
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/spurs2/json/template.json 
b/src/main/python/plugins/spurs2/json/template.json
new file mode 100755
index 0000000..a629a5d
--- /dev/null
+++ b/src/main/python/plugins/spurs2/json/template.json
@@ -0,0 +1,64 @@
+{
+{% if last %}"last": "{{ last }}",{% endif %}
+{% if prev %}"prev": "{{ prev }}",{% endif %}
+{% if next %}"next": "{{ next }}",{% endif %}
+{% if first %}"first": "{{ first }}",{% endif %}
+"results":[
+{% for doc in docs %}
+{
+"id": "{{ doc['id'] }}",
+"time": "{{ doc['time'] }}",
+"point": "Point({{ doc['point_srpt'] }})",
+"sea_water_temperature": {% if 'temperature' in doc %}{{ doc['temperature'] | 
jsonify }}{% elif 'temperature1' in doc %}{{ doc['temperature1'] | jsonify }}{% 
elif 'TEMP' in doc %}{{ doc['TEMP'] | jsonify }}{% elif 'temperature_ctd' in 
doc %}{{ doc['temperature_ctd'] | jsonify }}{% elif 'T_20' in doc %}{{ 
doc['T_20'] | jsonify }}{% else %}null{% endif %},
+"sea_water_temperature_depth": {% if 'temperature' in doc or 'temperature1' in 
doc or 'TEMP' in doc or 'temperature_ctd' in doc or 'T_20' in doc %}{{ 
doc['depth'] | jsonify }}{% else %}null{% endif %},
+"sea_water_temperature_quality": {% if 'temperature' in doc or 'temperature1' 
in doc or 'TEMP' in doc or 'temperature_ctd' in doc or 'T_20' in doc %}0{% else 
%}null{% endif %},
+"wind_speed": {{ doc['RELWSPD'] | jsonify }},
+"eastward_wind": {{ doc['wind_u'] | jsonify }},
+"northward_wind": {{ doc['wind_v'] | jsonify }},
+"wind_depth": {% if 'RELWSPD' in doc %}{{ doc['depth'] | jsonify }}{% else 
%}null{% endif %},
+"wind_quality": {% if 'RELWSPD' in doc %}0{% else %}null{% endif %},
+"sea_water_salinity": {% if 'salinity' in doc %}{{ doc['salinity'] | jsonify 
}}{% elif 'salinity1' in doc %}{{ doc['salinity1'] | jsonify }}{% elif 
'salinity_ctd' in doc %}{{ doc['salinity_ctd'] | jsonify }}{% elif 'S_41' in 
doc %}{{ doc['S_41'] | jsonify }}{% else %}null{% endif %},
+"sea_water_salinity_depth": {% if 'salinity' in doc or 'salinity1' in doc or 
'salinity_ctd' in doc or 'S_41' in doc %}{{ doc['depth'] | jsonify }}{% else 
%}null{% endif %},
+"sea_water_salinity_quality": {% if 'salinity' in doc or 'salinity1' in doc or 
'salinity_ctd' in doc or 'S_41' in doc %}0{% else %}null{% endif %},
+"platform": {{ doc['platform'] | jsonify }},
+"device": {{ doc['device'] | jsonify }},
+"fileurl": {{ doc['fileurl'] | jsonify }}
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+,"totalResults":{{ numFound }}
+,"startIndex":{{ startIndex  }}
+,"itemsPerPage":{{ itemsPerPage }}
+{% if stats %}
+,
+"stats_fields": {{ stats['stats_fields'] | jsonify }}
+{% endif %}
+{% if facets %}
+,
+"facets":[
+{% for key, facet in facets['facet_fields'].iteritems() %}
+{
+"field": "{{ key }}",
+"values":[
+{% for i in range(0, facet|count, 2) %}
+{
+"count":{{facet[i+1] }},
+"value": "{{ facet[i] }}"
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+}
+{% if not loop.last %}
+,
+{% endif %}
+{% endfor %}
+]
+{% endif %}
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/tie/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/tie/__init__.py 
b/src/main/python/plugins/tie/__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/tie/collection/Writer.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/tie/collection/Writer.py 
b/src/main/python/plugins/tie/collection/Writer.py
new file mode 100644
index 0000000..bad8827
--- /dev/null
+++ b/src/main/python/plugins/tie/collection/Writer.py
@@ -0,0 +1,54 @@
+import logging
+import urllib
+
+from edge.dateutility import DateUtility
+from edge.writer.proxywriter import ProxyWriter
+
+class Writer(ProxyWriter):
+    def __init__(self, configFilePath):
+        super(Writer, self).__init__(configFilePath)
+
+    def _generateUrl(self, requestHandler):
+        url = self._configuration.get('solr', 'url')
+        parameters = {}
+        parameters['wt'] = 'json'
+        parameters['group'] = 'true'
+        parameters['group.limit'] = -1
+        #parameters['facet.limit'] = 10
+        parameters['fl'] = 'time,productTypePrefix,productType'
+        parameters['group.field'] = 'crid'
+        parameters['omitHeader'] = 'true'
+        parameters['q'] = '*:*'
+        parameters['fq'] = []
+        parameters['sort'] = 'crid desc'
+        try:
+            parameters['fq'].append('collection:"' + 
requestHandler.get_argument('collection') + '"')
+        except:
+            pass
+        try:
+            parameters['fq'].append('productType:"' + 
requestHandler.get_argument('productType') + '"')
+        except:
+            pass
+        try:
+            start = requestHandler.get_argument('start')
+            if len(start) == 10:
+                start += 'T00:00:00'
+        except:
+            raise Exception('Missing start parameter.')
+        try:
+            end = requestHandler.get_argument('end')
+            if len(end) == 10:
+                end += 'T23:59:59'
+        except:
+            end = start[0:10] + 'T23:59:59'
+
+        logging.debug('start: ' + start)
+        logging.debug('end: ' + end)
+
+        start = DateUtility.convertISOToUTCTimestamp(start)
+        end = DateUtility.convertISOToUTCTimestamp(end) + 999
+        parameters['fq'].append('time:[' + str(start) + ' TO ' + str(end) + 
']')
+
+        url += '/select?' + urllib.urlencode(parameters, True)
+        logging.debug("proxy to url : " + url)
+        return url

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/plugins/tie/collection/__init__.py
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/tie/collection/__init__.py 
b/src/main/python/plugins/tie/collection/__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/tie/collection/plugin.conf
----------------------------------------------------------------------
diff --git a/src/main/python/plugins/tie/collection/plugin.conf 
b/src/main/python/plugins/tie/collection/plugin.conf
new file mode 100644
index 0000000..d82d682
--- /dev/null
+++ b/src/main/python/plugins/tie/collection/plugin.conf
@@ -0,0 +1,2 @@
+[solr]
+url=http://localhost:8983/solr/layer

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/requestresponder.py
----------------------------------------------------------------------
diff --git a/src/main/python/requestresponder.py 
b/src/main/python/requestresponder.py
new file mode 100644
index 0000000..5d27c48
--- /dev/null
+++ b/src/main/python/requestresponder.py
@@ -0,0 +1,24 @@
+import logging
+import ConfigParser
+
+class RequestResponder(object):
+    def __init__(self, configFilePath):
+        #logging.debug('config: '+configFilePath)
+        self._configuration = ConfigParser.RawConfigParser()
+        self._configuration.read(configFilePath)
+        self.requestHandler = None
+
+    def get(self, requestHandler):
+        self.requestHandler = requestHandler
+
+    def post(self, requestHandler):
+        self.requestHandler = requestHandler
+
+    def put(self, requestHandler):
+        self.requestHandler = requestHandler
+
+    def delete(self, requestHandler):
+        self.requestHandler = requestHandler
+
+    def options(self, requestHandler):
+        self.requestHandler = requestHandler

http://git-wip-us.apache.org/repos/asf/incubator-sdap-edge/blob/53351bf3/src/main/python/requirements.txt
----------------------------------------------------------------------
diff --git a/src/main/python/requirements.txt b/src/main/python/requirements.txt
new file mode 100644
index 0000000..e8805c9
--- /dev/null
+++ b/src/main/python/requirements.txt
@@ -0,0 +1,3 @@
+tornado==4.2.1
+jinja2==2.8
+python-dateutil==2.4.1


Reply via email to