示例#1
0
def normalize_args(parser, mpreq):
    """
    Normalizer for Python's cgi library.
    """
    args = {}
    fs = FieldStorage(mpreq)

    # Cast down from the FieldStorage object to Python str.
    for name in fs.keys():
        value = fs[name]
        if isinstance(value, str):
            value = str(value)

        elif isinstance(value, Field):
            value = FileUpload(value)

        elif isinstance(value, list):
            for i in range(len(value)):
                if isinstance(value[i], str):
                    value[i] = str(value[i])

                elif isinstance(value[i], Field):
                    value[i] = FileUpload(value[i])

        if name:  # mod_python sometimes gives a None key
            args[name] = value

    return args
示例#2
0
    def dispatch(self, req):
        global configs, oaiDcReader, c3OaiServers
        path = req.uri[1:]
        if (path[-1] == "/"):
            path = path[:-1]

        if configs.has_key(path):
            args = {}
            # parse options out of req
            store = FieldStorage(req)
            for qp in store.list:
                args[qp.name] = qp.value
            try:
                oaixml = MinimalOaiServer(c3OaiServers[path],
                                          c3OaiServers[path].metadataRegistry)
            except KeyError:
                oai = Cheshire3OaiServer(path)
                c3OaiServers[path] = oai
                oaixml = MinimalOaiServer(oai, oai.metadataRegistry)
            try:
                xmlresp = oaixml.handleRequest(args)
            except DatestampError:
                try:
                    raise BadArgumentError('Invalid date format supplied.')
                except:
                    xmlresp = oaixml.handleException(args, sys.exc_info())
            except C3Exception, e:
                xmlresp = '<c3:error xmlns:c3="http://www.cheshire3.org/schemas/error" code="%s">%s</c3:error>' % (
                    str(e.__class__).split('.')[-1], e.reason)
            self.send_xml(xmlresp, req)
示例#3
0
    def handle_docs(self, req):
        # retrieve documentation for object
        store = FieldStorage(req)
        try:
            objid = store['contextId']
            context = serv.get_object(session, objid)
            target = store['targetId']
            obj = context.get_object(session, target)
        except:
            obj = None
        if not obj:
            self.send_xml("<fault>Unknown object</fault>", req);
            return

        docs = []
        # look on object for manual docs
        if obj.docstring:
            docs.append('<doc from="%s">' % obj.id)
            docs.append(obj.docstring)
            docs.append("</doc>")
        classList = [obj.__class__]
        done = [];
        while classList:
            cl = classList.pop(0)
            if cl.__module__ != '__builtin__' and cl.__doc__ and not (cl in done):
                docs.append('<doc from="%s.%s">' % (cl.__module__, cl.__name__))
                docs.append(cl.__doc__)
                docs.append("</doc>")
                done.append(cl)
            classList.extend(list(cl.__bases__))
        
        self.send_xml("<docs>" + '\n'.join(docs) + "</docs>", req)
示例#4
0
    def handle_classDocs(self, req):
        # retrieve documentation for object
        store = FieldStorage(req)
        try:
            cls = store['className']
        except:
            self.send_xml("<fault>Missing className</fault>", req);
            return
        try:
            obj = arch.find_class(cls)
        except:
            self.send_xml("<fault>No such class: %s</fault>" % cls, req)

        docs = []
        classList = [obj]
        done = [];
        while classList:
            cl = classList.pop(0)
            if cl.__module__ != '__builtin__' and cl.__doc__ and not (cl in done):
                docs.append('<doc from="%s.%s">' % (cl.__module__, cl.__name__))
                docs.append(cl.__doc__)
                docs.append("</doc>")
                done.append(cl)
            classList.extend(list(cl.__bases__))
        
        self.send_xml("<docs>" + '\n'.join(docs) + "</docs>", req)
