コード例 #1
0
ファイル: Xslt.cs プロジェクト: thiagobfiorenza/sn-webpages
        public static XslTransformExecutionContext GetXslt(string nodePath, bool resolveScripts)
        {
            string nodeKey = "xslt:" + nodePath;

            XslTransformExecutionContext context = (XslTransformExecutionContext)(Cache.Get(nodeKey));

            if (context == null)
            {
                context = new XslTransformExecutionContext();

                context.XslCompiledTransform = new XslCompiledTransform(Debugger.IsAttached);
                RepositoryPathResolver resolver = new RepositoryPathResolver();

                try
                {
                    context.XslCompiledTransform.Load(nodePath, XsltSettings.Default, resolver);
                }
                catch (NullReferenceException e) // rethrow
                {
                    throw new NullReferenceException(e.Message + "<br/>" + nodePath + " (or include)");
                }

                AggregateCacheDependency aggregatedDependency = new AggregateCacheDependency();

                context.NamespaceExtensions    = resolver.ImportNamespaceCollection.Distinct().ToArray();
                context.ImportScriptCollection = resolver.ImportScriptCollection;
                context.ImportCssCollection    = resolver.ImportCssCollection;

                foreach (var dependencyPath in resolver.DependencyPathCollection)
                {
                    // Create an aggregate cache dependeny that includes NodeId, Path, NodeTypeId
                    // Our cache item will be invalidated if the dependency node is invalidated
                    //  - by node id
                    //  - by path
                    //  - by nodeType

                    string fsFilePath = null;
                    if (HttpContext.Current != null &&
                        WebApplication.DiskFSSupportMode == DiskFSSupportMode.Prefer)
                    {
                        fsFilePath = HttpContext.Current.Server.MapPath(dependencyPath);
                    }
                    if (!string.IsNullOrEmpty(fsFilePath) && System.IO.File.Exists(fsFilePath))
                    {
                        SnTrace.Repository.Write("Cannot create cache dependency for a filesystem entry: {0}", fsFilePath);
                    }
                    else
                    {
                        var nodeHead = NodeHead.Get(dependencyPath);
                        aggregatedDependency.Add(
                            new PathDependency(nodeHead.Path),
                            new NodeIdDependency(nodeHead.Id),
                            new NodeTypeDependency(nodeHead.NodeTypeId)
                            );
                    }
                }

                Cache.Insert(nodeKey, context, aggregatedDependency);
            }

            if (resolveScripts)
            {
                foreach (var script in context.ImportScriptCollection)
                {
                    UITools.AddScript(script);
                }
                foreach (var css in context.ImportCssCollection)
                {
                    UITools.AddStyleSheetToHeader(UITools.GetHeader(), css);
                }
            }

            return(context);
        }
コード例 #2
0
ファイル: Xslt.cs プロジェクト: maxpavlov/FlexNet
        public static XslTransformExecutionContext GetXslt(string nodePath, bool resolveScripts)
        {
            string nodeKey = "xslt:" + nodePath;

            XslTransformExecutionContext context = (XslTransformExecutionContext)(DistributedApplication.Cache.Get(nodeKey));
            if (context == null)
            {
                context = new XslTransformExecutionContext();
                
                context.XslCompiledTransform = new XslCompiledTransform(Debugger.IsAttached);
                RepositoryPathResolver resolver = new RepositoryPathResolver();

                try
                {
                    context.XslCompiledTransform.Load(nodePath, XsltSettings.Default, resolver);
                }
                catch (NullReferenceException e) // rethrow
                {
                    throw new NullReferenceException(e.Message + "<br/>" + nodePath + " (or include)");
                }

                AggregateCacheDependency aggregatedDependency = new AggregateCacheDependency();
                
                context.NamespaceExtensions = resolver.ImportNamespaceCollection.Distinct().ToArray();
                context.ImportScriptCollection = resolver.ImportScriptCollection;
                context.ImportCssCollection = resolver.ImportCssCollection;

                foreach (var dependencyPath in resolver.DependencyPathCollection)
                {
                    // Create an aggregate cache dependeny that includes NodeId, Path, NodeTypeId
                    // Our cache item will be invalidated if the dependency node is invalidated
                    //  - by node id
                    //  - by path
                    //  - by nodeType
                    string fsFilePath = null;
                    if (HttpContext.Current != null &&
                        RepositoryPathProvider.DiskFSSupportMode == DiskFSSupportMode.Prefer)
                        fsFilePath = HttpContext.Current.Server.MapPath(dependencyPath);
                    if (!string.IsNullOrEmpty(fsFilePath) && System.IO.File.Exists(fsFilePath))
                    {
                        aggregatedDependency.Add(new CacheDependency(fsFilePath));                        
                    }
                    else 
                    {
                        var nodeHead = NodeHead.Get(dependencyPath);
                        aggregatedDependency.Add(
                            new PathDependency(nodeHead.Path),
                            new NodeIdDependency(nodeHead.Id),
                            new NodeTypeDependency(nodeHead.NodeTypeId)
                            );
                    }
                }

                DistributedApplication.Cache.Insert(nodeKey, context, aggregatedDependency);
            }

            if (resolveScripts)
            {
                foreach (var script in context.ImportScriptCollection)
                {
                    UITools.AddScript(script);
                }
                foreach (var css in context.ImportCssCollection)
                {
                    UITools.AddStyleSheetToHeader(UITools.GetHeader(), css);
                }
            }

            return context;
        }