source: TI03-DataExtractor/trunk/pydxs/DXDMLHandler.py @ 1109

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI03-DataExtractor/trunk/pydxs/DXDMLHandler.py@1109
Revision 1109, 9.8 KB checked in by astephen, 13 years ago (diff)

Stable-ish version with fully-ish working dxc client.

Line 
1#!/usr/bin/env python
2
3#   Copyright (C) 2004 CCLRC & NERC( Natural Environment Research Council ).
4#   This software may be distributed under the terms of the
5#   Q Public License, version 1.0 or later. http://ndg.nerc.ac.uk/public_docs/QPublic_license.txt
6
7"""
8DXDMLHandler.py
9===============
10
11Holds the DXDMLHandler class for parsing and writing the
12Data Extractor's Dataset Markup Language (DXDML).
13
14"""
15
16# Import standard library modules
17from xml.dom import minidom
18import re
19
20# Import local modules
21from serverConfig import INPUT_DATASETS_FILE
22from common import deUnicodeObject
23from DXErrors import *
24
25class DXDMLHandler:
26    """
27    Handler class for DX Dataset objects - used as input data to the DX.
28    """
29
30    def __init__(self, xmlfile=INPUT_DATASETS_FILE):
31        """
32        Initialises the instance by parsing an xmlfile.
33        """
34        self.doc=minidom.parse(xmlfile)
35
36
37    def getDatasetGroups(self):
38        """
39        Returns a list of the Dataset Groups that the dx knows about.
40        """
41        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
42        dsgNames=[]
43        for dsg in dsgNodes:
44            dsgNames.append(dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip())
45        dsgNames.sort()
46        return dsgNames
47
48       
49    def getDatasets(self, datasetGroup):
50        """
51        Returns a list of the Datasets available for the given Dataset Group.
52        """
53        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
54        dsNames=[]     
55        for dsg in dsgNodes:
56            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
57                dsNodes=dsg.getElementsByTagName("DXDataset")
58                for ds in dsNodes:
59                    dsNames.append(ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip())   
60
61        if dsNames==[]:
62            raise DXOptionHandlingError, "Cannot match any datasets to dataset group: '%s'" % datasetGroup
63        dsNames.sort()
64        return dsNames   
65
66       
67    def getDatasetsAndDatasetURIs(self, datasetGroup):
68        """
69        Returns a list of (dataset, datasetURI) tuples for each dataset availabe in the
70        fiven datasetGroup.
71        """
72        rtlist=[]
73        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
74        for dsg in dsgNodes:
75            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
76                dsNames=[]
77                dsNodes=dsg.getElementsByTagName("DXDataset")
78                for ds in dsNodes:
79                    dsName=ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()
80                    dsURI=ds.getElementsByTagName("usageMetadataLink")[0].childNodes[0].nodeValue.strip()
81                    rtlist.append([dsName, dsURI])
82
83        if rtlist==[]:
84            raise DXOptionHandlingError, "Cannot match any datasets to dataset group: '%s'" % datasetGroup
85        rtlist.sort()
86        return rtlist                   
87
88       
89    def getDatasetURIList(self):
90        """
91        Returns a list of all the datasetURIs visible to this version of dx.
92        NOTE: datasetURI maps to usageMetadataLink in the XML.
93        """
94        dsURIs=[]
95        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
96        for dsg in dsgNodes:
97            dsgName=dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()
98            dsNodes=dsg.getElementsByTagName("DXDataset")
99           
100            for ds in dsNodes:
101                dsName=ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()
102                dsURI=ds.getElementsByTagName("usageMetadataLink")[0].childNodes[0].nodeValue.strip()
103
104                if dsURI!="" and dsURI!=None:
105                    dsURIs.append([dsURI, dsName, dsgName])
106
107        dsURIs.sort()
108        return dsURIs   
109
110
111    def getDatasetURI(self, datasetGroup, dataset):
112        """
113        Returns a datasetURI from a known dataset group and dataset.
114        """
115        dsURI=None
116        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
117        for dsg in dsgNodes:
118            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
119                dsNodes=dsg.getElementsByTagName("DXDataset")
120           
121                for ds in dsNodes:
122                    if ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()==dataset:
123                        dsURI=ds.getElementsByTagName("usageMetadataLink")[0].childNodes[0].nodeValue.strip()
124
125        if dsURI==None:
126            raise DXOptionHandlingError, "Cannot match the dataset group and dataset provided: ('%s', '%s')" % (datasetGroup, dataset)
127        return dsURI
128
129
130    def getDatasetGroupFromURI(self, datasetURI):
131        """
132        getDatasetGroupFromURI method - gets the id of the dataset group from a
133        datasetURI (if it is known to the dx).
134        """ 
135        URI_list=self.getDatasetURIList()
136        for i in URI_list:
137            if i[0]==datasetURI:
138                return i[2]
139        raise DXOptionHandlingError, "Cannot match any dataset group to the datasetURI: '%s'" % datasetURI
140
141
142    def getProtectID(self, datasetGroup=None, dataset=None, datasetURI=None):
143        """
144        getProtectID method - returns the (permittedRoles, permittedUsers) tuple for a given
145        dataset group, dataset or datasetURI (if known to the dx). This goes down to the level
146        provided by the caller. If just the dataset group is given then only the permissions
147        for that are returned. But if the dataset or datasetURI is given then the permissions
148        on that are returned. These should always be the same, but one day might not be.
149        """ 
150        if not datasetGroup and not datasetURI:
151            raise "You must provide either dataset group ID and dataset or a datasetURI as argument."
152        if datasetURI:
153            URI_list=self.getDatasetURIList()
154            for i in URI_list:
155                if i[0]==datasetURI:
156                    (datasetGroup, dataset)=(i[2], i[1])
157                   
158            # If no match then assume that the datasetURI has been provided externally
159            # and so the user can access it.
160            if not datasetGroup:
161                return (["all"], ["all"])
162 
163        permittedRoles=""
164        permittedUsers=""
165        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
166        for dsg in dsgNodes:
167
168            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
169                if not dataset:
170                    # Use the permissions defined at the Dataset Group level if no dataset provided.
171                    permittedRoles=dsg.getElementsByTagName("permittedRoles")[0].childNodes[0].nodeValue.strip()
172                    permittedUsers=dsg.getElementsByTagName("permittedUsers")[0].childNodes[0].nodeValue.strip()
173                else:               
174                    dsNodes=dsg.getElementsByTagName("DXDataset")
175           
176                    for ds in dsNodes:
177                        if ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()==dataset:
178                            permittedRoles=ds.getElementsByTagName("permittedRoles")[0].childNodes[0].nodeValue.strip()
179                            permittedUsers=ds.getElementsByTagName("permittedUsers")[0].childNodes[0].nodeValue.strip()
180
181        # Convert permitted items to lists
182        permittedRoles=deUnicodeObject(permittedRoles.split()) # de-unicode them just in case
183        permittedUsers=deUnicodeObject(permittedUsers.split()) # de-unicode them just in case
184        return [permittedRoles, permittedUsers]
185               
186               
187    def getFileNamePrefix(self, datasetGroup):
188        """
189        Returns the filename prefix for the given Dataset Group.
190        """
191        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
192        for dsg in dsgNodes:
193            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
194                prefix=dsg.getElementsByTagName("dxGroupFileNamePrefix")[0].childNodes[0].nodeValue.strip()
195        return prefix   
196       
197       
198    def getFileNameSection(self, datasetGroup, dataset):
199        """
200        Return the filename section for the Dataset given (within the Dataset Group given).
201        """
202        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
203        for dsg in dsgNodes:
204            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
205                dsNodes=dsg.getElementsByTagName("DXDataset")
206                for ds in dsNodes:
207                    if ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()==dataset:
208                        section=ds.getElementsByTagName("dxDatasetFileNameSection")[0].childNodes[0].nodeValue.strip()
209        return section   
210       
211       
212    def getAssociatedMetadata(self, datasetGroup, dataset=None):
213        """
214        Returns the URI to detailed ("B") metadata record and discovery ("D") metadata record
215        associated with a datasetGroup or a dataset.
216        """
217        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
218        for dsg in dsgNodes:
219            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
220                if dataset:
221                    dsNodes=dsg.getElementsByTagName("DXDataset")
222                    for ds in dsNodes:
223                        if ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()==dataset:
224                            detailedML=ds.getElementsByTagName("detailedMetadataLink")[0].childNodes[0].nodeValue.strip()
225                            discoveryML=ds.getElementsByTagName("discoveryMetadataLink")[0].childNodes[0].nodeValue.strip()                 
226                else:
227                    detailedML=dsg.getElementsByTagName("detailedMetadataLink")[0].childNodes[0].nodeValue.strip()
228                    discoveryML=dsg.getElementsByTagName("discoveryMetadataLink")[0].childNodes[0].nodeValue.strip()               
229        return [detailedML, discoveryML]               
230                     
231
232if __name__=="__main__":
233    a=DXDMLHandler()
234    print a.getDatasetGroups()
235    print a.getDatasets('Test Data Group 2')
236    print a.getFileNamePrefix('Test Data Group 3')
237    print a.getFileNameSection('Test Data Group 3', 'Test Dataset 3')
238    print a.getDatasetsAndDatasetURIs('Test Data Group 1')
239    #print a.getDatasetsAndDatasetURIs('tsosfso')
240    print a.getDatasetURIList()
241    print a.getDatasetURI('Test Data Group 3', 'Test Dataset 3')
242    print a.getProtectID('Test Data Group 2', datasetURI='file:/usr/local/dx/testdata/testdata2.xml')
243    print a.getAssociatedMetadata('Test Data Group 1')
244    print a.getAssociatedMetadata('Test Data Group 3', 'Test Dataset 3')
Note: See TracBrowser for help on using the repository browser.