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

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI03-DataExtractor/trunk/pydxs/InputDatasetManager.py@794
Revision 794, 5.5 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#   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
25class InputDatasetManager:
26    """
27    Manages the datasets known to the DX.
28    """
29
30    def __init__(self, datasetsFile=INPUT_DATASETS_FILE):
31        """
32        Sets up the instance.
33        """
34        self.datasetsFile=datasetsFile
35       
36        self.doc=minidom.parseString(open(self.datasetsFile).read().replace("\n",""))
37       
38        now=time.strftime("%Y%m%d.%H%M%S", time.localtime(time.time()))
39        backupFileName=self.datasetsFile+"."+now+".bak"
40        self.backupFile=open(backupFileName, "w")
41        self.backupFile.write(open(self.datasetsFile).read())
42        self.backupFile.close()
43        print "Backup file is: %s" % backupFileName
44       
45
46       
47       
48    def addDatasetGroup(self, argDict):
49        """
50        Adds a new datasetGroup. All attributes/elements are
51        listed in the argDict dictionary.
52        """
53        content=[["dxGroupShortName","REQUIRED"],
54                 ["dxGroupLongName","REQUIRED"],
55                 ["dxGroupFileNamePrefix","none"],
56                 ["dxGroupAccessRestrictions",[["permittedRoles","all"], ["permittedUsers","all"]]],
57                 ["MetadataLinks",[["detailedMetadataLink", "none"], 
58                                   ["discoveryMetadataLink", "none"],
59                                   ["usageMetadataLink", "none"],
60                                   ["documentationLink", "none"]]]]
61       
62       
63        dxDataInputsNode=self.doc.getElementsByTagName("DXDataInputs")[0]
64        dsgNode=self.doc.createElement("DXDatasetGroup")
65        dxDataInputsNode.appendChild(dsgNode)
66       
67        for (node, value) in content:
68
69            if value=="REQUIRED" and not argDict.has_key(node):
70                raise "Must provide mandatory metadata for new datasetGroup: %s" % node
71
72            newNode=self.doc.createElement(node)
73            dsgNode.appendChild(newNode)
74               
75            if type(value)==type([1]):
76               
77                for (subelement, subvalue) in value:
78                    if argDict.has_key(subelement):
79                        subvalue=argDict[subelement]   
80 
81                    subNode=self.doc.createElement(subelement)
82                    newNode.appendChild(subNode)
83                    subNode.appendChild(self.doc.createTextNode(subvalue))
84                       
85            elif not argDict.has_key(node):
86                newNode.appendChild(self.doc.createTextNode(value))         
87            else:
88                newNode.appendChild(self.doc.createTextNode(argDict[node]))
89       
90        print dsgNode.toxml()
91
92
93
94    def addDataset(self, datasetGroup, argDict):
95        """
96        Adds a new dataset. Parent dataset group is required and all other
97        attributes/elements are listed in the argDict dictionary.
98        """
99        content=[["dxDatasetShortName","REQUIRED"],
100                 ["dxDatasetLongName","REQUIRED"],
101                 ["dxDatasetFileNameSection","none"],
102                 ["dxDatasetAccessRestrictions",[["permittedRoles","all"], ["permittedUsers","all"]]],
103                 ["MetadataLinks",[["detailedMetadataLink", "none"], 
104                                   ["discoveryMetadataLink", "none"],
105                                   ["usageMetadataLink", "REQUIRED"],
106                                   ["documentationLink", "none"]]]]
107       
108        # Find starting node   
109        dsgNodes=self.doc.getElementsByTagName("DXDatasetGroup")
110        for dsgNode in dsgNodes:
111            #print "\nDD:%s:\n" % dsgNode.getElementsByTagName("dxGroupShortName")[0].childNodes[0].nodeValue
112            if dsgNode.getElementsByTagName("dxGroupShortName")[0].childNodes[0].nodeValue.strip()==datasetGroup:
113                break
114        else:
115            raise DXDatasetError, "Could not find matching node for dataset group '%s'." % datasetGroup
116       
117        dsNode=self.doc.createElement("DXDataset")
118        dsgNode.appendChild(dsNode)
119       
120        for (node, value) in content:
121
122            if value=="REQUIRED" and not argDict.has_key(node):
123                raise "Must provide mandatory metadata for new datasetGroup: %s" % node
124
125            newNode=self.doc.createElement(node)
126            dsNode.appendChild(newNode)
127               
128            if type(value)==type([1]):
129               
130                for (subelement, subvalue) in value:
131                    if subvalue=="REQUIRED" and not argDict.has_key(subelement):
132                        raise "Must provide mandatory metadata for new dataset: %s" % subelement       
133                       
134                    if argDict.has_key(subelement):
135                        subvalue=argDict[subelement]   
136 
137                    subNode=self.doc.createElement(subelement)
138                    newNode.appendChild(subNode)
139                    subNode.appendChild(self.doc.createTextNode(subvalue))
140                       
141            elif not argDict.has_key(node):
142                newNode.appendChild(self.doc.createTextNode(value))         
143            else:
144                newNode.appendChild(self.doc.createTextNode(argDict[node]))
145       
146        print dsNode.toxml()
147       
148           
149    def writeXMLFile(self, outputFilePath=None):
150        """
151        Writes the in-memory XML to the output file specified.
152        """
153        if not outputFilePath:
154            outputFilePath=self.datasetsFile
155           
156        outputFile=open(outputFilePath, "w")
157        self.doc.writexml(outputFile, indent="", addindent="    ", newl="\n")
158        outputFile.close()
159        print "New input dataset XML file written to: %s" % outputFilePath
160       
161       
162"""     
163    def (self):         
164    def (self):
165    def (self):
166    def (self):
167    def (self):
168    def (self):
169    def (self):
170    def (self):
171    def (self):
172    def (self):
173    def (self):
174    def (self):
175    def (self):
176"""
177
178 
Note: See TracBrowser for help on using the repository browser.