class EDPluginISPyBv1_2(EDPluginExec):
    """
    Plugin to store results in an ISPyB database using the DNA/ISPyB dbserver 
    """

    def __init__(self):
        """
        Sets default values for dbserver parameters 
        """
        EDPluginExec.__init__(self)
        self.setXSDataInputClass(XSDataISPyBScreening, "screening")                 # [0, 1]
        self.setXSDataInputClass(XSDataISPyBScreeningInput, "screeningInput")       # [0, infinite] 
        self.setXSDataInputClass(XSDataISPyBScreeningOutputContainer, "screeningOutputContainer") # [0, infinite] 
        self.setXSDataInputClass(XSDataISPyBScreeningRank, "screeningRank")         # [0, infinite]
        self.setXSDataInputClass(XSDataISPyBScreeningRankSet, "screeningRankSet")   # [0, 1]
        self.setXSDataInputClass(XSDataISPyBScreeningFile, "screeningFile")         # [0, infinite]
        self.setXSDataInputClass(XSDataISPyBImage, "image")                        # [0, 1]

        self.__strDbserverHost = "localhost"
        self.__iDbserverPort = 9090


    def getDbserverHost(self):
        return self.__strDbserverHost

    def setDbserverHost(self, _strDbserverHost):
        self.__strDbserverHost = _strDbserverHost

    def getDbserverPort(self):
        return self.__iDbserverPort

    def setDbserverPort(self, _iDbserverPort):
        self.__iDbserverPort = _iDbserverPort

    def configure(self):
        """
        Gets the dbserver parameters from the config file and stores them in class member attributes.
        """
        EDPluginExec.configure(self)
        pluginConfiguration = self.getConfiguration()

        if(pluginConfiguration == None):
            EDVerbose.DEBUG("*** EDPluginISPyBv1_2.configure: pluginConfiguration is None, using default settings")
        else:
            EDVerbose.DEBUG("*** EDPluginISPyBv1_2.configure: pluginConfiguration found, using settings from there")
            strDbserverHost = EDConfiguration.getStringParamValue(pluginConfiguration, "dbserverHost")
            if(strDbserverHost == None):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2.configure", self.getClassName(), \
                                                                     "Configuration parameter missing: dbserverHost")
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage
            else:
                self.setDbserverHost(strDbserverHost)

            strDbserverPort = EDConfiguration.getStringParamValue(pluginConfiguration, "dbserverPort")
            if(strDbserverPort == None):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2.configure", self.getClassName(), \
                                                                     "Configuration parameter missing: dbserverPort")
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage
            else:
                self.setDbserverPort(int (strDbserverPort))


    def process(self, _edObject=None):
        """
        Sends store requests with the screening objects to the dbserver. Returns success or failure.
        
        Note that:
        * Any objects referred to by the object returned by self.getDataInput("inputISPyB")[0] will be stored. 
        * Primary key attributes should not be set.
        * If a foreign key attribute is not set, this method will attempt to find the foreign object among the 
        input objects, and then use the primary key attribute of this object when it has been stored. If such 
        an object is not found, the method fails.
        * If an error is encountered, the method will immediately fail and will not attempt to store any more 
        objects. 
        """

        EDPluginExec.process(self)
        EDVerbose.DEBUG("*** EDPluginISPyBv1_2.process")

        # Basic sanity check of inputs:
        if (self.hasDataInput("screening")):
            if (len(self.getDataInput("screening")) > 1):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", "There should only be one input 'screening'.")
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

        if (self.hasDataInput("screeningRankSet")):
            if (len(self.getDataInput("screeningRankSet")) > 1):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", "There should only be one input 'screeningRankSet'.")
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

        # Get the inputs
        xsDataISPyBScreenings = None
        xsDataISPyBScreeningInputs = None
        xsDataISPyBScreeningOutputContainers = None
        xsDataISPyBScreeningRanks = None
        xsDataISPyBScreeningRankSets = None
        xsDataISPyBImages = None
        xsDataISPyBScreeningFiles = None

        if self.hasDataInput("screening"):
            xsDataISPyBScreenings = self.getDataInput("screening")
        if self.hasDataInput("screeningInput"):
            xsDataISPyBScreeningInputs = self.getDataInput("screeningInput")
        if self.hasDataInput("screeningOutputContainer"):
            xsDataISPyBScreeningOutputContainers = self.getDataInput("screeningOutputContainer")
        if self.hasDataInput("screeningRank"):
            xsDataISPyBScreeningRanks = self.getDataInput("screeningRank")
        if self.hasDataInput("screeningRankSet"):
            xsDataISPyBScreeningRankSets = self.getDataInput("screeningRankSet")
        if self.hasDataInput("image"):
            xsDataISPyBImages = self.getDataInput("image")
        if self.hasDataInput("screeningFile"):
            xsDataISPyBScreeningFiles = self.getDataInput("screeningFile")

        self.__xsDataResultISPyB = XSDataResultISPyB()

        if (xsDataISPyBScreenings is None):
            xsDataISPyBScreening = XSDataISPyBScreening()
        else:
            xsDataISPyBScreening = xsDataISPyBScreenings[0]

        if (xsDataISPyBImages is None):
            xsDataISPyBImage = None
        else:
            xsDataISPyBImage = xsDataISPyBImages[0]

        # Another sanity check:
        if xsDataISPyBScreening.getDataCollectionId() == None:
            if ((xsDataISPyBImage == None) or (xsDataISPyBImage.getFileName() == None) or (xsDataISPyBImage.getFileLocation() == None)):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", \
                                                                     "Neither a dataCollectionId nor an image filename + path are provided.")
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                return

            strXML = EDUtilsXML.dnaMarshal(xsDataISPyBImage)

            # Send the XML to request the dataCollectionId from the dbserver:
            strResponse = self.httpPost(self.getDbserverHost(), self.getDbserverPort(), "/get_datacollectionid", strXML)

            if strResponse != None:
                # Handle response:
                xsDatadbstatus = XSDatadbstatus.parseString(strResponse)
                strCode = xsDatadbstatus.getCode()
                strMessage = xsDatadbstatus.getMessage()
                EDVerbose.DEBUG("dbserver returns code: " + strCode)
                EDVerbose.DEBUG("dbserver returns message: " + strMessage)

                if (strCode == "error") or (xsDatadbstatus.getDataCollectionId() == -1):
                    if xsDatadbstatus.getDataCollectionId() == -1:
                        strMessage = "An image corresponding to the given fileName and fileLocation was not found."
                    strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", strMessage)
                    EDVerbose.error(strErrorMessage)
                    self.addErrorMessage(strErrorMessage)
                    return

                if xsDatadbstatus.getDataCollectionId() != -1:
                    xsDataISPyBScreening.setDataCollectionId(XSDataInteger(xsDatadbstatus.getDataCollectionId()))
                    self.__xsDataResultISPyB.setDataCollectionId(XSDataInteger(xsDatadbstatus.getDataCollectionId()))

        if (xsDataISPyBScreeningRankSets is None):
            xsDataISPyBScreeningRankSet = None
        else:
            xsDataISPyBScreeningRankSet = xsDataISPyBScreeningRankSets[0]

        # Store all the different screening* objects:
        xsDataIntegerScreeningId = self.store(xsDataISPyBScreening)

        if xsDataISPyBScreeningInputs != None:
            for xsDataISPyBScreeningInput in xsDataISPyBScreeningInputs:
                xsDataISPyBScreeningInput.setScreeningId(xsDataIntegerScreeningId)
                self.store(xsDataISPyBScreeningInput)

        if xsDataISPyBScreeningRankSet != None:
            xsDataIntegerScreeningRankSetId = self.store(xsDataISPyBScreeningRankSet)

            for xsDataISPyBScreeningRank in xsDataISPyBScreeningRanks:
                xsDataISPyBScreeningRank.setScreeningId(xsDataIntegerScreeningId)
                xsDataISPyBScreeningRank.setScreeningRankSetId(xsDataIntegerScreeningRankSetId)
                self.store(xsDataISPyBScreeningRank)

        if xsDataISPyBScreeningOutputContainers != None:
            for xsDataISPyBScreeningOutputContainer in xsDataISPyBScreeningOutputContainers:
                xsDataISPyBScreeningOutput = xsDataISPyBScreeningOutputContainer.getScreeningOutput()
                xsDataISPyBScreeningOutput.setScreeningId(xsDataIntegerScreeningId)
                xsDataIntegerScreeningOutputId = self.store(xsDataISPyBScreeningOutput)

            xsDataISPyBScreeningOutputLattices = xsDataISPyBScreeningOutputContainer.getScreeningOutputLattice()
            if xsDataISPyBScreeningOutputLattices != None:
                for xsDataISPyBScreeningOutputLattice in xsDataISPyBScreeningOutputLattices:
                    xsDataISPyBScreeningOutputLattice.setScreeningOutputId(xsDataIntegerScreeningOutputId)
                    self.store(xsDataISPyBScreeningOutputLattice)

            xsDataISPyBScreeningStrategyContainers = xsDataISPyBScreeningOutputContainer.getScreeningStrategyContainer()
            if xsDataISPyBScreeningStrategyContainers != None:
                for xsDataISPyBScreeningStrategyContainer in xsDataISPyBScreeningStrategyContainers:
                    xsDataISPyBScreeningStrategy = xsDataISPyBScreeningStrategyContainer.getScreeningStrategy()
                    if xsDataISPyBScreeningStrategy != None:
                        xsDataISPyBScreeningStrategy.setScreeningOutputId(xsDataIntegerScreeningOutputId)
                        xsDataIntegerScreeningStrategyId = self.store(xsDataISPyBScreeningStrategy)

                        xsDataISPyBScreeningStrategyWedgeContainers = xsDataISPyBScreeningStrategyContainer.getScreeningStrategyWedgeContainer()
                        if xsDataISPyBScreeningStrategyWedgeContainers != None:
                            for xsDataISPyBScreeningStrategyWedgeContainer in xsDataISPyBScreeningStrategyWedgeContainers:
                                xsDataISPyBScreeningStrategyWedge = xsDataISPyBScreeningStrategyWedgeContainer.getScreeningStrategyWedge()
                                xsDataISPyBScreeningStrategyWedge.setScreeningStrategyId(xsDataIntegerScreeningStrategyId)
                                xsDataIntegerScreeningStrategyWedgeId = self.store(xsDataISPyBScreeningStrategyWedge)

                                xsDataISPyBScreeningStrategySubWedges = xsDataISPyBScreeningStrategyWedgeContainer.getScreeningStrategySubWedge()
                                if xsDataISPyBScreeningStrategySubWedges != None:
                                    for xsDataISPyBScreeningStrategySubWedge in xsDataISPyBScreeningStrategySubWedges:
                                        xsDataISPyBScreeningStrategySubWedge.setScreeningStrategyWedgeId(xsDataIntegerScreeningStrategyWedgeId)
                                        self.store(xsDataISPyBScreeningStrategySubWedge)


    def postProcess(self, _edObject=None):
        """
        """
        EDPluginExec.postProcess(self)
        EDVerbose.DEBUG("*** EDPluginISPyBv1_2.postProcess")
        if (self.__xsDataResultISPyB is not None):
            self.setDataOutput(self.__xsDataResultISPyB)

    def httpPost(self, _strHost, _iPort, _strPath, _strXML):
        """
        Sends XML to the dbserver on the specified host and port with the specified path.
        Returns the response XML from the dbserver.
        @param _strHost: the host name for the dbserver
        @type  _strHost: string
        @param _iPort: the port for the dbserver
        @type  _iPort: integer
        @param _strPath: the path name for the request
        @type  _strPath: string
        @param _strXML: the XML for the request
        @type  _strXML: string
        """
        strData = None
        try:
            pyHTTPConnection = httplib.HTTPConnection(_strHost, _iPort)
            pyHTTPConnection.putrequest("POST", _strPath)
            pyHTTPConnection.putheader("Content-type", "text/xml")
            pyHTTPConnection.putheader("Content-length", "%d" % len(_strXML))
            pyHTTPConnection.putheader('Accept', 'text/plain')
            if "HOSTNAME" in os.environ.keys():
                pyHTTPConnection.putheader('Host', os.environ["HOSTNAME"])
            pyHTTPConnection.endheaders()
            pyHTTPConnection.send(_strXML)
            pyHTTPResponse = pyHTTPConnection.getresponse()
            strMsg = pyHTTPResponse.msg
            strHeaders = pyHTTPResponse.getheaders()
            strReply = str(pyHTTPResponse.status) + ' - ' + pyHTTPResponse.reason

            strContentLength = pyHTTPResponse.getheader("Content-Length")
            if strContentLength is None:
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "httpPost", \
                                                           "No header returned for %s, host %s, port %d. HTTP resonse was: %s" \
                                                           % (_strPath, _strHost, _iPort, strReply))
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage
            try:
                ilength = string.atoi(strContentLength)
            except:
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "httpPost", \
                                                           "Cannot convert Content-Length %s to integer for %s, host %s, port %d!" \
                                                           % (strContentLength, _strPath, _strHost, _iPort))
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

            strData = pyHTTPResponse.read()
        except (socket.error, httplib.BadStatusLine), (msg):
            strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "httpPost", \
                                                                 "Have you set up a connection to the dbserver? Error is: %s" % (msg))
            EDVerbose.error(strErrorMessage)
            self.addErrorMessage(strErrorMessage)
            self.setFailure()
            raise RuntimeError, strErrorMessage

        return strData
    def process(self, _edObject=None):
        """
        Sends store requests with the screening objects to the dbserver. Returns success or failure.
        
        Note that:
        * Any objects referred to by the object returned by self.getDataInput("inputISPyB")[0] will be stored. 
        * Primary key attributes should not be set.
        * If a foreign key attribute is not set, this method will attempt to find the foreign object among the 
        input objects, and then use the primary key attribute of this object when it has been stored. If such 
        an object is not found, the method fails.
        * If an error is encountered, the method will immediately fail and will not attempt to store any more 
        objects. 
        """

        EDPluginExec.process(self)
        EDVerbose.DEBUG("*** EDPluginISPyBv1_2.process")

        # Basic sanity check of inputs:
        if (self.hasDataInput("screening")):
            if (len(self.getDataInput("screening")) > 1):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", "There should only be one input 'screening'.")
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

        if (self.hasDataInput("screeningRankSet")):
            if (len(self.getDataInput("screeningRankSet")) > 1):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", "There should only be one input 'screeningRankSet'.")
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

        # Get the inputs
        xsDataISPyBScreenings = None
        xsDataISPyBScreeningInputs = None
        xsDataISPyBScreeningOutputContainers = None
        xsDataISPyBScreeningRanks = None
        xsDataISPyBScreeningRankSets = None
        xsDataISPyBImages = None
        xsDataISPyBScreeningFiles = None

        if self.hasDataInput("screening"):
            xsDataISPyBScreenings = self.getDataInput("screening")
        if self.hasDataInput("screeningInput"):
            xsDataISPyBScreeningInputs = self.getDataInput("screeningInput")
        if self.hasDataInput("screeningOutputContainer"):
            xsDataISPyBScreeningOutputContainers = self.getDataInput("screeningOutputContainer")
        if self.hasDataInput("screeningRank"):
            xsDataISPyBScreeningRanks = self.getDataInput("screeningRank")
        if self.hasDataInput("screeningRankSet"):
            xsDataISPyBScreeningRankSets = self.getDataInput("screeningRankSet")
        if self.hasDataInput("image"):
            xsDataISPyBImages = self.getDataInput("image")
        if self.hasDataInput("screeningFile"):
            xsDataISPyBScreeningFiles = self.getDataInput("screeningFile")

        self.__xsDataResultISPyB = XSDataResultISPyB()

        if (xsDataISPyBScreenings is None):
            xsDataISPyBScreening = XSDataISPyBScreening()
        else:
            xsDataISPyBScreening = xsDataISPyBScreenings[0]

        if (xsDataISPyBImages is None):
            xsDataISPyBImage = None
        else:
            xsDataISPyBImage = xsDataISPyBImages[0]

        # Another sanity check:
        if xsDataISPyBScreening.getDataCollectionId() == None:
            if ((xsDataISPyBImage == None) or (xsDataISPyBImage.getFileName() == None) or (xsDataISPyBImage.getFileLocation() == None)):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", \
                                                                     "Neither a dataCollectionId nor an image filename + path are provided.")
                EDVerbose.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                return

            strXML = EDUtilsXML.dnaMarshal(xsDataISPyBImage)

            # Send the XML to request the dataCollectionId from the dbserver:
            strResponse = self.httpPost(self.getDbserverHost(), self.getDbserverPort(), "/get_datacollectionid", strXML)

            if strResponse != None:
                # Handle response:
                xsDatadbstatus = XSDatadbstatus.parseString(strResponse)
                strCode = xsDatadbstatus.getCode()
                strMessage = xsDatadbstatus.getMessage()
                EDVerbose.DEBUG("dbserver returns code: " + strCode)
                EDVerbose.DEBUG("dbserver returns message: " + strMessage)

                if (strCode == "error") or (xsDatadbstatus.getDataCollectionId() == -1):
                    if xsDatadbstatus.getDataCollectionId() == -1:
                        strMessage = "An image corresponding to the given fileName and fileLocation was not found."
                    strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", strMessage)
                    EDVerbose.error(strErrorMessage)
                    self.addErrorMessage(strErrorMessage)
                    return

                if xsDatadbstatus.getDataCollectionId() != -1:
                    xsDataISPyBScreening.setDataCollectionId(XSDataInteger(xsDatadbstatus.getDataCollectionId()))
                    self.__xsDataResultISPyB.setDataCollectionId(XSDataInteger(xsDatadbstatus.getDataCollectionId()))

        if (xsDataISPyBScreeningRankSets is None):
            xsDataISPyBScreeningRankSet = None
        else:
            xsDataISPyBScreeningRankSet = xsDataISPyBScreeningRankSets[0]

        # Store all the different screening* objects:
        xsDataIntegerScreeningId = self.store(xsDataISPyBScreening)

        if xsDataISPyBScreeningInputs != None:
            for xsDataISPyBScreeningInput in xsDataISPyBScreeningInputs:
                xsDataISPyBScreeningInput.setScreeningId(xsDataIntegerScreeningId)
                self.store(xsDataISPyBScreeningInput)

        if xsDataISPyBScreeningRankSet != None:
            xsDataIntegerScreeningRankSetId = self.store(xsDataISPyBScreeningRankSet)

            for xsDataISPyBScreeningRank in xsDataISPyBScreeningRanks:
                xsDataISPyBScreeningRank.setScreeningId(xsDataIntegerScreeningId)
                xsDataISPyBScreeningRank.setScreeningRankSetId(xsDataIntegerScreeningRankSetId)
                self.store(xsDataISPyBScreeningRank)

        if xsDataISPyBScreeningOutputContainers != None:
            for xsDataISPyBScreeningOutputContainer in xsDataISPyBScreeningOutputContainers:
                xsDataISPyBScreeningOutput = xsDataISPyBScreeningOutputContainer.getScreeningOutput()
                xsDataISPyBScreeningOutput.setScreeningId(xsDataIntegerScreeningId)
                xsDataIntegerScreeningOutputId = self.store(xsDataISPyBScreeningOutput)

            xsDataISPyBScreeningOutputLattices = xsDataISPyBScreeningOutputContainer.getScreeningOutputLattice()
            if xsDataISPyBScreeningOutputLattices != None:
                for xsDataISPyBScreeningOutputLattice in xsDataISPyBScreeningOutputLattices:
                    xsDataISPyBScreeningOutputLattice.setScreeningOutputId(xsDataIntegerScreeningOutputId)
                    self.store(xsDataISPyBScreeningOutputLattice)

            xsDataISPyBScreeningStrategyContainers = xsDataISPyBScreeningOutputContainer.getScreeningStrategyContainer()
            if xsDataISPyBScreeningStrategyContainers != None:
                for xsDataISPyBScreeningStrategyContainer in xsDataISPyBScreeningStrategyContainers:
                    xsDataISPyBScreeningStrategy = xsDataISPyBScreeningStrategyContainer.getScreeningStrategy()
                    if xsDataISPyBScreeningStrategy != None:
                        xsDataISPyBScreeningStrategy.setScreeningOutputId(xsDataIntegerScreeningOutputId)
                        xsDataIntegerScreeningStrategyId = self.store(xsDataISPyBScreeningStrategy)

                        xsDataISPyBScreeningStrategyWedgeContainers = xsDataISPyBScreeningStrategyContainer.getScreeningStrategyWedgeContainer()
                        if xsDataISPyBScreeningStrategyWedgeContainers != None:
                            for xsDataISPyBScreeningStrategyWedgeContainer in xsDataISPyBScreeningStrategyWedgeContainers:
                                xsDataISPyBScreeningStrategyWedge = xsDataISPyBScreeningStrategyWedgeContainer.getScreeningStrategyWedge()
                                xsDataISPyBScreeningStrategyWedge.setScreeningStrategyId(xsDataIntegerScreeningStrategyId)
                                xsDataIntegerScreeningStrategyWedgeId = self.store(xsDataISPyBScreeningStrategyWedge)

                                xsDataISPyBScreeningStrategySubWedges = xsDataISPyBScreeningStrategyWedgeContainer.getScreeningStrategySubWedge()
                                if xsDataISPyBScreeningStrategySubWedges != None:
                                    for xsDataISPyBScreeningStrategySubWedge in xsDataISPyBScreeningStrategySubWedges:
                                        xsDataISPyBScreeningStrategySubWedge.setScreeningStrategyWedgeId(xsDataIntegerScreeningStrategyWedgeId)
                                        self.store(xsDataISPyBScreeningStrategySubWedge)