示例#5
0
    def handle_getConfig(self, req):
        # fetch configuration (eg for editing existing workflow)

        store = FieldStorage(req)
        try:
            objid = store['contextId']
            context = serv.get_object(session, objid)
        except:
            self.send_xml("<fault>Unknown object: %s</fault>" % objid, req);
            return
        try:
            target = store['targetId']
            obj = context.get_object(session, target)
        except:
            raise
            self.send_xml("<fault>Unknown object: %s</fault>" % target, req);
            return

        config = obj.parent.get_config(session, target)
        cfgStr = config.getAttributeNS(None, 'configStore')
        if cfgStr:
            confStore = context.get_object(session, cfgStr)
            try:
                del context.subConfigs[target]
                del context.objects[target]
            except KeyError, e:
                pass

            # now re-retrieve from confStore
            rec = confStore.fetch_record(session, target)            
            dom = rec.get_dom(session)
            config = dom.childNodes[0]
            config.setAttributeNS(None, 'configStore', cfgStr)
            context.subConfigs[target] = config
示例#6
0
    def handle_listFunctions(self, req):
        # retrieve list of function on object

        store = FieldStorage(req)
        try:
            objid = store['contextId']
            context = serv.get_object(session, objid)
        except:
            self.send_xml("<fault>Unknown object: %s</fault>" % (objid), req)
            return
        try:
            target = store['targetId']
            if target[:8] == "default ":
                # use random object of this type?
                otype = target[8:]
                obj = context.get_path(session, otype)
            else:
                obj = context.get_object(session, target)
            select = store['select']
        except:
            self.send_xml("<fault>Unknown object: %s</fault>" % (target), req)
            return

        properties = dir(obj)
        imt = type(self.handle_listObjects)
        funcs = []
        for p in properties:
            if p[0] != "_" and type(getattr(obj, p)) == imt:
                funcs.append(p)
        xml = [
            '<select xmlns="http://www.w3.org/1999/xhtml" id="functionNameSelect" onchange="set_function()">'
        ]
        xml.append('<option value="">(No Function)</option>')

        boringFns = [
            'add_logging', 'add_auth', 'get_setting', 'get_path',
            'get_default', 'get_object', 'get_config', 'remove_logging',
            'remove_auth'
        ]
        for f in funcs:
            if f in boringFns:
                # emphasize fns not everywhere
                name = '<span style="color:#888888;">%s</span>' % f
            else:
                name = f
            if f == select:
                xml.append('<option value="%s" selected="true">%s</option>' %
                           (f, name))
            else:
                xml.append('<option value="%s">%s</option>' % (f, name))
        xml.append("</select>")
        self.send_xml(''.join(xml), req)
示例#7
0
    def handle_listTypedObjects(self, req):
        # get list of typed objects, eg loggers

        storeHash = {}
        collHash = {}
        processHash = {}

        # get start obj from request
        store = FieldStorage(req)
        try:
            objid = store['contextId']
        except:
            self.send_xml("<fault>Missing contextId</fault>", req)
            return
        try:
            obj = serv.get_object(session, objid)
        except:
            self.send_xml("<fault>Unknown object: '%s'</fault>" % objid, req)
            return
        try:
            objType = store['objectType']
        except:
            self.send_xml("<fault>Missing parameter: objectType</fault>")
            return
        try:
            dflt = store['default']
        except:
            dflt = None

        oids = []
        while obj:
            for oid in obj.subConfigs.keys():
                dom = obj.subConfigs[oid]
                t = dom.getAttributeNS(None, 'type')
                if t == objType and oid != dflt:
                    oids.append(oid)
            obj = obj.parent

        oids.sort()
        html = [
            '<select id="loggerObjectSelect" xmlns="http://www.w3.org/1999/xhtml">'
        ]
        if dflt:
            html.append('<option value="%s">%s</option>' % (dflt, dflt))
        html.append('<option value="">Default Logger</option>')

        for o in oids:
            html.append('<option value="%s">%s</option>' % (o, o))
        html.append('</select>')

        xml = '\n'.join(html)
        self.send_xml(xml, req)
示例#8
0
def _reqArgs(req):
    """
    Returns a dictionary of name->value pairs for request's arguments and fields.
    """
    result = {}
    data = FieldStorage(req, keep_blank_values=1)
    for fieldName in data.keys():
        fieldData = data[fieldName] 
        if type(fieldData) is list:  # on POST requests if there is name collision between a parameter and a field
            result[fieldName] = fieldData[-1].value
        else:
            result[fieldName] = fieldData.value
    return result
