source: cowsclient/trunk/cowsclient/lib/utils.py @ 6014

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cowsclient/trunk/cowsclient/lib/utils.py@6014
Revision 6014, 4.5 KB checked in by pnorton, 12 years ago (diff)

Fixed the wcsdown action so that it now works with the new config file readers.

Line 
1
2from cowsclient.lib.base import config
3from cowsclient.lib.wmc_util import openURL
4
5import os
6import logging
7import urllib2 
8import simplejson as json
9from HTMLParser import HTMLParser
10import libxml2dom
11
12log = logging.getLogger(__name__)
13
14def readEndpoints():
15    endpoints = {}
16   
17    if 'endpointList' in config.keys():
18        log.debug("config['endpointList'] = %s" % (config['endpointList'],))
19       
20       
21        currentKey = None
22        for l in open(config['endpointList']):
23            l = l.strip()
24            if l == '' or l[0] == '#':
25                continue
26           
27            if l[0] == '[' and l[-1] == ']':
28                currentKey = l[1:-1]
29                continue
30           
31            if currentKey != None:
32                if currentKey not in endpoints:
33                    endpoints[currentKey] = []
34                endpoints[currentKey].append(l)
35       
36        if 'COWS' in endpoints:
37            for cowsEndpoint in endpoints['COWS']:
38                try:
39                   
40                    for linkName, linkDict in parseCowsCatalog(cowsEndpoint):
41                   
42                        #grab the WMS and WCS links and add them to the dictionary
43                        if 'WMS' in linkDict.keys():
44                            endpoints['WMS'].append(linkDict['WMS'])
45                        elif 'WCS' in linkDict.keys():
46                            endpoints['WMS'].append(linkDict['WCS'])
47                except:
48                    log.exception("Exception occurred reading enpoints from %s" % (cowsEndpoint,))
49               
50   
51    return endpoints
52
53class _MyHTMLLinkFinder(HTMLParser):
54   
55    def __init__(self, baseURL):
56        self.baseURL = baseURL
57        self.links = []
58        HTMLParser.__init__(self)
59       
60    def handle_starttag(self, tag, attrs):
61        atts = dict(attrs)
62        if tag == 'a' and 'href' in atts:
63            self.links.append(self._getLink(atts['href']))
64
65    def _getLink(self, href):
66        if href[0:4] == 'http':
67            return href
68        else:
69            if href[0] == '/':
70                href = href[1:]
71            return os.path.join(self.baseURL, href)
72
73
74def parseCowsCatalog(cowsEndpoint):
75    req = urllib2.Request(cowsEndpoint)
76    fh = openURL(req)
77    htmlString = fh.read()
78    fh.close()
79   
80    doc = libxml2dom.parseString(htmlString, html=1)
81   
82    COWSLinks = []
83   
84    for liElt in doc.getElementsByTagName("li"):
85   
86        childText = ""
87        links = {}
88   
89        for c in liElt.childNodes:
90   
91            # get the name by adding together all the text elements and then
92            # stripping whitespace and [].
93            if c.nodeType == 3:
94                childText += c.nodeValue
95   
96            # build a dictionary of the links with their ascociated text
97            elif c.nodeName == 'a' and c.hasAttribute('href'):
98                liknName = str(''.join(c.textContent.split())) # removing whitespace and converting from unicode
99               
100                # remove leading '/' as it confuses os.path.join
101                href = c.getAttribute('href')
102                if href[0] == '/':
103                    href = href[1:]
104                   
105                linkTarget =  os.path.join(cowsEndpoint, href)
106                links[liknName] = str(linkTarget)
107   
108        childText = ''.join(childText.split()) # strip the whitespace
109        childText = str(childText.replace('[]','')) # remove any angle brackets
110   
111        COWSLinks.append((childText, links))
112   
113    return COWSLinks
114
115def toJSON(obj):
116    return json.dumps(obj).replace('"', '\\"')
117
118def filterEnpointList(endpointList, requiredType, searchCowsIndex=True):
119        epList = []
120       
121        if endpointList is not None:
122            for e in endpointList:
123                if requiredType!= 'COWS' and e['service'] == 'COWS' and searchCowsIndex:
124                    try:
125                        for linkName, linkDict in parseCowsCatalog(e['url']):
126                            if requiredType in linkDict.keys():
127                                epList.append(
128                                    {'service':requiredType, 
129                                     'url':linkDict[requiredType], 
130                                     'name':linkName}
131                                )
132                    except:
133                        log.exception("An error occurred while reading cows catalog at %s"\
134                                      % (e['url'],))
135                           
136                elif e['service'] == requiredType:
137                    epList.append(e)
138               
139        return epList   
Note: See TracBrowser for help on using the repository browser.