2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.XML / System.Xml.Xsl / XsltArgumentList.cs
1 // System.Xml.Xsl.XsltArgumentList\r
2 //\r
3 // Author: Tim Coleman <tim@timcoleman.com>\r
4 // (C) Copyright 2002 Tim Coleman\r
5
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining
8 // a copy of this software and associated documentation files (the
9 // "Software"), to deal in the Software without restriction, including
10 // without limitation the rights to use, copy, modify, merge, publish,
11 // distribute, sublicense, and/or sell copies of the Software, and to
12 // permit persons to whom the Software is furnished to do so, subject to
13 // the following conditions:
14 // 
15 // The above copyright notice and this permission notice shall be
16 // included in all copies or substantial portions of the Software.
17 // 
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 //
26 \r
27 using System;\r
28 using System.Collections;\r
29 using System.Xml;\r
30 using System.Xml.XPath;\r
31 \r
32 namespace System.Xml.Xsl\r
33 {\r
34         public sealed class XsltArgumentList\r
35         {\r
36                 #region Fields\r
37 \r
38                 internal Hashtable extensionObjects;\r
39                 internal Hashtable parameters;\r
40 \r
41                 #endregion\r
42 \r
43                 #region Constructors\r
44 \r
45                 public XsltArgumentList ()\r
46                 {\r
47                         extensionObjects = new Hashtable ();\r
48                         parameters = new Hashtable ();\r
49                 }\r
50 \r
51                 #endregion\r
52 \r
53                 #region Methods\r
54 \r
55                 public void AddExtensionObject (string namespaceUri, object extension)\r
56                 {\r
57                         if (namespaceUri == null)\r
58                                 throw new ArgumentException ("The namespaceUri is a null reference.");\r
59                         if (namespaceUri == "http://www.w3.org/1999/XSL/Transform")\r
60                                 throw new ArgumentException ("The namespaceUri is http://www.w3.org/1999/XSL/Transform.");\r
61                         if (extensionObjects.Contains (namespaceUri))\r
62                                 throw new ArgumentException ("The namespaceUri already has an extension object associated with it.");\r
63 \r
64                         extensionObjects [namespaceUri] = extension;\r
65                 }\r
66 \r
67                 public void AddParam (string name, string namespaceUri, object parameter)\r
68                 {\r
69 \r
70                         if (namespaceUri == null)\r
71                                 throw new ArgumentException ("The namespaceUri is a null reference.");\r
72 \r
73                         if (namespaceUri == "http://www.w3.org/1999/XSL/Transform")\r
74                                 throw new ArgumentException ("The namespaceUri is http://www.w3.org/1999/XSL/Transform.");\r
75 \r
76                         if (name == null)\r
77                                 throw new ArgumentException ("The parameter name is a null reference.");\r
78 \r
79 \r
80                         // TODO:\r
81                         // verify that the name is a valid name according to\r
82                         // the W3C XML specification\r
83 \r
84                         XmlQualifiedName qName = new XmlQualifiedName (name, namespaceUri);\r
85 \r
86                         if (parameters.Contains (qName))\r
87                                 throw new ArgumentException ("The namespaceUri already has a parameter associated with it.");\r
88 \r
89                         parameter = ValidateParam (parameter);\r
90 \r
91                         parameters [qName] = parameter;\r
92                 }\r
93 \r
94                 public void Clear ()\r
95                 {\r
96                         extensionObjects.Clear ();\r
97                         parameters.Clear ();\r
98                 }\r
99 \r
100                 public object GetExtensionObject (string namespaceUri)\r
101                 {\r
102                         return extensionObjects [namespaceUri];\r
103                 }\r
104 \r
105                 public object GetParam (string name, string namespaceUri)\r
106                 {\r
107                         if (name == null)\r
108                                 throw (new ArgumentException ("The parameter name is a null reference."));\r
109 \r
110                         XmlQualifiedName qName = new XmlQualifiedName (name, namespaceUri);\r
111                         return parameters [qName];\r
112                 }\r
113 \r
114                 public object RemoveExtensionObject (string namespaceUri)\r
115                 {\r
116                         object extensionObject = this.GetExtensionObject (namespaceUri);\r
117                         extensionObjects.Remove (namespaceUri);\r
118                         return extensionObject;\r
119                 }\r
120 \r
121                 public object RemoveParam (string name, string namespaceUri)\r
122                 {\r
123                         XmlQualifiedName qName = new XmlQualifiedName (name, namespaceUri);\r
124                         object parameter = this.GetParam (name, namespaceUri);\r
125                         parameters.Remove (qName);\r
126                         return parameter;\r
127                 }\r
128 \r
129                 private object ValidateParam (object parameter)\r
130                 {\r
131                         if (parameter is string)                return parameter;\r
132                         if (parameter is bool)                  return parameter;\r
133                         if (parameter is double)                return parameter;\r
134                         if (parameter is XPathNavigator)        return parameter;\r
135                         if (parameter is XPathNodeIterator)     return parameter;\r
136 \r
137                         if (parameter is Int16)                 return (double) (Int16) parameter;\r
138                         if (parameter is UInt16)                return (double) (UInt16) parameter;\r
139                         if (parameter is Int32)                 return (double) (Int32) parameter;\r
140                         if (parameter is Int64)                 return (double) (Int64) parameter;\r
141                         if (parameter is UInt64)                return (double) (UInt64) parameter;\r
142                         if (parameter is Single)                return (double) (Single) parameter;\r
143                         if (parameter is decimal)               return (double) (decimal) parameter;\r
144 \r
145                         return parameter.ToString ();\r
146                 }\r
147 \r
148                 #endregion\r
149         }\r
150 }\r