2006-03-23 Atsushi Enomoto <atsushi@ximian.com>
[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                 RelaxngPattern attributePattern;
52
53                 public NvdlRelaxngValidatorGenerator (RelaxngPattern p,
54                         NvdlConfig config)
55                 {
56                         // FIXME: use XmlResolver
57                         pattern = p;
58                 }
59
60                 public override XmlReader CreateValidator (XmlReader reader,
61                         XmlResolver resolver)
62                 {
63                         // XmlResolver is never used.
64                         RelaxngValidatingReader rvr = 
65                                 new RelaxngValidatingReader (
66                                         reader, pattern);
67                         rvr.ReportDetails = true;
68                         return rvr;
69                 }
70
71                 public override XmlReader CreateAttributeValidator (
72                         XmlReader reader,
73                         XmlResolver resolver)
74                 {
75                         if (attributePattern == null) {
76                                 RelaxngElement el = new RelaxngElement ();
77                                 el.NameClass = new RelaxngAnyName ();
78                                 el.Patterns.Add (pattern);
79                         }
80                         // XmlResolver is never used.
81                         RelaxngValidatingReader rvr = 
82                                 new RelaxngValidatingReader (
83                                         reader, attributePattern);
84                         rvr.ReportDetails = true;
85                         return rvr;
86                 }
87
88                 public override bool AddOption (string name, string arg)
89                 {
90                         return false;
91                 }
92         }
93 }