2003-01-07 Gonzalo Paniagua Javier <gonzalo@ximian.com>
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Tue, 7 Jan 2003 00:14:04 +0000 (00:14 -0000)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Tue, 7 Jan 2003 00:14:04 +0000 (00:14 -0000)
* AspComponentFoundry.cs: reworked to allow same prefix for multiple
controls. You can register 1 assembly plus any number of user controls
under the same prefix.

* AspGenerator.cs: don't add duplicate 'using' for the same namespace.
Hack to allow @Register access to assemblies in other places than bin
directory.

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

mcs/class/System.Web/System.Web.Compilation/AspComponentFoundry.cs
mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs
mcs/class/System.Web/System.Web.Compilation/ChangeLog

index 081790314b67bf4b173819ecfb9fbeed59d44f24..e8e394074b79e74210eb3fbe8a4ce688b6944816 100644 (file)
@@ -27,7 +27,7 @@ namespace System.Web.Compilation
 \r
                public AspComponent MakeAspComponent (string foundryName, string componentName, Tag tag)\r
                {\r
-                       InternalFoundry foundry = foundries [foundryName] as InternalFoundry;\r
+                       Foundry foundry = foundries [foundryName] as Foundry;\r
                        if (foundry == null)\r
                                throw new ApplicationException ("Foundry not found: " + foundryName);\r
 \r
@@ -38,17 +38,34 @@ namespace System.Web.Compilation
                                                string assemblyName,\r
                                                string nameSpace)\r
                {\r
-                       InternalFoundry foundry = new InternalFoundry (assemblyName, nameSpace, null);\r
-                       foundries.Add (foundryName, foundry);\r
+                       AssemblyFoundry foundry = new AssemblyFoundry (assemblyName, nameSpace);\r
+                       InternalRegister (foundryName, foundry);\r
                }\r
 \r
                public void RegisterFoundry (string foundryName,\r
+                                               string tagName,\r
                                                string assemblyName,\r
                                                string nameSpace,\r
                                                string typeName)\r
                {\r
-                       InternalFoundry foundry = new InternalFoundry (assemblyName, nameSpace, typeName);\r
-                       foundries.Add (foundryName, foundry);\r
+                       TagNameFoundry foundry = new TagNameFoundry (assemblyName, tagName, nameSpace, typeName);\r
+                       InternalRegister (foundryName, foundry);\r
+               }\r
+\r
+               void InternalRegister (string foundryName, Foundry foundry)\r
+               {\r
+                       object f = foundries [foundryName];\r
+                       if (f is CompoundFoundry) {\r
+                               ((CompoundFoundry) f).Add (foundry);\r
+                       } else if (f == null || (f is AssemblyFoundry && foundry is AssemblyFoundry)) {\r
+                               // If more than 1 namespace/assembly specified, the last one is used.\r
+                               foundries [foundryName] = foundry;\r
+                       } else if (f != null) {\r
+                               CompoundFoundry compound = new CompoundFoundry (foundryName);\r
+                               compound.Add ((Foundry) f);\r
+                               compound.Add (foundry);\r
+                               foundries [foundryName] = compound;\r
+                       }\r
                }\r
 \r
                public bool LookupFoundry (string foundryName)\r
@@ -56,51 +73,144 @@ namespace System.Web.Compilation
                        return foundries.Contains (foundryName);\r
                }\r
 \r
