summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/BuildAssembler/BuildComponents/ComputeHashComponent.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Sandcastle/Source/BuildAssembler/BuildComponents/ComputeHashComponent.cs')
-rw-r--r--tools/Sandcastle/Source/BuildAssembler/BuildComponents/ComputeHashComponent.cs68
1 files changed, 68 insertions, 0 deletions
diff --git a/tools/Sandcastle/Source/BuildAssembler/BuildComponents/ComputeHashComponent.cs b/tools/Sandcastle/Source/BuildAssembler/BuildComponents/ComputeHashComponent.cs
new file mode 100644
index 0000000..37755ab
--- /dev/null
+++ b/tools/Sandcastle/Source/BuildAssembler/BuildComponents/ComputeHashComponent.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Security.Cryptography;
+using System.Text;
+using System.Xml;
+using System.Xml.XPath;
+
+
+namespace Microsoft.Ddue.Tools {
+
+ internal class HashComputation {
+
+ public HashComputation (string input, string output) {
+ Input = XPathExpression.Compile(input);
+ Output = XPathExpression.Compile(output);
+ }
+
+ public XPathExpression Input;
+ public XPathExpression Output;
+
+ }
+
+ public class ComputeHashComponent : BuildComponent {
+
+ public ComputeHashComponent (XPathNavigator configuration) : base(configuration) {
+
+ if (configuration == null) throw new ArgumentNullException("configuraton");
+
+ XPathNodeIterator hash_nodes = configuration.Select("hash");
+ foreach (XPathNavigator hash_node in hash_nodes) {
+ string input_xpath = hash_node.GetAttribute("input", String.Empty);
+ string output_xpath = hash_node.GetAttribute("output", String.Empty);
+ computations.Add( new HashComputation(input_xpath, output_xpath) );
+ }
+
+ }
+
+ // A list of the hash computations to do
+
+ private List<HashComputation> computations = new List<HashComputation>();
+
+ // Logic to compute a unique hash of a comment id string
+
+ private static Guid ComputeHash (string key) {
+ byte[] input = Encoding.UTF8.GetBytes(key);
+ byte[] output = md5.ComputeHash(input);
+ return( new Guid(output) );
+ }
+
+ private static HashAlgorithm md5 = new MD5CryptoServiceProvider();
+
+ // The actual action of the component
+
+ public override void Apply (XmlDocument document, string key) {
+
+ Guid id = ComputeHash(key);
+
+ foreach (HashComputation computation in computations) {
+ XPathNavigator output = document.CreateNavigator().SelectSingleNode(computation.Output);
+ if (output == null) continue;
+ output.SetValue(id.ToString());
+ }
+
+ }
+
+ }
+
+}