source: TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/medin_2_3_ISO19139.py @ 6956

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

fixed bug in originator handling and error reporting

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
10'''
11class medin_2_3_ISO19139:
12       
13        def __init__(self):
14               
15                logging.info("Initiated ISO data model: MEDIN_v2.3 profile (accessor class date = 09/02/2010 SJD")
16       
17        '''
18        Method to extract the dataset ID from the xml
19        '''
20        def datasetID(self):
21               
22                #datasetID = (self.datasetID.__name__,{1:{'xpath':'gmd:fileIdentifier/gco:CharacterString'}})
23                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'}})
24               
25                return datasetID
26       
27        def dataSetName(self):
28                '''
29                See notes in metadataDates for tuple format
30                '''
31               
32                datasetName = (self.dataSetName.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString'}})
33               
34                return datasetName
35       
36       
37        def dataSetAbstract(self):
38                '''
39                See notes in metadataDates for tuple format
40                '''
41               
42                datasetName = (self.dataSetAbstract.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:abstract/gco:CharacterString'}})
43               
44                return datasetName
45       
46       
47        def dataCentreName(self):
48                '''
49                See notes in metadataDates for tuple format
50                '''
51               
52                dataCentreName = (self.dataCentreName.__name__,{1:{
53                                                                                                        'baseXpath':'gmd:contact/gmd:CI_ResponsibleParty',
54                                                                                                        'elValXpath':'gmd:organisationName/gco:CharacterString',
55                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
56                                                                                                        'depVal':'pointOfContact'}},
57                                                                                                        {2:{
58                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty',
59                                                                                                        'elValXpath':'gmd:organisationName/gco:CharacterString',
60                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
61                                                                                                        'depVal':'pointOfContact'}})
62               
63                return dataCentreName
64       
65               
66       
67        def boundingDates(self):
68                '''
69                See notes in metadataDates for tuple format
70                '''
71                               
72                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'}},
73                                                                                        {2:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition'}},
74                                                                                        {'order':{'start':1,'end':2}})
75                                                               
76               
77                return date
78       
79        def coordinates(self):
80               
81                '''
82                See notes in metadataDates for tuple format
83                '''
84                               
85                #NOTE coords in north,south,east,west sequence
86                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'}},
87                                                                        {2:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:southBoundLatitude/gco:Decimal'}},
88                                                                        {3:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:eastBoundLongitude/gco:Decimal'}},
89                                                                        {4:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:westBoundLongitude/gco:Decimal'}},
90                                                                        {'order':{'north':1,'south':2,'east':3,'west':4}})
91               
92                return coordinates
93       
94               
95       
96        def originalFormat(self):
97                '''
98                See notes in metadataDates for tuple format
99                '''
100               
101                originalFormat = (self.originalFormat.__name__,{1:{'xpath':'metadataStandardName/gco:CharacterString'}})
102               
103                return originalFormat
104       
105       
106        def originalFormatVersion(self):
107                '''
108                See notes in metadataDates for tuple format
109                '''
110               
111                originalFormatVersion = (self.originalFormatVersion.__name__,{1:{'xpath':'metadataStandardVersion/gco:CharacterString'}})
112               
113                return originalFormatVersion
114       
115       
116        def authors(self):
117                '''
118                See notes in metadataDates for tuple format
119               
120                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
121                   to be any identified individual contributing to the dataset.  To restrict to actual roles, use compound xpath type.
122               
123                '''
124               
125                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'}})
126                                       
127                return authors
128       
129       
130        def parameters(self):
131                '''
132                See notes in metadataDates for tuple format NOTE - USE KEYWORDS!!
133               
134                1. For MEDIN use the TopicCategories for parameters (not handled differently than in DIF's
135                '''
136                #Note that in StubISO same element structure is used for related_urls!
137               
138                parameters = (self.parameters.__name__, {1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_TopicCategoryCode'}})
139               
140                '''
141                parameters = (self.parameters.__name__,{1:{                                                                     
142                'baseXpath':'distributionInfo/gmd:MD_Distribution/transferOptions',
143                'elValXpath':'gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/description/gco:CharacterString',
144                'depValXpath':'gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/function/gmd:CI_onLineFunctionCode',
145                'depVal':'DIF:PARAMETERS'}})
146                '''
147               
148                return parameters
149       
150       
151       
152        def resourceType(self):
153       
154                '''
155                Method to extract and return resourceType - extra column required for this 'searchTarget' requested by Gaynor.
156               
157                MEDIN element 4 p12             
158               
159                '''
160               
161                resource = (self.resourceType.__name__,{1:{'xpath':'gmd:hierarchyLevel/gmd:MD_ScopeCode'}})
162       
163                return resource
164       
165       
166       
167       
168        def topicCategory(self):
169                '''
170                Method to extract and return topicCategory
171               
172                MEDIN element 9 p16,
173               
174                NB - equivalent to standard NDG ingest field
175                '''
176               
177                topicCategory = (self.topicCategory.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:topicCategory/gmd:MD_TopicCategoryCode'}})
178       
179                return topicCategory
180               
181       
182       
183       
184        def lineage(self):
185                '''
186                Method to extract and return lineage values. - extra column required for this 'searchTarget' requested by Gaynor.
187               
188                MEDIN element 17 p29
189                '''
190               
191                lineage = (self.lineage.__name__,{1:{'xpath':'gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:statement/gco:CharacterString'}})
192               
193                return lineage
194       
195       
196        def publicAccessLimitations(self):
197                '''
198                Method to extract and return info on public access limitations - extra column required for this 'searchTarget' requested by Gaynor.
199               
200                MEDIN element 20 p33
201                '''
202               
203                publicAccess = (self.publicAccessLimitations.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_RestrictionCode'}})
204               
205                return publicAccess
206       
207       
208        def dataOriginator(self):
209                '''
210                Method to extract and return info on the Data Originator
211               
212                MEDIN element 22.1 p35.  For this will return a list of organisation names
213               
214                Mandatory - must have minimum of Organisation Name or Person Name.
215                '''
216               
217                #originator = (self.dataOriginator.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString'}})
218               
219                #revised 07/06/10 SJD - Needs to pick out values where CI_RoleCode = originator (not sure why its not already doing this..)
220                # also may not have Organisation name, so look uo
221                originator = (self.dataOriginator.__name__,{1:{
222                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty',
223                                                                                                        'elValXpath':'gmd:organisationName/gco:CharacterString',
224                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
225                                                                                                        'depVal':'originator'}},
226                                                                                                        {2:{
227                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty',
228                                                                                                        'elValXpath':'gmd:individualName/gco:CharacterString',
229                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode',
230                                                                                                        'depVal':'originator'}})
231               
232                return originator
233       
234       
235       
236        def keywords(self):
237               
238                '''
239                See notes in metadataDates for tuple format
240               
241                1. For MEDIN see Element 11 p18 - currently this method LUMPS ALL ISO keywords together!!!
242                '''
243                keywords = (self.keywords.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/gco:CharacterString'}},
244                                                                                        {2:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/gmx:Anchor'}}
245                                                                               
246                                )
247               
248                return keywords
249       
250       
251        def urlsToChange(self):
252                '''
253                Method containing standard iso xpath for URL's to be changed for purposes of NDG redirect
254               
255                MEDIN - updated to change home pages, resources etc : Element 5.1 (resource locator url), Element 7 (coupled resource)
256               
257                '''
258               
259                urls = (self.urlsToChange.__name__,
260                        {1:{'xpath':'distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/gmd:linkage/gmd:URL'}})
261                       
262                '''                                                             
263                'baseXpath':'distributionInfo/gmd:MD_Distribution/transferOptions',
264                'elValXpath':'gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/gmd:linkage/gmd:URL',
265                'depValXpath':'gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/function/gmd:CI_onLineFunctionCode',
266                'depVal':'DIF:RELATED_URL'}},
267                {3:{'baseXpath':'gmd:contact/gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:onlineResource',
268                                                                                                        'elValXpath':'gmd;linkage/gmd:URL',
269                                                                                                        'depValXpath':'function/gmd:CI_onLineFunctionCode',
270                                                                                                        'depVal':'DIF:DC_URL'}}
271                '''
272               
273                return urls
274               
275       
276       
277        def metadataCreationDate(self):
278               
279               
280                '''revised
281                Tuple to hold information data - return list of lists if list has 4 values
282                then its a dependant type in which case the list is the following format:
283                        [0] Base Xpath: the xpath from the root element to the element subtree at which point the required and dependant value branches
284                        [1] Value required xpath: the xpath to the subelement for the desired value
285                        [2] Dependant value xpath: the xpath to the subelement in which the dependant value resides i.e. an ISO role code
286                        [3] Dependant value: the value to match [2] - if it matches then value [1] returned, otherwise None returned
287                USE "returnDependantElementVal" method with this type!!
288               
289                If List has a SINGLE element then this is the xpath from the root element to the desired value
290                '''
291               
292                creationDate = (self.metadataCreationDate.__name__,{1:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date',
293                                                                                                                        'elValXpath':'gmd:CI_Date/gmd:date/gco:Date',
294                                                                                                                        'depValXpath':'gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode',
295                                                                                                                        'depVal':'creation'}})
296                               
297                return creationDate
298       
299       
300        '''
301        Return xpaths to revisionDate
302        '''
303        def metadataPublicationDate(self):
304               
305                publicationDate = (self.metadataPublicationDate.__name__,{1:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date',
306                                                                                                                        'elValXpath':'gmd:CI_Date/gmd:date/gco:Date',
307                                                                                                                        'depValXpath':'gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode',
308                                                                                                                        'depVal':'publication'}})
309               
310                return publicationDate
311       
312       
313        '''
314        Return xpaths to revisionDate
315        '''
316        def metadataRevisionDate(self):
317               
318                '''
319                revisionDate = (self.metadataRevisionDate.__name__,{1:{'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date',
320                                                                                                                        'elValXpath':'gmd:CI_Date/gmd:date/gco:Date',
321                                                                                                                        'depValXpath':'gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode',
322                                                                                                                        'depVal':'revision'}})
323                '''
324               
325                #for medin - revisionDate is same as updateDate
326                revisionDate = (self.metadataRevisionDate.__name__,{1:{'xpath':'gmd:dateStamp/gco:Date'}})
327               
328                return revisionDate
329       
330       
331        def metadataUpdateDate(self):           
332                '''
333                Method to extract and return the timestamp of the metadata
334               
335                MEDIN element 26 p 43
336                '''
337               
338                updateDate = (self.metadataUpdateDate.__name__,{1:{'xpath':'gmd:dateStamp/gco:Date'}})
339               
340                return updateDate
341               
Note: See TracBrowser for help on using the repository browser.