+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 :
{\r
internal class Util\r
{\r
+ /*\r
public static string ResolveUri (string baseUri, string href, XmlResolver resolver)\r
{\r
Uri uri = null;\r
throw new RelaxngException ("Invalid URI format: " + href);
return result.ToString ();
}\r
+ */\r
\r
public static string NormalizeWhitespace (string s)\r
{\r
//\r
// 2003 Atsushi Enomoto "No rights reserved."\r
//\r
-\r
using System;\r
using System.Collections;\r
using System.IO;\r
\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
// 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
\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
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
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
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
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
}\r
al.Add (pref);\r
}\r
+ this.unresolvedPatterns.Clear ();\r
}\r
\r
private void replaceDefines (string name, ArrayList al)\r
{\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
// 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
\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
}\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
\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
{\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
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
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