-               class InternalFoundry\r
+               abstract class Foundry\r
+               {\r
+                       public abstract Type GetType (string componentName);\r
+\r
+                       public Assembly LoadAssembly (string assemblyName)\r
+                       {\r
+                               Assembly assembly = null;\r
+                               try {\r
+                                       assembly = Assembly.LoadFrom (Path.GetFullPath (assemblyName));\r
+                               } catch {\r
+                                       string partialName = assemblyName;\r
+                                       if (String.Compare (Path.GetExtension (partialName), ".dll", true) == 0)\r
+                                               partialName = Path.GetFileNameWithoutExtension (assemblyName);\r
+\r
+                                       assembly = Assembly.LoadWithPartialName (partialName);\r
+                               }\r
+\r
+                               if (assembly == null)\r
+                                       throw new ApplicationException ("Assembly not found:" + assemblyName);\r
+\r
+                               return assembly;\r
+                       }\r
+               }\r
+               \r
+\r
+               class TagNameFoundry : Foundry\r
                {\r
-                       string nameSpace;\r
                        string assemblyName;\r
+                       string tagName;\r
+                       string nameSpace;\r
                        string typeName;\r
-                       Assembly assembly;\r
+                       Type type;\r
 \r
-                       public InternalFoundry (string assemblyName, string nameSpace, string typeName)\r
+                       public TagNameFoundry (string assemblyName, string tagName, string nameSpace, string typeName)\r
                        {\r
                                this.assemblyName = assemblyName;\r
+                               this.tagName = tagName;\r
                                this.nameSpace = nameSpace;\r
                                this.typeName = typeName;\r
-                               assembly = null;\r
                        }\r
 \r
-                       public Type GetType (string componentName)\r
+                       public override Type GetType (string componentName)\r
                        {\r
-                               EnsureAssembly ();\r
+                               if (0 != String.Compare (componentName, tagName, true))\r
+                                       throw new ArgumentException (componentName + " != " + tagName);\r
+                               \r
+                               if (type != null)\r
+                                       return type;\r
+                                       \r
+                               Assembly assembly = LoadAssembly (assemblyName);\r
+                               type =  assembly.GetType (nameSpace + "." + typeName, true, true);\r
+                               return type;\r
+                       }\r
 \r
-                               // For ascx files\r
-                               if (typeName != null && 0 == String.Compare (componentName, typeName, true)) {\r
-                                       throw new ApplicationException ("Only type '" + typeName + "' allowed.");\r
-                               } else if (typeName != null) {\r
-                                       componentName = typeName;\r
-                               }\r
+                       public string TagName {\r
+                               get { return tagName; }\r
+                       }\r
+               }\r
+\r
+               class AssemblyFoundry : Foundry\r
+               {\r
+                       string nameSpace;\r
+                       string assemblyName;\r
+                       Assembly assembly;\r
+\r
+                       public AssemblyFoundry (string assemblyName, string nameSpace)\r
+                       {\r
+                               this.assemblyName = assemblyName;\r
+                               this.nameSpace = nameSpace;\r
+                               assembly = null;\r
+                       }\r
+\r
+                       public override Type GetType (string componentName)\r
+                       {\r
+                               Assembly ass = EnsureAssembly (componentName);\r
 \r
-                               return assembly.GetType (nameSpace + "." + componentName, true, true);\r
+                               return ass.GetType (nameSpace + "." + componentName, true, true);\r
                        }\r
                        \r
-                       private void EnsureAssembly ()\r
+                       Assembly EnsureAssembly (string componentName)\r
                        {\r
                                if (assembly != null)\r
+                                       return assembly;\r
+\r
+                               assembly = LoadAssembly (assemblyName);\r
+                               return assembly;\r
+                       }\r
+               }\r
+\r
+               class CompoundFoundry : Foundry\r
+               {\r
+                       AssemblyFoundry assemblyFoundry;\r
+                       Hashtable tagnames;\r
+                       string tagPrefix;\r
+\r
+                       public CompoundFoundry (string tagPrefix)\r
+                       {\r
+                               this.tagPrefix = tagPrefix;\r
+                               tagnames = new Hashtable (CaseInsensitiveHashCodeProvider.Default,\r
+                                                          CaseInsensitiveComparer.Default);\r
+                       }\r
+\r
+                       public void Add (Foundry foundry)\r
+                       {\r
+                               if (foundry is AssemblyFoundry) {\r
+                                       assemblyFoundry = (AssemblyFoundry) foundry;\r
                                        return;\r
+                               }\r
+                               \r
+                               TagNameFoundry tn = (TagNameFoundry) foundry;\r
+                               string tagName = tn.TagName;\r
+                               if (tagnames.Contains (tagName)) {\r
+                                       string msg = String.Format ("{0}:{1} already registered.", tagPrefix, tagName);\r
+                                       throw new ApplicationException (msg);\r
+                               }\r
+                               tagnames.Add (tagName, foundry);\r
+                       }\r
 \r
-                               try {\r
-                                       assembly = Assembly.LoadFrom (Path.GetFullPath (assemblyName));\r
-                               } catch {\r
-                                       assembly = Assembly.LoadWithPartialName (assemblyName);\r
+                       public override Type GetType (string componentName)\r
+                       {\r
+                               Type type = null;\r
+                               if (assemblyFoundry != null) {\r
+                                       try {\r
+                                               type = assemblyFoundry.GetType (componentName);\r
+                                               return type;\r
+                                       } catch { }\r
                                }\r
 \r
-                               if (assembly == null)\r
-                                       throw new ApplicationException ("Assembly not found:" + assemblyName);\r
+                               Foundry foundry = tagnames [componentName] as Foundry;\r
+                               if (foundry == null) {\r
+                                       string msg = String.Format ("Type {0} not registered for prefix {1}",\r
+                                                                    componentName, tagPrefix);\r
+                                       throw new ApplicationException (msg);\r
+                               }\r
+\r
+                               return foundry.GetType (componentName);\r
                        }\r
                }\r
-\r
        }\r
 }\r
 \r