예제 #3
0
    def testExecute(self):
        """
        Runs the plugin and then compares expected output with obtained output to verify that it executed correctly. 
        """
        self.run()

        # Checks the obtained result against the expected result
        edStringExpectedOutput = self.readAndParseFile(
            self.getReferenceDataOutputFile())
        edStringObtainedOutput = self.readAndParseFile(
            self.__strObtainedOutputDataFile)

        xsDataResultISPyBExpected = XSDataResultISPyB.parseString(
            edStringExpectedOutput)
        xsDataResultISPyBObtained = XSDataResultISPyB.parseString(
            edStringObtainedOutput)

        self.DEBUG("Checking obtained result...")

        xsDataIntegerExpDataCollectionId = xsDataResultISPyBExpected.getDataCollectionId(
        )
        xsDataResultStatusExpScreening = xsDataResultISPyBExpected.getScreeningStatus(
        )
        xsDataResultStatusExpScreeningInputs = xsDataResultISPyBExpected.getScreeningInputStatus(
        )
        xsDataResultStatusExpScreeningOutputs = xsDataResultISPyBExpected.getScreeningOutputStatus(
        )
        xsDataResultStatusExpScreeningOutputLattices = xsDataResultISPyBExpected.getScreeningOutputLatticeStatus(
        )
        xsDataResultStatusExpScreeningStrategies = xsDataResultISPyBExpected.getScreeningStrategyStatus(
        )
        xsDataResultStatusExpScreeningStrategyWedges = xsDataResultISPyBExpected.getScreeningStrategyWedgeStatus(
        )
        xsDataResultStatusExpScreeningStrategySubWedges = xsDataResultISPyBExpected.getScreeningStrategySubWedgeStatus(
        )
        xsDataResultStatusExpScreeningRanks = xsDataResultISPyBExpected.getScreeningRankStatus(
        )
        xsDataResultStatusExpScreeningRankSet = xsDataResultISPyBExpected.getScreeningRankSetStatus(
        )

        xsDataIntegerDataCollectionId = xsDataResultISPyBObtained.getDataCollectionId(
        )
        xsDataResultStatusScreening = xsDataResultISPyBObtained.getScreeningStatus(
        )
        xsDataResultStatusScreeningInputs = xsDataResultISPyBObtained.getScreeningInputStatus(
        )
        xsDataResultStatusScreeningOutputs = xsDataResultISPyBObtained.getScreeningOutputStatus(
        )
        xsDataResultStatusScreeningOutputLattices = xsDataResultISPyBObtained.getScreeningOutputLatticeStatus(
        )
        xsDataResultStatusScreeningStrategies = xsDataResultISPyBObtained.getScreeningStrategyStatus(
        )
        xsDataResultStatusScreeningStrategyWedges = xsDataResultISPyBObtained.getScreeningStrategyWedgeStatus(
        )
        xsDataResultStatusScreeningStrategySubWedges = xsDataResultISPyBObtained.getScreeningStrategySubWedgeStatus(
        )
        xsDataResultStatusScreeningRanks = xsDataResultISPyBObtained.getScreeningRankStatus(
        )
        xsDataResultStatusScreeningRankSet = xsDataResultISPyBObtained.getScreeningRankSetStatus(
        )

        if xsDataIntegerExpDataCollectionId != None:
            self.DEBUG("Checking dataCollectionId ...")
            EDAssert.equal(xsDataIntegerDataCollectionId.getValue(),
                           xsDataIntegerExpDataCollectionId.getValue())
        if xsDataResultStatusExpScreening != None:
            self.DEBUG("Checking screening ...")
            EDAssert.equal(xsDataResultStatusScreening.getCode().getValue(),
                           "ok")
            iId = xsDataResultStatusScreening.getId().getValue()
            EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningInputs != None:
            self.DEBUG("Checking inputs...")
            for xsDataResultStatusScreeningInput in xsDataResultStatusScreeningInputs:
                EDAssert.equal(
                    xsDataResultStatusScreeningInput.getCode().getValue(),
                    "ok")
                iId = xsDataResultStatusScreeningInput.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningOutputs != None:
            self.DEBUG("Checking outputs ...")
            for xsDataResultStatusScreeningOutput in xsDataResultStatusScreeningOutputs:
                EDAssert.equal(
                    xsDataResultStatusScreeningOutput.getCode().getValue(),
                    "ok")
                iId = xsDataResultStatusScreeningOutput.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningOutputLattices != None:
            self.DEBUG("Checking output lattices...")
            for xsDataResultStatusScreeningOutputLattice in xsDataResultStatusScreeningOutputLattices:
                EDAssert.equal(
                    xsDataResultStatusScreeningOutputLattice.getCode().
                    getValue(), "ok")
                iId = xsDataResultStatusScreeningOutputLattice.getId(
                ).getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningStrategies != None:
            self.DEBUG("Checking strategies...")
            for xsDataResultStatusScreeningStrategy in xsDataResultStatusScreeningStrategies:
                EDAssert.equal(
                    xsDataResultStatusScreeningStrategy.getCode().getValue(),
                    "ok")
                iId = xsDataResultStatusScreeningStrategy.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningStrategyWedges != None:
            self.DEBUG("Checking strategy wedges...")
            for xsDataResultStatusScreeningStrategyWedge in xsDataResultStatusScreeningStrategyWedges:
                EDAssert.equal(
                    xsDataResultStatusScreeningStrategyWedge.getCode().
                    getValue(), "ok")
                iId = xsDataResultStatusScreeningStrategyWedge.getId(
                ).getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningStrategySubWedges != None:
            self.DEBUG("Checking strategy subwedges...")
            for xsDataResultStatusScreeningStrategySubWedge in xsDataResultStatusScreeningStrategySubWedges:
                EDAssert.equal(
                    xsDataResultStatusScreeningStrategySubWedge.getCode().
                    getValue(), "ok")
                iId = xsDataResultStatusScreeningStrategySubWedge.getId(
                ).getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningRanks != None:
            self.DEBUG("Checking ranks...")
            for xsDataResultStatusScreeningRank in xsDataResultStatusScreeningRanks:
                EDAssert.equal(
                    xsDataResultStatusScreeningRank.getCode().getValue(), "ok")
                iId = xsDataResultStatusScreeningRank.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusScreeningRankSet != None:
            self.DEBUG("Checking rank sets...")
            EDAssert.equal(
                xsDataResultStatusScreeningRankSet.getCode().getValue(), "ok")
            iId = xsDataResultStatusScreeningRankSet.getId().getValue()
            EDAssert.equal((iId >= 0), True)
    def testExecute(self):
        """
        Runs the plugin and then compares expected output with obtained output to verify that it executed correctly. 
        """
        self.run()

        # Checks the obtained result against the expected result
        edStringExpectedOutput = self.readAndParseFile(self.getReferenceDataOutputFile())
        edStringObtainedOutput = self.readAndParseFile(self.__strObtainedOutputDataFile)

        xsDataResultISPyBExpected = XSDataResultISPyB.parseString(edStringExpectedOutput)
        xsDataResultISPyBObtained = XSDataResultISPyB.parseString(edStringObtainedOutput)

        self.DEBUG("Checking obtained result...")

        xsDataIntegerExpDataCollectionId = xsDataResultISPyBExpected.getDataCollectionId()
        xsDataResultStatusExpScreening = xsDataResultISPyBExpected.getScreeningStatus()
        xsDataResultStatusExpScreeningInputs = xsDataResultISPyBExpected.getScreeningInputStatus()
        xsDataResultStatusExpScreeningOutputs = xsDataResultISPyBExpected.getScreeningOutputStatus()
        xsDataResultStatusExpScreeningOutputLattices = xsDataResultISPyBExpected.getScreeningOutputLatticeStatus()
        xsDataResultStatusExpScreeningStrategies = xsDataResultISPyBExpected.getScreeningStrategyStatus()
        xsDataResultStatusExpScreeningStrategyWedges = xsDataResultISPyBExpected.getScreeningStrategyWedgeStatus()
        xsDataResultStatusExpScreeningStrategySubWedges = xsDataResultISPyBExpected.getScreeningStrategySubWedgeStatus()
        xsDataResultStatusExpScreeningRanks = xsDataResultISPyBExpected.getScreeningRankStatus()
        xsDataResultStatusExpScreeningRankSet = xsDataResultISPyBExpected.getScreeningRankSetStatus()

        xsDataIntegerDataCollectionId = xsDataResultISPyBObtained.getDataCollectionId()
        xsDataResultStatusScreening = xsDataResultISPyBObtained.getScreeningStatus()
        xsDataResultStatusScreeningInputs = xsDataResultISPyBObtained.getScreeningInputStatus()
        xsDataResultStatusScreeningOutputs = xsDataResultISPyBObtained.getScreeningOutputStatus()
        xsDataResultStatusScreeningOutputLattices = xsDataResultISPyBObtained.getScreeningOutputLatticeStatus()
        xsDataResultStatusScreeningStrategies = xsDataResultISPyBObtained.getScreeningStrategyStatus()
        xsDataResultStatusScreeningStrategyWedges = xsDataResultISPyBObtained.getScreeningStrategyWedgeStatus()
        xsDataResultStatusScreeningStrategySubWedges = xsDataResultISPyBObtained.getScreeningStrategySubWedgeStatus()
        xsDataResultStatusScreeningRanks = xsDataResultISPyBObtained.getScreeningRankStatus()
        xsDataResultStatusScreeningRankSet = xsDataResultISPyBObtained.getScreeningRankSetStatus()

        if xsDataIntegerExpDataCollectionId != None:
            self.DEBUG("Checking dataCollectionId ...")
            EDAssert.equal(xsDataIntegerDataCollectionId.getValue(), xsDataIntegerExpDataCollectionId.getValue())
        if xsDataResultStatusExpScreening != None:
            self.DEBUG("Checking screening ...")
            EDAssert.equal(xsDataResultStatusScreening.getCode().getValue(), "ok")
            iId = xsDataResultStatusScreening.getId().getValue()
            EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningInputs != None:
            self.DEBUG("Checking inputs...")
            for xsDataResultStatusScreeningInput in xsDataResultStatusScreeningInputs:
                EDAssert.equal(xsDataResultStatusScreeningInput.getCode().getValue(), "ok")
                iId = xsDataResultStatusScreeningInput.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningOutputs != None:
            self.DEBUG("Checking outputs ...")
            for xsDataResultStatusScreeningOutput in xsDataResultStatusScreeningOutputs:
                EDAssert.equal(xsDataResultStatusScreeningOutput.getCode().getValue(), "ok")
                iId = xsDataResultStatusScreeningOutput.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningOutputLattices != None:
            self.DEBUG("Checking output lattices...")
            for xsDataResultStatusScreeningOutputLattice in xsDataResultStatusScreeningOutputLattices:
                EDAssert.equal(xsDataResultStatusScreeningOutputLattice.getCode().getValue(), "ok")
                iId = xsDataResultStatusScreeningOutputLattice.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningStrategies != None:
            self.DEBUG("Checking strategies...")
            for xsDataResultStatusScreeningStrategy in xsDataResultStatusScreeningStrategies:
                EDAssert.equal(xsDataResultStatusScreeningStrategy.getCode().getValue(), "ok")
                iId = xsDataResultStatusScreeningStrategy.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningStrategyWedges != None:
            self.DEBUG("Checking strategy wedges...")
            for xsDataResultStatusScreeningStrategyWedge in xsDataResultStatusScreeningStrategyWedges:
                EDAssert.equal(xsDataResultStatusScreeningStrategyWedge.getCode().getValue(), "ok")
                iId = xsDataResultStatusScreeningStrategyWedge.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningStrategySubWedges != None:
            self.DEBUG("Checking strategy subwedges...")
            for xsDataResultStatusScreeningStrategySubWedge in xsDataResultStatusScreeningStrategySubWedges:
                EDAssert.equal(xsDataResultStatusScreeningStrategySubWedge.getCode().getValue(), "ok")
                iId = xsDataResultStatusScreeningStrategySubWedge.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusExpScreeningRanks != None:
            self.DEBUG("Checking ranks...")
            for xsDataResultStatusScreeningRank in xsDataResultStatusScreeningRanks:
                EDAssert.equal(xsDataResultStatusScreeningRank.getCode().getValue(), "ok")
                iId = xsDataResultStatusScreeningRank.getId().getValue()
                EDAssert.equal((iId >= 0), True)
        if xsDataResultStatusScreeningRankSet != None:
            self.DEBUG("Checking rank sets...")
            EDAssert.equal(xsDataResultStatusScreeningRankSet.getCode().getValue(), "ok")
            iId = xsDataResultStatusScreeningRankSet.getId().getValue()
            EDAssert.equal((iId >= 0), True)
