2 // System.Web.UI.WebControls.XmlDataSource
5 // Ben Maurer (bmaurer@users.sourceforge.net)
11 using System.Collections;
12 using System.Collections.Specialized;
16 using System.ComponentModel;
19 namespace System.Web.UI.WebControls {
20 public class XmlDataSource : HierarchicalDataSourceControl, IDataSource, IListSource {
23 event EventHandler IDataSource.DataSourceChanged {
24 add { ((IHierarchicalDataSource)this).DataSourceChanged += value; }
25 remove { ((IHierarchicalDataSource)this).DataSourceChanged -= value; }
28 static object EventTransforming = new object ();
29 public event EventHandler Transforming {
30 add { Events.AddHandler (EventTransforming, value); }
31 remove { Events.RemoveHandler (EventTransforming, value); }
34 protected virtual void OnTransforming (EventArgs e)
36 EventHandler eh = Events [EventTransforming] as EventHandler;
41 XmlDataDocument xmlDataDocument;
42 public XmlDataDocument GetXmlDataDocument ()
44 if (xmlDataDocument == null) {
45 xmlDataDocument = new XmlDataDocument ();
46 LoadXmlDataDocument (xmlDataDocument);
48 return xmlDataDocument;
51 [MonoTODO ("XSLT, schema")]
52 void LoadXmlDataDocument (XmlDataDocument document)
54 if (Transform == "" && TransformFile == "") {
56 document.Load (MapPathSecure (DataFile));
58 document.LoadXml (Data);
60 throw new NotImplementedException ("XSLT transform not implemented");
67 throw new InvalidOperationException ();
69 xmlDataDocument.Save (MapPathSecure (DataFile));
74 return !ReadOnly && Transform == "" && TransformFile == "" && DataFile != "";
79 protected override void LoadViewState (object savedState)
81 base.LoadViewState (savedState);
85 protected override object SaveViewState ()
87 return base.SaveViewState ();
91 protected override void TrackViewState ()
93 base.TrackViewState ();
96 protected override HierarchicalDataSourceView GetHierarchicalView (string viewPath)
98 XmlNode doc = this.GetXmlDataDocument ();
99 XmlNodeList ret = null;
101 if (viewPath != "") {
102 XmlNode n = doc.SelectSingleNode (viewPath);
105 } else if (XPath != "") {
106 ret = doc.SelectNodes (XPath);
108 ret = doc.ChildNodes;
111 return new XmlHierarchicalDataSourceView (ret);
114 IList IListSource.GetList ()
116 return ListSourceHelper.GetList (this);
119 bool IListSource.ContainsListCollection {
120 get { return ListSourceHelper.ContainsListCollection (this); }
123 DataSourceView IDataSource.GetView (string viewName)
126 viewName = "DefaultView";
128 return new XmlDataSourceView (this, viewName, GetXmlDataDocument ().SelectNodes (XPath != "" ? XPath : "."));
131 ICollection IDataSource.GetViewNames ()
133 return new string [] { "DefaultView" };
136 public virtual bool AutoSave {
138 object ret = ViewState ["AutoSave"];
139 return ret != null ? (bool)ret : true;
142 ViewState ["AutoSave"] = value;
146 // TODO: stub these apis
147 //protected virtual FileDataSourceCache Cache { get; }
148 //public virtual int CacheDuration { get; set; }
149 //public virtual DataSourceCacheExpiry CacheExpirationPolicy { get; set; }
150 //public virtual string CacheKeyDependency { get; set; }
151 //public virtual bool EnableCaching { get; set; }
152 public virtual string Data {
154 string ret = ViewState ["Data"] as string;
155 return ret != null ? ret : "";
159 ViewState ["Data"] = value;
160 xmlDataDocument = null;
161 OnDataSourceChanged(EventArgs.Empty);
166 public virtual string DataFile {
168 string ret = ViewState ["DataFile"] as string;
169 return ret != null ? ret : "";
172 if (DataFile != value) {
173 ViewState ["DataFile"] = value;
174 xmlDataDocument = null;
175 OnDataSourceChanged(EventArgs.Empty);
180 public virtual bool ReadOnly {
182 object ret = ViewState ["ReadOnly"];
183 return ret != null ? (bool)ret : true;
186 ViewState ["ReadOnly"] = value;
190 public virtual string Schema {
192 string ret = ViewState ["Schema"] as string;
193 return ret != null ? ret : "";
196 if (Schema != value) {
197 ViewState ["Schema"] = value;
198 xmlDataDocument = null;
199 OnDataSourceChanged(EventArgs.Empty);
204 public virtual string SchemaFile {
206 string ret = ViewState ["SchemaFile"] as string;
207 return ret != null ? ret : "";
210 if (SchemaFile != value) {
211 ViewState ["SchemaFile"] = value;
212 xmlDataDocument = null;
213 OnDataSourceChanged(EventArgs.Empty);
218 XsltArgumentList transformArgumentList;
219 public virtual XsltArgumentList TransformArgumentList {
220 get { return transformArgumentList; }
221 set { transformArgumentList = value; }
224 public virtual string Transform {
226 string ret = ViewState ["Transform"] as string;
227 return ret != null ? ret : "";
230 if (Transform != value) {
231 ViewState ["Transform"] = value;
232 xmlDataDocument = null;
233 OnDataSourceChanged(EventArgs.Empty);
238 public virtual string TransformFile {
240 string ret = ViewState ["TransformFile"] as string;
241 return ret != null ? ret : "";
244 if (TransformFile != value) {
245 ViewState ["TransformFile"] = value;
246 xmlDataDocument = null;
247 OnDataSourceChanged(EventArgs.Empty);
252 public virtual string XPath {
254 string ret = ViewState ["XPath"] as string;
255 return ret != null ? ret : "";
258 if (XPath != value) {
259 ViewState ["XPath"] = value;
260 OnDataSourceChanged(EventArgs.Empty);