source: TI03-DataExtractor/branches/old_stuff/latest_dx/dx/pydxs/DXDMLHandler.py @ 793

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI03-DataExtractor/branches/old_stuff/latest_dx/dx/pydxs/DXDMLHandler.py@793
Revision 793, 9.2 KB checked in by astephen, 13 years ago (diff)

Put all the old code in the old_stuff branch.

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