예제 #5
0
class EDPluginISPyBv1_2(EDPluginExec):
    """
    Plugin to store results in an ISPyB database using the DNA/ISPyB dbserver 
    """
    def __init__(self):
        """
        Sets default values for dbserver parameters 
        """
        EDPluginExec.__init__(self)
        self.setXSDataInputClass(XSDataISPyBScreening, "screening")  # [0, 1]
        self.setXSDataInputClass(XSDataISPyBScreeningInput,
                                 "screeningInput")  # [0, infinite]
        self.setXSDataInputClass(XSDataISPyBScreeningOutputContainer,
                                 "screeningOutputContainer")  # [0, infinite]
        self.setXSDataInputClass(XSDataISPyBScreeningRank,
                                 "screeningRank")  # [0, infinite]
        self.setXSDataInputClass(XSDataISPyBScreeningRankSet,
                                 "screeningRankSet")  # [0, 1]
        self.setXSDataInputClass(XSDataISPyBScreeningFile,
                                 "screeningFile")  # [0, infinite]
        self.setXSDataInputClass(XSDataISPyBImage, "image")  # [0, 1]

        self.__strDbserverHost = "localhost"
        self.__iDbserverPort = 9090

    def getDbserverHost(self):
        return self.__strDbserverHost

    def setDbserverHost(self, _strDbserverHost):
        self.__strDbserverHost = _strDbserverHost

    def getDbserverPort(self):
        return self.__iDbserverPort

    def setDbserverPort(self, _iDbserverPort):
        self.__iDbserverPort = _iDbserverPort

    def configure(self):
        """
        Gets the dbserver parameters from the config file and stores them in class member attributes.
        """
        EDPluginExec.configure(self)
        pluginConfiguration = self.getConfiguration()

        if (pluginConfiguration == None):
            self.DEBUG(
                "*** EDPluginISPyBv1_2.configure: pluginConfiguration is None, using default settings"
            )
        else:
            self.DEBUG(
                "*** EDPluginISPyBv1_2.configure: pluginConfiguration found, using settings from there"
            )
            strDbserverHost = EDConfiguration.getStringParamValue(
                pluginConfiguration, "dbserverHost")
            if (strDbserverHost == None):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2.configure", self.getClassName(), \
                                                                     "Configuration parameter missing: dbserverHost")
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage
            else:
                self.setDbserverHost(strDbserverHost)

            strDbserverPort = EDConfiguration.getStringParamValue(
                pluginConfiguration, "dbserverPort")
            if (strDbserverPort == None):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2.configure", self.getClassName(), \
                                                                     "Configuration parameter missing: dbserverPort")
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage
            else:
                self.setDbserverPort(int(strDbserverPort))

    def process(self, _edObject=None):
        """
        Sends store requests with the screening objects to the dbserver. Returns success or failure.
        
        Note that:
        * Any objects referred to by the object returned by self.getDataInput("inputISPyB")[0] will be stored. 
        * Primary key attributes should not be set.
        * If a foreign key attribute is not set, this method will attempt to find the foreign object among the 
        input objects, and then use the primary key attribute of this object when it has been stored. If such 
        an object is not found, the method fails.
        * If an error is encountered, the method will immediately fail and will not attempt to store any more 
        objects. 
        """

        EDPluginExec.process(self)
        self.DEBUG("*** EDPluginISPyBv1_2.process")

        # Basic sanity check of inputs:
        if (self.hasDataInput("screening")):
            if (len(self.getDataInput("screening")) > 1):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % (
                    "EDPluginISPyBv1_2", "process",
                    "There should only be one input 'screening'.")
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

        if (self.hasDataInput("screeningRankSet")):
            if (len(self.getDataInput("screeningRankSet")) > 1):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % (
                    "EDPluginISPyBv1_2", "process",
                    "There should only be one input 'screeningRankSet'.")
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

        # Get the inputs
        xsDataISPyBScreenings = None
        xsDataISPyBScreeningInputs = None
        xsDataISPyBScreeningOutputContainers = None
        xsDataISPyBScreeningRanks = None
        xsDataISPyBScreeningRankSets = None
        xsDataISPyBImages = None
        xsDataISPyBScreeningFiles = None

        if self.hasDataInput("screening"):
            xsDataISPyBScreenings = self.getDataInput("screening")
        if self.hasDataInput("screeningInput"):
            xsDataISPyBScreeningInputs = self.getDataInput("screeningInput")
        if self.hasDataInput("screeningOutputContainer"):
            xsDataISPyBScreeningOutputContainers = self.getDataInput(
                "screeningOutputContainer")
        if self.hasDataInput("screeningRank"):
            xsDataISPyBScreeningRanks = self.getDataInput("screeningRank")
        if self.hasDataInput("screeningRankSet"):
            xsDataISPyBScreeningRankSets = self.getDataInput(
                "screeningRankSet")
        if self.hasDataInput("image"):
            xsDataISPyBImages = self.getDataInput("image")
        if self.hasDataInput("screeningFile"):
            xsDataISPyBScreeningFiles = self.getDataInput("screeningFile")

        self.__xsDataResultISPyB = XSDataResultISPyB()

        if (xsDataISPyBScreenings is None):
            xsDataISPyBScreening = XSDataISPyBScreening()
        else:
            xsDataISPyBScreening = xsDataISPyBScreenings[0]

        if (xsDataISPyBImages is None):
            xsDataISPyBImage = None
        else:
            xsDataISPyBImage = xsDataISPyBImages[0]

        # Another sanity check:
        if xsDataISPyBScreening.getDataCollectionId() == None:
            if ((xsDataISPyBImage == None)
                    or (xsDataISPyBImage.getFileName() == None)
                    or (xsDataISPyBImage.getFileLocation() == None)):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", \
                                                                     "Neither a dataCollectionId nor an image filename + path are provided.")
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                return

            strXML = EDUtilsXML.dnaMarshal(xsDataISPyBImage)

            # Send the XML to request the dataCollectionId from the dbserver:
            strResponse = self.httpPost(self.getDbserverHost(),
                                        self.getDbserverPort(),
                                        "/get_datacollectionid", strXML)

            if strResponse != None:
                # Handle response:
                xsDatadbstatus = XSDatadbstatus.parseString(strResponse)
                strCode = xsDatadbstatus.getCode()
                strMessage = xsDatadbstatus.getMessage()
                self.DEBUG("dbserver returns code: " + strCode)
                self.DEBUG("dbserver returns message: " + strMessage)

                if (strCode
                        == "error") or (xsDatadbstatus.getDataCollectionId()
                                        == -1):
                    if xsDatadbstatus.getDataCollectionId() == -1:
                        strMessage = "An image corresponding to the given fileName and fileLocation was not found."
                    strErrorMessage = EDMessage.ERROR_EXECUTION_03 % (
                        "EDPluginISPyBv1_2", "process", strMessage)
                    self.error(strErrorMessage)
                    self.addErrorMessage(strErrorMessage)
                    return

                if xsDatadbstatus.getDataCollectionId() != -1:
                    xsDataISPyBScreening.setDataCollectionId(
                        XSDataInteger(xsDatadbstatus.getDataCollectionId()))
                    self.__xsDataResultISPyB.setDataCollectionId(
                        XSDataInteger(xsDatadbstatus.getDataCollectionId()))

        if (xsDataISPyBScreeningRankSets is None):
            xsDataISPyBScreeningRankSet = None
        else:
            xsDataISPyBScreeningRankSet = xsDataISPyBScreeningRankSets[0]

        # Store all the different screening* objects:
        xsDataIntegerScreeningId = self.store(xsDataISPyBScreening)

        if xsDataISPyBScreeningInputs != None:
            for xsDataISPyBScreeningInput in xsDataISPyBScreeningInputs:
                xsDataISPyBScreeningInput.setScreeningId(
                    xsDataIntegerScreeningId)
                self.store(xsDataISPyBScreeningInput)

        if xsDataISPyBScreeningRankSet != None:
            xsDataIntegerScreeningRankSetId = self.store(
                xsDataISPyBScreeningRankSet)

            for xsDataISPyBScreeningRank in xsDataISPyBScreeningRanks:
                xsDataISPyBScreeningRank.setScreeningId(
                    xsDataIntegerScreeningId)
                xsDataISPyBScreeningRank.setScreeningRankSetId(
                    xsDataIntegerScreeningRankSetId)
                self.store(xsDataISPyBScreeningRank)

        if xsDataISPyBScreeningOutputContainers != None:
            for xsDataISPyBScreeningOutputContainer in xsDataISPyBScreeningOutputContainers:
                xsDataISPyBScreeningOutput = xsDataISPyBScreeningOutputContainer.getScreeningOutput(
                )
                xsDataISPyBScreeningOutput.setScreeningId(
                    xsDataIntegerScreeningId)
                xsDataIntegerScreeningOutputId = self.store(
                    xsDataISPyBScreeningOutput)

            xsDataISPyBScreeningOutputLattices = xsDataISPyBScreeningOutputContainer.getScreeningOutputLattice(
            )
            if xsDataISPyBScreeningOutputLattices != None:
                for xsDataISPyBScreeningOutputLattice in xsDataISPyBScreeningOutputLattices:
                    xsDataISPyBScreeningOutputLattice.setScreeningOutputId(
                        xsDataIntegerScreeningOutputId)
                    self.store(xsDataISPyBScreeningOutputLattice)

            xsDataISPyBScreeningStrategyContainers = xsDataISPyBScreeningOutputContainer.getScreeningStrategyContainer(
            )
            if xsDataISPyBScreeningStrategyContainers != None:
                for xsDataISPyBScreeningStrategyContainer in xsDataISPyBScreeningStrategyContainers:
                    xsDataISPyBScreeningStrategy = xsDataISPyBScreeningStrategyContainer.getScreeningStrategy(
                    )
                    if xsDataISPyBScreeningStrategy != None:
                        xsDataISPyBScreeningStrategy.setScreeningOutputId(
                            xsDataIntegerScreeningOutputId)
                        xsDataIntegerScreeningStrategyId = self.store(
                            xsDataISPyBScreeningStrategy)

                        xsDataISPyBScreeningStrategyWedgeContainers = xsDataISPyBScreeningStrategyContainer.getScreeningStrategyWedgeContainer(
                        )
                        if xsDataISPyBScreeningStrategyWedgeContainers != None:
                            for xsDataISPyBScreeningStrategyWedgeContainer in xsDataISPyBScreeningStrategyWedgeContainers:
                                xsDataISPyBScreeningStrategyWedge = xsDataISPyBScreeningStrategyWedgeContainer.getScreeningStrategyWedge(
                                )
                                xsDataISPyBScreeningStrategyWedge.setScreeningStrategyId(
                                    xsDataIntegerScreeningStrategyId)
                                xsDataIntegerScreeningStrategyWedgeId = self.store(
                                    xsDataISPyBScreeningStrategyWedge)

                                xsDataISPyBScreeningStrategySubWedges = xsDataISPyBScreeningStrategyWedgeContainer.getScreeningStrategySubWedge(
                                )
                                if xsDataISPyBScreeningStrategySubWedges != None:
                                    for xsDataISPyBScreeningStrategySubWedge in xsDataISPyBScreeningStrategySubWedges:
                                        xsDataISPyBScreeningStrategySubWedge.setScreeningStrategyWedgeId(
                                            xsDataIntegerScreeningStrategyWedgeId
                                        )
                                        self.store(
                                            xsDataISPyBScreeningStrategySubWedge
                                        )

    def postProcess(self, _edObject=None):
        """
        """
        EDPluginExec.postProcess(self)
        self.DEBUG("*** EDPluginISPyBv1_2.postProcess")
        if (self.__xsDataResultISPyB is not None):
            self.setDataOutput(self.__xsDataResultISPyB)

    def httpPost(self, _strHost, _iPort, _strPath, _strXML):
        """
        Sends XML to the dbserver on the specified host and port with the specified path.
        Returns the response XML from the dbserver.
        @param _strHost: the host name for the dbserver
        @type  _strHost: string
        @param _iPort: the port for the dbserver
        @type  _iPort: integer
        @param _strPath: the path name for the request
        @type  _strPath: string
        @param _strXML: the XML for the request
        @type  _strXML: string
        """
        strData = None
        try:
            pyHTTPConnection = httplib.HTTPConnection(_strHost, _iPort)
            pyHTTPConnection.putrequest("POST", _strPath)
            pyHTTPConnection.putheader("Content-type", "text/xml")
            pyHTTPConnection.putheader("Content-length", "%d" % len(_strXML))
            pyHTTPConnection.putheader('Accept', 'text/plain')
            if "HOSTNAME" in os.environ.keys():
                pyHTTPConnection.putheader('Host', os.environ["HOSTNAME"])
            pyHTTPConnection.endheaders()
            pyHTTPConnection.send(_strXML)
            pyHTTPResponse = pyHTTPConnection.getresponse()
            strMsg = pyHTTPResponse.msg
            strHeaders = pyHTTPResponse.getheaders()
            strReply = str(
                pyHTTPResponse.status) + ' - ' + pyHTTPResponse.reason

            strContentLength = pyHTTPResponse.getheader("Content-Length")
            if strContentLength is None:
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "httpPost", \
                                                           "No header returned for %s, host %s, port %d. HTTP resonse was: %s" \
                                                           % (_strPath, _strHost, _iPort, strReply))
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage
            try:
                ilength = string.atoi(strContentLength)
            except:
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "httpPost", \
                                                           "Cannot convert Content-Length %s to integer for %s, host %s, port %d!" \
                                                           % (strContentLength, _strPath, _strHost, _iPort))
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

            strData = pyHTTPResponse.read()
        except (socket.error, httplib.BadStatusLine), (msg):
            strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "httpPost", \
                                                                 "Have you set up a connection to the dbserver? Error is: %s" % (msg))
            self.error(strErrorMessage)
            self.addErrorMessage(strErrorMessage)
            self.setFailure()
            raise RuntimeError, strErrorMessage

        return strData
