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

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

Merged with titania version.

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,sortUnique
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=sortUnique(dsgNames)
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=sortUnique(dsNames)
64       
65        return dsNames   
66
67       
68    def getDatasetsAndDatasetURIs(self, datasetGroup):
69        """
70        Returns a list of (dataset, datasetURI) tuples for each dataset availabe in the
71        fiven datasetGroup.
72        """
73        rtlist=[]
74        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
75        for dsg in dsgNodes:
76            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
77                dsNames=[]
78                dsNodes=dsg.getElementsByTagName("DXDataset")
79                for ds in dsNodes:
80                    dsName=ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()
81                    dsURI=ds.getElementsByTagName("usageMetadataLink")[0].childNodes[0].nodeValue.strip()
82                    rtlist.append([dsName, dsURI])
83
84        if rtlist==[]:
85            raise DXOptionHandlingError, "Cannot match any datasets to dataset group: '%s'" % datasetGroup
86        rtlist=sortUnique(rtlist)
87        return rtlist                   
88
89       
90    def getDatasetURIList(self):
91        """
92        Returns a list of all the datasetURIs visible to this version of dx.
93        NOTE: datasetURI maps to usageMetadataLink in the XML.
94        """
95        dsURIs=[]
96        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
97        for dsg in dsgNodes:
98            dsgName=dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()
99            dsNodes=dsg.getElementsByTagName("DXDataset")
100           
101            for ds in dsNodes:
102                dsName=ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()
103                dsURI=ds.getElementsByTagName("usageMetadataLink")[0].childNodes[0].nodeValue.strip()
104
105                if dsURI!="" and dsURI!=None:
106                    dsURIs.append([dsURI, dsName, dsgName])
107
108        dsURIs=sortUnique(dsURIs)
109        return dsURIs   
110
111
112    def getDatasetURI(self, datasetGroup, dataset):
113        """
114        Returns a datasetURI from a known dataset group and dataset.
115        """
116        dsURI=None
117        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
118        for dsg in dsgNodes:
119            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
120                dsNodes=dsg.getElementsByTagName("DXDataset")
121           
122                for ds in dsNodes:
123                    if ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()==dataset:
124                        dsURI=ds.getElementsByTagName("usageMetadataLink")[0].childNodes[0].nodeValue.strip()
125
126        if dsURI==None:
127            raise DXOptionHandlingError, "Cannot match the dataset group and dataset provided: ('%s', '%s')" % (datasetGroup, dataset)
128        return dsURI
129
130
131    def getDatasetGroupFromURI(self, datasetURI):
132        """
133        getDatasetGroupFromURI method - gets the id of the dataset group from a
134        datasetURI (if it is known to the dx).
135        """ 
136        URI_list=self.getDatasetURIList()
137        for i in URI_list:
138            if i[0]==datasetURI:
139                return i[2]
140        raise DXOptionHandlingError, "Cannot match any dataset group to the datasetURI: '%s'" % datasetURI
141
142
143    def getDatasetGroupAndDatasetFromURI(self, datasetURI):
144        """
145        Gets the id of the dataset group and dataset from a
146        datasetURI (if it is known to the dx).
147        """
148        URI_list=self.getDatasetURIList()
149        for i in URI_list:
150            if i[0]==datasetURI or i[0]==("file:"+datasetURI):
151                return (i[2], i[1])
152                   
153        raise DXOptionHandlingError, ("Cannot match any dataset group and dataset to the datasetURI: '%s'" % datasetURI)
154
155
156    def getProtectID(self, datasetGroup=None, dataset=None, datasetURI=None):
157        """
158        getProtectID method - returns the (permittedRoles, permittedUsers) tuple for a given
159        dataset group, dataset or datasetURI (if known to the dx). This goes down to the level
160        provided by the caller. If just the dataset group is given then only the permissions
161        for that are returned. But if the dataset or datasetURI is given then the permissions
162        on that are returned. These should always be the same, but one day might not be.
163        """ 
164        if not datasetGroup and not datasetURI:
165            raise "You must provide either dataset group ID and dataset or a datasetURI as argument."
166        if datasetURI:
167            URI_list=self.getDatasetURIList()
168            for i in URI_list:
169                if i[0]==datasetURI:
170                    (datasetGroup, dataset)=(i[2], i[1])
171                   
172            # If no match then assume that the datasetURI has been provided externally
173            # and so the user can access it.
174            if not datasetGroup:
175                return (["all"], ["all"])
176 
177        permittedRoles=""
178        permittedUsers=""
179        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
180        for dsg in dsgNodes:
181
182            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
183                if not dataset:
184                    # Use the permissions defined at the Dataset Group level if no dataset provided.
185                    permittedRoles=dsg.getElementsByTagName("permittedRoles")[0].childNodes[0].nodeValue.strip()
186                    permittedUsers=dsg.getElementsByTagName("permittedUsers")[0].childNodes[0].nodeValue.strip()
187                else:               
188                    dsNodes=dsg.getElementsByTagName("DXDataset")
189           
190                    for ds in dsNodes:
191                        if ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()==dataset:
192                            permittedRoles=ds.getElementsByTagName("permittedRoles")[0].childNodes[0].nodeValue.strip()
193                            permittedUsers=ds.getElementsByTagName("permittedUsers")[0].childNodes[0].nodeValue.strip()
194
195        # Convert permitted items to lists
196        permittedRoles=deUnicodeObject(permittedRoles.split()) # de-unicode them just in case
197        permittedUsers=deUnicodeObject(permittedUsers.split()) # de-unicode them just in case
198        return [permittedRoles, permittedUsers]
199               
200               
201    def getFileNamePrefix(self, datasetGroup):
202        """
203        Returns the filename prefix for the given Dataset Group.
204        """
205        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
206        for dsg in dsgNodes:
207            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
208                prefix=dsg.getElementsByTagName("dxGroupFileNamePrefix")[0].childNodes[0].nodeValue.strip()
209        return prefix   
210       
211       
212    def getFileNameSection(self, datasetGroup, dataset):
213        """
214        Return the filename section for the Dataset given (within the Dataset Group given).
215        """
216        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
217        for dsg in dsgNodes:
218            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
219                dsNodes=dsg.getElementsByTagName("DXDataset")
220                for ds in dsNodes:
221                    if ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()==dataset:
222                        section=ds.getElementsByTagName("dxDatasetFileNameSection")[0].childNodes[0].nodeValue.strip()
223        return section   
224       
225       
226    def getAssociatedMetadata(self, datasetGroup, dataset=None):
227        """
228        Returns the URI to detailed ("B") metadata record and discovery ("D") metadata record
229        associated with a datasetGroup or a dataset.
230        """
231        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
232        for dsg in dsgNodes:
233            if dsg.getElementsByTagName("dxGroupLongName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
234                if dataset:
235                    dsNodes=dsg.getElementsByTagName("DXDataset")
236                    for ds in dsNodes:
237                        if ds.getElementsByTagName("dxDatasetLongName")[0].childNodes[0].nodeValue.strip()==dataset:
238                            detailedML=ds.getElementsByTagName("detailedMetadataLink")[0].childNodes[0].nodeValue.strip()
239                            discoveryML=ds.getElementsByTagName("discoveryMetadataLink")[0].childNodes[0].nodeValue.strip()                 
240                else:
241                    detailedML=dsg.getElementsByTagName("detailedMetadataLink")[0].childNodes[0].nodeValue.strip()
242                    discoveryML=dsg.getElementsByTagName("discoveryMetadataLink")[0].childNodes[0].nodeValue.strip()               
243        return [detailedML, discoveryML]               
244                     
245
246if __name__=="__main__":
247    a=DXDMLHandler()
248    print a.getDatasetGroups()
249    print a.getDatasets('Test Data Group 2')
250    print a.getFileNamePrefix('Test Data Group 3')
251    print a.getFileNameSection('Test Data Group 3', 'Test Dataset 3')
252    print a.getDatasetsAndDatasetURIs('Test Data Group 1')
253    #print a.getDatasetsAndDatasetURIs('tsosfso')
254    print a.getDatasetURIList()
255    print a.getDatasetURI('Test Data Group 3', 'Test Dataset 3')
256    print a.getProtectID('Test Data Group 2', datasetURI='file:/usr/local/dx/testdata/testdata2.xml')
257    print a.getAssociatedMetadata('Test Data Group 1')
258    print a.getAssociatedMetadata('Test Data Group 3', 'Test Dataset 3')
Note: See TracBrowser for help on using the repository browser.