示例#9
0
def handler(req):
  req.content_type = "text/plain"
  from mod_python.util import FieldStorage
  FS = FieldStorage(req)
  logfile = StringIO.StringIO()

  if req.filename.find("distl.signal_strength_bcsb")>=0:
    from spotfinder.servers.apache_bcsb import run as run_command
  elif req.filename.find("distl.signal_strength")>0:
    run_command = run
  elif req.filename.find("dials.find_spots")>0:
    from spotfinder.servers.apache_dials import run as run_command

  logfile.write(run_command(args=FS))
  log = logfile.getvalue()
  req.set_content_length(len(log))
  req.write(log)
  return apache.OK
示例#10
0
    def handle_create(self, req):
        # Create a new object  (workflow or otherwise)
        store = FieldStorage(req)
        try:
            objid = store['contextId']
            storeid = store['storeId']
            targetid = store['targetId']
            workflow = store['config']
            replace = int(store['replace'])
            context = serv.get_object(session, objid)
            confStore = context.get_object(session, storeid)
        except:
            context = None
            contStore = None
        if not context or not confStore:
            self.send_xml("<fault>Unknown object</fault>", req);
            return

        try:
            contStore.fetch_record(session, targetid)
            if not replace:
                self.send_xml("<fault>Object exists</fault>", req)
                return
        except:
            # does not exist
            pass

        try:
            p = context.get_object(session, 'SaxParser')
            d = StringDocument(workflow)
            rec = p.process_document(session, d)
            rec.id = targetid
            rec.recordStore = storeid
            confStore.begin_storing(session)
            confStore.store_record(session, rec)
            confStore.commit_storing(session)
        except Exception, e:
            self.send_xml("<fault>Storing failed %s</fault>" % e , req)
            return
    def handle_workflowRequest(self, config, req):
        postdata = FieldStorage(req)

        xmlstr = postdata.get('requestxml', None)

        if not (xmlstr):
            # throw some sensible error
            time.sleep(1)
            req.write('ERROR : No request XML submitted\n')
            return
#        else:
#            self.log.write(xmlstr)

        doc = document.StringDocument(xmlstr)
        rec = mdp.process_document(session, doc)

        self.log.write('rec.get_xml():\n%s\n' % rec.get_xml(session))

        dom = rec.get_dom(session)
        #now do some clever dynamic object stuff
        wfNode = dom.childNodes[0]
        wfNode = dom.getElementsByTagName('workflow')[0]
        wfConf = self._generateWorkflowConfigNode(wfNode)
        wfobj = SimpleWorkflow(session, wfConf, serv)
        inputs = dom.getElementsByTagName('inputs')[0]

        time.sleep(1)
        if not (wfobj):
            req.write('ERROR : Junk XML - must contain workflow element\n')
            return
        elif not (inputs):
            req.write('ERROR : Junk XML - must contain inputs element\n')
            return

        iCount = 1
        wfmsgs = []
        self.log.write('inputs:%s\n' % inputs.toxml())
        for input in inputs.childNodes:
            self.log.write('input:%s\n' % input.toxml())
            if (input.nodeType == elementType):
                objectType = input.getAttribute('type')
            else:
                continue

            if objectType == 'document.StringDocument':
                try:
                    f = postdata.get('file', None)
                    data = f.value
                except:
                    data = None
            else:
                data = input.firstChild.toxml()

            if not data:
                req.write('ERROR : No input data provided\n')
                return

            time.sleep(5)
            #req.write('PROGRESS : %s\n' % (objectType))
            modName = objectType[:objectType.rfind('.')]
            clName = objectType[objectType.rfind('.') + 1:]
            mod = dynamic.globalImport(modName, [])
            cl = getattr(mod, clName)
            inobj = cl(data)
            try:
                msg = wfobj.process(session, inobj)
            except ObjectAlreadyExistsException, e:
                time.sleep(1)
                req.write(
                    'ERROR : One or more records in input %d already exist in the database : %s\n'
                    % (iCount, e))
                continue
            except Exception, e:
                time.sleep(1)
                msg = e
                req.write(
                    'ERROR : Something went wrong while processing input %d : %s\n'
                    % (iCount, e))
                continue