예제 #6
0
    def process(self, _edObject=None):
        """
        Sends store requests with the screening objects to the dbserver. Returns success or failure.
        
        Note that:
        * Any objects referred to by the object returned by self.getDataInput("inputISPyB")[0] will be stored. 
        * Primary key attributes should not be set.
        * If a foreign key attribute is not set, this method will attempt to find the foreign object among the 
        input objects, and then use the primary key attribute of this object when it has been stored. If such 
        an object is not found, the method fails.
        * If an error is encountered, the method will immediately fail and will not attempt to store any more 
        objects. 
        """

        EDPluginExec.process(self)
        self.DEBUG("*** EDPluginISPyBv1_2.process")

        # Basic sanity check of inputs:
        if (self.hasDataInput("screening")):
            if (len(self.getDataInput("screening")) > 1):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % (
                    "EDPluginISPyBv1_2", "process",
                    "There should only be one input 'screening'.")
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

        if (self.hasDataInput("screeningRankSet")):
            if (len(self.getDataInput("screeningRankSet")) > 1):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % (
                    "EDPluginISPyBv1_2", "process",
                    "There should only be one input 'screeningRankSet'.")
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                raise RuntimeError, strErrorMessage

        # Get the inputs
        xsDataISPyBScreenings = None
        xsDataISPyBScreeningInputs = None
        xsDataISPyBScreeningOutputContainers = None
        xsDataISPyBScreeningRanks = None
        xsDataISPyBScreeningRankSets = None
        xsDataISPyBImages = None
        xsDataISPyBScreeningFiles = None

        if self.hasDataInput("screening"):
            xsDataISPyBScreenings = self.getDataInput("screening")
        if self.hasDataInput("screeningInput"):
            xsDataISPyBScreeningInputs = self.getDataInput("screeningInput")
        if self.hasDataInput("screeningOutputContainer"):
            xsDataISPyBScreeningOutputContainers = self.getDataInput(
                "screeningOutputContainer")
        if self.hasDataInput("screeningRank"):
            xsDataISPyBScreeningRanks = self.getDataInput("screeningRank")
        if self.hasDataInput("screeningRankSet"):
            xsDataISPyBScreeningRankSets = self.getDataInput(
                "screeningRankSet")
        if self.hasDataInput("image"):
            xsDataISPyBImages = self.getDataInput("image")
        if self.hasDataInput("screeningFile"):
            xsDataISPyBScreeningFiles = self.getDataInput("screeningFile")

        self.__xsDataResultISPyB = XSDataResultISPyB()

        if (xsDataISPyBScreenings is None):
            xsDataISPyBScreening = XSDataISPyBScreening()
        else:
            xsDataISPyBScreening = xsDataISPyBScreenings[0]

        if (xsDataISPyBImages is None):
            xsDataISPyBImage = None
        else:
            xsDataISPyBImage = xsDataISPyBImages[0]

        # Another sanity check:
        if xsDataISPyBScreening.getDataCollectionId() == None:
            if ((xsDataISPyBImage == None)
                    or (xsDataISPyBImage.getFileName() == None)
                    or (xsDataISPyBImage.getFileLocation() == None)):
                strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ("EDPluginISPyBv1_2", "process", \
                                                                     "Neither a dataCollectionId nor an image filename + path are provided.")
                self.error(strErrorMessage)
                self.addErrorMessage(strErrorMessage)
                return

            strXML = EDUtilsXML.dnaMarshal(xsDataISPyBImage)

            # Send the XML to request the dataCollectionId from the dbserver:
            strResponse = self.httpPost(self.getDbserverHost(),
                                        self.getDbserverPort(),
                                        "/get_datacollectionid", strXML)

            if strResponse != None:
                # Handle response:
                xsDatadbstatus = XSDatadbstatus.parseString(strResponse)
                strCode = xsDatadbstatus.getCode()
                strMessage = xsDatadbstatus.getMessage()
                self.DEBUG("dbserver returns code: " + strCode)
                self.DEBUG("dbserver returns message: " + strMessage)

                if (strCode
                        == "error") or (xsDatadbstatus.getDataCollectionId()
                                        == -1):
                    if xsDatadbstatus.getDataCollectionId() == -1:
                        strMessage = "An image corresponding to the given fileName and fileLocation was not found."
                    strErrorMessage = EDMessage.ERROR_EXECUTION_03 % (
                        "EDPluginISPyBv1_2", "process", strMessage)
                    self.error(strErrorMessage)
                    self.addErrorMessage(strErrorMessage)
                    return

                if xsDatadbstatus.getDataCollectionId() != -1:
                    xsDataISPyBScreening.setDataCollectionId(
                        XSDataInteger(xsDatadbstatus.getDataCollectionId()))
                    self.__xsDataResultISPyB.setDataCollectionId(
                        XSDataInteger(xsDatadbstatus.getDataCollectionId()))

        if (xsDataISPyBScreeningRankSets is None):
            xsDataISPyBScreeningRankSet = None
        else:
            xsDataISPyBScreeningRankSet = xsDataISPyBScreeningRankSets[0]

        # Store all the different screening* objects:
        xsDataIntegerScreeningId = self.store(xsDataISPyBScreening)

        if xsDataISPyBScreeningInputs != None:
            for xsDataISPyBScreeningInput in xsDataISPyBScreeningInputs:
                xsDataISPyBScreeningInput.setScreeningId(
                    xsDataIntegerScreeningId)
                self.store(xsDataISPyBScreeningInput)

        if xsDataISPyBScreeningRankSet != None:
            xsDataIntegerScreeningRankSetId = self.store(
                xsDataISPyBScreeningRankSet)

            for xsDataISPyBScreeningRank in xsDataISPyBScreeningRanks:
                xsDataISPyBScreeningRank.setScreeningId(
                    xsDataIntegerScreeningId)
                xsDataISPyBScreeningRank.setScreeningRankSetId(
                    xsDataIntegerScreeningRankSetId)
                self.store(xsDataISPyBScreeningRank)

        if xsDataISPyBScreeningOutputContainers != None:
            for xsDataISPyBScreeningOutputContainer in xsDataISPyBScreeningOutputContainers:
                xsDataISPyBScreeningOutput = xsDataISPyBScreeningOutputContainer.getScreeningOutput(
                )
                xsDataISPyBScreeningOutput.setScreeningId(
                    xsDataIntegerScreeningId)
                xsDataIntegerScreeningOutputId = self.store(
                    xsDataISPyBScreeningOutput)

            xsDataISPyBScreeningOutputLattices = xsDataISPyBScreeningOutputContainer.getScreeningOutputLattice(
            )
            if xsDataISPyBScreeningOutputLattices != None:
                for xsDataISPyBScreeningOutputLattice in xsDataISPyBScreeningOutputLattices:
                    xsDataISPyBScreeningOutputLattice.setScreeningOutputId(
                        xsDataIntegerScreeningOutputId)
                    self.store(xsDataISPyBScreeningOutputLattice)

            xsDataISPyBScreeningStrategyContainers = xsDataISPyBScreeningOutputContainer.getScreeningStrategyContainer(
            )
            if xsDataISPyBScreeningStrategyContainers != None:
                for xsDataISPyBScreeningStrategyContainer in xsDataISPyBScreeningStrategyContainers:
                    xsDataISPyBScreeningStrategy = xsDataISPyBScreeningStrategyContainer.getScreeningStrategy(
                    )
                    if xsDataISPyBScreeningStrategy != None:
                        xsDataISPyBScreeningStrategy.setScreeningOutputId(
                            xsDataIntegerScreeningOutputId)
                        xsDataIntegerScreeningStrategyId = self.store(
                            xsDataISPyBScreeningStrategy)

                        xsDataISPyBScreeningStrategyWedgeContainers = xsDataISPyBScreeningStrategyContainer.getScreeningStrategyWedgeContainer(
                        )
                        if xsDataISPyBScreeningStrategyWedgeContainers != None:
                            for xsDataISPyBScreeningStrategyWedgeContainer in xsDataISPyBScreeningStrategyWedgeContainers:
                                xsDataISPyBScreeningStrategyWedge = xsDataISPyBScreeningStrategyWedgeContainer.getScreeningStrategyWedge(
                                )
                                xsDataISPyBScreeningStrategyWedge.setScreeningStrategyId(
                                    xsDataIntegerScreeningStrategyId)
                                xsDataIntegerScreeningStrategyWedgeId = self.store(
                                    xsDataISPyBScreeningStrategyWedge)

                                xsDataISPyBScreeningStrategySubWedges = xsDataISPyBScreeningStrategyWedgeContainer.getScreeningStrategySubWedge(
                                )
                                if xsDataISPyBScreeningStrategySubWedges != None:
                                    for xsDataISPyBScreeningStrategySubWedge in xsDataISPyBScreeningStrategySubWedges:
                                        xsDataISPyBScreeningStrategySubWedge.setScreeningStrategyWedgeId(
                                            xsDataIntegerScreeningStrategyWedgeId
                                        )
                                        self.store(
                                            xsDataISPyBScreeningStrategySubWedge
                                        )