2003-10-19 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.Compilation / AspComponentFoundry.cs
1 //\r
2 // System.Web.Compilation.AspComponentFoundry\r
3 //\r
4 // Authors:\r
5 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)\r
6 //\r
7 // (C) 2002,2003 Ximian, Inc (http://www.ximian.com)\r
8 //\r
9 using System;\r
10 using System.Collections;\r
11 using System.IO;\r
12 using System.Reflection;\r
13 \r
14 namespace System.Web.Compilation\r
15 {\r
16         internal class AspComponentFoundry\r
17         {\r
18                 private Hashtable foundries;\r
19 \r
20                 public AspComponentFoundry ()\r
21                 {\r
22                         foundries = new Hashtable (CaseInsensitiveHashCodeProvider.Default,\r
23                                                    CaseInsensitiveComparer.Default);\r
24 \r
25                         Assembly sw = typeof (AspComponentFoundry).Assembly;\r
26                         RegisterFoundry ("asp", sw, "System.Web.UI.WebControls");\r
27                         RegisterFoundry ("", "object", typeof (System.Web.UI.ObjectTag));\r
28                 }\r
29 \r
30                 public Type GetComponentType (string foundryName, string tag)\r
31                 {\r
32                         Foundry foundry = foundries [foundryName] as Foundry;\r
33                         if (foundry == null)\r
34                                 return null;\r
35 \r
36                         return foundry.GetType (tag);\r
37                 }\r
38 \r
39                 public void RegisterFoundry (string foundryName,\r
40                                                 Assembly assembly,\r
41                                                 string nameSpace)\r
42                 {\r
43                         AssemblyFoundry foundry = new AssemblyFoundry (assembly, nameSpace);\r
44                         InternalRegister (foundryName, foundry);\r
45                 }\r
46 \r
47                 public void RegisterFoundry (string foundryName,\r
48                                                 string tagName,\r
49                                                 Type type)\r
50                 {\r
51                         TagNameFoundry foundry = new TagNameFoundry (tagName, type);\r
52                         InternalRegister (foundryName, foundry);\r
53                 }\r
54 \r
55                 void InternalRegister (string foundryName, Foundry foundry)\r
56                 {\r
57                         object f = foundries [foundryName];\r
58                         if (f is CompoundFoundry) {\r
59                                 ((CompoundFoundry) f).Add (foundry);\r
60                         } else if (f == null || (f is AssemblyFoundry && foundry is AssemblyFoundry)) {\r
61                                 // If more than 1 namespace/assembly specified, the last one is used.\r
62                                 foundries [foundryName] = foundry;\r
63                         } else if (f != null) {\r
64                                 CompoundFoundry compound = new CompoundFoundry (foundryName);\r
65                                 compound.Add ((Foundry) f);\r
66                                 compound.Add (foundry);\r
67                                 foundries [foundryName] = compound;\r
68                         }\r
69                 }\r
70 \r
71                 public bool LookupFoundry (string foundryName)\r
72                 {\r
73                         return foundries.Contains (foundryName);\r
74                 }\r
75 \r
76                 abstract class Foundry\r
77                 {\r
78                         public abstract Type GetType (string componentName);\r
79                 }\r
80                 \r
81 \r
82                 class TagNameFoundry : Foundry\r
83                 {\r
84                         string tagName;\r
85                         Type type;\r
86 \r
87                         public TagNameFoundry (string tagName, Type type)\r
88                         {\r
89                                 this.tagName = tagName;\r
90                                 this.type = type;\r
91                         }\r
92 \r
93                         public override Type GetType (string componentName)\r
94                         {\r
95                                 if (0 != String.Compare (componentName, tagName, true))\r
96                                         return null;\r
97                                 \r
98                                 return type;\r
99                         }\r
100 \r
101                         public string TagName {\r
102                                 get { return tagName; }\r
103                         }\r
104                 }\r
105 \r
106                 class AssemblyFoundry : Foundry\r
107                 {\r
108                         string nameSpace;\r
109                         Assembly assembly;\r
110 \r
111                         public AssemblyFoundry (Assembly assembly, string nameSpace)\r
112                         {\r
113                                 this.assembly = assembly;\r
114                                 this.nameSpace = nameSpace;\r
115                         }\r
116 \r
117                         public override Type GetType (string componentName)\r
118                         {\r
119                                 return assembly.GetType (nameSpace + "." + componentName, true, true);\r
120                         }\r
121                 }\r
122 \r
123                 class CompoundFoundry : Foundry\r
124                 {\r
125                         AssemblyFoundry assemblyFoundry;\r
126                         Hashtable tagnames;\r
127                         string tagPrefix;\r
128 \r
129                         public CompoundFoundry (string tagPrefix)\r
130                         {\r
131                                 this.tagPrefix = tagPrefix;\r
132                                 tagnames = new Hashtable (CaseInsensitiveHashCodeProvider.Default,\r
133                                                            CaseInsensitiveComparer.Default);\r
134                         }\r
135 \r
136                         public void Add (Foundry foundry)\r
137                         {\r
138                                 if (foundry is AssemblyFoundry) {\r
139                                         assemblyFoundry = (AssemblyFoundry) foundry;\r
140                                         return;\r
141                                 }\r
142                                 \r
143                                 TagNameFoundry tn = (TagNameFoundry) foundry;\r
144                                 string tagName = tn.TagName;\r
145                                 if (tagnames.Contains (tagName)) {\r
146                                         string msg = String.Format ("{0}:{1} already registered.", tagPrefix, tagName);\r
147                                         throw new ApplicationException (msg);\r
148                                 }\r
149                                 tagnames.Add (tagName, foundry);\r
150                         }\r
151 \r
152                         public override Type GetType (string componentName)\r
153                         {\r
154                                 Type type = null;\r
155                                 if (assemblyFoundry != null) {\r
156                                         try {\r
157                                                 type = assemblyFoundry.GetType (componentName);\r
158                                                 return type;\r
159                                         } catch { }\r
160                                 }\r
161 \r
162                                 Foundry foundry = tagnames [componentName] as Foundry;\r
163                                 if (foundry == null) {\r
164                                         string msg = String.Format ("Type {0} not registered for prefix {1}",\r
165                                                                      componentName, tagPrefix);\r
166                                         throw new ApplicationException (msg);\r
167                                 }\r
168 \r
169                                 return foundry.GetType (componentName);\r
170                         }\r
171                 }\r
172         }\r
173 }\r
174 \r