source: TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/NERC_DMS_0_7.py @ 7901

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/NERC_DMS_0_7.py@7901
Revision 7901, 17.1 KB checked in by sdonegan, 9 years ago (diff)

Update to bugs involved in handling CEH service records etc

Line 
1import string,logging
2
3'''
4Class to hold methods that define the tuples holding xpath information to be used with the iso accessor class to
5return information for various parameters needed to complete the NDG Discovery Service database as part of the MEDIN
6Upgraded ingest system.
7
8Steve Donegan Dec/Jan 2009/2010.
9
1028/10/2010: Updated to extract values from NERC Discovery Metadata Standard (based on MEDIN).  SJD.
11
12'''
13class NERC_DMS_0_7:
14       
15        def __init__(self):
16               
17                logging.info("Initiated ISO data model: NERC DMS 0.7 profile (accessor class date = 01/11/2010 SJD")
18       
19       
20        '''
21        Method to extract the dataset ID from the xml - for service datasets
22        '''
23        def fileIdentifier(self):
24                               
25                fileIdentifier = (self.fileIdentifier.__name__,{1:{'xpath':'gmd:fileIdentifier/gco:CharacterString'}})
26               
27                return fileIdentifier
28       
29        '''
30        Method to extract the dataset ID from the xml - for non service type datasets
31        '''
32        def datasetID(self):
33               
34                #datasetID = (self.datasetID.__name__,{1:{'xpath':'gmd:fileIdentifier/gco:CharacterString'}})
35                datasetID = (self.datasetID.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:RS_Identifier/gmd:code/gco:CharacterString'}},
36                                                                                         {2:{'xpath':'gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:RS_Identifier/gmd:code/gco:CharacterString'}})
37               
38                return datasetID
39       
40        def dataSetName(self):
41                '''
42                See notes in metadataDates for tuple format
43                '''
44               
45                datasetName = (self.dataSetName.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString'}},
46                                                                                                 {2:{'xpath':'gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString'}})
47               
48                return datasetName
49       
50       
51        def dataSetAbstract(self):
52                '''
53                See notes in metadataDates for tuple format
54                '''
55               
56                datasetName = (self.dataSetAbstract.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:abstract/gco:CharacterString'}})
57               
58                return datasetName
59       
60       
61        def dataCentreName(self):
62                '''
63                See notes in metadataDates for tuple format
64                '''
65               
66                dataCentreName = (self.dataCentreName.__name__,{1:{
67                                                                                                        'baseXpath':'gmd:contact/gmd:CI_ResponsibleParty',
68                                                                                                        'elValXpath':'gmd:organisationName/gco:CharacterString',
69                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
70                                                                                                        'depVal':'pointOfContact'}},
71                                                                                                        {2:{
72                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty',
73                                                                                                        'elValXpath':'gmd:organisationName/gco:CharacterString',
74                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
75                                                                                                        'depVal':'pointOfContact'}},
76                                                                                                        {2:{
77                                                                                                        'baseXpath':'gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty',
78                                                                                                        'elValXpath':'gmd:organisationName/gco:CharacterString',
79                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
80                                                                                                        'depVal':'pointOfContact'}})
81               
82                return dataCentreName
83       
84               
85       
86        def boundingDates(self):
87                '''
88                See notes in metadataDates for tuple format
89                '''
90                               
91                date = (self.boundingDates.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition'}},
92                                                                                        {2:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition'}},
93                                                                                        {'order':{'start':1,'end':2}})
94               
95               
96                                                               
97               
98                return date
99       
100        def coordinates(self):
101               
102                '''
103                See notes in metadataDates for tuple format
104                '''
105                               
106                #NOTE coords in north,south,east,west sequence
107                coordinates = (self.coordinates.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:northBoundLatitude/gco:Decimal'}},
108                                                                        {2:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:southBoundLatitude/gco:Decimal'}},
109                                                                        {3:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:eastBoundLongitude/gco:Decimal'}},
110                                                                        {4:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:westBoundLongitude/gco:Decimal'}},
111                                                                        {'order':{'north':1,'south':2,'east':3,'west':4}})
112               
113                return coordinates
114       
115               
116       
117        def originalFormat(self):
118                '''
119                See notes in metadataDates for tuple format
120                '''
121               
122                originalFormat = (self.originalFormat.__name__,{1:{'xpath':'metadataStandardName/gco:CharacterString'}})
123               
124                return originalFormat
125       
126       
127        def originalFormatVersion(self):
128                '''
129                See notes in metadataDates for tuple format
130                '''
131               
132                originalFormatVersion = (self.originalFormatVersion.__name__,{1:{'xpath':'metadataStandardVersion/gco:CharacterString'}})
133               
134                return originalFormatVersion
135       
136       
137       
138        def dataFormats(self):
139                '''
140                See notes in metadataDates for tuple format
141                '''
142               
143                originalFormat = (self.originalFormat.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceFormat/gmd:MD_Format/gmd:name/gco:CharacterString'}})
144               
145                return originalFormat
146       
147       
148        def authors(self):
149                '''
150                See notes in metadataDates for tuple format
151               
152                1. According to MEDIN profile (element 22 p37) -for authors I will use "individualName" whatever roleCode is - as currently (11/02/10) understand author in this context
153                   to be any identified individual contributing to the dataset.  To restrict to actual roles, use compound xpath type.
154               
155                '''
156               
157                authors = (self.authors.__name__,{1:{'xpath':'gmd:contact/gmd:CI_ResponsibleParty/gmd:individualName/gco:CharacterString'}},{2:{'xpath':'gmd:contact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString'}},{3:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString'}})
158                                       
159                return authors
160       
161       
162        def parameters(self):
163                '''
164                See notes in metadataDates for tuple format NOTE - USE KEYWORDS!!
165               
166                1. For MEDIN use the TopicCategories for parameters (not handled differently than in DIF's
167                '''
168                #Note that in StubISO same element structure is used for related_urls!
169               
170                parameters = (self.parameters.__name__, {1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_TopicCategoryCode'}})
171               
172                '''
173                parameters = (self.parameters.__name__,{1:{                                                                     
174                'baseXpath':'distributionInfo/gmd:MD_Distribution/transferOptions',
175                'elValXpath':'gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/description/gco:CharacterString',
176                'depValXpath':'gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/function/gmd:CI_onLineFunctionCode',
177                'depVal':'DIF:PARAMETERS'}})
178                '''
179               
180                return parameters
181       
182       
183       
184        def resourceType(self):
185       
186                '''
187                Method to extract and return resourceType - extra column required for this 'searchTarget' requested by Gaynor.
188               
189                MEDIN element 4 p12             
190               
191                '''
192               
193                resource = (self.resourceType.__name__,{1:{'xpath':'gmd:hierarchyLevel/gmd:MD_ScopeCode@codeListValue'}})
194       
195                return resource
196       
197       
198       
199       
200        def topicCategory(self):
201                '''
202                Method to extract and return topicCategory
203               
204                MEDIN element 9 p16,
205               
206                NB - equivalent to standard NDG ingest field
207                '''
208               
209                topicCategory = (self.topicCategory.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:topicCategory/gmd:MD_TopicCategoryCode'}})
210       
211                return topicCategory
212               
213       
214       
215       
216        def lineage(self):
217                '''
218                Method to extract and return lineage values. - extra column required for this 'searchTarget' requested by Gaynor.
219               
220                MEDIN element 17 p29
221                '''
222               
223                lineage = (self.lineage.__name__,{1:{'xpath':'gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:statement/gco:CharacterString'}})
224               
225                return lineage
226       
227       
228        def publicAccessLimitations(self):
229                '''
230                Method to extract and return info on public access limitations - extra column required for this 'searchTarget' requested by Gaynor.
231               
232                MEDIN element 20 p33
233                '''
234               
235                publicAccess = (self.publicAccessLimitations.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_RestrictionCode'}},
236                                                                                                                          {2:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:useLimitation/gco:CharacterString'}})
237               
238                return publicAccess
239       
240       
241        def dataOriginator(self):
242                '''
243                Method to extract and return info on the Data Originator
244               
245                MEDIN element 22.1 p35.  For this will return a list of organisation names
246               
247                Mandatory - must have minimum of Organisation Name or Person Name.
248                '''
249               
250                #originator = (self.dataOriginator.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString'}})
251               
252                #revised 07/06/10 SJD - Needs to pick out values where CI_RoleCode = originator (not sure why its not already doing this..)
253                # also may not have Organisation name, so look uo
254                originator = (self.dataOriginator.__name__,{1:{
255                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty',
256                                                                                                        'elValXpath':'gmd:organisationName/gco:CharacterString',
257                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
258                                                                                                        'depVal':'originator'}},
259                                                                                                        {2:{
260                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty',
261                                                                                                        'elValXpath':'gmd:individualName/gco:CharacterString',
262                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
263                                                                                                        'depVal':'originator'}})
264               
265                return originator
266       
267       
268       
269        def keywords(self):
270               
271                '''
272                See notes in metadataDates for tuple format
273               
274                1. For MEDIN see Element 11 p18 - currently this method LUMPS ALL ISO keywords together!!!
275                '''
276                keywords = (self.keywords.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/gco:CharacterString'}},
277                                                                                        {2:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/gmx:Anchor'}},
278                                                                                        {3:{'xpath':'gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/gco:CharacterString'}}
279                                                                               
280                                )
281               
282                return keywords
283       
284       
285        def INSPIREthemes(self):
286               
287                '''
288                Updated for NERC API v4.3.0 - type of keyword so extract using dependant value type of tuple
289               
290                '''
291               
292                themes = (self.INSPIREthemes.__name__,{1:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords',
293                                                                                                        'elValXpath':'gmd:keyword/gco:CharacterString',
294                                                                                                        'depValXpath':'gmd:thesaurusName/gmd:CI_Citation/gmd:title/gco:CharacterString',
295                                                                                                        'depVal':'GEMET - INSPIRE themes, version 1.0'}},
296                                                                                          {2:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords',
297                                                                                                        'elValXpath':'gmd:keyword/gco:CharacterString',
298                                                                                                        'depValXpath':'gmd:thesaurusName/gmd:CI_Citation/gmd:title/gco:CharacterString',
299                                                                                                        'depVal':'INSPIRE themes'}}
300                                                                                                        )
301               
302                return themes
303       
304       
305        def resourceLocator(self):
306               
307                '''
308                Updated for NERC API v4.3.0 - returns url of actual data location if available - is dependant val - code must be 'download'
309               
310                Update 02/03/11: CI_onlineFunctionCode=download structure is not available for all records: Kay wants us to just go on the presence
311                                                 of the gmd:transferOptions//gmd:URL as indicator of a resource locator..
312               
313               
314               
315                resource = (self.resourceLocator.__name__,{1:{
316                                                                                                        'baseXpath':'gmd:distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource',
317                                                                                                        'elValXpath':'gmd:linkage/gmd:URL',
318                                                                                                        'depValXpath':'gmd:function/gmd:CI_onLineFunctionCode',
319                                                                                                        'depVal':'download'}}) '''
320               
321                resource = (self.resourceLocator.__name__,{1:{'xpath':'gmd:distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/gmd:linkage/gmd:URL'}})
322                                                                                       
323                                       
324                return resource
325       
326       
327        def verticalExtentKeyword(self):
328               
329                '''
330                Updated for NERC API v4.3.0 - returns info on vertical extent
331                '''
332               
333               
334                extent = (self.verticalExtentKeyword.__name__,{1:{
335                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription/gmd:geographicIdentifier/gmd:MD_Identifier',
336                                                                                                        'elValXpath':'gmd:code/gco:CharacterString',
337                                                                                                        'depValXpath':'gmd:authority/gmd:CI_Citation/gmd:title/gco:CharacterString',
338                                                                                                        'depVal':'SeaDataNet vertical extent keywords'}},
339                                                                                                       
340                                                                                                        {2:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords',
341                                                                                                        'elValXpath':'gmd:keyword/gco:CharacterString',
342                                                                                                        'depValXpath':'gmd:thesaurusName/gmd:CI_Citation/gmd:title/gco:CharacterString',
343                                                                                                        'depVal':'Vertical Coverages'}}
344                                                                                                        )
345               
346               
347                #debug xpath - all extents
348                #extent = (self.verticalExtentKeyword.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString'}})
349               
350                return extent
351       
352       
353        def urlsToChange(self):
354                '''
355                Method containing standard iso xpath for URL's to be changed for purposes of NDG redirect
356               
357                MEDIN - updated to change home pages, resources etc : Element 5.1 (resource locator url), Element 7 (coupled resource)
358               
359                '''
360               
361                urls = (self.urlsToChange.__name__,
362                        {1:{'xpath':'distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/gmd:linkage/gmd:URL'}})
363                       
364                '''                                                             
365                'baseXpath':'distributionInfo/gmd:MD_Distribution/transferOptions',
366                'elValXpath':'gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/gmd:linkage/gmd:URL',
367                'depValXpath':'gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/function/gmd:CI_onLineFunctionCode',
368                'depVal':'DIF:RELATED_URL'}},
369                {3:{'baseXpath':'gmd:contact/gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:onlineResource',
370                                                                                                        'elValXpath':'gmd;linkage/gmd:URL',
371                                                                                                        'depValXpath':'function/gmd:CI_onLineFunctionCode',
372                                                                                                        'depVal':'DIF:DC_URL'}}
373                '''
374               
375                return urls
376               
377       
378       
379        def metadataCreationDate(self):
380               
381               
382                '''revised
383                Tuple to hold information data - return list of lists if list has 4 values
384                then its a dependant type in which case the list is the following format:
385                        [0] Base Xpath: the xpath from the root element to the element subtree at which point the required and dependant value branches
386                        [1] Value required xpath: the xpath to the subelement for the desired value
387                        [2] Dependant value xpath: the xpath to the subelement in which the dependant value resides i.e. an ISO role code
388                        [3] Dependant value: the value to match [2] - if it matches then value [1] returned, otherwise None returned
389                USE "returnDependantElementVal" method with this type!!
390               
391                If List has a SINGLE element then this is the xpath from the root element to the desired value
392                '''
393               
394                creationDate = (self.metadataCreationDate.__name__,{1:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date',
395                                                                                                                        'elValXpath':'gmd:CI_Date/gmd:date/gco:Date',
396                                                                                                                        'depValXpath':'gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode',
397                                                                                                                        'depVal':'creation'}})
398                               
399                return creationDate
400       
401       
402        '''
403        Return xpaths to revisionDate
404        '''
405        def metadataPublicationDate(self):
406               
407                publicationDate = (self.metadataPublicationDate.__name__,{1:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date',
408                                                                                                                        'elValXpath':'gmd:CI_Date/gmd:date/gco:Date',
409                                                                                                                        'depValXpath':'gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode',
410                                                                                                                        'depVal':'publication'}})
411               
412                return publicationDate
413       
414       
415        '''
416        Return xpaths to revisionDate
417        '''
418        def metadataRevisionDate(self):
419               
420                '''
421                revisionDate = (self.metadataRevisionDate.__name__,{1:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date',
422                                                                                                                        'elValXpath':'gmd:CI_Date/gmd:date/gco:Date',
423                                                                                                                        'depValXpath':'gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode',
424                                                                                                                        'depVal':'revision'}})
425                '''
426               
427                #for medin - revisionDate is same as updateDate
428                revisionDate = (self.metadataRevisionDate.__name__,{1:{'xpath':'gmd:dateStamp/gco:Date'}},
429                                                                                                                        {2:{'xpath':'gmd:dateStamp/gco:DateTime'}})
430               
431                return revisionDate
432       
433       
434        def metadataUpdateDate(self):           
435                '''
436                Method to extract and return the timestamp of the metadata
437               
438                MEDIN element 26 p 43
439                '''
440               
441                updateDate = (self.metadataUpdateDate.__name__,{1:{'xpath':'gmd:dateStamp/gco:Date'}})
442               
443                return updateDate
444               
Note: See TracBrowser for help on using the repository browser.