The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.XsltOld \ TemplateComparer

  1. //------------------------------------------------------------------------------
  2. // <copyright file="TemplateManager.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Xml.Xsl.XsltOld
  16. {
  17.     using Res = System.Xml.Utils.Res;
  18.     using System;
  19.     using System.Diagnostics;
  20.     using System.Xml;
  21.     using System.Xml.XPath;
  22.     using System.Collections;
  23.    
  24.     internal class TemplateManager
  25.     {
  26.         private XmlQualifiedName mode;
  27.         internal ArrayList templates;
  28.         private Stylesheet stylesheet;
  29.         // Owning stylesheet
  30.         private class TemplateComparer : IComparer
  31.         {
  32.             public int Compare(object x, object y)
  33.             {
  34.                 Debug.Assert(x != null && x is TemplateAction);
  35.                 Debug.Assert(y != null && y is TemplateAction);
  36.                
  37.                 TemplateAction tx = (TemplateAction)x;
  38.                 TemplateAction ty = (TemplateAction)y;
  39.                
  40.                 Debug.Assert(!Double.IsNaN(tx.Priority));
  41.                 Debug.Assert(!Double.IsNaN(ty.Priority));
  42.                
  43.                 if (tx.Priority == ty.Priority) {
  44.                     Debug.Assert(tx.TemplateId != ty.TemplateId || tx == ty);
  45.                     return tx.TemplateId - ty.TemplateId;
  46.                 }
  47.                 else {
  48.                     return tx.Priority > ty.Priority ? 1 : -1;
  49.                 }
  50.             }
  51.         }
  52.        
  53.         private static TemplateComparer s_TemplateComparer = new TemplateComparer();
  54.        
  55.         internal XmlQualifiedName Mode {
  56.             get { return this.mode; }
  57.         }
  58.        
  59.         internal TemplateManager(Stylesheet stylesheet, XmlQualifiedName mode)
  60.         {
  61.             this.mode = mode;
  62.             this.stylesheet = stylesheet;
  63.         }
  64.        
  65.         internal void AddTemplate(TemplateAction template)
  66.         {
  67.             Debug.Assert(template != null);
  68.             Debug.Assert(((object)this.mode == (object)template.Mode) || (template.Mode == null && this.mode.Equals(XmlQualifiedName.Empty)) || this.mode.Equals(template.Mode));
  69.            
  70.             if (this.templates == null) {
  71.                 this.templates = new ArrayList();
  72.             }
  73.            
  74.             this.templates.Add(template);
  75.         }
  76.        
  77.         internal void ProcessTemplates()
  78.         {
  79.             if (this.templates != null) {
  80.                 this.templates.Sort(s_TemplateComparer);
  81.             }
  82.         }
  83.        
  84.         internal TemplateAction FindTemplate(Processor processor, XPathNavigator navigator)
  85.         {
  86.             if (this.templates == null) {
  87.                 return null;
  88.             }
  89.            
  90.             Debug.Assert(this.templates != null);
  91.             for (int templateIndex = this.templates.Count - 1; templateIndex >= 0; templateIndex--) {
  92.                 TemplateAction action = (TemplateAction)this.templates[templateIndex];
  93.                 int matchKey = action.MatchKey;
  94.                
  95.                 if (matchKey != Compiler.InvalidQueryKey) {
  96.                     if (processor.Matches(navigator, matchKey)) {
  97.                         return action;
  98.                     }
  99.                 }
  100.             }
  101.            
  102.             return null;
  103.         }
  104.     }
  105. }

Developer Fusion