awips2/deltaScripts/16.2.1/DR5252/removeGFSPostProcessor.py
2022-05-05 12:34:50 -05:00

76 lines
2.5 KiB
Python

#!/awips2/python/bin/python
# AWIPS2 #5252
# Looks for configurations with GFSPostProcessor, and if found, removes that processor.
# If GFSPostProcessor is the only processor defined, the whole postProcessedModel is removed,
# with a comment stating so.
import xml.etree.ElementTree as ET
import sys
# http://effbot.org/zone/element-pi.htm
# Custom XMLTreeBuilder to preserve comments when parsing
class CommentParser(ET.XMLTreeBuilder):
def __init__(self):
ET.XMLTreeBuilder.__init__(self)
# assumes ElementTree 1.2.X
self._parser.CommentHandler = self.handle_comment
self._parser.ProcessingInstructionHandler = self.handle_pi
def close(self):
return ET.XMLTreeBuilder.close(self)
def handle_comment(self, data):
self._target.start(ET.Comment, {})
self._target.data(data)
self._target.end(ET.Comment)
def handle_pi(self, target, data):
self._target.start(ET.PI, {})
self._target.data(target + " " + data)
self._target.end(ET.PI)
def parse(source):
return ET.parse(source, CommentParser())
if len(sys.argv) != 3: # this script is sys.argv[0]
print "Error. Expected two file names as arguments. Received " + str(sys.argv[1:])
sys.exit(1)
tree = ET.parse(sys.argv[1], CommentParser())
if not tree:
print "Could not parse " + sys.argv[1]
sys.exit(1)
root = tree.getroot()
if root.tag != "postProcessedModels":
print "Root element is not postProcessedModels. Found " + root.tag
sys.exit(1)
i=0
for ppm in root:
# only care about postProcessedModel tags, but want the index to insert a
# comment when a whole block postProcessedModel block is removed.
if ppm.tag == "postProcessedModel":
prev = ppm
for pn in ppm:
#only care about processorName tags
if pn.tag == "processorName" and pn.text.find("GFSPostProcessor") >= 0:
ppm.remove(pn)
prev.tail = pn.tail
else:
prev = pn
if len(ppm.findall("processorName")) == 0:
# if this postProcessedModel doesn't have any configured processors, remove it.
root.remove(ppm)
modelName = ppm.findtext("modelName", default=" A postProcessedModel block").replace("--","- -").strip()
comment = ET.Comment(" " + modelName + " was removed because its only processor, GFSPostProcessor, is OBE. ")
comment.tail = ppm.tail
root.insert(i, comment)
i+=1
tree.write(sys.argv[2])