source: TI07-MOLES/trunk/PythonCode/returnMoles/returnMolesExist.py @ 1570

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/returnMoles/returnMolesExist.py@1570
Revision 1570, 6.5 KB checked in by ko23, 15 years ago (diff)
Line 
1#!/usr/bin/env python
2
3import urllib2, base64, urllib, urlparse, httplib, xmlrpclib, types, sys, MOLESXQueries
4
5
6class   InstanceObject(object):
7    def __init__(self, **kw):
8        self.dict={}
9        self.dict.update(kw)
10       
11    def __getattr__(self,arg):
12        return self.dict[arg]
13
14class    eXist_Connector(object):
15    """Access class for eXist"""
16    def __init__(self,constants=None):
17        #make sure that we have these constants in scope for command line playfulness
18        if constants is None:constants=eXistConstants
19        authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm()
20        authinfo.add_password(None,
21                                  constants.host,
22                                  constants.userid,
23                                  constants.password)
24        authHandler = urllib2.HTTPBasicAuthHandler(authinfo)
25        opener = urllib2.build_opener(authHandler)
26        s = constants.userid+':'+constants.password
27        z = base64.encodestring(s)[:-1] # strip trailing 12
28        opener.addheaders.append(('Authorization', 'Basic %s' % z))
29        self.http_headers = {'Authorization':'Basic %s' % z}
30        self.opener = opener
31        # also create an xmlrpc Server object
32       
33        xmlrpc_uri = '%s%s:%s@%s:%d%s' % ( 
34                                            'http://',
35                                            constants.userid,
36                                            constants.password,
37                                            constants.host,
38                                            constants.port,
39                                            constants.xmlrpc_base_path
40                                        )
41        self.xmlrpc = xmlrpclib.Server(xmlrpc_uri)
42       
43    def execute(self, collection, application=None, subpath=None):
44        """Execute an xquery stored in eXist, return result as string"""
45        path = self.generate_db_path(collection=collection, application=application, 
46                            subpath=subpath)
47        params = {}
48        r = self.xmlrpc.execute(path, params)
49        try:
50            res = self.xmlrpc.retrieve(r['id'], 0, {})
51        finally:
52            self.xmlrpc.releaseQueryResult(r['id'])
53        return res.data
54
55    def executeQuery(self, xquery, params={}):
56        """Execute an xquery string, return result as string"""
57        xquery=xmlrpclib.Binary(xquery) #bnl
58        id = self.xmlrpc.executeQuery(xquery, params)
59        try:
60            res = self.xmlrpc.retrieve(id, 0, {})
61            print res.data,'bb'
62        finally:
63            self.xmlrpc.releaseQueryResult(id)
64        return res.data
65
66    def open(self, url):
67        """Open url and return url handler"""
68        return self.opener.open(url)
69
70    def http_request(self, url, method="GET", body=None, extra_headers=None, 
71                                                            extra_args=None):
72        """Open an HTTPConnection to server, splits url into parts
73           and adds headers as appropriate
74           extra_args can be a dictionary
75        """
76        parts = urlparse.urlparse(url)
77        scheme, location, path, parameters, query, fragment = parts
78        if scheme == 'https':
79            http = httplib.HTTPSConnection(location)
80        else:
81            http = httplib.HTTPConnection(location)
82        if extra_args:
83            extra_args = urllib.urlencode(extra_args)
84            if not query:
85                query = extra_args
86            else:
87                query = "%s&%s" % (query, extra_args)
88        if query and not body:
89            body = query
90        if not extra_headers:
91            extra_headers = {}
92        extra_headers.update(self.http_headers)
93        http.request(method, path, body, extra_headers )
94        return http.getresponse()
95
96def convTuple(t):
97        return {t[0]:t[1]}
98
99def printUsage():
100        print "\n\nThe mandatory command line options for this script are:"
101        print "\t--repositoryID"
102        print "\t--localID"
103        print "\t--format\n\t\tSupported values are:"
104        print "\t\t\tDC\t\t- Dublin Core"
105        print "\t\t\tDIF\t\t- GCMD DIF v9.4"
106        print "\t\t\tNDG-B0\t\t- Raw MOLES"
107        print "\t\t\tNDG-B1\t\t- StubB from MOLES"
108        print "\t\t\tISO19115\t- Base ISO19139"
109        print "\nOptional parameters are:"
110        print  "\t--user\t\teXist user ID; defaults to 'guest'"
111        print  "\t--userpw\t\teXist user ID password; defaults to 'guest'"
112        print  "\t--repository\t\pointer to eXist installation; defaults to 'localhost'"
113        print  "\t--port\t\pointer to eXist installation port number; defaults to '8080'"
114        print "\nAs an example:"
115        print '\tpython returnMolesExist.py --repositoryID=badc.nerc.ac.uk --localID=dataent20 -format=DC --repository=badc.nerc.ac.uk --port=8088 --userpw=secret' 
116        print '\nPlease note that spaces in parameter values may cause malfunction' 
117        print 'Non-zero return codes:'
118        print '\t10 - zero records returned (ID not found)'
119        print '\t11 - more than one record returned: check database and db records'
120        sys.exit(1)
121
122def getMOLESbyID(repositoryID, localID, format, user='guest', userpw='guest', repository='localhost', portNumber=8080):
123
124    eXistConstants = InstanceObject(host=repository,
125                                userid=user,
126                                password=userpw,
127                                base_path="/exist/servlet",
128                                xmlrpc_base_path="/exist/xmlrpc",
129                                port=portNumber)   
130    existDB=eXist_Connector(constants=eXistConstants)
131    if format == 'DC':
132        xquery = MOLESXQueries.XQueryDCbyID(repositoryID, localID)
133    elif format == 'ISO19115':
134        xquery = MOLESXQueries.XQueryISO19115byID(repositoryID, localID)
135    elif format == 'NDG-B1':
136        xquery = MOLESXQueries.XQueryNDGB1byID(repositoryID=repositoryID, localID=localID, existDB=existDB)
137    elif format == 'DIF':
138        xquery = MOLESXQueries.XQueryDIFbyID(repositoryID=repositoryID, localID=localID)
139    else:
140        xquery = "<dgMetaData/>"
141    id = existDB.xmlrpc.executeQuery(xquery,{})
142    i=0
143    while i>=0:
144        try:
145            res = existDB.xmlrpc.retrieve(id, i, {})
146            i+=1
147        except xmlrpclib.Fault:
148            break
149        except Exception,e:
150            existDB.xmlrpc.releaseQueryResult(id)
151            raise e
152
153    if i==0:
154        print "<dgMetaData/>"
155        sys.exit(10)
156    elif i>1:
157        print "<dgMetaData/>"
158        sys.exit(11)
159    else:
160        print res.data
161       
162    existDB.xmlrpc.releaseQueryResult(id)
Note: See TracBrowser for help on using the repository browser.