//\r
// 2003 Atsushi Enomoto "No rights reserved."\r
//\r
+// Copyright (c) 2004 Novell Inc.\r
+// All rights reserved\r
+//\r
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
\r
using System;\r
using System.Collections;\r
using System.IO;\r
using System.Xml;\r
using Commons.Xml.Relaxng.Derivative;\r
+using Commons.Xml.Relaxng.Rnc;\r
+\r
+#if NET_2_0\r
+using NSResolver = System.Xml.IXmlNamespaceResolver;\r
+#else\r
+using NSResolver = System.Xml.XmlNamespaceManager;\r
+#endif\r
\r
namespace Commons.Xml.Relaxng\r
{\r
set { baseUri = value; }\r
}\r
\r
- public abstract void Write (XmlWriter write);\r
+ public abstract void Write (XmlWriter writer);\r
+\r
+ internal abstract void WriteRnc (RncWriter writer);\r
}\r
\r
public abstract class RelaxngSingleContentPattern : RelaxngPattern\r
{\r
// Flatten patterns into RdpGroup. See 4.12.\r
if (patterns.Count == 0)\r
- throw new RelaxngException ("No pattern contents.");\r
+ throw new RelaxngException (this, "No pattern contents.");\r
RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);\r
if (patterns.Count == 1)\r
return p;\r
{\r
// Flatten patterns. See 4.12.\r
if (patterns.Count == 0)\r
- throw new RelaxngException ("No pattern contents.");\r
+ throw new RelaxngException (this, "No pattern contents.");\r
\r
RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);\r
if (patterns.Count == 1)\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteStart (this);\r
+ }\r
+\r
internal RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return p.Compile (grammar);\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteDefine (this);\r
+ }\r
+\r
internal RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return makeSingle (grammar);\r
{\r
// Flatten patterns into RdpGroup. See 4.12.\r
if (patterns.Count == 0)\r
- throw new RelaxngException ("No pattern contents.");\r
+ throw new RelaxngException (this, "No pattern contents.");\r
RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);\r
if (patterns.Count == 1)\r
return p;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteInclude (this);\r
+ }\r
+\r
// compile into div\r
internal RelaxngDiv Compile (RelaxngGrammar grammar)\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
+ throw new RelaxngException (this, "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
xtr.Close ();\r
}\r
if (g == null)\r
- throw new RelaxngException ("Included syntax must start with \"grammar\" element.");\r
+ throw new RelaxngException (this, "Included syntax must start with \"grammar\" element.");\r
g.DataProvider = grammar.Provider;\r
\r
// process recursive inclusions.\r
// replace redifinitions into div.\r
// starts.\r
if (this.Starts.Count > 0 && g.Starts.Count == 0)\r
- throw new RelaxngException ("When the included grammar does not contain start components, this include component must not contain start components.");\r
+ throw new RelaxngException (this, "When the included grammar does not contain start components, this include component must not contain start components.");\r
RelaxngGrammarContentList appliedStarts = (this.starts.Count > 0) ?\r
this.starts : g.Starts;\r
\r
div.Defines.Add (def);\r
}\r
foreach (RelaxngDefine def in g.Defines) {\r
- originalDefs.Add (def.Name, def.Name);\r
- if (overrides [def.Name] == null)\r
+ originalDefs [def.Name] = def.Name;\r
+ if (!overrides.ContainsKey (def.Name)) {\r
div.Defines.Add (def);\r
+ }\r
// else discard.\r
}\r
+\r
foreach (string name in overrides.Values)\r
- if (!originalDefs.Contains (name))\r
- throw new RelaxngException ("The include component must not contain define components whose name does not appear in the included grammar component.");\r
+ if (!originalDefs.ContainsKey (name))\r
+ throw new RelaxngException (this, "The include component must not contain define components whose name does not appear in the included grammar component.");\r
\r
grammar.IncludedUris.Remove (Href);\r
return div;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteDiv (this);\r
+ }\r
+\r
internal void Compile (RelaxngGrammar grammar)\r
{\r
foreach (RelaxngDiv div in divs)\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
this.IsCompiled = true;\r
}\r
\r
+ public void WriteCompact (TextWriter writer)\r
+ {\r
+ WriteRnc (new RncWriter (writer));\r
+ }\r
+\r
+ public void WriteCompact (TextWriter writer, NSResolver res)\r
+ {\r
+ WriteRnc (new RncWriter (writer, res));\r
+ }\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
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteNotAllowed (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return RdpNotAllowed.Instance;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteEmpty (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return RdpEmpty.Instance;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteText (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return RdpText.Instance;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteData (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
// RdpParamList rdpl = new RdpParamList ();\r
RdpPattern p = null;\r
if (this.except != null) {\r
if (except.Patterns.Count == 0)\r
- throw new RelaxngException ("data except pattern have no children.");\r
+ throw new RelaxngException (this, "data except pattern have no children.");\r
p = except.Patterns [0].Compile (grammar);\r
for (int i=1; i<except.Patterns.Count; i++)\r
p = new RdpChoice (p,\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteValue (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteList (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteElement (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return new RdpElement (\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteAttribute (this);\r
+ }\r
+\r
private void checkInvalidAttrNameClass (RdpNameClass nc)\r
{\r
string xmlnsNS = "http://www.w3.org/2000/xmlns";\r
RdpName n = nc as RdpName;\r
if (n != null) {\r
if (n.NamespaceURI == xmlnsNS)\r
- throw new RelaxngException ("cannot specify \"" + xmlnsNS + "\" for name of attribute.");\r
+ throw new RelaxngException (this, "cannot specify \"" + xmlnsNS + "\" for name of attribute.");\r
if (n.LocalName == "xmlns" && n.NamespaceURI == "")\r
- throw new RelaxngException ("cannot specify \"xmlns\" inside empty ns context.");\r
+ throw new RelaxngException (this, "cannot specify \"xmlns\" inside empty ns context.");\r
} else {\r
RdpNsName nn = nc as RdpNsName;\r
if (nn.NamespaceURI == "http://www.w3.org/2000/xmlns")\r
- throw new RelaxngException ("cannot specify \"" + xmlnsNS + "\" for name of attribute.");\r
+ throw new RelaxngException (this, "cannot specify \"" + xmlnsNS + "\" for name of attribute.");\r
RdpNsNameExcept x = nc as RdpNsNameExcept;\r
if (x != null)\r
checkInvalidAttrNameClass (x.ExceptNameClass);\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
public override bool Nullable {\r
get {\r
- throw new InvalidOperationException ();\r
+ throw new InvalidOperationException ("Internal error: should not reach.");\r
}\r
}\r
\r
+ public override void GetLabels (Hashtable elements, Hashtable attributes)\r
+ {\r
+ throw new InvalidOperationException ("Internal error: should not reach.");\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
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteRef (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
// Important!! This compile method only generates stub.\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteParentRef (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = false;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteExternalRef (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\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
+ throw new RelaxngException (this, "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
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteOneOrMore (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteZeroOrMore (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteOptional (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteMixed (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteChoice (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteGroup (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteInterleave (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteParam (this);\r
+ }\r
+\r
internal RdpParam Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
p.Write (writer);\r
writer.WriteEndElement ();\r
}\r
+\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteDataExcept (this);\r
+ }\r
}\r
\r
internal class RelaxngRefPattern\r