2 using System.Collections;
3 using System.Collections.Specialized;
6 using Commons.Xml.Relaxng;
7 using Commons.Xml.Relaxng.Rnc;
9 namespace Commons.Xml.Nvdl
11 public class NvdlRelaxngValidatorProvider : NvdlValidationProvider
13 public const string RncMimeType = "application/vnd.oasis-open.relax-ng.rnc";
15 public override NvdlValidatorGenerator CreateGenerator (
16 NvdlValidate validate, string schemaType, NvdlConfig config)
18 if (schemaType == RncMimeType)
19 return CreateRncGenerator (validate, config);
20 return base.CreateGenerator (validate, schemaType, config);
23 private NvdlValidatorGenerator CreateRncGenerator (NvdlValidate validate, NvdlConfig config)
25 XmlResolver resolver = config.XmlResolverInternal;
26 string schemaUri = GetSchemaUri (validate);
27 if (schemaUri == null)
29 Uri baseUri = resolver.ResolveUri (null, validate.SourceUri);
30 RelaxngPattern p = RncParser.ParseRnc (
31 new StreamReader ((Stream) resolver.GetEntity (
32 resolver.ResolveUri (baseUri, schemaUri),
35 return new NvdlRelaxngValidatorGenerator (p, config);
38 public override NvdlValidatorGenerator CreateGenerator (
39 XmlReader reader, NvdlConfig config)
41 if (reader.NamespaceURI != RelaxngGrammar.NamespaceURI)
44 return new NvdlRelaxngValidatorGenerator (RelaxngPattern.Read (reader), config);
48 internal class NvdlRelaxngValidatorGenerator : NvdlValidatorGenerator
50 RelaxngPattern pattern;
52 public NvdlRelaxngValidatorGenerator (RelaxngPattern p,
55 // FIXME: use XmlResolver
59 public override XmlReader CreateValidator (XmlReader reader,
62 // XmlResolver is never used.
63 RelaxngValidatingReader rvr =
64 new RelaxngValidatingReader (
66 rvr.ReportDetails = true;
70 public override XmlReader CreateAttributeValidator (
74 // XmlResolver is never used.
75 RelaxngValidatingReader rvr =
76 new RelaxngValidatingReader (
78 rvr.ReportDetails = true;
82 public override bool AddOption (string name, string arg)
87 public override bool HandleError (Exception ex, XmlReader reader, string nvdlLocation)
89 if (ex is RelaxngException)
90 throw new NvdlInstanceValidationException (String.Format ("RELAX NG validation error occured as a part of NVDL validation: " + ex.Message), ex, this, nvdlLocation);