added merge_rspecs() method
authorTony Mack <tmack@cs.princeton.edu>
Tue, 27 Jul 2010 22:39:16 +0000 (22:39 +0000)
committerTony Mack <tmack@cs.princeton.edu>
Tue, 27 Jul 2010 22:39:16 +0000 (22:39 +0000)
sfa/util/rspec.py

index f891034..c56d382 100644 (file)
@@ -7,6 +7,38 @@ import os
 import httplib
 from xml.dom import minidom
 from types import StringTypes, ListType
+from lxml import etree
+from StringIO import StringIO
+
+def merge_rspecs(rspecs):
+    """
+    Merge merge a set of RSpecs into 1 RSpec, and return the result.
+    rspecs must be a valid RSpec string or list of rspec strings. 
+    """
+    if not rspecs or not isinstance(rspecs, list):
+        return rspecs
+    
+    rspec = None
+    for tmp_rspec in rspecs:
+        try:
+            tree = etree.parse(StringIO(tmp_rspec))
+        except etree.XMLSyntaxError:
+            # consider failing silently here
+            message = str(agg_rspec) + ": " + str(sys.exc_info()[1])
+            raise InvalidRSpec(message)
+
+        root = tree.getroot()
+        if root.get("type") in ["SFA"]:
+            if rspec == None:
+                rspec = root
+            else:
+                for network in root.iterfind("./network"):
+                    rspec.append(deepcopy(network))
+                for request in root.iterfind("./request"):
+                    rspec.append(deepcopy(request))    
+    return etree.tostring(rspec, xml_declaration=True, pretty_print=True)
+        
+
 
 class RSpec: