summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/BuildAssembler/BuildComponents/SwitchComponent.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Sandcastle/Source/BuildAssembler/BuildComponents/SwitchComponent.cs')
-rw-r--r--tools/Sandcastle/Source/BuildAssembler/BuildComponents/SwitchComponent.cs73
1 files changed, 73 insertions, 0 deletions
diff --git a/tools/Sandcastle/Source/BuildAssembler/BuildComponents/SwitchComponent.cs b/tools/Sandcastle/Source/BuildAssembler/BuildComponents/SwitchComponent.cs
new file mode 100644
index 0000000..47b1d6c
--- /dev/null
+++ b/tools/Sandcastle/Source/BuildAssembler/BuildComponents/SwitchComponent.cs
@@ -0,0 +1,73 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Diagnostics;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace Microsoft.Ddue.Tools {
+
+ public class SwitchComponent : BuildComponent {
+
+ public SwitchComponent(BuildAssembler assembler, XPathNavigator configuration) : base(assembler, configuration) {
+
+ // get the condition
+ XPathNavigator condition_element = configuration.SelectSingleNode("switch");
+ if (condition_element == null) {
+ throw new ConfigurationErrorsException("You must specifiy a condition using the <switch> statement with a 'value' attribute.");
+ }
+ string condition_value = condition_element.GetAttribute("value", String.Empty);
+ if (String.IsNullOrEmpty(condition_value)) {
+ throw new ConfigurationErrorsException("The switch statement must have a 'value' attribute, which is an xpath expression.");
+ }
+ condition = XPathExpression.Compile(condition_value);
+
+ // load the component stacks for each case
+ XPathNodeIterator case_elements = configuration.Select("case");
+ foreach (XPathNavigator case_element in case_elements) {
+ string case_value = case_element.GetAttribute("value", String.Empty);
+ BuildComponent[] components = BuildAssembler.LoadComponents(case_element);
+ cases.Add(case_value, components);
+ }
+ }
+
+ // data held by the component
+
+ private XPathExpression condition;
+
+ private Dictionary<string,IEnumerable<BuildComponent>> cases = new Dictionary<string,IEnumerable<BuildComponent>>();
+
+ // the action of the component
+
+ public override void Apply(XmlDocument document, string key) {
+
+ // evaluate the condition
+ string result = document.CreateNavigator().Evaluate(condition).ToString();
+
+ // get the corresponding component stack
+ IEnumerable<BuildComponent> components;
+ if (cases.TryGetValue(result, out components)) {
+ // apply it
+ foreach (BuildComponent component in components) {
+ component.Apply(document, key);
+ }
+ } else {
+ // no such case exists
+ }
+
+ }
+
+ public override void Dispose () {
+ foreach (IEnumerable<BuildComponent> components in cases.Values) {
+ foreach (BuildComponent component in components) {
+ component.Dispose();
+ }
+ }
+ base.Dispose();
+ }
+
+ }
+
+} \ No newline at end of file