示例#12
0
    def handle_getConfigParams(self, req):
        store = FieldStorage(req)
        try:
            cls = store['className']
        except:
            self.send_xml("<fault>Missing className</fault>", req);
            return
        try:
            classObj = arch.find_class(cls)
        except:
            self.send_xml("<fault>No such class: %s</fault>" % cls, req)

        try:
            (paths, setts, defs) = arch.find_params(classObj)
        except:
            self.send_xml("<fault>Not a configurable object?</fault>", req)


        # This is stupid...
        classes = arch.discover_classes()
        otype = "unknown"
        for c in classes:
            if c[1] == classObj:
                otype = c[0]
                otype = otype[:2].lower() + otype[2:]
        

        html = ["""<div xmlns="http://www.w3.org/1999/xhtml">""",
                """<center><i>Basic Information</i></center>""",
                """<table width="100%%">
                <tr><td width="20%%"><b>Identifier</b></td><td><input id="identifierInput" type="text" name="identifier" size="30"/></td><td width="5%%"></td></tr>
                <tr><td><b>Class</b></td><td>%s</td><td></td></tr>
                <tr><td><b>Object Type</b></td><td>%s</td><td></td></tr>
                </table>
                <input type="hidden" name="className" id="classNameInput" value="%s"/>
                <input type="hidden" name="objectType" id="objectTypeInput" value="%s"/>
                <br/>
                <center><i>Paths</i></center>""" % (cls, otype, cls, otype)]

        html.append('<table width="100%">')
        items = paths.items()
        items.sort()
        for (p, info) in items:
            html.append("<tr><td width=\"20%%\"><b>%s</b></td><td>" % p)
            if info.has_key('options'):
                opts = info['options'].split('|')
                html.append("""<select name="path_%s">""" % p)
                html.append("""<option value="">(default)</option>""")
                for o in opts:
                    html.append("""<option value="%s">%s</option>""" % (o,o))
                html.append("""</select>""")
            else:
                html.append("""<input type="text" name="path_%s" size="30"/>""" % (p))
            html.append("""</td><td width=\"5%%\"><a href="javascript:none()" onclick="config_help('%s')"><img src="http://sca.lib.liv.ac.uk/images/whatisthis.gif"/></a></td></tr>""" % info['docs'].replace("'", "\\'"))
        html.append('</table>')

        if setts:
            html.append("<br/><center><i>Settings</i></center>")
            html.append('<table width="100%">')
            items = setts.items()
            items.sort()
            for (p, info) in items:
                html.append("<tr><td width=\"20%%\"><b>%s</b></td><td>" % p)
                if info.has_key('options'):
                    opts = info['options'].split('|')
                    html.append("""<select name="setting_%s">""" % p)
                    html.append("""<option value="">(default)</option>""")
                    for o in opts:
                        html.append("""<option value="%s">%s</option>""" % (o,o))
                    html.append("""</select>""")
                else:
                    html.append("""<input type="text" name="setting_%s" size="30"/>""" % (p))
                html.append("""</td><td width=\"5%%\"><a href="javascript:none()" onclick="config_help('%s')"><img src="http://sca.lib.liv.ac.uk/images/whatisthis.gif"/></a></td></tr>""" % info['docs'].replace("'", "\\'"))
            html.append('</table>')


        if defs:
            html.append("<br/><center><i>Defaults</i></center>")
            html.append('<table width="100%">')
            items = defs.items()
            items.sort()
            for (p, info) in items:
                html.append("<tr><td width=\"20%%\"><b>%s</b></td><td>" % p)
                if info.has_key('options'):
                    opts = info['options'].split('|')
                    html.append("""<select name="default_%s">""" % p)
                    html.append("""<option value="">(default)</option>""")
                    for o in opts:
                        html.append("""<option value="%s">%s</option>""" % (o,o))
                    html.append("""</select>""")
                else:
                    html.append("""<input type="text" name="default_%s" size="30"/>""" % (p))
                html.append("""</td><td width=\"5%%\"><a href="javascript:none()" onclick="config_help('%s')"><img src="http://sca.lib.liv.ac.uk/images/whatisthis.gif"/></a></td></tr>""" % info['docs'].replace("'", "\\'"))
            html.append('</table>')

        html.append("</div>")

        xml = "\n".join(html)
        self.send_xml(xml, req)
