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

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

Merged with titania version.

Line 
1#   Copyright (C) 2004 CCLRC & NERC( Natural Environment Research Council ).
2#   This software may be distributed under the terms of the
3#   Q Public License, version 1.0 or later. http://ndg.nerc.ac.uk/public_docs/QPublic_license.txt
4
5"""
6InputDatasetManager.py
7======================
8
9InputDatasetManager class manages changes to the input datasets
10file that holds the top level datasets known to the DX.
11
12"""
13
14# Import required modules
15import os
16import sys
17import time
18from xml.dom import minidom
19
20# import package modules including global variables
21from serverConfig import *
22from common import *
23from DXErrors import *
24
25
26def deleteExcessWhiteSpace(xmlString):
27    """
28    Removes excess white space in the xml string.
29    """
30    xmlString=xmlString.replace("  ","")
31    xmlString=xmlString.replace("  ","")
32    return xmlString
33
34
35class InputDatasetManager:
36    """
37    Manages the datasets known to the DX.
38    """
39
40    def __init__(self, datasetsFile=INPUT_DATASETS_FILE):
41        """
42        Sets up the instance.
43        """
44        self.datasetsFile=datasetsFile
45       
46        self.doc=minidom.parseString(open(self.datasetsFile).read().replace("\n",""))
47       
48        now=time.strftime("%Y%m%d.%H%M%S", time.localtime(time.time()))
49        backupFileName=self.datasetsFile+"."+now+".bak"
50        self.backupFile=open(backupFileName, "w")
51        self.backupFile.write(open(self.datasetsFile).read())
52        self.backupFile.close()
53        print "Backup file is: %s" % backupFileName
54       
55
56       
57       
58    def addDatasetGroup(self, argDict):
59        """
60        Adds a new datasetGroup. All attributes/elements are
61        listed in the argDict dictionary.
62        """
63        content=[["dxGroupShortName","REQUIRED"],
64                 ["dxGroupLongName","REQUIRED"],
65                 ["dxGroupFileNamePrefix","undefined"],
66                 ["dxGroupAccessRestrictions",[["permittedRoles",""], ["permittedUsers","none"]]],
67                 ["MetadataLinks",[["detailedMetadataLink", "undefined"], 
68                                   ["discoveryMetadataLink", "undefined"],
69                                   ["usageMetadataLink", "undefined"],
70                                   ["documentationLink", "undefined"]]]]
71       
72       
73        dxDataInputsNode=self.doc.getElementsByTagName("DXDataInputs")[0]
74        dsgNode=self.doc.createElement("DXDatasetGroup")
75        dxDataInputsNode.appendChild(dsgNode)
76       
77        for (node, value) in content:
78
79            if value=="REQUIRED" and not argDict.has_key(node):
80                raise "Must provide mandatory metadata for new datasetGroup: %s" % node
81
82            newNode=self.doc.createElement(node)
83            dsgNode.appendChild(newNode)
84               
85            if type(value)==type([1]):
86               
87                for (subelement, subvalue) in value:
88                    if argDict.has_key(subelement):
89                        subvalue=argDict[subelement]   
90 
91                    subNode=self.doc.createElement(subelement)
92                    newNode.appendChild(subNode)
93                    subNode.appendChild(self.doc.createTextNode(subvalue))
94                       
95            elif not argDict.has_key(node):
96                newNode.appendChild(self.doc.createTextNode(value))         
97            else:
98                newNode.appendChild(self.doc.createTextNode(argDict[node]))
99       
100        print dsgNode.toxml()
101
102
103
104    def addDataset(self, datasetGroup, argDict):
105        """
106        Adds a new dataset. Parent dataset group is required and all other
107        attributes/elements are listed in the argDict dictionary.
108        """
109        content=[["dxDatasetShortName","REQUIRED"],
110                 ["dxDatasetLongName","REQUIRED"],
111                 ["dxDatasetFileNameSection","undefined"],
112                 ["dxDatasetAccessRestrictions",[["permittedRoles",""], ["permittedUsers","none"]]],
113                 ["MetadataLinks",[["detailedMetadataLink", "undefined"], 
114                                   ["discoveryMetadataLink", "undefined"],
115                                   ["usageMetadataLink", "REQUIRED"],
116                                   ["documentationLink", "undefined"]]]]
117       
118        # Find starting node   
119        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
120        for dsgNode in dsgNodes:
121            #print "\nDD:%s:\n" % dsgNode.getElementsByTagName("dxGroupShortName")[0].childNodes[0].nodeValue
122            if dsgNode.getElementsByTagName("dxGroupShortName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
123                break
124        else:
125            raise DXDatasetError, "Could not find matching node for dataset group '%s'." % datasetGroup
126       
127        dsNode=self.doc.createElement("DXDataset")
128        dsgNode.appendChild(dsNode)
129       
130        for (node, value) in content:
131
132            if value=="REQUIRED" and not argDict.has_key(node):
133                raise "Must provide mandatory metadata for new datasetGroup: %s" % node
134
135            newNode=self.doc.createElement(node)
136            dsNode.appendChild(newNode)
137               
138            if type(value)==type([1]):
139               
140                for (subelement, subvalue) in value:
141                    if subvalue=="REQUIRED" and not argDict.has_key(subelement):
142                        raise "Must provide mandatory metadata for new dataset: %s" % subelement       
143                       
144                    if argDict.has_key(subelement):
145                        subvalue=argDict[subelement]   
146 
147                    subNode=self.doc.createElement(subelement)
148                    newNode.appendChild(subNode)
149                    subNode.appendChild(self.doc.createTextNode(subvalue))
150                       
151            elif not argDict.has_key(node):
152                newNode.appendChild(self.doc.createTextNode(value))         
153            else:
154                newNode.appendChild(self.doc.createTextNode(argDict[node]))
155       
156        print dsNode.toxml()
157       
158           
159    def writeXMLFile(self, outputFilePath=None):
160        """
161        Writes the in-memory XML to the output file specified.
162        """
163        if not outputFilePath:
164            outputFilePath=self.datasetsFile
165           
166        outputFile=open(outputFilePath, "w")
167        self.doc.writexml(outputFile, indent="", addindent="    ", newl="\n")
168        outputFile.close()
169        time.sleep(1)
170        f=open(outputFilePath)
171        data=f.read()
172        f.close()
173        data=deleteExcessWhiteSpace(data)
174        f=open(outputFilePath, "w")
175        f.write(data)
176        f.close()
177        print "New input dataset XML file written to: %s" % outputFilePath
178       
179       
180
181 
Note: See TracBrowser for help on using the repository browser.