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

  1. //------------------------------------------------------------------------------
  2. // <copyright file="InputScopeManager.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.    
  23.     internal class InputScopeManager
  24.     {
  25.         private InputScope scopeStack;
  26.         private string defaultNS = string.Empty;
  27.         private XPathNavigator navigator;
  28.         // We need this nsvigator for document() function implementation
  29.         public InputScopeManager(XPathNavigator navigator, InputScope rootScope)
  30.         {
  31.             this.navigator = navigator;
  32.             this.scopeStack = rootScope;
  33.         }
  34.        
  35.         internal InputScope CurrentScope {
  36.             get { return this.scopeStack; }
  37.         }
  38.        
  39.         internal InputScope VariableScope {
  40.             get {
  41.                 Debug.Assert(this.scopeStack != null);
  42.                 Debug.Assert(this.scopeStack.Parent != null);
  43.                 return this.scopeStack.Parent;
  44.             }
  45.         }
  46.        
  47.         internal InputScopeManager Clone()
  48.         {
  49.             InputScopeManager manager = new InputScopeManager(this.navigator, null);
  50.             manager.scopeStack = this.scopeStack;
  51.             manager.defaultNS = this.defaultNS;
  52.             return manager;
  53.         }
  54.        
  55.         public XPathNavigator Navigator {
  56.             get { return this.navigator; }
  57.         }
  58.        
  59.         internal InputScope PushScope()
  60.         {
  61.             this.scopeStack = new InputScope(this.scopeStack);
  62.             return this.scopeStack;
  63.         }
  64.        
  65.         internal void PopScope()
  66.         {
  67.             Debug.Assert(this.scopeStack != null, "Push/Pop disbalance");
  68.             if (this.scopeStack == null) {
  69.                 return;
  70.             }
  71.            
  72.             for (NamespaceDecl scope = this.scopeStack.Scopes; scope != null; scope = scope.Next) {
  73.                 this.defaultNS = scope.PrevDefaultNsUri;
  74.             }
  75.            
  76.             this.scopeStack = this.scopeStack.Parent;
  77.         }
  78.        
  79.         internal void PushNamespace(string prefix, string nspace)
  80.         {
  81.             Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
  82.             Debug.Assert(prefix != null);
  83.             Debug.Assert(nspace != null);
  84.             this.scopeStack.AddNamespace(prefix, nspace, this.defaultNS);
  85.            
  86.             if (prefix == null || prefix.Length == 0) {
  87.                 this.defaultNS = nspace;
  88.             }
  89.         }
  90.        
  91.         // CompileContext
  92.        
  93.         public string DefaultNamespace {
  94.             get { return this.defaultNS; }
  95.         }
  96.        
  97.         private string ResolveNonEmptyPrefix(string prefix)
  98.         {
  99.             Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
  100.             Debug.Assert(prefix != null || prefix.Length != 0);
  101.             if (prefix == Keywords.s_Xml) {
  102.                 return Keywords.s_XmlNamespace;
  103.             }
  104.             else if (prefix == Keywords.s_Xmlns) {
  105.                 return Keywords.s_XmlnsNamespace;
  106.             }
  107.            
  108.             for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
  109.                 string nspace = inputScope.ResolveNonAtom(prefix);
  110.                 if (nspace != null) {
  111.                     return nspace;
  112.                 }
  113.             }
  114.             throw XsltException.Create(Res.Xslt_InvalidPrefix, prefix);
  115.         }
  116.        
  117.         public string ResolveXmlNamespace(string prefix)
  118.         {
  119.             Debug.Assert(prefix != null);
  120.             if (prefix.Length == 0) {
  121.                 return this.defaultNS;
  122.             }
  123.             return ResolveNonEmptyPrefix(prefix);
  124.         }
  125.        
  126.         public string ResolveXPathNamespace(string prefix)
  127.         {
  128.             Debug.Assert(prefix != null);
  129.             if (prefix.Length == 0) {
  130.                 return string.Empty;
  131.             }
  132.             return ResolveNonEmptyPrefix(prefix);
  133.         }
  134.        
  135.         internal void InsertExtensionNamespaces(string[] nsList)
  136.         {
  137.             Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
  138.             Debug.Assert(nsList != null);
  139.             for (int idx = 0; idx < nsList.Length; idx++) {
  140.                 this.scopeStack.InsertExtensionNamespace(nsList[idx]);
  141.             }
  142.         }
  143.        
  144.         internal bool IsExtensionNamespace(string nspace)
  145.         {
  146.             Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
  147.             for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
  148.                 if (inputScope.IsExtensionNamespace(nspace)) {
  149.                     return true;
  150.                 }
  151.             }
  152.             return false;
  153.         }
  154.        
  155.         internal void InsertExcludedNamespaces(string[] nsList)
  156.         {
  157.             Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
  158.             Debug.Assert(nsList != null);
  159.             for (int idx = 0; idx < nsList.Length; idx++) {
  160.                 this.scopeStack.InsertExcludedNamespace(nsList[idx]);
  161.             }
  162.         }
  163.        
  164.         internal bool IsExcludedNamespace(string nspace)
  165.         {
  166.             Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
  167.             for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
  168.                 if (inputScope.IsExcludedNamespace(nspace)) {
  169.                     return true;
  170.                 }
  171.             }
  172.             return false;
  173.         }
  174.     }
  175. }

Developer Fusion