示例#13
0
    def handle_listObjects(self, req):
        # List existing objects in context

        storeHash = {}
        collHash = {}
        processHash = {}

        # get start obj from request
        store = FieldStorage(req)
        try:
            objid = store['contextId']
        except:
            self.send_xml("<fault>Missing contextId</fault>", req);
            return
        try:
            obj = serv.get_object(session, objid)
            origObj = obj
        except:
            raise
            self.send_xml("<fault>Unknown object: '%s'</fault>" % objid, req);
            return;

        while obj:
            # first, recheck any configStores
            for csid in obj._includeConfigStores:
                confStore = obj.get_object(session, csid)
                if confStore != None:
                    for rec in confStore:
                        # do something with config
                        if (not (rec.id in obj.subConfigs.keys())):
                            node = rec.get_dom(session)
                            node= node.childNodes[0]
                            nid = node.getAttributeNS(None, 'id')
                            node.setAttributeNS(None, 'configStore', confStore.id)
                            obj.subConfigs[nid] = node
                            ntype = node.getAttributeNS(None, 'type')
                            if ntype == 'index':
                                obj.indexConfigs[nid] = node
                            elif ntype == 'protocolMap':
                                obj.protocolMapConfigs[nid] = node
                            elif ntype == 'database':
                                obj.databaseConfigs[nid] = node
                            elif ntype == '':
                                raise ConfigFileException("Object must have a type attribute: %s  -- in configStore %s" % (nid, csid))
            sys.stderr.flush()
            for oid in obj.subConfigs.keys():
                dom = obj.subConfigs[oid]
                t = dom.getAttributeNS(None, 'type')
                if t in storeTypes:
                    try:
                        storeHash[t].append(oid)
                    except:
                        storeHash[t] = [oid]
                elif t in collTypes:
                    try:
                        collHash[t].append(oid)
                    except:
                        collHash[t] = [oid]
                elif t in processTypes:
                    try:
                        processHash[t].append(oid)
                    except:
                        processHash[t] = [oid]
            obj = obj.parent

        html = ["""<div xmlns="http://www.w3.org/1999/xhtml"><ul id="ObjectList" style="padding-left: 5px; border-left: none;">"""]

        html.append("<li>Process Objects")
        html.append("<ul>")
        keys = processHash.keys()
        keys.sort()
        for ot in keys:
            html.append("<li>" + ot + "<ul>")
            oids = processHash[ot]
            oids.sort()
            if (origObj.get_path(session, ot)):
                html.append('<li> <a class="item" href="javascript:none()" onclick="create_ellipse(\'default %s\', \'%s\')"><i>default %s</i></a></li>' % (ot, ot, ot))
            for oid in oids:
                html.append("""
<li>
<a class="item" href="javascript:none()" onclick="create_ellipse('%s', '%s')">%s</a> 
<a class="item" href="javascript:none()" onclick="help(event, '%s')" onmouseout="unhelp()">?</a>
</li>""" % (oid, ot, oid, oid))
            html.append("</ul></li>")
        html.append("</ul></li>")


        html.append("<li>Store Objects")
        html.append("<ul>")
        keys = storeHash.keys()
        keys.sort()
        for ot in keys:
            html.append("<li>" + ot + "<ul>")
            oids = storeHash[ot]
            oids.sort()
            if (origObj.get_path(session, ot)):
                html.append('<li> <a class="item" href="javascript:none()" onclick="create_store(\'default %s\', \'%s\')"><i>default %s</i></a></li>' % (ot, ot, ot))
            if ot == 'configStore':
                for oid in oids:
                    html.append("""
<li>
<a class="item" href="javascript:none()" onclick="create_store('%s', '%s')">%s</a> 
<a class="item" href="javascript:none()" onclick="help(event, '%s')" onmouseout="unhelp()">?</a>
<a class="item" href="javascript:none()" onclick="setConfigStore('%s')">(set)</a>
</li>""" % (oid, ot, oid, oid, oid))
            else:
                for oid in oids:
                    html.append("""
<li>
<a class="item" href="javascript:none()" onclick="create_store('%s', '%s')">%s</a> 
<a class="item" href="javascript:none()" onclick="help(event, '%s')" onmouseout="unhelp()">?</a>
</li>""" % (oid, ot, oid, oid))
            html.append("</ul></li>")
        html.append("</ul></li>")

        html.append("<li>Collection Objects")
        html.append("<ul>")
        keys = collHash.keys()
        keys.sort()
        for ot in keys:
            html.append("<li>" + ot + "<ul>")
            oids  = collHash[ot]
            oids.sort()
            if (origObj.get_path(session, ot)):
                html.append('<li> <a class="item" href="javascript:none()" onclick="create_rect(\'default %s\', \'%s\')"><i>default %s</i></a></li>' % (ot, ot, ot))
            if ot == 'database':
                for oid in oids:
                    html.append("""
<li>
<a class="item" href="javascript:none()" onclick="create_rect('%s', '%s')">%s</a> 
<a class="item" href="javascript:none()" onclick="help(event, '%s')" onmouseout="unhelp()">?</a>
<a class="item" href="javascript:none()" onclick="setContext('%s')">(set)</a>
</li>""" % (oid, ot, oid, oid, oid))
            elif ot == 'workflow':
                for oid in oids:
                    html.append("""
<li>
<a class="item" href="javascript:none()" onclick="create_rect('%s', '%s')">%s</a> 
<a class="item" href="javascript:none()" onclick="help(event, '%s')" onmouseout="unhelp()">?</a>
<a class="item" href="javascript:none()" onclick="loadWorkflow('%s')">(edit)</a>
</li>""" % (oid, ot, oid, oid, oid))

            else:
                for oid in oids:
                    html.append("""
<li>
<a class="item" href="javascript:none()" onclick="create_rect('%s', '%s')">%s</a> 
<a class="item" href="javascript:none()" onclick="help(event, '%s')" onmouseout="unhelp()">?</a>
</li>""" % (oid, ot, oid, oid))

            html.append("</ul></li>")

        html.append("</ul></li>")
        html.append('<li><a class="item" href="javascript:none()" onclick="create_line();">Create Line</a></li>')
        html.append('<li><a class="item" href="javascript:none()" onclick="create_log();">Create Log Entry</a></li>')
        html.append('<li><a class="item" href="javascript:none()" onclick="create_assign();">Create Assignment</a></li>')

        html.append('<li>Create: <a class="item" href="javascript:none()" onclick="create_fork();">Fork</a>, ')
        html.append('<a class="item" href="javascript:none()" onclick="create_foreach();">ForEach</a>, ')
        html.append('<a class="item" href="javascript:none()" onclick="create_try();">TryExcept</a></li>')

        html.append('<li>Create: <a class="item" href="javascript:none()" onclick="create_return();">Return</a>, ')
        html.append('<a class="item" href="javascript:none()" onclick="create_raise();">Raise</a>, ')
        html.append('<a class="item" href="javascript:none()" onclick="create_continue();">Continue</a>, ')
        html.append('<a class="item" href="javascript:none()" onclick="create_break();">Break</a></li>')

        html.append("</ul>")

        html.append('<ul style="padding-left: 5px; border-left: none;">')

        html.append('<li><a class="item" href="javascript:none()" onclick="zoom(1);">Zoom Out</a>  (Current: <span id="zoomLevel">1</span>:1)</li>')
        html.append('<li><a class="item" href="javascript:none()" onclick="zoom(-1);">Zoom In</a></li>')

        html.append('<li><a class="item" href="javascript:none()" onclick="panX(1);">Move Left</a> (Current: <span id="panLevel">0 0</span>)</li>')
        html.append('<li><a class="item" href="javascript:none()" onclick="panX(-1);">Move Right</a></li>')
        html.append('<li><a class="item" href="javascript:none()" onclick="panY(1);">Move Up</a></li>')
        html.append('<li><a class="item" href="javascript:none()" onclick="panY(-1);">Move Down</a></li>')


        html.append('<li><br/><a class="item" href="index2.xml">Create New Object</a></li>')


        html.append('<li><br/><a class="item" href="javascript:none()" onclick="clear_flow();">Clear Workflow</a></li>')
        html.append('<li><a class="item" href="javascript:none()" onclick="show_flow();">Preview Workflow</a></li>')
        html.append('<li><a class="item" href="javascript:none()" onclick="send_flow();">Save Workflow</a></li>')

        html.append('<li><br/><table cellpadding="0" cellspacing="0" border="0"><tr><td>Context:</td><td><span id="contextId">%s</span></td></tr><tr><td>Workflow:</td><td><input type="text" value="test-flow" id="workflowId"/></td></tr><tr><td>ConfigStore:</td><td><input type="text" value="defaultConfigStore" id="configStoreId"/></td></tr><tr><td>Replace:</td><td><select id="replace"><option value="0">No</option><option value="1">Yes</option></select></td></tr></table></li>' % objid);

        html.append("</ul></div>")

        xml = '\n'.join(html)
        self.send_xml(xml, req)
