internal static XmlNode ProcessContextSwitchNode(SageContext context, XmlNode switchNode)
{
if (switchNode.SelectSingleElement("ancestor::sage:literal", XmlNamespaces.Manager) != null)
return switchNode;
XmlElement switchElem = (XmlElement) switchNode;
string propName = switchElem.GetAttribute("property");
string key = switchElem.GetAttribute("key");
if (string.IsNullOrEmpty(propName))
{
log.ErrorFormat("The switch node in document '{0}' is missing the required property attribute",
switchNode.OwnerDocument.BaseURI);
return switchNode;
}
string propValue = SageContext.GetContextProperty(context, propName, key);
int caseNum = 0;
bool caseFound = false;
XmlDocumentFragment result = switchNode.OwnerDocument.CreateDocumentFragment();
foreach (XmlElement caseNode in switchNode.SelectNodes("context:case", XmlNamespaces.Manager))
{
string testValue = caseNode.GetAttribute("test");
if (string.IsNullOrEmpty(testValue))
{
log.WarnFormat(
"The case node with index {0} of switch node '{1}' in document '{2}' didn't specify a test condition.",
caseNum, propName, switchNode.OwnerDocument.BaseURI);
continue;
}
if (testValue.Equals(propValue, StringComparison.InvariantCultureIgnoreCase))
{
foreach (XmlNode node in caseNode.SelectNodes("node()"))
result.AppendChild(context.ProcessNode(node));
caseFound = true;
break;
}
caseNum += 1;
}
if (!caseFound)
{
XmlNode defaultNode = switchNode.SelectSingleNode("context:default", XmlNamespaces.Manager);
if (defaultNode != null)
{
foreach (XmlNode node in defaultNode.SelectNodes("node()"))
result.AppendChild(context.ProcessNode(node));
}
}
return result;
}