generator: Add option to validate GAPI XML against an XSD schema

With a new --schema option, you can specify the path to an XSD file, and
all GAPI XML files will be validated against this schema, including the
files given through the --include option.
This commit is contained in:
Bertrand Lorentz 2012-11-25 15:55:27 +01:00
parent 57c82a89c7
commit 99cb57e7aa
2 changed files with 43 additions and 5 deletions

View file

@ -24,6 +24,7 @@ namespace GtkSharp.Generation {
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Xml; using System.Xml;
public class CodeGenerator { public class CodeGenerator {
@ -36,6 +37,7 @@ namespace GtkSharp.Generation {
string glue_filename = ""; string glue_filename = "";
string glue_includes = ""; string glue_includes = "";
string gluelib_name = ""; string gluelib_name = "";
string schema_name = "";
SymbolTable table = SymbolTable.Table; SymbolTable table = SymbolTable.Table;
var gens = new List<IGeneratable> (); var gens = new List<IGeneratable> ();
@ -59,6 +61,8 @@ namespace GtkSharp.Generation {
{ "gluelib-name=", "Name of the C library into which the C glue code will be compiled. " + { "gluelib-name=", "Name of the C library into which the C glue code will be compiled. " +
"Used to generated correct DllImport attributes.", "Used to generated correct DllImport attributes.",
(string v) => { gluelib_name = v; } }, (string v) => { gluelib_name = v; } },
{ "schema=", "Validate all GAPI XML files against this XSD schema.",
(string v) => { schema_name = v; } },
{ "h|help", "Show this message and exit", { "h|help", "Show this message and exit",
v => show_help = v != null }, v => show_help = v != null },
}; };
@ -90,14 +94,19 @@ namespace GtkSharp.Generation {
return 0; return 0;
} }
if (!String.IsNullOrEmpty (schema_name) && !File.Exists (schema_name)) {
Console.WriteLine ("WARNING: Could not find schema file at '{0}', no validation will be done.", schema_name);
schema_name = null;
}
Parser p = new Parser (); Parser p = new Parser ();
foreach (string include in includes) { foreach (string include in includes) {
IGeneratable[] curr_gens = p.Parse (include); IGeneratable[] curr_gens = p.Parse (include, schema_name);
table.AddTypes (curr_gens); table.AddTypes (curr_gens);
} }
foreach (string filename in filenames) { foreach (string filename in filenames) {
IGeneratable[] curr_gens = p.Parse (filename); IGeneratable[] curr_gens = p.Parse (filename, schema_name);
table.AddTypes (curr_gens); table.AddTypes (curr_gens);
gens.AddRange (curr_gens); gens.AddRange (curr_gens);
} }

View file

@ -26,17 +26,28 @@ namespace GtkSharp.Generation {
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Xml; using System.Xml;
using System.Xml.Schema;
public class Parser { public class Parser {
const int curr_parser_version = 2; const int curr_parser_version = 2;
private XmlDocument Load (string filename) private XmlDocument Load (string filename, string schema_file)
{ {
XmlDocument doc = new XmlDocument (); XmlDocument doc = new XmlDocument ();
try { try {
XmlReaderSettings settings = new XmlReaderSettings ();
if (!String.IsNullOrEmpty (schema_file)) {
settings.Schemas.Add (null, schema_file);
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += ValidationEventHandler;
}
Stream stream = File.OpenRead (filename); Stream stream = File.OpenRead (filename);
doc.Load (stream); XmlReader reader = XmlReader.Create (stream, settings);
doc.Load (reader);
stream.Close (); stream.Close ();
} catch (XmlException e) { } catch (XmlException e) {
Console.WriteLine ("Invalid XML file."); Console.WriteLine ("Invalid XML file.");
@ -47,9 +58,27 @@ namespace GtkSharp.Generation {
return doc; return doc;
} }
private void ValidationEventHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Warning: {0}", e.Message);
break;
}
}
public IGeneratable[] Parse (string filename) public IGeneratable[] Parse (string filename)
{ {
XmlDocument doc = Load (filename); return Parse (filename, null);
}
public IGeneratable[] Parse (string filename, string schema_file)
{
XmlDocument doc = Load (filename, schema_file);
if (doc == null) if (doc == null)
return null; return null;