示例#14
0
 def __init__( self, req ):
     from mod_python.util import FieldStorage
     self.fieldStorage = FieldStorage( req, True )
示例#15
0
 def dispatch(self, req):
     path = req.uri.strip('/')
     if path not in configs:
         # Unknown endpoint
         # No specification
         xml = ['<databases numberOfDatabases="%d">' % (len(configs))]
         for k in sorted(configs.keys()):
             xml.append("<database><path>%s</path></database>" % k)
         xml.append('</databases>')
         txt = ''.join(xml)
         self.send_xml(txt, req)
     else:
         dbconf = configs[path]
         if isinstance(dbconf, tuple):
             dbid = dbconf[0]
             db = serv.get_object(session, dbid)
             config = db.get_object(
                 session,
                 dbconf[1]['http://www.loc.gov/zing/srw/']
             )
         else:
             config = dbconf['http://www.loc.gov/zing/srw/']
         # Check db hasn't changed since instantiated
         db = config.parent
         # Attempt to find filepath for db metadata
         fp = db.get_path(session, 'metadataPath')
         if os.stat(fp).st_mtime > db.initTime:
             # rediscover objects
             dbid = db.id
             del db
             try:
                 del serv.objects[dbid]
             except KeyError:
                 pass
             try:
                 del serv.databases[dbid]
             except KeyError:
                 pass
             db = serv.get_object(session, dbid)
         session.path = "http://%s/%s" % (req.hostname, path)
         session.config = config
         store = FieldStorage(req)
         opts = {}
         for qp in store.list:
             if qp.value.isdigit():
                 opts[qp.name] = int(qp.value)
             else:
                 opts[qp.name] = qp.value
         if not opts:
             opts = {
                 'operation': 'explain',
                 'version': '1.2',
                 'recordPacking': 'xml'
                 }
         if not 'operation' in opts:
             err = self.diagnostic(7,
                                   msg="Mandatory parameter not supplied",
                                   details='operation')
             result = self.processUnknownOperation(err, config)
         elif not opts['operation'] in ['explain',
                                        'searchRetrieve',
                                        'scan']:
             err = self.diagnostic(4,
                                   msg="Unsupported Operation",
                                   details=opts['operation'])
             result = self.processUnknownOperation(err, config)
         else:
             respName = "%sResponse" % opts['operation']
             result = getattr(elemFac, respName)()
             v = elemFac.version('1.2')
             result.append(v)
             if not 'version' in opts:
                 err = self.diagnostic(
                     7,
                     msg="Mandatory parameter not supplied",
                     details='version'
                 )
                 dx = self.diagnosticToXml(err)
                 x = elemFac.diagnostics()
                 x.append(dx)
                 result.append(x)
             else:
                 fn = getattr(self, 'process_%s' % opts['operation'])
                 try:
                     fn(opts, result)
                 except cqlParser.Diagnostic as d:
                     diags = elemFac.diagnostics(self.diagnosticToXml(d))
                     result.append(diags)
                 result.append(self.echoedQuery(opts))
                 self.extraData('response', opts, result)
                 session.currentResultSet = None
         text = etree.tostring(result, pretty_print=True)
         if 'stylesheet' in opts:
             text = (u'<?xml version="1.0"?>\n'
                     u'<?xml-stylesheet type="text/xsl" href="%s"?>\n'
                     u'%s' % (opts['stylesheet'], text))
         else:
             text = u'<?xml version="1.0"?>\n%s' % text
         self.send_xml(text, req)
         if len(serv.databaseConfigs) >= 25:
             # cleanup memory
             try:
                 del serv.objects[config.parent.id]
             except KeyError:
                 pass
         result = self.call(xreq)
     except AttributeError, err:
         # result = self.processUnknownOperation(classname, err, config)
         self.send_fault(
             Fault(Fault.Client,
                   'Unknown Operation (%s)' % str(err)), req)
         return
     except Exception, err:
         self.send_fault(
             Fault(Fault.Client,
                   'Broken request %s: (%s)' % (err, data)), req)
         return
 elif (req.method == "GET"):
     # parse options out of req
     config = config['http://www.loc.gov/zing/srw/']
     store = FieldStorage(req)
     opts = {}
     for qp in store.list:
         opts[qp.name] = [qp.value]
     if not opts:
         opts = {
             'operation': ['explain'],
             'version': ['1.1'],
             'recordPacking': ['xml']
         }
     if not opts.has_key('operation'):
         # Be rigourous and error ... somehow
         err = SRWDiagnostics.Diagnostic7()
         err.uri = err.uri
         err.message = "Mandatory 'operation' parameter not supplied"
         err.details = "operation"