index e1aa147bf2c36ce4990281fd4f7220ccd6ada8a2..2094b47aa33b832cab7b4bbcd25831f4b1bb44f2 100644 (file)
@@ -416,6 +416,17 @@ class AspGenerator
                set { context = value; }
        }
        
+       bool AddUsing (string nspace)
+       {
+               string _using = "using " + nspace + ";";
+               if (prolog.ToString ().IndexOf (_using) == -1) {
+                       prolog.AppendFormat ("\t{0}\n", _using);
+                       return true;
+               }
+
+               return false;
+       }
+
        void AddInterface (Type type)
        {
                AddInterface (type.ToString ());
@@ -662,8 +673,14 @@ class AspGenerator
                        if (tag_name != "" || src != "")
                                throw new ApplicationException ("Invalid attributes for @ Register: " +
                                                                att.ToString ());
-                       prolog.AppendFormat ("\tusing {0};\n", name_space);
+
+                       AddUsing (name_space);
                        string dll = privateBinPath + Path.DirectorySeparatorChar + assembly_name + ".dll";
+                       // Hack: it should use assembly.load semantics...
+                       // may be when we don't run mcs as a external program...
+                       if (!File.Exists (dll))
+                               dll = assembly_name;
+
                        Foundry.RegisterFoundry (tag_prefix, dll, name_space);
                        AddReference (dll);
                        return;
@@ -681,9 +698,9 @@ class AspGenerator
                        UserControlData data = GenerateUserControl (src, Context);
                        switch (data.result) {
                        case UserControlResult.OK:
-                               prolog.AppendFormat ("\tusing {0};\n", "ASP");
+                               AddUsing ("ASP");
                                string dll = "output" + Path.DirectorySeparatorChar + data.assemblyName + ".dll";
-                               Foundry.RegisterFoundry (tag_prefix, data.assemblyName, "ASP", data.className);
+                               Foundry.RegisterFoundry (tag_prefix, tag_name, data.assemblyName, "ASP", data.className);
                                AddReference (data.assemblyName);
                                break;
                        case UserControlResult.FileNotFound:
@@ -742,8 +759,7 @@ class AspGenerator
                                throw new ApplicationException ("Wrong syntax in Import directive.");
 
                        string _using = "using " + value + ";";
-                       if (prolog.ToString ().IndexOf (_using) == -1) {
-                               prolog.AppendFormat ("\t{0}\n", _using);
+                       if (AddUsing (value) == true) {
                                string imports = Options ["Import"] as string;
                                if (imports == null) {
                                        imports = value;
index e45792cfa05b28f5f10cce3b0129bb1f835c8f15..d1122d33c5bc7cb23fca18ebc9c744c2f93dbe5b 100644 (file)
@@ -1,3 +1,13 @@
+2003-01-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * AspComponentFoundry.cs: reworked to allow same prefix for multiple
+       controls. You can register 1 assembly plus any number of user controls
+       under the same prefix.
+
+       * AspGenerator.cs: don't add duplicate 'using' for the same namespace.
+       Hack to allow @Register access to assemblies in other places than bin
+       directory.
+
 2003-01-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
 
        * AspElements.cs: added 'codebehind' attribute for page, control and