fix scrolling issues and display of xml tag
[sface.git] / sface / sfiprocess.py
index bf37de5..bef0902 100644 (file)
@@ -2,14 +2,10 @@
 import os
 import sys
 import time
-import re
 
 from PyQt4.QtCore import *
-from PyQt4.QtXml import QDomDocument
 from sface.config import config
-from sface.logwindow import LogIO
-from sface.rspecwindow import RSpecWindow, DomModel
-
+from sface.xmlrpcwindow import XmlrpcTracker
 
 def find_executable(exec_name):
     """find the given executable in $PATH"""
@@ -25,12 +21,15 @@ class SfiProcess(QObject):
     def __init__(self, parent=None):
         QObject.__init__(self, parent)
 
+        env = QProcess.systemEnvironment()
+        env << "PYTHONPATH=%s" % ":".join(sys.path)
         self.process = QProcess()
+        self.process.setEnvironment(env)
         self.connect(self.process, SIGNAL("finished(int, QProcess::ExitStatus)"),
                      self.processFinished)
         
-        self.xmltracker = XmlTracker()
-        # in case self.output is read by the XmlTracker before any
+        self.xmlrpctracker = XmlrpcTracker()
+        # in case self.output is read by the XmlrpcTracker before any
         # readyReadStandardOutput signal
         self.output = ''
 
@@ -55,16 +54,9 @@ class SfiProcess(QObject):
         return self.process.state() != QProcess.NotRunning
 
     def processStandardOutput(self):
-        # NOTE: The signal readyReadStandardOutput is emitted when
-        # the process has made new data available through its standard output channel.
-        # But the process is not necessarily finished.
-        # It's cool to have this method wo we print the stdOut live,
-        # but we must be carefull with self.output, used by xmlTracker too.
-        print "SETTING SELF.OUTPUT"
-        tmpOut = self.process.readAllStandardOutput()
+        output = self.process.readAllStandardOutput()
         if config.debug:
-            print tmpOut        
-        self.output += tmpOut
+            print output
 
     def processStandardError(self):
         print self.process.readAllStandardError()
@@ -108,25 +100,41 @@ class SfiProcess(QObject):
     def getRSpecFromSM(self):
         return self.__getRSpec(config.getSlicemgr())
 
-    def getRSpecFromAM(self):
-        return self.__getRSpec(config.getAggmgr())
+#    def getRSpecFromAM(self):
+#        return self.__getRSpec(config.getAggmgr())
 
-    def getRecord(self, hrn):
-        args = ["-u", config.getUser(), "-a", config.getAuthority(), 
+    def getRecord(self, hrn, filename=None):
+        args = ["-u", config.getUser(), "-a", config.getAuthority(),
                 "-r", config.getRegistry(), "-s", config.getSlicemgr(), "show", hrn]
+        if filename:
+            args.append("-o")
+            args.append(filename)
         self.__init_command(args)
         self.start()
 
     def applyRSpec(self, rspec):
         filename = config.getSliceRSpecFile() + "_new"
         rspec.save(filename)
-        args = ["-u", config.getUser(), "-a", config.getAuthority(), 
-                "-r", config.getRegistry(), "-s", config.getSlicemgr(), "create", 
+        args = ["-u", config.getUser(), "-a", config.getAuthority(),
+                "-r", config.getRegistry(), "-s", config.getSlicemgr(), "create",
                 config.getSlice(), filename]
         self.__init_command(args)
         self.start()
         return filename
 
+    def updateRecord(self, filename):
+        args = ["-u", config.getUser(), "-a", config.getAuthority(),
+                "-r", config.getRegistry(), "-s", config.getSlicemgr(), "update", filename]
+        self.__init_command(args)
+        self.start()
+
+    def renewSlivers(self, expiration):
+        args = ["-u", config.getUser(), "-a", config.getAuthority(),
+                "-r", config.getRegistry(), "-s", config.getSlicemgr(), "renew",
+                config.getSlice(), expiration]
+        self.__init_command(args)
+        self.start()
+
     def start(self):
         self.trace_command()
         self.process.start(self.exe, self.args)
@@ -139,75 +147,12 @@ class SfiProcess(QObject):
         if config.verbose:
             self._trace=time.time()
             command = "%s %s" % (self.exe, self.args.join(" "))
-            print time.strftime('%M:%S'),'Invoking',command
+            print time.strftime('%H:%M:%S'),'Invoking',command
 
     def trace_end (self):
         if config.verbose:
-            command = "%s %s" % (self.exe, self.args.join(" "))
-            print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-self._trace),command,'Done'
-            self.xmltracker.getAndPrint(self.output)
-
-class XmlTracker():
-    def __init__(self):
-        self.xmlrpcWindow = XmlrpcWindow()
-
-    def getAndPrint(self, rawOutput):
-        self.store(rawOutput)
-        self.extractXml()
-        self.xmlrpcWindow.setData(self.xml)
-        self.showXmlrpc()
-
-    def showXmlrpc(self):
-        self.xmlrpcWindow.show()
-        self.xmlrpcWindow.resize(500, 640)
-        self.xmlrpcWindow.raise_()
-        self.xmlrpcWindow.activateWindow()
-
-    def store(self, rawOutput):
-        self.rawOutput = rawOutput
-
-    def extractXml(self):
-        pttrnAsk = '<methodCall>.*?</methodCall>'
-        pttrnAns = '<methodResponse>.*?</methodResponse>'
-        answers = re.compile(pttrnAsk, re.DOTALL).findall(self.rawOutput)
-        replies = re.compile(pttrnAns, re.DOTALL).findall(self.rawOutput)
-        # cleaning
-        answers = map(lambda x: x.replace('\\n','\n'), answers)
-        replies = map(lambda x: x.replace('\\n','\n').replace("'\nbody: '", ''), replies)
-        replies.reverse() # so that I use pop() as popleft
-        # A well-formed XML document must have one, and only one, top-level element
-        self.xml = '<debug>'
-        for ans in answers:
-            self.xml += ans + replies.pop()
-        self.xml += '</debug>'
-
-    def stats(self):
-        # statistics: round-trip time, size of the com
-        pass
-
-    def prettyPrint(self, XmlComs):
-        # just for testing
-        print XmlComs
-
-class XmlrpcWindow(RSpecWindow):
-    def __init__(self, parent=None):
-        # super __init__() calls updateView,
-        # which assumes you have some data
-        self.data = '<debug/>'
-        RSpecWindow.__init__(self, parent)
-
-    def setData(self, XmlrpcCom):
-        self.data = XmlrpcCom
-
-    def updateView(self):
-        del self.document
-        del self.model
-        self.document = None
-        self.model = None
-
-        self.document = QDomDocument("RSpec")
-        self.document.setContent(self.data)
-        self.model = DomModel(self.document, self)
-
-        self.view.setModel(self.model)
-        self.view.expand(self.model.index(0, 0)) #expand first level only
+#            command = "%s %s" % (self.exe, self.args.join(" "))
+            print time.strftime('%H:%M:%S'),"Done [%.3f s]"%(time.time()-self._trace)
+        if config.debug:
+            self.xmlrpctracker.getAndPrint(self.output)
+