示例#17
0
    def handle(self, req):
        path = req.uri[5:]
        form = FieldStorage(req)

        strict = form.get('strict', True)
        if strict in ['false', 'False', '0', None, '']:
            strict = False

        mt = form.get('mimeType', '')
        mt = mt.replace(' ', '+')

        if not mt:
            xtn = form.get('extension', '')
            if xtn:
                if xtn not in srlzHash:
                    # can't continue
                    raise ValueError(xtn)
                else:
                    mt = srlzHash[xtn].mimeType

        if not mt:
            try:
                wanted = req.headers_in['Accept']
                mts = conneg.parse(wanted)
                mt = conneg.best(mts, mimeList)
            except:
                mt = ''

        if mt:
            xtn = mimeHash[str(mt)]
        else:
            # default to rdf/xml
            xtn = "rdf.xml"

        srlz = srlzHash[xtn]

        if 'aggregation' in form:
            uri = form.get('aggregation')
        else:
            uri = path

        if not uri:
            data = '<html><body>Instructions etc. goes here</body></html>'
            self.send(data, req, ct="text/html")
            return
        elif not protoUriRe.match(uri):
            self.error("Resource Map URI must be a protocol based URI", req)
            return

        try:
            # fetch

            rd = ReMDocument(uri)
        except Exception as e:
            self.error(
                "Could not retrieve Resource Map from '%s': %s" %
                (uri, e.message), req)
            return

        try:
            # parse
            if rd.format == 'atom':
                parser = ap
            elif rd.format == 'rdfa':
                parser = rdfap
            else:
                parser = p
            if not strict:
                parser.strict = False
            try:
                rem = parser.parse(rd)
                parser.strict = True
            except:
                parser.strict = True
                raise

        except OreException as e:
            # get exception message
            self.error("Resource Map Invalid: %s" % e.message, req)
            return
        except SAXParseException as e:
            self.error(
                "Could not parse XML: %s (line %s, column %s)" %
                (e.getMessage(), e.getLineNumber(), e.getColumnNumber()), req)
            return
        except:
            raise

        try:
            # serialize
            rem2 = rem._aggregation_.register_serialization(
                srlz, 'http://foresite.cheshire3.org/%s#rem' % req.uri)
            rd = rem2.get_serialization()
            data = rd.data
            if srlz == srlzHash['rdfa.html']:
                data = '<xhtml xmlns="http://www.w3.org/1999/xhtml"><body><i>Invisible RDFa resource map follows, it must have validated okay. [view source] :)</i>' + data + "</body></xhtml>"

        except Exception as e:
            self.error(
                "Could not serialize Aggregation to Resource Map: %s" %
                e.message, req)
            return

        self.send(data, req, ct=srlz.mimeType)