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

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

Unstable but latest version with multi-variable support and split hooks
for CDML and CSML.

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