In corlib/System.Runtime.InteropServices:
[mono.git] / mcs / class / Commons.Xml.Relaxng / Commons.Xml.Nvdl / NvdlRelaxngSupport.cs
1 using System;
2 using System.Collections;
3 using System.Collections.Specialized;
4 using System.IO;
5 using System.Xml;
6 using Commons.Xml.Relaxng;
7 using Commons.Xml.Relaxng.Rnc;
8
9 namespace Commons.Xml.Nvdl
10 {
11         public class NvdlRelaxngValidatorProvider : NvdlValidationProvider
12         {
13                 public const string RncMimeType = "application/vnd.oasis-open.relax-ng.rnc";
14
15                 public override NvdlValidatorGenerator CreateGenerator (
16                         NvdlValidate validate, string schemaType, NvdlConfig config)
17                 {
18                         if (schemaType == RncMimeType)
19                                 return CreateRncGenerator (validate, config);
20                         return base.CreateGenerator (validate, schemaType, config);
21                 }
22
23                 private NvdlValidatorGenerator CreateRncGenerator (NvdlValidate validate, NvdlConfig config)
24                 {
25                         XmlResolver resolver = config.XmlResolverInternal;
26                         string schemaUri = GetSchemaUri (validate);
27                         if (schemaUri == null)
28                                 return 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),
33                                         null,
34                                         typeof (Stream))));
35                         return new NvdlRelaxngValidatorGenerator (p, config);
36                 }
37
38                 public override NvdlValidatorGenerator CreateGenerator (
39                         XmlReader reader, NvdlConfig config)
40                 {
41                         if (reader.NamespaceURI != RelaxngGrammar.NamespaceURI)
42                                 return null;
43
44                         return new NvdlRelaxngValidatorGenerator (RelaxngPattern.Read (reader), config);
45                 }
46         }
47
48         internal class NvdlRelaxngValidatorGenerator : NvdlValidatorGenerator
49         {
50                 RelaxngPattern pattern;
51
52                 public NvdlRelaxngValidatorGenerator (RelaxngPattern p,
53                         NvdlConfig config)
54                 {
55                         // FIXME: use XmlResolver
56                         pattern = p;
57                 }
58
59                 public override XmlReader CreateValidator (XmlReader reader,
60                         XmlResolver resolver)
61                 {
62                         // XmlResolver is never used.
63                         RelaxngValidatingReader rvr = 
64                                 new RelaxngValidatingReader (
65                                         reader, pattern);
66                         rvr.ReportDetails = true;
67                         return rvr;
68                 }
69
70                 public override XmlReader CreateAttributeValidator (
71                         XmlReader reader,
72                         XmlResolver resolver)
73                 {
74                         // XmlResolver is never used.
75                         RelaxngValidatingReader rvr = 
76                                 new RelaxngValidatingReader (
77                                         reader, pattern);
78                         rvr.ReportDetails = true;
79                         return rvr;
80                 }
81
82                 public override bool AddOption (string name, string arg)
83                 {
84                         return false;
85                 }
86
87                 public override bool HandleError (Exception ex, XmlReader reader, string nvdlLocation)
88                 {
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);
91                         return false;
92                 }
93         }
94 }