source: TI01-discovery/trunk/ingestAutomation/OAIBatch/SpaceTimeIngestFromMOLES.py @ 3205

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI01-discovery/trunk/ingestAutomation/OAIBatch/SpaceTimeIngestFromMOLES.py@3785
Revision 3205, 10.1 KB checked in by selatham, 12 years ago (diff)

make celementree imports more robust

Line 
1#!/usr/bin/env python
2try: #python 2.5
3    from xml.etree import cElementTree
4    from xml.etree import ElementTree as etree
5except ImportError:
6    try:
7        # if you've installed it yourself it comes this way
8        import cElementTree
9        import ElementTree as etree
10    except ImportError:
11        # if you've egged it this is the way it comes
12        from ndgUtils.elementtree import cElementTree
13        from ndgUtils.elementtree import ElementTree as etree
14
15import molesReadWrite as MRW
16import sys
17import db_funcs
18import os
19
20#connect to db (in separate db functions module)
21connection = db_funcs.db_connect()
22
23def listify(item):
24        ''' listify checks if an item is a list, if it isn't it puts it inside a list and returns it. Always returns a list object.'''
25        if type(item) is list:
26            return item
27        else:
28            return [item]
29
30def id_exists(Mid):
31        sql = "select id from spatiotemp where id = '"+Mid+"';"
32        cursor = connection.cursor()
33        try:
34            cursor.execute(sql)
35        except:
36            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
37        if len(cursor.fetchall()) <1:
38            return False
39        else:
40            return True
41
42
43def do_insert(Mid,west,south,east,north,startdate,enddate):
44        sql = "INSERT INTO spatiotemp (id, coordinates, startdate, enddate) VALUES ( '"+Mid+ "', sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', '"+startdate+"', '"+enddate+"');"
45        if str(startdate)=='nostartdate':
46            sql=sql.replace(", startdate,"," ")
47            sql=sql.replace(",   'no '"," ")
48            sql=sql.replace("'"+startdate+"',"," ")
49        if str(enddate)=='noenddate':
50            sql=sql.replace(", enddate"," ")
51            sql=sql.replace("enddate"," ")
52            #print sql
53            sql=sql.replace(",   'no '"," ")
54            sql=sql.replace(", '"+enddate+"'"," ")
55            #print sql
56        if str(west)=='null' or str(south)=='null' or str(east)=='null' or str(north)=='null':
57            sql=sql.replace("coordinates,"," ")
58            sql=sql.replace("sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))',"," ")
59        print sql
60        cursor = connection.cursor()
61        try:
62            cursor.execute(sql)
63        except:
64            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
65        connection.commit()
66
67def do_update(Mid,west,south,east,north,startdate,enddate):
68        sql = "UPDATE spatiotemp SET coordinates = sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', startdate='"+startdate+"', enddate= '"+enddate+"', update_time= now() WHERE id='"+Mid+"';"
69        if str(startdate)=='nostartdate':
70            sql=sql.replace("startdate='"+startdate+"',"," ")
71        if str(enddate)=='noenddate':
72            sql=sql.replace("enddate= '"+enddate+"',"," ")
73        if str(west)=='null' or str(south)=='null' or str(east)=='null' or str(north)=='null':
74            sql=sql.replace("coordinates = sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))',", " ")
75        print sql
76        cursor = connection.cursor()
77        try:
78            cursor.execute(sql)
79        except:
80            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
81        connection.commit()
82
83def main(indir):
84    if indir == "":
85        sys.exit("USAGE: argument 1 = full path of directory where MOLES records reside")
86    else:
87        print "INFO: moles records are in %s" %indir
88
89#this is a fix to the  ElementTree namespace problem that namespaces are usually represented as ns0, ns1, ns2 etc.
90    etree._namespace_map.update({'http://ndg.nerc.ac.uk/moles': 'moles', 'http://www.w3.org/1999/xlink':'xlink'})
91    numfilesproc = 0
92
93    filenames = os.listdir(indir)
94    for filename in filenames:
95        Mid = filename
96        print Mid
97        if filename.find('.xml') != -1:
98            full_filename = indir + "/" + filename
99            #print full_filename
100            no_bbox = False
101            no_dates = False
102            east = 'null'
103            west = 'null'
104            north = 'null'
105            south = 'null'
106            startdate='nostartdate'
107            enddate='noenddate'
108            dgMeta=MRW.dgMetadata()
109            try:
110                dgMeta.fromXML(cElementTree.ElementTree(file=full_filename).getroot())
111            except:
112                print "WARNING: Cannot parse the XML moles document %s. Will not process" %full_filename
113                continue
114            try:
115                bbox_list=listify(dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgSpatialCoverage.BoundingBox)
116            except:
117                print "INFO: XML moles document %s does not contain a bounding box." %full_filename
118                no_bbox=True
119
120            try:
121                dates=dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgTemporalCoverage.DateRange
122                print "startdate = %s" %dates.DateRangeStart
123                print "enddate = %s" %dates.DateRangeEnd
124            except:
125                print "INFO: XML moles document %s does not contain temporal info." %full_filename
126                no_dates=True
127            #if type(dates) =='NoneType':
128            #    no_dates=True
129
130            if no_bbox and no_dates:
131                print "INFO: XML moles document %s does not contain any spatiotemporal info." %full_filename
132                continue
133
134            if no_dates:
135                pass
136            else:
137                startdate=dates.DateRangeStart
138                enddate= dates.DateRangeEnd
139                if startdate==None or startdate=='None':
140                    startdate="nostartdate"
141                if enddate==None or enddate=='None':
142                    enddate="noenddate"
143
144            if no_bbox:
145                pass
146            else:
147                # for bbox in bbox_list:
148                #parse the coordinates somewhat - only use the first bounding box.
149                #print bbox_list
150                bbox=bbox_list[0]
151                #print bbox
152                #west
153                try:
154                    west = bbox.LimitWest.strip()
155                except:
156                    print "ERROR:  Will not process File %s. Contains incorrect West bounding box limit." %full_filename
157                    continue
158                if west.endswith('E'):
159                    west=bbox.LimitWest.split('E')[0]
160                elif west.endswith('W'):
161                    if west.startswith('-'):
162                        west = bbox.LimitWest.split('W')[0]
163                    else:
164                        west = "-" +bbox.LimitWest.split('W')[0]
165                try:
166                    float(west)
167                except:
168                    print "ERROR:  Will not process File %s. Contains incorrect West bounding box limit." %full_filename
169                    continue
170                #print "West = %s" %west
171                #east
172                try:
173                    east = bbox.LimitEast.strip()
174                except:
175                    print "ERROR:  Will not process File %s. Contains incorrect East bounding box limit." %full_filename
176                    continue
177                if east.endswith('E'):
178                    east=bbox.LimitEast.split('E')[0]
179                elif east.endswith('W'):
180                    if east.startswith('-'):
181                        east = bbox.LimitEast.split('W')[0]
182                    else:
183                        east = "-" +bbox.LimitEast.split('W')[0]
184                try:
185                    float(east)
186                except:
187                    print "ERROR:  Will not process File %s. Contains incorrect East bounding box limit." %full_filename
188                    continue
189                #print "East = %s" %east
190                #north
191                try:
192                    north = bbox.LimitNorth.strip()
193                except:
194                    print "ERROR:  Will not process File %s. Contains incorrect North bounding box limit." %full_filename
195                    continue
196                if north.endswith('N'):
197                    north=bbox.LimitNorth.split('N')[0]
198                elif north.endswith('S'):
199                    if north.startswith('-'):
200                        north = bbox.LimitNorth.split('S')[0]
201                    else:
202                        north = "-" +bbox.LimitNorth.split('S')[0]
203                try:
204                    float(north)
205                except:
206                    print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
207                    continue
208                #print "North = %s" %north
209                #south
210                try:
211                    south = bbox.LimitSouth.strip()
212                except:
213                    print "ERROR:  Will not process File %s. Contains incorrect South bounding box limit." %full_filename
214                    continue
215                if south.endswith('N'):
216                    south=bbox.LimitSouth.split('N')[0]
217                elif south.endswith('S'):
218                    if south.startswith('-'):
219                        south = bbox.LimitSouth.split('S')[0]
220                    else:
221                        south = "-" +bbox.LimitSouth.split('S')[0]
222                try:
223                    float(south)
224                except:
225                    print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
226                    continue
227                #print "North = %s" %south
228
229            print "west= %s,south %s, east %s, north %s, startdate %s, enddate %s" %(west,south,east,north,startdate,enddate)
230            if id_exists( Mid ):
231                print "INFO: doc %s exists, updating\n" %Mid
232                do_update( Mid, west, south, east, north, startdate, enddate )
233            else:
234                print "INFO: doc %s does not exist, inserting new record\n" %Mid
235
236                do_insert( Mid, west, south, east, north, startdate, enddate )
237            numfilesproc += 1
238        else:
239            print "WARNING: File %s appears not to be XML. Will not be processed." %filename
240
241    print 'INFO: SpaceTimeIngestFromMOLES.py ran to end. files processed= %s' %(numfilesproc)
242
243if __name__=='__main__':
244    indir=sys.argv[1]
245    main(indir)
Note: See TracBrowser for help on using the repository browser.