Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / System.XML / System.Xml.Xsl / XslTransform.cs
index 19be823939751953ee74a67c175d1ddb7b0153a0..a3c2c5a70d35f6c70dcc80709ed78f5cfc8cfdc8 100644 (file)
@@ -7,27 +7,27 @@
 // (C) Copyright 2002 Tim Coleman\r
 // (c) 2003 Ximian Inc. (http://www.ximian.com)\r
 //\r
-
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
+\r
+//\r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+// \r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+//\r
 \r
 using System;\r
 using System.Collections;\r
@@ -37,18 +37,81 @@ using System.Runtime.InteropServices;
 using System.Security;\r
 using System.Security.Policy;\r
 using System.Xml.XPath;\r
-using Mono.Xml.Xsl;
+using Mono.Xml.Xsl;\r
 \r
 namespace System.Xml.Xsl {\r
+       internal class SimpleXsltDebugger\r
+       {\r
+               public void OnCompile (XPathNavigator style)\r
+               {\r
+                       Console.Write ("Compiling: ");\r
+                       PrintXPathNavigator (style);\r
+                       Console.WriteLine ();\r
+               }\r
+\r
+               public void OnExecute (XPathNodeIterator currentNodeSet, XPathNavigator style, XsltContext xsltContext)\r
+               {\r
+                       Console.Write ("Executing: ");\r
+                       PrintXPathNavigator (style);\r
+                       Console.WriteLine (" / NodeSet: (type {1}) {0} / XsltContext: {2}", currentNodeSet, currentNodeSet.GetType (), xsltContext);\r
+               }\r
+\r
+               void PrintXPathNavigator (XPathNavigator nav)\r
+               {\r
+                       IXmlLineInfo li = nav as IXmlLineInfo;\r
+                       li = li != null && li.HasLineInfo () ? li : null;\r
+                       Console.Write ("({0}, {1}) element {2}", li != null ? li.LineNumber : 0, li != null ? li.LinePosition : 0, nav.Name);\r
+               }\r
+       }\r
+\r
+       [Obsolete]\r
        public sealed class XslTransform {\r
-
+\r
+               internal static readonly bool TemplateStackFrameError;\r
+               internal static readonly TextWriter TemplateStackFrameOutput;\r
+\r
+               static XslTransform ()\r
+               {\r
+                       string env = Environment.GetEnvironmentVariable ("MONO_XSLT_STACK_FRAME");\r
+                       switch (env) {\r
+                       case "stdout":\r
+                               TemplateStackFrameOutput = Console.Out;\r
+                               break;\r
+                       case "stderr":\r
+                               TemplateStackFrameOutput = Console.Error;\r
+                               break;\r
+                       case "error":\r
+                               TemplateStackFrameError = true;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               static object GetDefaultDebugger ()\r
+               {\r
+                       string env = Environment.GetEnvironmentVariable ("MONO_XSLT_DEBUGGER");\r
+                       if (env == null)\r
+                               return null;\r
+                       if (env == "simple")\r
+                               return new SimpleXsltDebugger ();\r
+                       object obj = Activator.CreateInstance (Type.GetType (env));\r
+                       return obj;\r
+               }\r
+\r
+               public XslTransform ()\r
+                       : this (GetDefaultDebugger ())\r
+               {\r
+               }\r
+\r
+               internal XslTransform (object debugger)\r
+               {\r
+                       this.debugger = debugger;\r
+               }\r
+\r
+               object debugger;\r
                CompiledStylesheet s;\r
                XmlResolver xmlResolver = new XmlUrlResolver ();\r
 \r
-               [MonoTODO ("Security check.")]\r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
+               [MonoTODO] // FIXME: audit security check\r
                public XmlResolver XmlResolver {\r
                        set {\r
                                 xmlResolver = value;\r
@@ -56,35 +119,22 @@ namespace System.Xml.Xsl {
                }\r
                \r
                #region Transform\r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public XmlReader Transform (IXPathNavigable input, XsltArgumentList args)\r
                {\r
                        return Transform (input.CreateNavigator (), args, xmlResolver);\r
                }\r
 \r
-#if NET_1_1\r
                public XmlReader Transform (IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)\r
-#else\r
-               XmlReader Transform (IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)\r
-#endif\r
                {\r
                        return Transform (input.CreateNavigator (), args, resolver);\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public XmlReader Transform (XPathNavigator input, XsltArgumentList args)\r
                {\r
                        return Transform (input, args, xmlResolver);\r
                }\r
-#if NET_1_1\r
+\r
                public XmlReader Transform (XPathNavigator input, XsltArgumentList args, XmlResolver resolver)\r
-#else\r
-               XmlReader Transform (XPathNavigator input, XsltArgumentList args, XmlResolver resolver)\r
-#endif\r
                {\r
                        // todo: is this right?\r
                        MemoryStream stream = new MemoryStream ();\r
@@ -93,130 +143,85 @@ namespace System.Xml.Xsl {
                        return new XmlTextReader (stream, XmlNodeType.Element, null);\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output)\r
                {\r
                        Transform (input.CreateNavigator (), args, output, xmlResolver);\r
                }\r
-#if NET_1_1\r
+\r
                public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
-#else\r
-               void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
-#endif\r
                {\r
                        Transform (input.CreateNavigator (), args, output, resolver);\r
                }\r
                \r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output)\r
                {\r
                        Transform (input.CreateNavigator (), args, output, xmlResolver);\r
                }\r
-#if NET_1_1\r
                public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
-#else\r
-               void Transform (IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
-#endif\r
                {\r
                        Transform (input.CreateNavigator (), args, output, resolver);\r
                }\r
                \r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output)\r
                {\r
                        Transform (input.CreateNavigator (), args, output, xmlResolver);\r
                }\r
-#if NET_1_1\r
+\r
                public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
-#else\r
-               void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
-#endif\r
                {\r
                        Transform (input.CreateNavigator (), args, output, resolver);\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output)\r
                {\r
                        Transform (input, args, output, xmlResolver);\r
                }\r
-#if NET_1_1\r
+\r
                public void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
-#else\r
-               void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
-#endif\r
-               {\r
-                       if (s == null)
-                               throw new XsltException ("No stylesheet was loaded.", null);
-
-                       Outputter outputter = new GenericOutputter (output, s.Outputs, null);
-                       new XslTransformProcessor (s).Process (input, outputter, args, resolver);
+               {\r
+                       if (s == null)\r
+                               throw new XsltException ("No stylesheet was loaded.", null);\r
+\r
+                       Outputter outputter = new GenericOutputter (output, s.Outputs, null);\r
+                       new XslTransformProcessor (s, debugger).Process (input, outputter, args, resolver);\r
                        output.Flush ();\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public void Transform (XPathNavigator input, XsltArgumentList args, Stream output)\r
                {\r
                        Transform (input, args, output, xmlResolver);           \r
                }\r
-#if NET_1_1\r
                public void Transform (XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
-#else\r
-               void Transform (XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
-#endif\r
                {\r
-                       XslOutput xslOutput = (XslOutput)s.Outputs[String.Empty];
+                       XslOutput xslOutput = (XslOutput)s.Outputs[String.Empty];\r
                        Transform (input, args, new StreamWriter (output, xslOutput.Encoding), resolver);\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output)\r
                {\r
                        Transform (input, args, output, xmlResolver);\r
                }\r
-#if NET_1_1\r
+\r
                public void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
-#else\r
-               void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
-#endif\r
-               {\r
-                       if (s == null)
-                               throw new XsltException ("No stylesheet was loaded.", null);
-
-                       Outputter outputter = new GenericOutputter(output, s.Outputs, output.Encoding);                 
-                       new XslTransformProcessor (s).Process (input, outputter, args, resolver);
-                       outputter.Done ();
+               {\r
+                       if (s == null)\r
+                               throw new XsltException ("No stylesheet was loaded.", null);\r
+\r
+                       Outputter outputter = new GenericOutputter(output, s.Outputs, output.Encoding);                 \r
+                       new XslTransformProcessor (s, debugger).Process (input, outputter, args, resolver);\r
+                       outputter.Done ();\r
                        output.Flush ();\r
                }\r
                \r
-#if NET_1_1\r
-               [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
-#endif\r
                public void Transform (string inputfile, string outputfile)\r
                { \r
                        Transform (inputfile, outputfile, xmlResolver);\r
                }\r
 \r
-#if NET_1_1\r
                public void Transform (string inputfile, string outputfile, XmlResolver resolver)\r
-#else\r
-               void Transform (string inputfile, string outputfile, XmlResolver resolver)\r
-#endif\r
                {\r
-                       using (Stream s = new FileStream (outputfile, FileMode.Create, FileAccess.ReadWrite)) {
-                               Transform(new XPathDocument (inputfile).CreateNavigator (), null, s, resolver);
+                       using (Stream s = new FileStream (outputfile, FileMode.Create, FileAccess.ReadWrite)) {\r
+                               Transform(new XPathDocument (inputfile).CreateNavigator (), null, s, resolver);\r
                        }\r
                }\r
                #endregion\r
@@ -229,92 +234,62 @@ namespace System.Xml.Xsl {
                \r
                public void Load (string url, XmlResolver resolver)\r
                {\r
-                       XmlResolver res = resolver;
-                       if (res == null)
-                               res = new XmlUrlResolver ();
-                       Uri uri = res.ResolveUri (null, url);
-                       using (Stream s = res.GetEntity (uri, null, typeof (Stream)) as Stream) {
-                               XmlTextReader xtr = new XmlTextReader (uri.ToString (), s);
-                               xtr.XmlResolver = res;
-                               XmlValidatingReader xvr = new XmlValidatingReader (xtr);
-                               xvr.XmlResolver = res;
-                               xvr.ValidationType = ValidationType.None;
-                               Load (new XPathDocument (xvr, XmlSpace.Preserve).CreateNavigator (), resolver, null);
+                       XmlResolver res = resolver;\r
+                       if (res == null)\r
+                               res = new XmlUrlResolver ();\r
+                       Uri uri = res.ResolveUri (null, url);\r
+                       using (Stream s = res.GetEntity (uri, null, typeof (Stream)) as Stream) {\r
+                               XmlTextReader xtr = new XmlTextReader (uri.ToString (), s);\r
+                               xtr.XmlResolver = res;\r
+                               XmlValidatingReader xvr = new XmlValidatingReader (xtr);\r
+                               xvr.XmlResolver = res;\r
+                               xvr.ValidationType = ValidationType.None;\r
+                               Load (new XPathDocument (xvr, XmlSpace.Preserve).CreateNavigator (), resolver, null);\r
                        }\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete("You should pass evidence.", false)]\r
-#endif\r
                public void Load (XmlReader stylesheet)\r
                {\r
                        Load (stylesheet, null, null);\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete("You should pass evidence.", false)]\r
-#endif\r
                public void Load (XmlReader stylesheet, XmlResolver resolver)\r
                {\r
                        Load (stylesheet, resolver, null);\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete("You should pass evidence.", false)]\r
-#endif\r
                public void Load (XPathNavigator stylesheet)\r
                {\r
                        Load (stylesheet, null, null);\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete("You should pass evidence.", false)]\r
-#endif\r
                public void Load (XPathNavigator stylesheet, XmlResolver resolver)\r
                {\r
                        Load (stylesheet, resolver, null);\r
                }\r
                \r
-#if NET_1_1\r
-               [Obsolete("You should pass evidence.", false)]\r
-#endif\r
                public void Load (IXPathNavigable stylesheet)\r
                {\r
                        Load (stylesheet.CreateNavigator(), null);\r
                }\r
 \r
-#if NET_1_1\r
-               [Obsolete("You should pass evidence.", false)]\r
-#endif\r
                public void Load (IXPathNavigable stylesheet, XmlResolver resolver)\r
                {\r
                        Load (stylesheet.CreateNavigator(), resolver);\r
                }\r
 \r
                // Introduced in .NET 1.1\r
-#if NET_1_1\r
                public void Load (IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)\r
-#else\r
-               internal void Load (IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)\r
-#endif\r
                {\r
                        Load (stylesheet.CreateNavigator(), resolver, evidence);\r
                }\r
 \r
-#if NET_1_1\r
                public void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)\r
-#else\r
-               internal void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)\r
-#endif\r
                {\r
-                       s = new Compiler ().Compile (stylesheet, resolver, evidence);\r
+                       s = new Compiler (debugger).Compile (stylesheet, resolver, evidence);\r
                }\r
 \r
-#if NET_1_1\r
                public void Load (XmlReader stylesheet, XmlResolver resolver, Evidence evidence)\r
-#else\r
-               internal void Load (XmlReader stylesheet, XmlResolver resolver, Evidence evidence)\r
-#endif\r
                {\r
                        Load (new XPathDocument (stylesheet, XmlSpace.Preserve).CreateNavigator (), resolver, evidence);\r
                }\r