source: TI07-MOLES/trunk/PythonCode/wsgi/stubB.py @ 2364

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/wsgi/stubB.py@2364
Revision 2364, 7.2 KB checked in by lawrence, 15 years ago (diff)

Sundry modifications to get browse working again and to use a
config file to identify the appropriate repositories (for
a given ndg uri, what repository holds the browse info? this
is by way of a temporary expedient).

Line 
1#!/usr/bin/env python
2#
3# This python code (will) handle all forms of stub-B and provide HTML
4# methods to the extent required by the NDG browse functionality
5# BNL April 2006
6#
7from renderEntity import renderEntity
8from Utilities import *
9from ServiceBinding import *
10from AccessControl import AccessControl
11from geoUtilities import Bounding
12from People import *
13try: #python 2.5
14    from xml.etree import ElementTree as ET
15except ImportError:
16    try:
17        # if you've installed it yourself it comes this way
18        import ElementTree as ET
19    except ImportError:
20        # if you've egged it this is the way it comes
21        from elementtree import ElementTree as ET
22
23class dataGranule:
24        ''' Provides support for data granule structures '''
25        def __init__(self,elem,config,name=''):
26                self.elem=elem
27                self.constraints=AccessControl(elem.find('accessControlPolicy'))
28                self.binding=ServiceBinding(config,n=name,entryID=idconvert(elem.find('dataModelID')))
29                self.Aurl=self.binding.url
30               
31               
32class ObservationStation:
33    def __init__(self,e):
34        self.e=e
35        if e is None: return
36class DataProductionTool:
37    def __init__(self,e):
38        self.e=e
39        if e is None: return
40class Activity:
41    def __init__(self,e):
42        self.e=e
43        if e is None: return
44class Deployment:
45    def __init__(self,e):
46        self.e=e
47        if e is None: return
48       
49class DataEntity:
50        def __init__(self,element):
51                ''' Attempt to instantiate this stubB as a data entity'''
52                self.elem=element
53                #just one curator
54                self.curator=dgContact(self.elem.find('dgDataRoles/dgDataCurator'),ctype='organisation')
55                #possibly multiple creators
56                self.creators=[dgContact(i) for i in self.elem.findall('dgDataRoles/dgDataCreator')]
57                host,service = '','' # dummy for now
58                #possibly multiple granules
59                self.getGranules()
60                #bounding box, handled as a class because this is going to be difficult ...
61                self.bbox=Bounding(self.elem,entity='stubB')
62                self.temporal()
63                #parameters
64                self.parameters=wrapGetText(self.elem,'dgDataSummary/dgParameterSummary/ParameterName',multiple=1)
65               
66        def getGranules(self):
67                ''' Load up the granule content within the entity '''
68                granList=self.elem.findall('dgDataGranule')
69                self.granules=[]
70                i=0
71                for item in granList:
72                        i+=1
73                        #following needs to be refactored when granule definition includes
74                        #a proper name ...
75                        name=wrapGetText(item,'name')
76                        if name=='': name='Granule %s'%i
77                        self.granules.append(dataGranule(item,self.config,name=name))
78               
79        def temporal(self):
80                '''Instantiate the timeCoverage attribute by parsing for temporal coverage '''
81                t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateRange')
82                if t is not None:
83                        try:
84                                self.timeCoverage=(float(i.text) for i in t)
85                        except:
86                                self.timeCoverage=('',)
87                               
88                else:
89                        t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateSingle')
90                        try:
91                                self.timeCoverage=(t.text,)
92                        except:
93                                self.timeCoverage=('',)
94
95
96
97class stubB(DataEntity,Deployment,ObservationStation,DataProductionTool,Activity):
98       
99        ''' Holds the stub-b document and provides methods which get and manipulate it '''
100       
101        def __init__(self,xml,config):
102               
103                '''Instantiate by parsing an xml document passed in as a string '''
104               
105                self.metadataType='stubB'
106                self.services=[]
107                self.config=config
108               
109                self.labels={'activity':'Activity ','observationstation':'Observation Station ',
110                                        'dataproductiontool':'Data Production Tool ','dataEntity':'Data Entity ','dataentity':'Data Entity'}
111                try:
112                        self.xml=xml
113                        self.tree=ET.fromstring(self.xml)
114                        self.name=wrapGetText(self.tree,'name')
115                except Exception,e:
116                        raise ValueError('Error instantiating stubB [%s]'%e)
117                id=self.tree.find('dgMetadataID')
118                self.entryID=idconvert(id)
119                self.binding=ServiceBinding(config,n=wrapGetText(self.tree,'abbreviation'),
120                                entryID=self.entryID)
121                self.Burl=self.binding.url
122                             
123                #Note that the root of the ElementTree instance is dgMetadataRecord
124                #so we don't need (or want) that in our xpath expressions.
125               
126                self.constraints=AccessControl(self.tree.find('dgMetadataSecurity'))
127                self.abbreviation=wrapGetText(self.tree,'abbreviation')
128                if self.abbreviation=='': self.abbreviation=self.name[0:min(15,len(self.name))]
129               
130                elem=self.tree.find('dgDataEntity')
131                if elem is not None:
132                        DataEntity.__init__(self,elem)
133                        self.type='dgDataEntity'
134                        self.others=('activity','observationstation','dataproductiontool')
135                        related='/RelatedDeployment'
136                elem=self.tree.find('dgActivity')
137                if elem is not None:
138                        self.type='dgActivity'
139                        #nb activity stub-b seems to have dataentity instead of dataEntity
140                        self.others=('dataentity','dataEntity','observationstation','dataproductiontool')
141                        related='/ActivityDeployment'
142                       
143                elem=self.tree.find('dgDataProductionTool')
144                if elem is not None:
145                        self.type='dgDataProductionTool'
146                        self.others=('dataEntity','observationstation','activity')
147                        related='DPTDeployment'
148               
149                elem=self.tree.find('dgObservationStation')
150                if elem is not None:
151                        related='/ObsStnDeployment'
152                        self.type='dgObservationStation'
153                        self.others=('dataEntity','dataproductiontool','activity')
154
155                self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText')
156               
157                # now go get all the related links
158                self.related=[]
159               
160                deployment=['empty',[]]  #something should eventually go in the empty slot ...
161                for item in self.others:
162                    #multiple types of "related deployment definitions"
163                    subitems=self.tree.findall(self.type+'/*/'+item)
164                    if subitems != []:
165                        aa=[]
166                        for subitem in subitems:
167                            name=wrapGetText(subitem,'name')
168                            entryID=idconvert(subitem.find('dgMetadataID'))
169                            binding=ServiceBinding(name,entryID=entryID,serviceFile=serviceFile)
170                            aa.append(binding)
171                        deployment[1].append([self.labels[item],aa])
172                self.related.append(deployment)
173       
174        def toHTML(self,config):
175            if self.tree is not None:
176                renderer=renderEntity(config)
177                return renderer.render(self)
178            else:
179                return '<p>No Valid Stub-B</p>'
180       
181if __name__=="__main__":
182       
183        #xml=open("../../exampleB/methyl.example.xml",'r').read()
184        xml=open('COAPC_ObsStn.xml','r').read()
185        x=stubB(xml,serviceFile='serviceMap.config')
186        y='''<?xml version="1.0" encoding="UTF-8"?>
187                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
188                <html xmlsns="http://www.w3.org/1999/xhtml" xml:lang="en">
189                        <head>
190                                <META http-equiv="Content-Type" content="text/xhtml; charset=iso-8859-1"/>
191                                <title>stubB</title>
192                                <LINK media="all, screen" href="../layout/style.css" type="text/css" rel="stylesheet"/>
193                        </head> '''+x.toHTML(myConfig('browse.config'))
194        f=file('output.html','w')
195        f.write(y)
Note: See TracBrowser for help on using the repository browser.