2004-06-21 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Mon, 21 Jun 2004 20:54:39 +0000 (20:54 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Mon, 21 Jun 2004 20:54:39 +0000 (20:54 -0000)
* Misc.cs,
  RelaxngPattern.cs,
  RelaxngReader.cs :
  Use XmlResolver (or XmlUrlResolver) directly. XmlResolver was
  incorrectly _used_ before null check. Don't create XmlResolver
  instance for _every_ pattern object.
* RelaxngPattern.cs : UnresolvedRef.ExpandRef() should return not
  try to find target derivative pattern twice. It was the culprit of
  infinite loop. Removed dirty switches.
* RelaxngGrammar.cs : code cleanup.

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

mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/Misc.cs
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngGrammar.cs
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngPattern.cs
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngReader.cs

index ed049eea7fed1bf0504c242294413502206991d3..10332061dc3ea77908d2951f1e81109322b936f9 100644 (file)
@@ -1,3 +1,16 @@
+2004-06-21  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Misc.cs,
+         RelaxngPattern.cs,
+         RelaxngReader.cs :
+         Use XmlResolver (or XmlUrlResolver) directly. XmlResolver was
+         incorrectly _used_ before null check. Don't create XmlResolver
+         instance for _every_ pattern object.
+       * RelaxngPattern.cs : UnresolvedRef.ExpandRef() should return not
+         try to find target derivative pattern twice. It was the culprit of
+         infinite loop. Removed dirty switches.
+       * RelaxngGrammar.cs : code cleanup.
+
 2004-06-17  Atsushi Enomoto <atsushi@ximian.com>
 
        * Misc.cs, RelaxngGrammar.cs, RelaxngPattern.cs, RelaxngReader.cs :
index 7a687bac4306c71729abfbd597c8083f709f3a7e..93a397d4032475f604b1562db1e297482a37f8f1 100644 (file)
@@ -16,6 +16,7 @@ namespace Commons.Xml.Relaxng
 {\r
        internal class Util\r
        {\r
+               /*\r
                public static string ResolveUri (string baseUri, string href, XmlResolver resolver)\r
                {\r
                        Uri uri = null;\r
@@ -26,6 +27,7 @@ namespace Commons.Xml.Relaxng
                                throw new RelaxngException ("Invalid URI format: " + href);
                        return result.ToString ();
                }\r
+               */\r
 \r
                public static string NormalizeWhitespace (string s)\r
                {\r
index 49568fc7c7c7682d7c8d06ef1712afc69b65a0d9..2207d4142111a888e5c7ea4cd8c9aed0fd0d4e8b 100644 (file)
@@ -6,7 +6,6 @@
 //\r
 // 2003 Atsushi Enomoto "No rights reserved."\r
 //\r
-\r
 using System;\r
 using System.Collections;\r
 using System.IO;\r
@@ -41,7 +40,6 @@ namespace Commons.Xml.Relaxng
 \r
                Hashtable includedUris = new Hashtable ();\r
                RelaxngGrammar parentGrammar;\r
-               ArrayList includedGrammars;\r
                Hashtable refPatterns = new Hashtable (); // key = RdpPattern of assembledDefs\r
 \r
                // only for checkRecursion()\r
@@ -176,13 +174,7 @@ namespace Commons.Xml.Relaxng
                        // here we collected element-replaced definitions\r
                        foreach (DictionaryEntry entry in elementReplacedDefs)\r
                                assembledDefs.Add (entry.Key, entry.Value);\r
-#if REPLACE_IN_ADVANCE\r
-// Well, actual expandRef should be done after checking constraints\r
-                       // 4.19 (c) expandRef\r
-                       startPattern = compiledStart.ExpandRef (assembledDefs);\r
-#else\r
                        startPattern = compiledStart;\r
-#endif\r
                        // 4.20,21 reduce notAllowed and empty.\r
                        bool b;\r
                        do {\r
@@ -207,10 +199,8 @@ namespace Commons.Xml.Relaxng
 \r
                        // TODO: 7.3\r
 \r
-#if !REPLACE_IN_ADVANCE\r
                        // 4.19 (c) expandRef - actual replacement\r
                        startPattern = compiledStart.ExpandRef (assembledDefs);\r
-#endif\r
 \r
                        // return its start pattern.\r
                        IsCompiled = true;\r
@@ -220,10 +210,8 @@ namespace Commons.Xml.Relaxng
                private void CheckStartPatternContent (RdpPattern p)\r
                {\r
                        switch (p.PatternType) {\r
-#if !REPLACE_IN_ADVANCE\r
                        case RelaxngPatternType.Ref:\r
                                CheckStartPatternContent (((RdpUnresolvedRef) p).RefPattern);\r
-#endif\r
                                break;\r
                        case RelaxngPatternType.Element:\r
                                break;\r
@@ -277,8 +265,8 @@ namespace Commons.Xml.Relaxng
                                        checkRecursionDepth = (int) checkedDepth;\r
                                // get refPattern\r
                                RdpUnresolvedRef pref = p as RdpUnresolvedRef;\r
-                               RelaxngGrammar target = pref.TargetGrammar;//pref.IsParentRef ? parentGrammar : this;\r
-                               RdpPattern refPattern = pref.RefPattern;//target.assembledDefs [pref.Name] as RdpPattern;\r
+                               RelaxngGrammar target = pref.TargetGrammar;\r
+                               RdpPattern refPattern = pref.RefPattern;\r
                                if (refPattern == null)\r
                                        throw new RelaxngException ("No matching define found for " + pref.Name);\r
 \r
@@ -315,21 +303,15 @@ namespace Commons.Xml.Relaxng
                private void CollectGrammars ()\r
                {\r
                        // collect ref and parentRef for each define.\r
-                       includedGrammars = (parentGrammar != null) ?\r
-                               parentGrammar.includedGrammars : new ArrayList ();\r
 \r
                        // FIXME: This should be assembledStart.\r
                        CheckReferences (compiledStart);\r
                        FixupReference ();\r
-                       this.unresolvedPatterns.Clear ();\r
 \r
-//                     Hashtable ht = assembledDefs.Clone () as Hashtable;\r
-//                     foreach (string name in ht.Keys) {\r
                        foreach (string name in assembledDefs.Keys) {\r
                                RdpPattern p = (RdpPattern) assembledDefs [name];\r
                                CheckReferences (p);\r
                                FixupReference ();\r
-                               this.unresolvedPatterns.Clear ();\r
                        }\r
 \r
                        // If it is child of any other pattern:\r
@@ -344,15 +326,22 @@ namespace Commons.Xml.Relaxng
                                        if (al == null)\r
                                                continue; // Not referenced.\r
 \r
-                                       if (parentGrammar.assembledDefs [name] == null)\r
-                                               parentGrammar.assembledDefs [name] =\r
-                                                       this.assembledDefs [name];\r
-                                       else\r
-                                               replaceDefines (name, al);\r
+                                       // At this point, parent grammar doesn't \r
+                                       // collect assembledDefs as yet\r
+                                       string uname = GetUniqueName (name, parentGrammar);\r
+                                       parentGrammar.assembledDefs [uname] = assembledDefs [name];\r
                                }\r
                        }\r
                }\r
 \r
+               private static string GetUniqueName (string name, RelaxngGrammar grammar)\r
+               {\r
+                       foreach (RelaxngDefine def in grammar.Defines)\r
+                               if (def.Name == name)\r
+                                       return GetUniqueName (name + '_', grammar);\r
+                       return name;\r
+               }\r
+\r
                private void FixupReference ()\r
                {\r
                        foreach (RdpUnresolvedRef pref in this.unresolvedPatterns) {\r
@@ -366,6 +355,7 @@ namespace Commons.Xml.Relaxng
                                }\r
                                al.Add (pref);\r
                        }\r
+                       this.unresolvedPatterns.Clear ();\r
                }\r
 \r
                private void replaceDefines (string name, ArrayList al)\r
index 2736d72cb8fe32de0fb1970a8c38d80b8e4b3eac..b084d8eb78a8f9e98b7d9e7d5ab95d0b254778e2 100644 (file)
@@ -267,13 +267,13 @@ namespace Commons.Xml.Relaxng
                {\r
                        grammar.CheckIncludeRecursion (Href);\r
                        grammar.IncludedUris.Add (Href, Href);\r
-                       string url = Util.ResolveUri (BaseUri, href, grammar.Resolver);\r
                        if (grammar.Resolver == null)\r
                                throw new RelaxngException ("To compile 'include' element, XmlResolver is required.");\r
+                       Uri uri = grammar.Resolver.ResolveUri (BaseUri != String.Empty ? new Uri (BaseUri) : null, Href);\r
                        XmlTextReader xtr = null;\r
                        RelaxngGrammar g = null;\r
                        try {\r
-                               xtr = new XmlTextReader (url, (Stream) grammar.Resolver.GetEntity (grammar.Resolver.ResolveUri (null, url), null, typeof (Stream)));\r
+                               xtr = new XmlTextReader (uri.AbsoluteUri, (Stream) grammar.Resolver.GetEntity (uri, null, typeof (Stream)));\r
                                RelaxngReader r = new RelaxngReader (xtr, ns);\r
                                r.MoveToContent ();\r
                                g = r.ReadPattern () as RelaxngGrammar;\r
@@ -411,11 +411,15 @@ namespace Commons.Xml.Relaxng
                // Private Fields\r
                RdpPattern startRelaxngPattern;\r
                RelaxngDatatypeProvider provider;\r
-               XmlResolver resolver = new XmlUrlResolver ();\r
+               XmlResolver resolver;\r
+               bool nullResolver;\r
 \r
                // Public\r
                public XmlResolver XmlResolver {\r
-                       set { resolver = value; }\r
+                       set {\r
+                               nullResolver = value == null;\r
+                               resolver = value;\r
+                       }\r
                }\r
 \r
                public abstract RelaxngPatternType PatternType { get; }\r
@@ -454,7 +458,13 @@ namespace Commons.Xml.Relaxng
 \r
                // Internal\r
                internal XmlResolver Resolver {\r
-                       get { return resolver; }\r
+                       get {\r
+                               if (nullResolver)\r
+                                       return null;\r
+                               if (resolver == null)\r
+                                       resolver = new XmlUrlResolver ();\r
+                               return resolver;\r
+                       }\r
                }\r
 \r
                internal abstract void CheckConstraints ();\r
@@ -930,11 +940,7 @@ namespace Commons.Xml.Relaxng
                }\r
 \r
                public override RdpContentType ContentType {\r
-#if REPLACE_IN_ADVANCE\r
-                       get { throw new InvalidOperationException (); }\r
-#else\r
                        get { return RdpContentType.Empty; }\r
-#endif\r
                }\r
 \r
 \r
@@ -946,12 +952,7 @@ namespace Commons.Xml.Relaxng
 \r
                internal override RdpPattern ExpandRef (Hashtable defs)\r
                {\r
-                       RdpPattern target = (RdpPattern) defs [this.name];\r
-                       if (target == null)\r
-                               throw new RelaxngException ("Target definition " + name + " not found.");\r
-                       if (target == this)\r
-                               throw new RelaxngException (String.Format ("Illegal recursion was found. Definition is '{0}'.", name));\r
-                       return target.ExpandRef (defs);\r
+                       return referencedPattern.ExpandRef (defs);\r
                }\r
 \r
                internal override void MarkReachableDefs () \r
@@ -1078,12 +1079,12 @@ namespace Commons.Xml.Relaxng
                {\r
                        grammar.CheckIncludeRecursion (Href);\r
                        grammar.IncludedUris.Add (Href, Href);\r
-                       string uri = Util.ResolveUri (this.BaseUri, href, grammar.Resolver);\r
                        if (grammar.Resolver == null)\r
                                throw new RelaxngException ("To compile 'include' element, XmlResolver is required.");\r
+                       Uri uri = grammar.Resolver.ResolveUri (BaseUri != String.Empty ? new Uri (BaseUri) : null, Href);\r
                        XmlTextReader xtr = null;\r
                        try {\r
-                               xtr = new XmlTextReader (uri, (Stream) grammar.Resolver.GetEntity (grammar.Resolver.ResolveUri (null, uri), null, typeof (Stream)));\r
+                               xtr = new XmlTextReader (uri.AbsoluteUri, (Stream) grammar.Resolver.GetEntity (uri, null, typeof (Stream)));\r
                                RelaxngReader r = new RelaxngReader (xtr, ns);\r
                                r.MoveToContent ();\r
                                RelaxngPattern p = r.ReadPattern ();\r
index 04250f1923a27b9b61e55b54788d03daaa6da9f9..3cbe8b5c7c7b2c08f8972d75540fb8d6d7154661 100644 (file)
@@ -441,7 +441,8 @@ namespace Commons.Xml.Relaxng
                        string href = GetSpaceStrippedAttribute ("href");\r
                        if (href == null)\r
                                throw new RelaxngException ("Required attribute href was not found.");\r
-                       i.Href = Util.ResolveUri (BaseURI, href, resolver);\r
+                       XmlResolver res = resolver != null ? resolver : new XmlUrlResolver ();\r
+                       i.Href = res.ResolveUri (BaseURI != null ? new Uri (BaseURI) : null, href).AbsoluteUri;\r
                        if (!IsEmptyElement) {\r
                                Read ();\r
                                this.readGrammarIncludeContent (i.Starts, i.Defines, i.Divs, null);\r
@@ -640,7 +641,8 @@ namespace Commons.Xml.Relaxng
                        string href = GetSpaceStrippedAttribute ("href");\r
                        if (href == null)\r
                                throw new RelaxngException ("Required attribute href was not found.");\r
-                       r.Href = Util.ResolveUri (BaseURI, href, resolver);\r
+                       XmlResolver res = resolver != null ? resolver : new XmlUrlResolver ();\r
+                       r.Href = res.ResolveUri (BaseURI != null ? new Uri (BaseURI) : null, href).AbsoluteUri;\r
                        r.NSContext = ContextNamespace;\r
                        if (!IsEmptyElement) {\r
                                Read ();\r