From 22b32a6c92c0d780f9847d1e2787f8794b82826b Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Tue, 27 Jul 2010 22:39:16 +0000 Subject: [PATCH] added merge_rspecs() method --- sfa/util/rspec.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/sfa/util/rspec.py b/sfa/util/rspec.py index f8910342..c56d3820 100644 --- a/sfa/util/rspec.py +++ b/sfa/util/rspec.py @@ -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: -- 2.43.0