Changeset 4522

Show
Ignore:
Timestamp:
12/31/07 05:54:24 (1 year ago)
Author:
xmlhacker
Message:

checkpoint checkin: extended the service operation processing to include XSLT 2.0 transformations. updated core XSLT files to require less start-up time

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/nuxleus/Source/Nuxleus.Command/Nuxleus.Command.csproj

    r4359 r4522  
    4343  <ItemGroup> 
    4444    <Compile Include="Agent.cs" /> 
     45    <Compile Include="ICommand.cs" /> 
    4546    <Compile Include="Program.cs" /> 
    4647    <Compile Include="Properties\AssemblyInfo.cs" /> 
  • trunk/nuxleus/Source/Nuxleus.Extension/Nuxleus.Extension.csproj

    r4359 r4522  
    4545    <Compile Include="Agent.cs" /> 
    4646    <Compile Include="Properties\AssemblyInfo.cs" /> 
     47    <Compile Include="StringUtils\Substring.cs" /> 
    4748  </ItemGroup> 
    4849  <ItemGroup> 
  • trunk/nuxleus/Source/Nuxleus.IO/Nuxleus.IO.csproj

    r4359 r4522  
    5151  <ItemGroup> 
    5252    <Compile Include="Agent.cs" /> 
     53    <Compile Include="AsyncResult\NuxleusAsyncResult.cs" /> 
    5354    <Compile Include="Clipboard\Cache.cs" /> 
    5455    <Compile Include="Clipboard\Clipboard.cs" /> 
  • trunk/nuxleus/Source/Nuxleus.Web/HttpApplication/Global.cs

    r4521 r4522  
    4747        BaseXsltContext m_baseXsltContext; 
    4848        String m_baseUri; 
     49        UTF8Encoding m_encoding; 
    4950        static HashAlgorithm m_hashAlgorithm = HashAlgorithm.MD5; 
    5051 
     
    7071            m_geoIPLookup = new Dictionary<String, IPLocation>(); 
    7172            m_requestXsltParams = null; 
     73            m_encoding = new UTF8Encoding(); 
    7274 
    7375            using(XmlReader configReader = XmlReader.Create(HttpContext.Current.Server.MapPath("~/App_Data/aws.config"))) 
     
    155157            Application["as_debug"] = m_DEBUG; 
    156158            Application["as_hashkey"] = hashkey; 
     159            Application["as_encoding"] = m_encoding; 
    157160        } 
    158161 
     
    169172            Application["debug"] = Application["as_debug"]; 
    170173            Application["hashkey"] = Application["as_hashkey"]; 
     174            Application["encoding"] = Application["as_encoding"]; 
    171175        } 
    172176 
  • trunk/nuxleus/Source/Nuxleus.Web/HttpHandler/NuxleusHttpAsyncFileNotFoundHandler.cs

    r4521 r4522  
    2424using Nuxleus.Cryptography; 
    2525using Nuxleus.Bucker; 
     26using Nuxleus.Async; 
    2627 
    2728namespace Nuxleus.Web.HttpHandler { 
     
    3839        Hashtable m_xsltParams; 
    3940        Hashtable m_namedXsltHashtable; 
    40         TransformServiceAsyncResult m_transformAsyncResult; 
     41        NuxleusAsyncResult m_transformAsyncResult; 
    4142        AsyncCallback m_callback; 
    4243        String m_httpMethod; 
     
    6970            m_namedXsltHashtable = (Hashtable)context.Application["namedXsltHashtable"]; 
    7071            m_transformContext = new Transform.Context(context, m_hashAlgorithm, (string)context.Application["hashkey"], fileInfo, (Hashtable)m_xsltParams.Clone(), fileInfo.LastWriteTimeUtc, fileInfo.Length); 
    71             m_transformAsyncResult = new TransformServiceAsyncResult(cb, extraData); 
     72            m_transformAsyncResult = new NuxleusAsyncResult(cb, extraData); 
    7273            m_callback = cb; 
    73             m_transformAsyncResult._context = context; 
     74            m_transformAsyncResult.m_context = context; 
    7475            m_builder = new StringBuilder(); 
    7576            m_CONTENT_IS_MEMCACHED = false; 
  • trunk/nuxleus/Source/Nuxleus.Web/HttpHandler/NuxleusHttpAsyncHandler.cs

    r4521 r4522  
    2424using Nuxleus.Cryptography; 
    2525using Nuxleus.Bucker; 
     26using Nuxleus.Async; 
    2627 
    2728namespace Nuxleus.Web.HttpHandler 
     
    3940        Hashtable m_xsltParams; 
    4041        Hashtable m_namedXsltHashtable; 
    41         TransformServiceAsyncResult m_transformAsyncResult; 
     42        NuxleusAsyncResult m_transformAsyncResult; 
    4243        AsyncCallback m_callback; 
    4344        String m_httpMethod; 
     
    7576            m_namedXsltHashtable = (Hashtable)context.Application["namedXsltHashtable"]; 
    7677            m_transformContext = new Transform.Context(context, m_hashAlgorithm, (string)context.Application["hashkey"], fileInfo, (Hashtable)m_xsltParams.Clone(), fileInfo.LastWriteTimeUtc, fileInfo.Length); 
    77             m_transformAsyncResult = new TransformServiceAsyncResult(cb, extraData); 
     78            m_transformAsyncResult = new NuxleusAsyncResult(cb, extraData); 
    7879            m_callback = cb; 
    79             m_transformAsyncResult._context = context; 
     80            m_transformAsyncResult.m_context = context; 
    8081            m_builder = new StringBuilder(); 
    8182            m_CONTENT_IS_MEMCACHED = false; 
  • trunk/nuxleus/Source/Nuxleus.Web/HttpHandler/NuxleusHttpAsyncXmlServiceOperationHandler.cs

    r4521 r4522  
    44 
    55using System; 
     6using System.Diagnostics; 
    67using System.IO; 
    78using System.Data; 
     
    1819using Saxon.Api; 
    1920using System.Xml; 
     21using Mvp.Xml; 
    2022using Nuxleus.Configuration; 
    2123using Nuxleus.Transform; 
     
    2527using Nuxleus.Bucker; 
    2628using Nuxleus.Async; 
     29using System.Globalization; 
    2730 
    2831namespace Nuxleus.Web.HttpHandler { 
     
    3134 
    3235        XmlServiceOperationManager m_xmlServiceOperationManager; 
     36        XsltTransformationManager m_xslTransformationManager; 
     37        Transform.Context m_transformContext; 
     38        Transform.Transform m_transform; 
     39        Hashtable m_xsltParams; 
     40        Hashtable m_namedXsltHashtable; 
     41        TransformServiceAsyncResult m_transformAsyncResult; 
    3342        MemcachedClient m_memcachedClient; 
    3443        QueueClient m_queueClient; 
     
    5261        string m_lastModifiedKey; 
    5362        string m_lastModifiedDate; 
     63        UTF8Encoding m_encoding; 
     64        Stopwatch m_stopwatch; 
    5465 
    5566        public void ProcessRequest (HttpContext context) { 
     
    7283            m_httpMethod = m_httpContext.Request.HttpMethod; 
    7384            m_memcachedClient = (Client)context.Application["memcached"]; 
     85            m_encoding = (UTF8Encoding)context.Application["encoding"]; 
    7486            m_queueClient = (QueueClient)context.Application["queueclient"]; 
    7587            m_hashkey = (string)context.Application["hashkey"]; 
    7688            m_xmlServiceOperationManager = (XmlServiceOperationManager)context.Application["xmlServiceOperationManager"]; 
     89            m_xslTransformationManager = (XsltTransformationManager)context.Application["xslTransformationManager"]; 
     90            m_transform = m_xslTransformationManager.Transform; 
     91            m_xsltParams = (Hashtable)context.Application["globalXsltParams"]; 
     92            m_transformContext = new Transform.Context(context, m_hashAlgorithm, (string)context.Application["hashkey"], fileInfo, (Hashtable)m_xsltParams.Clone(), fileInfo.LastWriteTimeUtc, fileInfo.Length); 
     93            m_namedXsltHashtable = (Hashtable)context.Application["namedXsltHashtable"]; 
    7794            m_xmlSourceETagDictionary = m_xmlServiceOperationManager.XmlSourceETagDictionary; 
    7895            m_xmlReaderDictionary = m_xmlServiceOperationManager.XmlReaderDictionary; 
     
    89106            m_lastModifiedKey = String.Format("LastModified:{0}", m_context.RequestUri); 
    90107            m_lastModifiedDate = String.Empty; 
    91  
    92  
     108            m_stopwatch = new Stopwatch(); 
     109 
     110            m_stopwatch.Start(); 
    93111            bool hasXmlSourceChanged = m_xmlServiceOperationManager.HasXmlSourceChanged(m_context.RequestXmlETag, requestUri); 
    94112 
     
    119137                            if (context.Request.Headers["If-None-Match"] == m_requestHashcode) { 
    120138 
    121                                 if (m_USE_MEMCACHED && m_memcachedClient.KeyExists(m_lastModifiedKey) && !hasXmlSourceChanged)
     139                                if (m_USE_MEMCACHED && m_memcachedClient.KeyExists(m_lastModifiedKey) && !hasXmlSourceChanged)
    122140                                    m_lastModifiedDate = (string)m_memcachedClient.Get(m_lastModifiedKey); 
    123141                                    if (context.Request.Headers["If-Modified-Since"] == m_lastModifiedDate) { 
     
    158176Process: 
    159177            try { 
     178                string xmlStylesheetHref = String.Empty; 
     179                bool processWithEmbeddedPIStylsheet = false; 
    160180                XmlReader reader = m_xmlServiceOperationManager.GetXmlReader(m_context.RequestXmlETag, requestUri); 
    161                 while (reader.Read()) { 
    162                     if (reader.IsStartElement()) { 
    163                         switch (reader.Name) { 
    164                             case "service:operation": 
    165                                 m_writer.WriteLine(reader.ReadOuterXml()); 
    166                                 break; 
    167                             default: 
    168                                 break; 
    169                         } 
     181                do { 
     182                    switch (reader.NodeType) { 
     183                        case XmlNodeType.ProcessingInstruction: 
     184                            switch (reader.Name) { 
     185                                case "xml-stylesheet": 
     186                                    string piValue = reader.Value; 
     187                                    if (piValue.Contains("type=\"text/xsl\"") && piValue.Contains("href=")) { 
     188                                        processWithEmbeddedPIStylsheet = true; 
     189                                        xmlStylesheetHref = SubstringBefore(SubstringAfter(piValue, "href=\""), "\""); 
     190                                    } 
     191                                    //Console.WriteLine("Stylesheet Href = {0}", xmlStylesheetHref); 
     192                                    break; 
     193                                default: 
     194                                    break; 
     195                            } 
     196                            break; 
     197                        case XmlNodeType.Element: 
     198                            if (reader.IsStartElement()) { 
     199                                switch (reader.Name) { 
     200                                    case "service:operation": 
     201                                        Uri baseXsltUri = new Uri(context.Request.MapPath(xmlStylesheetHref)); 
     202                                        string baseXslt = baseXsltUri.GetHashCode().ToString(); 
     203 
     204                                        if (!m_xslTransformationManager.NamedXsltHashtable.ContainsKey(baseXslt)) { 
     205                                            m_xslTransformationManager.AddTransformer(baseXslt, baseXsltUri); 
     206                                            m_xslTransformationManager.NamedXsltHashtable.Add(baseXslt, baseXsltUri); 
     207                                        } 
     208                                        if (!m_xslTransformationManager.XmlSourceHashtable.ContainsKey(m_context.RequestXmlETag)) { 
     209                                            using (MemoryStream stream = new MemoryStream(m_encoding.GetBytes(reader.ReadOuterXml().ToCharArray()))) { 
     210                                                m_xslTransformationManager.AddXmlSource(m_context.RequestXmlETag.ToString(), (Stream)stream); 
     211                                            } 
     212                                        } 
     213                                        //m_writer.WriteLine(reader.ReadOuterXml()); 
     214                                        m_transform.BeginProcess(m_transformContext, context, m_xslTransformationManager, m_writer, baseXslt, m_nuxleusAsyncResult); 
     215 
     216                                        break; 
     217                                    default: 
     218                                        break; 
     219                                } 
     220                            } 
     221                            break; 
     222                        case XmlNodeType.EndElement: 
     223 
     224                            continue; 
     225                        case XmlNodeType.Text: 
     226                        case XmlNodeType.SignificantWhitespace: 
     227                        case XmlNodeType.Whitespace: 
     228 
     229                            break; 
     230                        case XmlNodeType.CDATA: 
     231 
     232                            break; 
     233                        case XmlNodeType.Comment: 
     234                            break; 
     235                        case XmlNodeType.DocumentType: 
     236                            break; 
     237                        case XmlNodeType.EntityReference: 
     238                            reader.ResolveEntity(); 
     239                            continue; 
     240 
     241                        case XmlNodeType.XmlDeclaration: 
     242                        case XmlNodeType.EndEntity: 
     243                            continue; 
     244                        default: 
     245                            break; 
     246                        //throw new InvalidOperationException(); 
     247 
    170248                    } 
    171                 } 
     249                } while (reader.Read()); 
    172250                goto CompleteCall; 
    173251            } catch (Exception e) { 
     
    182260                m_lastModifiedDate = DateTime.UtcNow.ToString("r"); 
    183261            } 
    184             context.Response.Expires = 15; 
    185262            context.Response.AppendHeader("Cache-Control", "max-age=3600"); 
    186263            context.Response.AddHeader("Last-Modified", m_lastModifiedDate); 
     
    199276                } 
    200277                if (!m_CONTENT_IS_MEMCACHED && m_USE_MEMCACHED) { 
    201                     m_memcachedClient.Set(m_context.GetRequestHashcode(true).ToString(), output, DateTime.Now.AddHours(1)); 
     278                    m_memcachedClient.Set(m_context.GetRequestHashcode(true).ToString(), output, DateTime.Now.AddHours(4)); 
    202279                    m_memcachedClient.Set(m_lastModifiedKey, m_lastModifiedDate); 
    203280                } 
    204281            } 
     282            m_stopwatch.Stop(); 
     283            Console.WriteLine("Total processing time:\t\t{0} ms", m_stopwatch.ElapsedMilliseconds); 
    205284        } 
    206285 
     
    220299            m_httpContext.Response.Output.WriteLine("</html>"); 
    221300        } 
     301 
     302        /// <summary> 
     303        /// Modified from Oleg Tkachenko's SubstringBefore and SubstringAfter extension functions 
     304        /// @ http://www.tkachenko.com/blog/archives/000684.html 
     305        /// This will be moved into an appropriate class once I have the time. 
     306        /// </summary> 
     307        /// <param name="source"></param> 
     308        /// <param name="value"></param> 
     309        /// <returns></returns> 
     310        public static string SubstringAfter (string source, string value) { 
     311            if (string.IsNullOrEmpty(value)) { 
     312                return source; 
     313            } 
     314            CompareInfo compareInfo = CultureInfo.InvariantCulture.CompareInfo; 
     315            int index = compareInfo.IndexOf(source, value, CompareOptions.Ordinal); 
     316            if (index < 0) { 
     317                //No such substring 
     318                return string.Empty; 
     319            } 
     320            return source.Substring(index + value.Length); 
     321        } 
     322 
     323        public static string SubstringBefore (string source, string value) { 
     324            if (string.IsNullOrEmpty(value)) { 
     325                return value; 
     326            } 
     327            CompareInfo compareInfo = CultureInfo.InvariantCulture.CompareInfo; 
     328            int index = compareInfo.IndexOf(source, value, CompareOptions.Ordinal); 
     329            if (index < 0) { 
     330                //No such substring 
     331                return string.Empty; 
     332            } 
     333            return source.Substring(0, index); 
     334        } 
    222335        #endregion 
    223336    } 
  • trunk/nuxleus/Source/Nuxleus.Web/Nuxleus.Web.csproj

    r4521 r4522  
    112112    </Compile> 
    113113    <Compile Include="Agent.cs" /> 
    114     <Compile Include="AsyncResult\NuxleusAsyncResult.cs" /> 
     114    <Compile Include="HttpHandler\temp.cs" /> 
    115115    <Compile Include="XmlServiceOperation\Context.cs" /> 
    116116    <Compile Include="HttpHandler\NuxleusHttpAsyncQueryEntityHandler.cs" /> 
     
    131131    <Compile Include="HttpModule\*.cs" /> 
    132132    <Compile Include="XmlServiceOperation\XmlServiceOperationManager.cs" /> 
     133    <Compile Include="XmlServiceOperation\XmlServiceOperationReader.cs" /> 
    133134  </ItemGroup> 
    134135  <ItemGroup> 
     
    182183  </ItemGroup> 
    183184  <ItemGroup> 
     185    <Folder Include="AsyncResult\" /> 
    184186    <Folder Include="Properties\" /> 
    185187  </ItemGroup> 
  • trunk/nuxleus/Source/Nuxleus/Agent.cs

    r4374 r4522  
    99    public struct Agent : IAgent 
    1010    { 
    11         PostOffice _postOffice; 
    12         Hashtable _resultHashtable; 
    13         LoadBalancer _loadBalancer; 
     11        PostOffice m_postOffice; 
     12        Hashtable m_resultHashtable; 
     13        LoadBalancer m_loadBalancer; 
    1414 
    1515        public Agent (LoadBalancer loadBalancer) 
    1616        { 
    17             _loadBalancer = LoadBalancer.GetLoadBalancer(); 
    18             _postOffice = null; 
    19             _resultHashtable = new Hashtable(); 
     17            m_loadBalancer = LoadBalancer.GetLoadBalancer(); 
     18            m_postOffice = null; 
     19            m_resultHashtable = new Hashtable(); 
    2020        } 
    2121 
    22         public PostOffice PostOffice { get { return _postOffice; } set { _postOffice = value; } } 
    23         public Hashtable Result { get { return _resultHashtable; } set { _resultHashtable = value; } } 
     22        public PostOffice PostOffice { get { return m_postOffice; } set { m_postOffice = value; } } 
     23        public Hashtable Result { get { return m_resultHashtable; } set { m_resultHashtable = value; } } 
    2424 
    2525        public Response MakeRequest (Request request)  
    2626        { 
    27             if (_postOffice == null) 
     27            if (m_postOffice == null) 
    2828            { 
    29                 _postOffice = _loadBalancer.GetPostOffice; 
     29                m_postOffice = m_loadBalancer.GetPostOffice; 
    3030            } 
    31             ///TODO: Create the logic for adding a new request to the _postOffice.Inbox. 
     31            ///TODO: Create the logic for adding a new request to the m_postOffice.Inbox. 
    3232            ///For now will just return a new Response() so we can compile; 
    3333            return new Response(); 
     
    3636        public string GetResponse (Guid id) 
    3737        { 
    38             return (string)_resultHashtable[id]; 
     38            return (string)m_resultHashtable[id]; 
    3939        } 
    4040        public void AuthenticateRequest () { } 
  • trunk/nuxleus/Source/Xameleon/Transform/AsyncProcess.cs

    r3980 r4522  
    88using System.Text; 
    99using System.Web.SessionState; 
     10using Nuxleus.Async; 
    1011 
    1112namespace Nuxleus.Transform 
     
    1718    { 
    1819 
    19         public void BeginProcess(Context context, HttpContext httpContext, XsltTransformationManager manager, TextWriter writer, TransformServiceAsyncResult result) 
     20        public void BeginProcess(Context context, HttpContext httpContext, XsltTransformationManager manager, TextWriter writer, NuxleusAsyncResult result) 
    2021        { 
    2122            BeginProcess(context, httpContext, manager, writer, manager.BaseXsltName, result); 
    2223        } 
    2324 
    24         public void BeginProcess(Context context, HttpContext httpContext, XsltTransformationManager manager, TextWriter writer, String xsltName, TransformServiceAsyncResult result) 
     25        public void BeginProcess (Context context, HttpContext httpContext, XsltTransformationManager manager, TextWriter writer, String xsltName, NuxleusAsyncResult result) 
    2526        { 
    2627            XsltTransformer transformer = manager.GetTransformer(xsltName); 
     
    5051            } 
    5152 
    52             result.CompleteCall(); 
     53            //result.CompleteCall(); 
    5354        } 
    5455    } 
  • trunk/nuxleus/Source/Xameleon/Transform/XsltTransformationManager.cs

    r4511 r4522  
    88using Nuxleus.Cryptography; 
    99 
    10 namespace Nuxleus.Transform 
    11 
     10namespace Nuxleus.Transform { 
    1211 
    1312    //NOTE: TransformEngine enum PLACEHOLDER FOR FUTURE USE 
    1413    public enum TransformEngine { SAXON, MVPXML, NET_1_1, NET_2_0, NET_3_0, NET_3_5, SILVERLIGHT } 
    1514 
    16     public struct XsltTransformationManager 
    17     { 
     15    public struct XsltTransformationManager { 
    1816 
    1917        Hashtable m_xsltHashtable; 
     
    3634        static TransformEngine m_transformEngine; 
    3735 
    38         public XsltTransformationManager(Processor processor) 
    39             : this(processor, new Transform(), new XmlUrlResolver(), new Serializer(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) 
    40         { 
    41         } 
    42         public XsltTransformationManager(Processor processor, Transform transform) 
    43             : this(processor, transform, new XmlUrlResolver(), new Serializer(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) 
    44         { 
    45         } 
    46         public XsltTransformationManager(Processor processor, Transform transform, XmlUrlResolver resolver) 
    47             : this(processor, transform, resolver, new Serializer(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) 
    48         { 
    49         } 
    50         public XsltTransformationManager(Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer) 
    51             : this(processor, transform, resolver, serializer, new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) 
    52         { 
    53         } 
    54         public XsltTransformationManager(Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable) 
    55             : this(processor, transform, resolver, serializer, xsltHashtable, new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) 
    56         { 
    57         } 
    58         public XsltTransformationManager(Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable namedXsltHashtable) 
    59             : this(processor, transform, resolver, serializer, xsltHashtable, new Hashtable(), new Hashtable(), namedXsltHashtable, new Hashtable(), new Hashtable(), null, null, null) 
    60         { 
    61         } 
    62         public XsltTransformationManager(Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable xmlSourceHashtable, Hashtable namedXsltHashtable) 
    63             : this(processor, transform, resolver, serializer, xsltHashtable, xmlSourceHashtable, new Hashtable(), namedXsltHashtable, new Hashtable(), new Hashtable(), null, null, null) 
    64         { 
    65         } 
    66         public XsltTransformationManager(Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable xmlSourceHashtable, Hashtable xdmNodeHashtable, Hashtable namedXsltHashtable) 
    67             : this(processor, transform, resolver, serializer, xsltHashtable, xmlSourceHashtable, xdmNodeHashtable, namedXsltHashtable, new Hashtable(), new Hashtable(), null, null, null) 
    68         { 
    69         } 
    70         public XsltTransformationManager(Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable xmlSourceHashtable, Hashtable xdmNodeHashtable, Hashtable namedXsltHashtable, Hashtable namedXsltETagIndex) 
    71             : this(processor, transform, resolver, serializer, xsltHashtable, xmlSourceHashtable, xdmNodeHashtable, namedXsltHashtable, namedXsltETagIndex, new Hashtable(), null, null, null) 
    72         { 
    73         } 
    74         public XsltTransformationManager(Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable xmlSourceHashtable, Hashtable xdmNodeHashtable, Hashtable namedXsltHashtable, Hashtable namedXsltETagIndex, Hashtable xdmNodeETagIndex) 
    75             : this(processor, transform, resolver, serializer, xsltHashtable, xmlSourceHashtable, xdmNodeHashtable, namedXsltHashtable, namedXsltETagIndex, xdmNodeETagIndex, null, null, null) 
    76         { 
     36        public XsltTransformationManager (Processor processor) 
     37            : this(processor, new Transform(), new XmlUrlResolver(), new Serializer(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) { 
     38        } 
     39        public XsltTransformationManager (Processor processor, Transform transform) 
     40            : this(processor, transform, new XmlUrlResolver(), new Serializer(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) { 
     41        } 
     42        public XsltTransformationManager (Processor processor, Transform transform, XmlUrlResolver resolver) 
     43            : this(processor, transform, resolver, new Serializer(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) { 
     44        } 
     45        public XsltTransformationManager (Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer) 
     46            : this(processor, transform, resolver, serializer, new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) { 
     47        } 
     48        public XsltTransformationManager (Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable) 
     49            : this(processor, transform, resolver, serializer, xsltHashtable, new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), new Hashtable(), null, null, null) { 
     50        } 
     51        public XsltTransformationManager (Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable namedXsltHashtable) 
     52            : this(processor, transform, resolver, serializer, xsltHashtable, new Hashtable(), new Hashtable(), namedXsltHashtable, new Hashtable(), new Hashtable(), null, null, null) { 
     53        } 
     54        public XsltTransformationManager (Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable xmlSourceHashtable, Hashtable namedXsltHashtable) 
     55            : this(processor, transform, resolver, serializer, xsltHashtable, xmlSourceHashtable, new Hashtable(), namedXsltHashtable, new Hashtable(), new Hashtable(), null, null, null) { 
     56        } 
     57        public XsltTransformationManager (Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable xmlSourceHashtable, Hashtable xdmNodeHashtable, Hashtable namedXsltHashtable) 
     58            : this(processor, transform, resolver, serializer, xsltHashtable, xmlSourceHashtable, xdmNodeHashtable, namedXsltHashtable, new Hashtable(), new Hashtable(), null, null, null) { 
     59        } 
     60        public XsltTransformationManager (Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable xmlSourceHashtable, Hashtable xdmNodeHashtable, Hashtable namedXsltHashtable, Hashtable namedXsltETagIndex) 
     61            : this(processor, transform, resolver, serializer, xsltHashtable, xmlSourceHashtable, xdmNodeHashtable, namedXsltHashtable, namedXsltETagIndex, new Hashtable(), null, null, null) { 
     62        } 
     63        public XsltTransformationManager (Processor processor, Transform transform, XmlUrlResolver resolver, Serializer serializer, Hashtable xsltHashtable, Hashtable xmlSourceHashtable, Hashtable xdmNodeHashtable, Hashtable namedXsltHashtable, Hashtable namedXsltETagIndex, Hashtable xdmNodeETagIndex) 
     64            : this(processor, transform, resolver, serializer, xsltHashtable, xmlSourceHashtable, xdmNodeHashtable, namedXsltHashtable, namedXsltETagIndex, xdmNodeETagIndex, null, null, null) { 
    7765        } 
    7866        public XsltTransformationManager 
     
    9179            String baseXsltUriHash, 
    9280            String baseXsltName 
    93           ) 
    94         { 
     81          ) { 
    9582            m_baseXsltUri = baseXsltUri; 
    9683            m_baseXsltUriHash = baseXsltUriHash; 
     
    114101        } 
    115102 
    116         public void SetBaseXsltContext(BaseXsltContext baseXsltContext) 
    117         { 
     103        public void SetBaseXsltContext (BaseXsltContext baseXsltContext) { 
    118104            m_baseXsltUri = baseXsltContext.BaseXsltUri; 
    119105            m_baseXsltName = baseXsltContext.Name; 
     
    123109        } 
    124110 
    125         public bool HasXmlSourceChanged(string eTag) 
    126         { 
     111        public bool HasXmlSourceChanged (string eTag) { 
    127112            if (m_xdmNodeETagIndex[eTag] != null) 
    128113                return false; 
     
    131116        } 
    132117 
    133         public string GetXdmNodeHashtableCount() 
    134         { 
     118        public string GetXdmNodeHashtableCount () { 
    135119            return m_xdmNodeETagIndex.Count.ToString(); 
    136120        } 
    137121 
    138         public bool HasBaseXsltSourceChanged() 
    139         { 
     122        public bool HasBaseXsltSourceChanged () { 
    140123            string namedETag = (string)m_namedXsltETagIndex[m_baseXsltName]; 
    141124            if (namedETag != null && namedETag == GenerateNamedETagKey(m_baseXsltName, m_baseXsltUri)) 
    142125                return false; 
    143             else 
    144             { 
     126            else { 
    145127                m_namedXsltETagIndex[m_baseXsltName] = (string)m_baseXsltUriHash; 
    146128                return true; 
     
    148130        } 
    149131 
    150         public void AddTransformer(Uri uri) 
    151         { 
     132        public void AddTransformer (Uri uri) { 
    152133            addTransformer(GenerateNamedETagKey(uri.LocalPath, uri), uri.LocalPath, uri, m_resolver, null, null, null); 
    153134        } 
    154         public void AddTransformer(string name, Uri uri) 
    155         { 
     135        public void AddTransformer (string name, Uri uri) { 
    156136            addTransformer(GenerateNamedETagKey(name, uri), name, uri, m_resolver, null, null, null); 
    157137        } 
    158         public void AddTransformer(string name, Uri uri, XmlUrlResolver resolver) 
    159         { 
     138        public void AddTransformer (string name, Uri uri, XmlUrlResolver resolver) { 
    160139            addTransformer(GenerateNamedETagKey(name, uri), name, uri, resolver, null, null, null); 
    161140        } 
    162         public void AddTransformer(string name, Uri uri, XmlUrlResolver resolver, string initialMode) 
    163         { 
     141        public void AddTransformer (string name, Uri uri, XmlUrlResolver resolver, string initialMode) { 
    164142            addTransformer(GenerateNamedETagKey(name, uri), name, uri, resolver, initialMode, null, null); 
    165143        } 
    166         public void AddTransformer(string name, Uri uri, XmlUrlResolver resolver, string initialMode, string initialTemplate) 
    167         { 
     144        public void AddTransformer (string name, Uri uri, XmlUrlResolver resolver, string initialMode, string initialTemplate) { 
    168145            addTransformer(GenerateNamedETagKey(name, uri), name, uri, resolver, initialMode, initialTemplate, null); 
    169146        } 
    170         public void AddTransformer(string name, Uri uri, XmlUrlResolver resolver, string initialMode, string initialTemplate, string baseOutputUri) 
    171         { 
     147        public void AddTransformer (string name, Uri uri, XmlUrlResolver resolver, string initialMode, string initialTemplate, string baseOutputUri) { 
    172148            addTransformer(GenerateNamedETagKey(name, uri), name, uri, resolver, initialMode, initialTemplate, baseOutputUri); 
    173149        } 
    174         private void addTransformer(string key, string name, Uri uri, XmlUrlResolver resolver, string initialMode, string initialTemplate, string baseOutputUri) 
    175         { 
     150        private void addTransformer (string key, string name, Uri uri, XmlUrlResolver resolver, string initialMode, string initialTemplate, string baseOutputUri) { 
    176151            XsltTransformer transformer = createNewTransformer(uri); 
    177152            transformer.InputXmlResolver = resolver; 
     
    186161        } 
    187162 
    188         public void AddXmlSource(string name, Uri uri) 
    189         { 
    190             Stream xmlStream = createNewXmlStream(uri); 
    191             m_sourceHashtable[name] = (Stream)xmlStream; 
    192         } 
    193  
    194         public XdmNode GetXdmNode(string name, string xmlSource) 
    195         { 
     163        public void AddXmlSource (string sourceXmlETag, Stream xmlStream) { 
     164            m_sourceHashtable[sourceXmlETag] = xmlStream; 
     165        } 
     166 
     167        public void AddXmlSource (string name, Uri uri) { 
     168            m_sourceHashtable[name] = createNewXmlStream(uri); 
     169        } 
     170 
     171        public XdmNode GetXdmNode (string name, string xmlSource) { 
    196172            Uri xmlSourceUri = new Uri(xmlSource); 
    197173            return GetXdmNode(name, xmlSourceUri); 
    198174        } 
    199         public XdmNode GetXdmNode(string name, Uri xmlSourceUri) 
    200         { 
     175        public XdmNode GetXdmNode (string name, Uri xmlSourceUri) { 
    201176 
    202177            Uri xdmNodeUri = (Uri)m_xdmNodeETagIndex[name]; 
    203             if (xdmNodeUri != null && xdmNodeUri == xmlSourceUri) 
    204             { 
     178            if (xdmNodeUri != null && xdmNodeUri == xmlSourceUri) { 
    205179                return getXdmNode(name, xmlSourceUri, false); 
    206             } 
    207             else 
    208             { 
     180            } else { 
    209181                m_xdmNodeETagIndex[name] = xmlSourceUri; 
    210182                return getXdmNode(name, xmlSourceUri, true); 
    211183            } 
    212184        } 
    213         private XdmNode getXdmNode(string key, Uri xmlSourceUri, bool replaceExistingXdmNode) 
    214         { 
     185        private XdmNode getXdmNode (string key, Uri xmlSourceUri, bool replaceExistingXdmNode) { 
    215186 
    216187            XdmNode node = (XdmNode)m_xdmNodeHashtable[key]; 
    217188 
    218             if (node != null && !replaceExistingXdmNode) 
    219             { 
     189            if (node != null && !replaceExistingXdmNode) { 
    220190                return node; 
    221             } 
    222             else 
    223             { 
    224                 using (Stream stream = createNewXmlStream(xmlSourceUri)) 
    225                 { 
     191            } else if (m_sourceHashtable.ContainsKey(key)) { 
     192                node = createNewXdmNode((Stream)m_sourceHashtable[key]); 
     193            } else { 
     194                using (Stream stream = createNewXmlStream(xmlSourceUri)) { 
    226195                    node = createNewXdmNode(stream); 
    227196                } 
     
    231200        } 
    232201 
    233         private Stream createNewXmlStream(Uri xmlSourceUri) 
    234         { 
     202        private Stream createNewXmlStream (Uri xmlSourceUri) { 
    235203            return (Stream)m_resolver.GetEntity(xmlSourceUri, null, typeof(Stream)); 
    236204        } 
    237205 
    238         private XdmNode createNewXdmNode(Stream xmlSourceStream) 
    239         { 
     206        private XdmNode createNewXdmNode (Stream xmlSourceStream) { 
    240207            return (XdmNode)m_builder.Build(xmlSourceStream); 
    241208        } 
    242209 
    243         public XsltTransformer GetTransformer(string eTag, Uri xsltUri) 
    244         { 
     210        public XsltTransformer GetTransformer (string eTag, Uri xsltUri) { 
    245211            return getTransformer(eTag, xsltUri, true); 
    246212        } 
    247         public XsltTransformer GetTransformer(string name, string href, Uri baseUri) 
    248         { 
     213        public XsltTransformer GetTransformer (string name, string href, Uri baseUri) { 
    249214            Uri xsltUri = new Uri(baseUri, href); 
    250215            return getTransformer(GenerateNamedETagKey(name, xsltUri), name, xsltUri); 
    251216        } 
    252         public XsltTransformer GetTransformer(string name) 
    253         { 
     217        public XsltTransformer GetTransformer (string name) { 
    254218            Uri xsltUri = (Uri)m_namedXsltHashtable[name]; 
    255219            return getTransformer(GenerateNamedETagKey(name, xsltUri), name, xsltUri); 
    256220        } 
    257         private XsltTransformer getTransformer(string key, string xsltName, Uri xsltUri) 
    258         { 
     221        private XsltTransformer getTransformer (string key, string xsltName, Uri xsltUri) { 
    259222            string namedETag = (string)m_namedXsltETagIndex[xsltName]; 
    260             if (namedETag != null && namedETag == key) 
    261             { 
     223            if (namedETag != null && namedETag == key) { 
    262224                return getTransformer(namedETag, xsltUri, false); 
    263             } 
    264             else 
    265             { 
     225            } else { 
    266226                m_namedXsltETagIndex[xsltName] = key; 
    267227                return getTransformer(key, xsltUri, true); 
    268228            } 
    269229        } 
    270         private XsltTransformer getTransformer(string key, Uri xsltUri, bool replaceExistingXsltTransformer) 
    271         { 
     230        private XsltTransformer getTransformer (string key, Uri xsltUri, bool replaceExistingXsltTransformer) { 
    272231            XsltTransformer transformer; 
    273232            transformer = (XsltTransformer)m_namedXsltHashtable[key]; 
    274233 
    275             if (transformer != null && !replaceExistingXsltTransformer) 
    276             { 
     234            if (transformer != null && !replaceExistingXsltTransformer) { 
    277235                return transformer; 
    278             } 
    279             else 
     236            } else 
    280237                transformer = createNewTransformer(xsltUri); 
    281238 
     
    284241        } 
    285242 
    286         public static String GenerateNamedETagKey(String name, Uri sourceUri, params object[] objectParams) 
    287         { 
     243        public static String GenerateNamedETagKey (String name, Uri sourceUri, params object[] objectParams) { 
    288244            FileInfo fileInfo = new FileInfo(sourceUri.LocalPath); 
    289245            return name + ":" + Context.GenerateETag((string)HttpContext.Current.Application["hashkey"], _hashAlgorithm, fileInfo.LastWriteTimeUtc, fileInfo.Length, sourceUri, objectParams); 
    290246        } 
    291247 
    292         private XsltTransformer createNewTransformer(Uri xsltUri) 
    293         { 
    294             using (Stream stream = createNewXmlStream(xsltUri)) 
    295             { 
     248        private XsltTransformer createNewTransformer (Uri xsltUri) { 
     249            using (Stream stream = createNewXmlStream(xsltUri)) { 
    296250                return m_compiler.Compile(stream).Load(); 
    297251            } 
    298252        } 
    299253 
    300         public Hashtable XsltHashtable 
    301         { 
     254        public Hashtable XsltHashtable { 
    302255            get { return m_xsltHashtable; } 
    303256            set { m_xsltHashtable = value; } 
    304257        } 
    305         public Hashtable XmlSourceHashtable 
    306         { 
     258        public Hashtable XmlSourceHashtable { 
    307259            get { return m_sourceHashtable; } 
    308260            set { m_sourceHashtable = value; } 
    309261        } 
    310         public Hashtable NamedXsltHashtable 
    311         { 
     262        public Hashtable NamedXsltHashtable { 
    312263            get { return m_namedXsltHashtable; } 
    313264            set { m_namedXsltHashtable = value; } 
    314265        } 
    315         public HashAlgorithm HashAlgorithm 
    316         { 
     266        public HashAlgorithm HashAlgorithm { 
    317267            get { return _hashAlgorithm; } 
    318268            set { _hashAlgorithm = value; } 
    319269        } 
    320         public Processor Processor 
    321         { 
     270        public Processor Processor { 
    322271            get { return m_processor; } 
    323272            set { m_processor = value; } 
    324273        }