2003-06-30 Gonzalo Paniagua Javier <gonzalo@ximian.com>
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Mon, 30 Jun 2003 14:56:44 +0000 (14:56 -0000)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Mon, 30 Jun 2003 14:56:44 +0000 (14:56 -0000)
* AdRotator.cs: fixed bug #44271 and a few others bugs. Mono-stylized.

svn path=/trunk/mcs/; revision=15756

mcs/class/System.Web/System.Web.UI.WebControls/AdRotator.cs
mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog

index 7b1e4bb91c4af41380dfb034b80e2e91fae767c7..30a2b2a18a2cd79be6936e838f00916d0785bbfc 100755 (executable)
-/**\r
- * Namespace: System.Web.UI.WebControls\r
- * Class:     AdRotator\r
- *\r
- * Author:  Gaurav Vaish\r
- * Maintainer: gvaish@iitk.ac.in\r
- * Implementation: yes\r
- * Contact: <gvaish@iitk.ac.in>\r
- * Status:  100%\r
- *\r
- * (C) Gaurav Vaish (2001)\r
- */\r
-\r
-using System;\r
-using System.IO;\r
-using System.Collections;\r
-using System.Collections.Specialized;\r
-using System.Web;\r
-using System.Web.Caching;\r
-using System.Web.UI;\r
-using System.Xml;\r
-using System.Web.Util;\r
-using System.ComponentModel;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
-       [DefaultEvent("AdCreated")]\r
-       [DefaultProperty("AdvertisementFile")]\r
-       //TODO: [Designer("??")]\r
-       [ToolboxData("<{0}:AdRotator runat=\"server\" Height=\"60px\" "\r
-                    + "Width=\"468\"></{0}:AdRotator>")]\r
-       public class AdRotator: WebControl\r
-       {\r
-\r
-               private string advertisementFile;\r
-               private static readonly object AdCreatedEvent = new object();\r
-\r
-               // Will be set values during (On)PreRender-ing\r
-               private string alternateText;\r
-               private string imageUrl;\r
-               private string navigateUrl;\r
-\r
-               private string fileDirectory;\r
-\r
-               class AdRecord\r
-               {\r
-                       public IDictionary adProps;\r
-                       public int         hits; // or impressions or clicks\r
-                       public string      keyword;\r
-\r
-                       public AdRecord(IDictionary adProps)\r
-                       {\r
-                               this.adProps = adProps;\r
-                               hits         = 0;\r
-                               keyword      = String.Empty;\r
-                       }\r
-               }\r
-\r
-/*\r
- * Loading / Saving data from/to ad file and all the manipulations wrt to the URL...\r
- * are incorporated by the following functions.\r
- * GetData(string)\r
- * LoadAdFile(string)\r
- * IsAdMatching(AdRecord)\r
- * ResolveAdUrl(string)\r
- * SelectAd()\r
- * The exact control flow will be detailed. Let me first write the functions\r
- */\r
-\r
-               private AdRecord[] LoadAdFile(string file)\r
-               {\r
-                       Stream      fStream;\r
-                       ArrayList   list;\r
-                       XmlReader   reader;\r
-                       XmlDocument document;\r
-                       XmlNode     topNode, innerNode;\r
-                       IDictionary hybridDict = null;\r
-                       AdRecord[]  adsArray = null;\r
-                       try\r
-                       {\r
-                               fStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read);\r
-                       } catch(Exception e)\r
-                       {\r
-                               throw new HttpException("AdRotator: Unable to open file");\r
-                       }\r
-                       try\r
-                       {\r
-                               list = new ArrayList();\r
-                               reader = new XmlTextReader(fStream);\r
-                               document = new XmlDocument();\r
-                               document.Load(reader);\r
-                               if(document.DocumentElement!=null)\r
-                               {\r
-                                       if(document.DocumentElement.LocalName=="Advertisements")\r
-                                       {\r
-                                               topNode = document.DocumentElement.FirstChild;\r
-                                               while(topNode!=null)\r
-                                               {\r
-                                                       if(topNode.LocalName=="Ad")\r
-                                                       {\r
-                                                               innerNode = topNode.FirstChild;\r
-                                                               while(innerNode!=null)\r
-                                                               {\r
-                                                                       if(innerNode.NodeType==XmlNodeType.Element)\r
-                                                                       {\r
-                                                                               if(hybridDict==null)\r
-                                                                               {\r
-                                                                                       hybridDict = new HybridDictionary();\r
-                                                                               }\r
-                                                                               hybridDict.Add(innerNode.LocalName, innerNode.InnerText);\r
-                                                                       }\r
-                                                                       innerNode = innerNode.NextSibling;\r
-                                                               }\r
-                                                               if (hybridDict!=null) {\r
-                                                                       list.Add (hybridDict);\r
-                                                                       hybridDict = null;\r
-                                                               }\r
-                                                       }\r
-                                                       topNode = topNode.NextSibling;\r
-                                               }\r
-                                       }\r
-                               }\r
-                               if(list.Count>0)\r
-                               {\r
-                                       adsArray = new AdRecord[list.Count];\r
-                                       for(int i=0; i < list.Count; i++)\r
-                                       {\r
-                                               adsArray[i] = new AdRecord((IDictionary)list[i]);\r
-                                       }\r
-                               }\r
-                       } catch(Exception e)\r
-                       {\r
-                               throw new HttpException("AdRotator_Parse_Error" + file);\r
-                       } finally\r
-                       {\r
-                               fStream.Close();\r
-                       }\r
-                       if(adsArray == null)\r
-                       {\r
-                               throw new HttpException("AdRotator_No_Advertisements_Found");\r
-                       }\r
-                       return adsArray;\r
-               }\r
-\r
-               [MonoTODO("CacheDependency does nothing")]\r
-               private AdRecord[] GetData(string file)\r
-               {\r
-                       string physPath = MapPathSecure(file);\r
-                       string AdKey = "AdRotatorCache: " + physPath;\r
-                       fileDirectory = UrlUtils.GetDirectory(UrlUtils.Combine(TemplateSourceDirectory, file));\r
-                       Cache cache = HttpRuntime.Cache;\r
-                       AdRecord[] records = (AdRecord[])cache[AdKey];\r
-                       if(records==null)\r
-                       {\r
-                               records = LoadAdFile(physPath);\r
-                               if(records==null)\r
-                               {\r
-                                       return null;\r
-                               }\r
-                               cache.Insert(AdKey, records, new CacheDependency(physPath));\r
-                       }\r
-                       return records;\r
-               }\r
-\r
-               private IDictionary SelectAd()\r
-               {\r
-                       AdRecord[] records = GetData(AdvertisementFile);\r
-                       if(records!=null && records.Length!=0)\r
-                       {\r
-                               int impressions = 0;\r
-                               for(int i=0 ; i < records.Length; i++)\r
-                               {\r
-                                       if(IsAdMatching(records[i]))\r
-                                               impressions += records[i].hits;\r
-                               }\r
-                               if(impressions!=0)\r
-                               {\r
-                                       int rnd = (new Random()).Next(impressions) + 1;\r
-                                       int counter = 0;\r
-                                       int index = 0;\r
-                                       for(int i=0; i < records.Length; i++)\r
-                                       {\r
-                                               if(IsAdMatching(records[i]))\r
-                                               {\r
-                                                       if(rnd <= (counter + records[i].hits))\r
-                                                       {\r
-                                                               index = i;\r
-                                                               break;\r
-                                                       }\r
-                                                       counter += records[i].hits;\r
-                                               }\r
-                                       }\r
-                                       return records[index].adProps;\r
-                               }\r
-                               //FIXME: the line below added. Where should i init hits to make\r
-                               //impressions not be 0?\r
-                               return records [0].adProps;\r
-                       }\r
-                       return null;\r
-               }\r
-\r
-               private bool IsAdMatching(AdRecord currAd)\r
-               {\r
-                       if (KeywordFilter != String.Empty)\r
-                               return (0 == String.Compare (currAd.keyword, KeywordFilter, true));\r
-\r
-                       return true;\r
-               }\r
-\r
-               private string ResolveAdUrl(string relativeUrl)\r
-               {\r
-                       if(relativeUrl.Length==0 || !UrlUtils.IsRelativeUrl(relativeUrl))\r
-                               return relativeUrl;\r
-                       string fullUrl = String.Empty;\r
-                       if(fileDirectory != null)\r
-                               fullUrl = fileDirectory;\r
-                       if(fullUrl.Length == 0)\r
-                               fullUrl = TemplateSourceDirectory;\r
-                       if(fullUrl.Length == 0)\r
-                               return relativeUrl;\r
-                       return (fullUrl + relativeUrl);\r
-               }\r
-\r
-               [WebCategory("Action")]\r
-               [WebSysDescription("AdRotator_OnAdCreated")]\r
-               public event AdCreatedEventHandler AdCreated\r
-               {\r
-                       add\r
-                       {\r
-                               Events.AddHandler(AdCreatedEvent, value);\r
-                       }\r
-                       remove\r
-                       {\r
-                               Events.RemoveHandler(AdCreatedEvent, value);\r
-                       }\r
-               }\r
-\r
-               public AdRotator(): base()\r
-               {\r
-                       advertisementFile = string.Empty;\r
-                       fileDirectory     = null;\r
-               }\r
-\r
-               [Bindable(true)]\r
-               [DefaultValue("")]\r
-               //[Editor("??")]\r
-               [WebCategory("Behaviour")]\r
-               [WebSysDescription("AdRotator_AdvertisementFile")]\r
-               public string AdvertisementFile\r
-               {\r
-                       get\r
-                       {\r
-                               return advertisementFile;\r
-                       }\r
-                       set\r
-                       {\r
-                               advertisementFile = value;\r
-                       }\r
-               }\r
-\r
-               public override FontInfo Font\r
-               {\r
-                       get\r
-                       {\r
-                               return Font;\r
-                       }\r
-               }\r
-\r
-               [Bindable(true)]\r
-               [DefaultValue("")]\r
-               [WebCategory("Behaviour")]\r
-               [WebSysDescription("AdRotator_KeywordFilter")]\r
-               public string KeywordFilter\r
-               {\r
-                       get\r
-                       {\r
-                               object o = ViewState["KeywordFilter"];\r
-                               if(o!=null)\r
-                                       return (string)o;\r
-                               return String.Empty;\r
-                       }\r
-                       set\r
-                       {\r
-                               if(value!=null)\r
-                                       ViewState["KeywordFilter"] = value.Trim();\r
-                       }\r
-               }\r
-\r
-               [Bindable(true)]\r
-               [DefaultValue("")]\r
-               [TypeConverter(typeof(TargetConverter))]\r
-               [WebCategory("Behaviour")]\r
-               [WebSysDescription("AdRotator_Target")]\r
-               public string Target\r
-               {\r
-                       get\r
-                       {\r
-                               object o = ViewState["Target"];\r
-                               if(o!=null)\r
-                                       return (string)o;\r
-                               return String.Empty;\r
-                       }\r
-                       set\r
-                       {\r
-                               ViewState["Target"] = value;\r
-                       }\r
-               }\r
-\r
-               protected override ControlCollection CreateControlCollection()\r
-               {\r
-                       return new EmptyControlCollection(this);\r
-               }\r
-\r
-               protected virtual void OnAdCreated(AdCreatedEventArgs e)\r
-               {\r
-                       if(Events!=null)\r
-                       {\r
-                               AdCreatedEventHandler aceh = (AdCreatedEventHandler)(Events[AdCreatedEvent]);\r
-                               if(aceh!=null)\r
-                                       aceh(this, e);\r
-                       }\r
-               }\r
-\r
-               protected override void OnPreRender(EventArgs e)\r
-               {\r
-                       if(AdvertisementFile!=String.Empty)\r
-                       {\r
-                               AdCreatedEventArgs acea = new AdCreatedEventArgs(SelectAd());\r
-                               imageUrl      = acea.ImageUrl;\r
-                               navigateUrl   = acea.NavigateUrl;\r
-                               alternateText = acea.AlternateText;\r
-                       }\r
-               }\r
-\r
-               protected override void Render(HtmlTextWriter writer)\r
-               {\r
-                       HyperLink hLink = new HyperLink();\r
-                       Image adImage = new Image();\r
-                       foreach(IEnumerable current in Attributes.Keys)\r
-                       {\r
-                               hLink.Attributes[(string)current] = Attributes[(string)current];\r
-                       }\r
-                       if(ID != null && ID.Length > 0)\r
-                               hLink.ID = ID;\r
-                       hLink.Target    = Target;\r
-                       hLink.AccessKey = AccessKey;\r
-                       hLink.Enabled   = Enabled;\r
-                       hLink.TabIndex  = TabIndex;\r
-                       if (navigateUrl != null && navigateUrl.Length != 0)\r
-                               hLink.NavigateUrl = ResolveAdUrl (navigateUrl);\r
-                       hLink.RenderBeginTag(writer);\r
-                       if(ControlStyleCreated)\r
-                       {\r
-                               adImage.ApplyStyle(ControlStyle);\r
-                       }\r
-                       if(imageUrl!=null && imageUrl.Length > 0)\r
-                               adImage.ImageUrl = ResolveAdUrl(imageUrl);\r
-                       adImage.AlternateText = alternateText;\r
-                       adImage.ToolTip       = ToolTip;\r
-                       adImage.RenderControl(writer);\r
-                       hLink.RenderEndTag(writer);\r
-               }\r
-       }\r
-}\r
+/**
+ * Namespace: System.Web.UI.WebControls
+ * Class:     AdRotator
+ *
+ * Authors:  Gaurav Vaish, Gonzalo Paniagua
+ * Maintainer: gvaish@iitk.ac.in, gonzalo@ximian.com
+ * Implementation: yes
+ * Contact: <gvaish@iitk.ac.in>
+ * Status:  100%
+ *
+ * (C) Gaurav Vaish (2001)
+ * (C) 2003 Ximian, Inc. (http://www.ximian.com)
+ */
+
+using System;
+using System.IO;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Web;
+using System.Web.Caching;
+using System.Web.UI;
+using System.Xml;
+using System.Web.Util;
+using System.ComponentModel;
+
+namespace System.Web.UI.WebControls
+{
+       [DefaultEvent("AdCreated")]
+       [DefaultProperty("AdvertisementFile")]
+       //TODO: [Designer("??")]
+       [ToolboxData("<{0}:AdRotator runat=\"server\" Height=\"60px\" "
+       + "Width=\"468\"></{0}:AdRotator>")]
+       public class AdRotator: WebControl
+       {
+               string advertisementFile;
+               static readonly object AdCreatedEvent = new object();
+
+               // Will be set values during (On)PreRender-ing
+               string alternateText;
+               string imageUrl;
+               string navigateUrl;
+               string fileDirectory;
+               Random random;
+
+               public AdRotator ()
+               {
+                       advertisementFile = "";
+                       fileDirectory     = null;
+               }
+
+               AdRecord[] LoadAdFile (string file)
+               {
+                       Stream fStream;
+                       try {
+                               fStream = new FileStream (file, FileMode.Open, FileAccess.Read, FileShare.Read);
+                       } catch (Exception e) {
+                               throw new HttpException("AdRotator: Unable to open file", e);
+                       }
+
+                       ArrayList list = new ArrayList ();
+                       try {
+                               IDictionary hybridDict = null;
+                               XmlDocument document = new XmlDocument ();
+                               document.Load (fStream);
+
+                               XmlElement docElem = document.DocumentElement;
+
+                               if (docElem == null)
+                                       throw new HttpException ("No advertisements found");
+
+                               if (docElem.LocalName != "Advertisements")
+                                       throw new HttpException ("No advertisements found: invalid document element");
+
+                               XmlNode node = docElem.FirstChild;
+                               while (node != null) {
+                                       if (node.LocalName == "Ad") {
+                                               XmlNode innerNode = node.FirstChild;
+                                               while (innerNode != null) {
+                                                       if (node.NodeType == XmlNodeType.Element) {
+                                                               if (hybridDict == null)
+                                                                       hybridDict = new HybridDictionary ();
+
+                                                               hybridDict.Add (innerNode.LocalName, innerNode.InnerText);
+                                                       }
+                                                       innerNode = innerNode.NextSibling;
+                                               }
+
+                                               if (hybridDict != null) {
+                                                       list.Add (hybridDict);
+                                                       hybridDict = null;
+                                               }
+                                       }
+                                       node = node.NextSibling;
+                               }
+
+                       } catch(Exception e) {
+                               throw new HttpException("Parse error:" + file, e);
+                       } finally {
+                               if (fStream != null)
+                                       fStream.Close();
+                       }
+
+                       if (list.Count == 0)
+                               throw new HttpException ("No advertisements found");
+
+                       AdRecord [] adsArray = new AdRecord [list.Count];
+                       int count = list.Count;
+                       for (int i = 0; i < count; i++)
+                               adsArray [i] = new AdRecord ((IDictionary) list [i]);
+
+                       return adsArray;
+               }
+
+               AdRecord [] GetData (string file)
+               {
+                       string physPath = MapPathSecure (file);
+                       string AdKey = "AdRotatorCache: " + physPath;
+                       fileDirectory = UrlUtils.GetDirectory (UrlUtils.Combine (TemplateSourceDirectory, file));
+                       Cache cache = HttpRuntime.Cache;
+                       AdRecord[] records = (AdRecord[]) cache [AdKey];
+                       if (records == null) {
+                               records = LoadAdFile (physPath);
+                               cache.Insert (AdKey, records, new CacheDependency (physPath));
+                       }
+
+                       return records;
+               }
+
+               IDictionary SelectAd ()
+               {
+                       AdRecord[] records = GetData (AdvertisementFile);
+                       if (records == null || records.Length ==0)
+                               return null;
+
+                       int impressions = 0;
+                       int rlength = records.Length;
+                       for (int i=0 ; i < rlength; i++) {
+                               if (IsAdMatching (records [i]))
+                                       impressions += records [i].Hits;
+                       }
+
+                       if (impressions == 0)
+                               return null;
+
+                       if (random == null)
+                               random = new Random ();
+
+                       int rnd = random.Next (impressions) + 1;
+                       int counter = 0;
+                       int index = 0;
+                       for (int i = 0; i < rlength; i++) {
+                               if(IsAdMatching(records[i])) {
+                                       if (rnd <= (counter + records [i].Hits)) {
+                                               index = i;
+                                               break;
+                                       }
+                                       counter += records [i].Hits;
+                               }
+                       }
+
+                       return records [index].Properties;
+               }
+
+               private bool IsAdMatching (AdRecord currAd)
+               {
+                       if (KeywordFilter != String.Empty)
+                               return (0 == String.Compare (currAd.Keyword, KeywordFilter, true));
+
+                       return true;
+               }
+
+               private string ResolveAdUrl (string relativeUrl)
+               {
+                       if (relativeUrl.Length==0 || !UrlUtils.IsRelativeUrl (relativeUrl))
+                               return relativeUrl;
+
+                       string fullUrl;
+                       if (fileDirectory != null)
+                               fullUrl = fileDirectory;
+                       else
+                               fullUrl = TemplateSourceDirectory;
+
+                       if (fullUrl.Length == 0)
+                               return relativeUrl;
+
+                       return UrlUtils.Combine (fullUrl, relativeUrl);
+               }
+
+               [WebCategory("Action")]
+               [WebSysDescription("AdRotator_OnAdCreated")]
+               public event AdCreatedEventHandler AdCreated {
+                       add { Events.AddHandler (AdCreatedEvent, value); }
+                       remove { Events.RemoveHandler (AdCreatedEvent, value); }
+               }
+
+               [Bindable(true)]
+               [DefaultValue("")]
+               //[Editor("??")]
+               [WebCategory("Behaviour")]
+               [WebSysDescription("AdRotator_AdvertisementFile")]
+               public string AdvertisementFile {
+                       get { return ((advertisementFile != null) ? advertisementFile : ""); }
+                       set { advertisementFile = value; }
+               }
+
+               public override FontInfo Font {
+                       get { return base.Font; }
+               }
+
+               [Bindable(true)]
+               [DefaultValue("")]
+               [WebCategory("Behaviour")]
+               [WebSysDescription("AdRotator_KeywordFilter")]
+               public string KeywordFilter {
+                       get {
+                               object o = ViewState ["KeywordFilter"];
+                               if (o != null)
+                                       return (string) o;
+
+                               return String.Empty;
+                       }
+                       set {
+                               if(value != null)
+                                       ViewState ["KeywordFilter"] = value.Trim ();
+                       }
+               }
+
+               [Bindable(true)]
+               [DefaultValue("")]
+               [TypeConverter(typeof(TargetConverter))]
+               [WebCategory("Behaviour")]
+               [WebSysDescription("AdRotator_Target")]
+               public string Target {
+                       get {
+                               object o = ViewState ["Target"];
+                               if (o != null)
+                                       return (string) o;
+
+                               return "_top";
+                       }
+                       set {
+                               ViewState["Target"] = value;
+                       }
+               }
+
+               protected override ControlCollection CreateControlCollection ()
+               {
+                       return new EmptyControlCollection (this);
+               }
+
+               protected virtual void OnAdCreated (AdCreatedEventArgs e)
+               {
+                       if (Events == null)
+                               return;
+
+                       AdCreatedEventHandler aceh = (AdCreatedEventHandler) Events [AdCreatedEvent];
+                       if (aceh != null)
+                               aceh (this, e);
+               }
+
+               protected override void OnPreRender (EventArgs e)
+               {
+                       if(AdvertisementFile == String.Empty)
+                               return;
+
+                       AdCreatedEventArgs acea = new AdCreatedEventArgs (SelectAd ());
+                       imageUrl = acea.ImageUrl;
+                       navigateUrl = acea.NavigateUrl;
+                       alternateText = acea.AlternateText;
+               }
+
+               protected override void Render (HtmlTextWriter writer)
+               {
+                       HyperLink hLink = new HyperLink ();
+                       Image adImage = new Image();
+                       foreach (string current in Attributes.Keys)
+                               hLink.Attributes [current] = Attributes [current];
+
+                       if (ID != null && ID.Length > 0)
+                               hLink.ID = ID;
+
+                       hLink.Target = Target;
+                       hLink.AccessKey = AccessKey;
+                       hLink.Enabled  = Enabled;
+                       hLink.TabIndex = TabIndex;
+                       if (navigateUrl != null && navigateUrl.Length != 0)
+                               hLink.NavigateUrl = ResolveAdUrl (navigateUrl);
+
+                       hLink.RenderBeginTag (writer);
+                       if (ControlStyleCreated)
+                               adImage.ApplyStyle(ControlStyle);
+
+                       if(imageUrl!=null && imageUrl.Length > 0)
+                               adImage.ImageUrl = ResolveAdUrl (imageUrl);
+
+                       adImage.AlternateText = alternateText;
+                       adImage.ToolTip = ToolTip;
+                       adImage.RenderControl (writer);
+                       hLink.RenderEndTag (writer);
+               }
+
+               class AdRecord
+               {
+                       public IDictionary Properties;
+                       public int Hits; // or impressions or clicks
+                       public string Keyword;
+
+                       public AdRecord (IDictionary adProps)
+                       {
+                               this.Properties = adProps;
+                               Keyword = Properties ["Keyword"] as string;
+                               if (Keyword == null)
+                                       Keyword = "";
+
+                               string imp = Properties ["Impressions"] as string;
+                               Hits = 1;
+                               if (imp != null) {
+                                       try {
+                                               Hits = Int32.Parse (imp);
+                                       } catch {
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
index b9b7783bec2e4d9f0e4ec31d409f7ee48442c627..b9d06003a834ccb3284c1054cba18d9faf7e4e6b 100644 (file)
@@ -1,4 +1,8 @@
 
+2003-06-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * AdRotator.cs: fixed bug #44271 and a few others bugs. Mono-stylized.
+
 2003-06-26  Gonzalo Paniagua Javier <gonzalo@ximian.com>
 
        * ListControl.cs: save viewstate data when any of the 3 values is not