2003-01-22 Zdravko Tashev <ztashev@openlinksw.co.uk>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Xml.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     Xml\r
4  *\r
5  * Author:  Gaurav Vaish, Gonzalo Paniagua Javier\r
6  * Maintainer: gvaish@iitk.ac.in\r
7  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>, <gonzalo@ximian.com>\r
8  * Implementation: yes\r
9  * Status:  95%\r
10  *\r
11  * (C) Gaurav Vaish (2002)\r
12  * (c) 2002 Ximian, Inc. (http://www.ximian.com)\r
13  */\r
14 \r
15 using System;\r
16 using System.ComponentModel;\r
17 using System.IO;\r
18 using System.Xml;\r
19 using System.Xml.Xsl;\r
20 using System.Xml.XPath;\r
21 using System.Web;\r
22 using System.Web.UI;\r
23 \r
24 namespace System.Web.UI.WebControls\r
25 {\r
26         [DefaultProperty("DocumentSource")]\r
27         [PersistChildren(false)]\r
28         public class Xml : Control\r
29         {\r
30                 private XmlDocument      document;\r
31                 private string           documentContent;\r
32                 private string           documentSource;\r
33                 private XslTransform     transform;\r
34                 private XsltArgumentList transformArgumentList;\r
35                 private string           transformSource;\r
36 \r
37                 private XPathDocument xpathDoc;\r
38 \r
39                 private static XslTransform defaultTransform;\r
40 \r
41                 static Xml()\r
42                 {\r
43                         XmlTextReader reader = new XmlTextReader(new StringReader("<xsl:stylesheet version='1.0' " +\r
44                                                                 "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>" +\r
45                                                                 "<xsl:template match=\"*\">" +\r
46                                                                 "<xsl:copy-of select=\".\"/>" +\r
47                                                                 "</xsl:template>" +\r
48                                                                 "</xsl:stylesheet>"));\r
49                         defaultTransform = new XslTransform();\r
50                         defaultTransform.Load(reader);\r
51                 }\r
52 \r
53                 public Xml(): base()\r
54                 {\r
55                 }\r
56 \r
57                 [MonoTODO("security")]\r
58                 private void LoadXmlDoc ()\r
59                 {\r
60                         if (documentContent != null && documentContent.Length > 0) {\r
61                                 document = new XmlDocument();\r
62                                 document.LoadXml (documentContent);\r
63                                 return;\r
64                         }\r
65 \r
66                         if (documentSource != null && documentSource.Length != 0) {\r
67                                 document = new XmlDocument();\r
68                                 document.Load (documentSource);\r
69                         }\r
70                 }\r
71 \r
72                 public XmlDocument Document\r
73                 {\r
74                         get\r
75                         {\r
76                                 if(document == null)\r
77                                         LoadXmlDoc();\r
78                                 return document;\r
79                         }\r
80                         set\r
81                         {\r
82                                 documentSource  = null;\r
83                                 documentContent = null;\r
84                                 xpathDoc        = null;\r
85                                 document        = value;\r
86                         }\r
87                 }\r
88 \r
89                 public string DocumentContent\r
90                 {\r
91                         get\r
92                         {\r
93                                 return String.Empty;\r
94                         }\r
95                         set\r
96                         {\r
97                                 document        = null;\r
98                                 xpathDoc        = null;\r
99                                 documentContent = value;\r
100                         }\r
101                 }\r
102 \r
103                 public string DocumentSource\r
104                 {\r
105                         get\r
106                         {\r
107                                 if(documentSource != null)\r
108                                         return documentSource;\r
109                                 return String.Empty;\r
110                         }\r
111                         set\r
112                         {\r
113                                 document        = null;\r
114                                 documentContent = null;\r
115                                 xpathDoc        = null;\r
116                                 documentSource  = MapPathSecure (value);\r
117                         }\r
118                 }\r
119 \r
120                 public XslTransform Transform\r
121                 {\r
122                         get\r
123                         {\r
124                                 return transform;\r
125                         }\r
126                         set\r
127                         {\r
128                                 transformSource = null;\r
129                                 transform       = value;\r
130                         }\r
131                 }\r
132 \r
133                 public string TransformSource\r
134                 {\r
135                         get\r
136                         {\r
137                                 if(transformSource != null)\r
138                                         return transformSource;\r
139                                 return String.Empty;\r
140                         }\r
141                         set\r
142                         {\r
143                                 transform       = null;\r
144                                 transformSource = value;\r
145                         }\r
146                 }\r
147 \r
148                 public XsltArgumentList TransformArgumentList\r
149                 {\r
150                         get\r
151                         {\r
152                                 return transformArgumentList;\r
153                         }\r
154                         set\r
155                         {\r
156                                 transformArgumentList = value;\r
157                         }\r
158                 }\r
159 \r
160                 protected override void AddParsedSubObject(object obj)\r
161                 {\r
162                         if(obj is LiteralControl)\r
163                         {\r
164                                 DocumentContent = ((LiteralControl)obj).Text;\r
165                                 return;\r
166                         }\r
167                         throw new HttpException (HttpRuntime.FormatResourceString (\r
168                                                         "Cannot_Have_Children_of_Type",\r
169                                                         "Xml",\r
170                                                         GetType().Name));\r
171                 }\r
172 \r
173                 [MonoTODO("security")]\r
174                 private void LoadXpathDoc ()\r
175                 {\r
176                         if(documentContent != null && documentContent.Length > 0) {\r
177                                 xpathDoc = new XPathDocument (new StringReader (documentContent));\r
178                                 return;\r
179                         }\r
180 \r
181                         if (documentSource != null && documentSource.Length != 0) {\r
182                                 xpathDoc = new XPathDocument (MapPathSecure (documentSource));\r
183                                 return;\r
184                         }\r
185                 }\r
186 \r
187                 [MonoTODO("security")]\r
188                 private void LoadTransform ()\r
189                 {\r
190                         if (transform != null)\r
191                                 return;\r
192 \r
193                         if (transformSource != null && transformSource.Length != 0) {\r
194                                 transform = new XslTransform ();\r
195                                 transform.Load (MapPathSecure (transformSource));\r
196                         }\r
197                 }\r
198 \r
199                 protected override void Render(HtmlTextWriter output)\r
200                 {\r
201                         if(document == null)\r
202                         {\r
203                                 LoadXpathDoc();\r
204                         }\r
205 \r
206                         LoadTransform();\r
207                         if(document == null && xpathDoc == null)\r
208                         {\r
209                                 return;\r
210                         }\r
211                         if(transform == null)\r
212                         {\r
213                                 transform = defaultTransform;\r
214                         }\r
215                         if(document != null)\r
216                         {\r
217                                 Transform.Transform(document, transformArgumentList, output);\r
218                                 return;\r
219                         }\r
220                         Transform.Transform(xpathDoc, transformArgumentList, output);\r
221                 }\r
222         }\r
223 }\r
224 \r