1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
using System;
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Xml;
using Commons.Xml.Relaxng;
using Commons.Xml.Relaxng.Rnc;
namespace Commons.Xml.Nvdl
{
public class NvdlRelaxngValidatorProvider : NvdlValidationProvider
{
public const string RncMimeType = "application/vnd.oasis-open.relax-ng.rnc";
public override NvdlValidatorGenerator CreateGenerator (
NvdlValidate validate, string schemaType, NvdlConfig config)
{
if (schemaType == RncMimeType)
return CreateRncGenerator (validate, config);
return base.CreateGenerator (validate, schemaType, config);
}
private NvdlValidatorGenerator CreateRncGenerator (NvdlValidate validate, NvdlConfig config)
{
XmlResolver resolver = config.XmlResolverInternal;
string schemaUri = GetSchemaUri (validate);
if (schemaUri == null)
return null;
Uri baseUri = resolver.ResolveUri (null, validate.SourceUri);
Uri absUri = resolver.ResolveUri (baseUri, schemaUri);
RelaxngPattern p = RncParser.ParseRnc (
new StreamReader ((Stream) resolver.GetEntity (
absUri,
null,
typeof (Stream))), null, absUri.ToString ());
return new NvdlRelaxngValidatorGenerator (p, config);
}
public override NvdlValidatorGenerator CreateGenerator (
XmlReader reader, NvdlConfig config)
{
if (reader.NamespaceURI != RelaxngGrammar.NamespaceURI)
return null;
return new NvdlRelaxngValidatorGenerator (RelaxngPattern.Read (reader), config);
}
}
internal class NvdlRelaxngValidatorGenerator : NvdlValidatorGenerator
{
RelaxngPattern pattern;
public NvdlRelaxngValidatorGenerator (RelaxngPattern p,
NvdlConfig config)
{
// FIXME: use XmlResolver
pattern = p;
}
public override XmlReader CreateValidator (XmlReader reader,
XmlResolver resolver)
{
// XmlResolver is never used.
RelaxngValidatingReader rvr =
new RelaxngValidatingReader (
reader, pattern);
rvr.ReportDetails = true;
return rvr;
}
public override XmlReader CreateAttributeValidator (
XmlReader reader,
XmlResolver resolver)
{
// XmlResolver is never used.
RelaxngValidatingReader rvr =
new RelaxngValidatingReader (
reader, pattern);
rvr.ReportDetails = true;
return rvr;
}
public override bool AddOption (string name, string arg)
{
return false;
}
public override bool HandleError (Exception ex, XmlReader reader, string nvdlLocation)
{
if (ex is RelaxngException)
throw new NvdlInstanceValidationException (String.Format ("RELAX NG validation error occured as a part of NVDL validation: " + ex.Message), ex, this, nvdlLocation);
return false;
}
}
}
|