source: CMIP6dreq/trunk/src/dreq.py @ 357

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/src/dreq.py@357
Revision 357, 6.1 KB checked in by mjuckes, 6 years ago (diff)

added 'manage' directory

Line 
1""" Module to read in the data request and make some cross-reference tables to facilitate use.
2----------------------------------------------------------------------------------------------
3The data request is stored in a flattened format, which nevertheless requires 7 interlinking sections.
4"""
5
6import xml, string, collections
7import xml.dom
8import xml.dom.minidom
9class dreqItemBase(object):
10       def __init__(self,dict=None,xmlMiniDom=None,id='defaultId'):
11         dictMode = dict != None
12         mdMode = xmlMiniDom != None
13         assert not( dictMode and mdMode), 'Mode must be either dictionary of minidom: both assigned'
14         assert dictMode or mdMode, 'Mode must be either dictionary of minidom: neither assigned'
15         self.defaults = {}
16         self.globalDefault = '__unset__'
17         if dictMode:
18           self.dictInit( dict )
19         elif mdMode:
20           self.mdInit( xmlMiniDom )
21
22       def dictInit( self, dict ):
23         for a in self.attributes:
24           if dict.has_key(a):
25             self.__dict__[a] = dict[a]
26           else:
27             self.__dict__[a] = self.defaults.get( a, self.globalDefault )
28
29       def mdInit( self, el ):
30         __doc__ = """Initialisation from a mindom XML element. The list of attributes must be set by the class factory before the class is initialised"""
31         for a in self.attributes:
32           if el.hasAttribute( a ):
33             v = el.getAttribute( a )
34             self.__dict__[a] = v
35           else:
36             self.__dict__[a] = self.defaults.get( a, self.globalDefault )
37       
38
39class config(object):
40
41  def __init__(self):
42    self.vdef = '../docs/parVocabDefn.xml' 
43    self.vsamp = '../docs/CMIP6DataRequest_v0_01.xml'
44    self.nts = collections.namedtuple( 'sectdef', ['tag','label','title','id','itemLabelMode'] )
45    self.nti = collections.namedtuple( 'itemdef', ['tag','label','title','type'] )
46    self.ntt = collections.namedtuple( 'sect', ['header','attributes'] )
47
48    doc = xml.dom.minidom.parse( self.vdef  )
49    self.contentDoc = xml.dom.minidom.parse( self.vsamp )
50##<vocab label="institute" title="Institute" id="cmip.drv.001" itemLabelMode="def">
51##  <itemAttribute label="label"/>
52    vl = doc.getElementsByTagName( 'table' )
53    self.slist = []
54    self.tables = {}
55    tables = {}
56    self.tableClasses = {}
57    self.tableItems = collections.defaultdict( list )
58    for v in vl:
59      t = self.parsevcfg(v)
60      tables[t[0].label] = t
61      self.tableClasses[t[0].label] = self.itemClassFact( t.header.itemLabelMode, t.attributes.keys() )
62      self.slist.append( t )
63
64    for k in tables.keys():
65      vl = self.contentDoc.getElementsByTagName( k )
66      if len(vl) == 1:
67        v = vl[0]
68        t = v.getAttribute( 'title' )
69        i = v.getAttribute( 'id' )
70        il = v.getElementsByTagName( 'item' )
71        print k, t, i, len(il)
72        self.tables[k] = (i,t,len(il))
73       
74        for i in il:
75          ii = self.tableClasses[k](xmlMiniDom=i)
76          self.tableItems[k].append( ii )
77      elif len(vl) > 1:
78        l1 = []
79        l2 = []
80        print '#### %s: %s' % (k,len(vl) )
81        for v in vl:
82          t = v.getAttribute( 'title' )
83          i = v.getAttribute( 'id' )
84          il = v.getElementsByTagName( 'item' )
85          print k, t, i, len(il)
86          l1.append( (i,t,len(il)) )
87         
88          l2i = []
89          for i in il:
90            ii = self.tableClasses[k](xmlMiniDom=i)
91            l2i.append( ii )
92          l2.append( l2i )
93        self.tables[k] = l1
94        self.tableItems[k] = l2
95
96  def itemClassFact(self,itemLabelMode,attributes):
97     class dreqItem(dreqItemBase):
98       """Inherits all methods from dreqItemBase"""
99       
100     dreqItem.itemLabelMode = itemLabelMode
101     dreqItem.attributes = attributes
102     return dreqItem
103         
104  def parsevcfg(self,v):
105      l = v.getAttribute( 'label' )
106      t = v.getAttribute( 'title' )
107      i = v.getAttribute( 'id' )
108      ilm = v.getAttribute( 'itemLabelMode' )
109      il = v.getElementsByTagName( 'rowAttribute' )
110      vtt = self.nts( v.nodeName, l,t,i,ilm )
111      ll = []
112      idict = {}
113      for i in il:
114        tt = self.parseicfg(i)
115        idict[tt.label] = tt
116        ll.append(tt)
117      return self.ntt( vtt, idict )
118
119  def parseicfg(self,i):
120      l = i.getAttribute( 'label' )
121      if i.hasAttribute( 'title' ):
122        t = i.getAttribute( 'title' )
123        self.lastTitle = t
124      else:
125        t = None
126      if i.hasAttribute( 'type' ):
127        ty = i.getAttribute( 'type' )
128      else:
129        ty = "xs:string"
130      return self.nti( i.nodeName, l,t,ty )
131
132c = config()
133
134class index(object):
135  def __init__(self, dreq):
136    self.uuid = {}
137    self.var_uuid = {}
138    self.var_by_name = collections.defaultdict( list )
139    self.var_by_sn = collections.defaultdict( list )
140    self.iref_by_uuid = collections.defaultdict( list )
141    irefdict = {'ovar':['vid'], 'groupItem':['gpid','vid'], 'requestLink':['refid'], 'requestItem':['rlid'], 'revisedTabItem':['vid']}
142    for k in dreq.tableItems.keys():
143        for i in dreq.tableItems[k]:
144          self.uuid[i.uuid] = (k,i)
145        for k2 in irefdict.get( k, [] ):
146          for i in dreq.tableItems[k]:
147            self.iref_by_uuid[ i.__dict__.get( k2 ) ].append( (k2,i.uuid) )   
148
149    for i in dreq.tableItems['var']:
150       self.var_uuid[i.uuid] = i
151       self.var_by_name[i.label].append( i.uuid )
152       self.var_by_sn[i.sn].append( i.uuid )
153
154  def makeVarRefs(self):
155    self.varRefs = {}
156    for thisuuid in self.var_uuid.keys():
157      if self.iref_by_uuid.has_key(thisuuid):
158        ee1 = collections.defaultdict( list )
159        for k,i in self.iref_by_uuid[thisuuid]:
160          sect,thisi = self.uuid[i]
161### irefdict = {'ovar':['vid'], 'groupItem':['gpid','vid'], 'requestLink':['refid'], 'requestItem':['rlid'], 'revisedTabItem':['vid']}
162          if sect == 'groupItem':
163            ee1[sect].append( '%s.%s' % (thisi.mip, thisi.group) )
164          elif sect == 'ovar':
165            ee1[sect].append( thisi.mipTable )
166          elif sect == 'revisedTabItem':
167            ee1[sect].append( '%s.%s' % (thisi.mip, thisi.table) )
168        self.varRefs[thisuuid] = ee1
169
170inx = index( c )
171inx.makeVarRefs()
Note: See TracBrowser for help on using the repository browser.