2003-11-21 Andreas Nahr <ClassDevelopment@A-SoftTech.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Xml.cs
1 //
2 // System.Web.UI.WebControls.Xml.cs
3 //
4 // Authors:
5 //   Gaurav Vaish (gvaish@iitk.ac.in)
6 //   Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 //
9 // (c) 2002 Ximian, Inc. (http://www.ximian.com)
10 // (C) Gaurav Vaish (2002)
11 // (C) 2003 Andreas Nahr
12 //\r
13 \r
14 using System;\r
15 using System.ComponentModel;
16 using System.ComponentModel.Design;\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)]
28         [ControlBuilder (typeof (XmlBuilder))]
29         [Designer ("System.Web.UI.Design.WebControls.XmlDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]\r
30         public class Xml : Control\r
31         {\r
32                 private XmlDocument      document;\r
33                 private string           documentContent;\r
34                 private string           documentSource;\r
35                 private XslTransform     transform;\r
36                 private XsltArgumentList transformArgumentList;\r
37                 private string           transformSource;\r
38 \r
39                 private XPathDocument xpathDoc;\r
40 \r
41                 private static XslTransform defaultTransform;\r
42 \r
43                 static Xml()\r
44                 {\r
45                         XmlTextReader reader = new XmlTextReader(new StringReader("<xsl:stylesheet version='1.0' " +\r
46                                                                 "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>" +\r
47                                                                 "<xsl:template match=\"*\">" +\r
48                                                                 "<xsl:copy-of select=\".\"/>" +\r
49                                                                 "</xsl:template>" +\r
50                                                                 "</xsl:stylesheet>"));\r
51                         defaultTransform = new XslTransform();\r
52 #if NET_1_0
53                         defaultTransform.Load (reader);
54 #else
55                         defaultTransform.Load (reader, null, null);
56 #endif
57                 }\r
58 \r
59                 public Xml(): base()\r
60                 {\r
61                 }\r
62 \r
63                 [MonoTODO("security")]\r
64                 private void LoadXmlDoc ()\r
65                 {\r
66                         if (documentContent != null && documentContent.Length > 0) {\r
67                                 document = new XmlDocument();\r
68                                 document.LoadXml (documentContent);\r
69                                 return;\r
70                         }\r
71 \r
72                         if (documentSource != null && documentSource.Length != 0) {\r
73                                 document = new XmlDocument();\r
74                                 document.Load (documentSource);\r
75                         }\r
76                 }\r
77
78                 [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
79                 [WebSysDescription ("This is the XML document that is used for the XML Webcontrol.")]\r
80                 public XmlDocument Document\r
81                 {\r
82                         get\r
83                         {\r
84                                 if(document == null)\r
85                                         LoadXmlDoc();\r
86                                 return document;\r
87                         }\r
88                         set\r
89                         {\r
90                                 documentSource  = null;\r
91                                 documentContent = null;\r
92                                 xpathDoc        = null;\r
93                                 document        = value;\r
94                         }\r
95                 }\r
96
97                 [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
98                 [WebSysDescription ("The XML content that is transformed for the XML Webcontrol.")]\r
99                 public string DocumentContent\r
100                 {\r
101                         get\r
102                         {\r
103                                 return String.Empty;\r
104                         }\r
105                         set\r
106                         {\r
107                                 document        = null;\r
108                                 xpathDoc        = null;\r
109                                 documentContent = value;\r
110                         }\r
111                 }\r
112
113                 [DefaultValue (""), Bindable (true), WebCategory ("Behavior")]
114                 [Editor ("System.Web.UI.Design.XmlUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
115                 [WebSysDescription ("The URL or the source of the XML content that is transformed for the XML Webcontrol.")]\r
116                 public string DocumentSource\r
117                 {\r
118                         get\r
119                         {\r
120                                 if(documentSource != null)\r
121                                         return documentSource;\r
122                                 return String.Empty;\r
123                         }\r
124                         set\r
125                         {\r
126                                 document        = null;\r
127                                 documentContent = null;\r
128                                 xpathDoc        = null;\r
129                                 documentSource  = value;\r
130                         }\r
131                 }\r
132
133                 [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
134                 [WebSysDescription ("The XSL transform that is applied to this XML Webcontrol.")]\r
135                 public XslTransform Transform\r
136                 {\r
137                         get\r
138                         {\r
139                                 return transform;\r
140                         }\r
141                         set\r
142                         {\r
143                                 transformSource = null;\r
144                                 transform       = value;\r
145                         }\r
146                 }\r
147
148                 [DefaultValue (""), Bindable (true), WebCategory ("Behavior")]
149                 [Editor ("System.Web.UI.Design.XmlUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
150                 [WebSysDescription ("An URL specifying the source that is used for the XSL transformation.")]\r
151                 public string TransformSource\r
152                 {\r
153                         get\r
154                         {\r
155                                 if(transformSource != null)\r
156                                         return transformSource;\r
157                                 return String.Empty;\r
158                         }\r
159                         set\r
160                         {\r
161                                 transform       = null;\r
162                                 transformSource = value;\r
163                         }\r
164                 }\r
165
166                 [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
167                 [WebSysDescription ("Arguments that are used by the XSL Transform.")]\r
168                 public XsltArgumentList TransformArgumentList\r
169                 {\r
170                         get\r
171                         {\r
172                                 return transformArgumentList;\r
173                         }\r
174                         set\r
175                         {\r
176                                 transformArgumentList = value;\r
177                         }\r
178                 }\r
179 \r
180                 protected override void AddParsedSubObject(object obj)\r
181                 {\r
182                         if(obj is LiteralControl)\r
183                         {\r
184                                 DocumentContent = ((LiteralControl)obj).Text;\r
185                                 return;\r
186                         }\r
187                         throw new HttpException (HttpRuntime.FormatResourceString (\r
188                                                         "Cannot_Have_Children_of_Type",\r
189                                                         "Xml",\r
190                                                         GetType().Name));\r
191                 }\r
192 \r
193                 [MonoTODO("security")]\r
194                 private void LoadXpathDoc ()\r
195                 {\r
196                         if(documentContent != null && documentContent.Length > 0) {\r
197                                 xpathDoc = new XPathDocument (new StringReader (documentContent));\r
198                                 return;\r
199                         }\r
200 \r
201                         if (documentSource != null && documentSource.Length != 0) {\r
202                                 xpathDoc = new XPathDocument (MapPathSecure (documentSource));\r
203                                 return;\r
204                         }\r
205                 }\r
206 \r
207                 [MonoTODO("security")]\r
208                 private void LoadTransform ()\r
209                 {\r
210                         if (transform != null)\r
211                                 return;\r
212 \r
213                         if (transformSource != null && transformSource.Length != 0) {\r
214                                 transform = new XslTransform ();\r
215                                 transform.Load (MapPathSecure (transformSource));\r
216                         }\r
217                 }\r
218 \r
219                 protected override void Render(HtmlTextWriter output)\r
220                 {\r
221                         if(document == null)\r
222                         {\r
223                                 LoadXpathDoc();\r
224                         }\r
225 \r
226                         LoadTransform();\r
227                         if(document == null && xpathDoc == null)\r
228                         {\r
229                                 return;\r
230                         }\r
231                         if(transform == null)\r
232                         {\r
233                                 transform = defaultTransform;\r
234                         }\r
235                         if(document != null)\r
236                         {\r
237                                 Transform.Transform(document, transformArgumentList, output);\r
238                                 return;\r
239                         }\r
240                         Transform.Transform(xpathDoc, transformArgumentList, output);\r
241                 }\r
242         }\r
243 }\r
244 \r