1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

Add skeleton support for template schemas, but don't enable it. Can't make a schema with arbitrary ordering of type elements :(

This commit is contained in:
Kevin Glynn 2011-07-29 12:02:12 +02:00
parent 1a29534e3f
commit b0bc6dca4d
4 changed files with 275 additions and 4 deletions

View File

@ -0,0 +1,211 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:www.twigletsoftware.com:schemas:txtemplate:1:0"
xmlns="urn:www.twigletsoftware.com:schemas:txtemplate:1:0">
<xs:element name="Class" nillable="true" type="Class" />
<xs:complexType name="Class">
<xs:complexContent mixed="false">
<xs:extension base="Interface">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Constructors" type="ArrayOfConstructorRepTemplate" />
<xs:element minOccurs="0" maxOccurs="1" name="Fields" type="ArrayOfFieldRepTemplate1" />
<xs:element minOccurs="0" maxOccurs="1" name="UnaryOps" type="ArrayOfMethodRepTemplate1" />
<xs:element minOccurs="0" maxOccurs="1" name="BinaryOps" type="ArrayOfMethodRepTemplate2" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Interface">
<xs:complexContent mixed="false">
<xs:extension base="TypeRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Methods" type="ArrayOfMethodRepTemplate" />
<xs:element minOccurs="0" maxOccurs="1" name="Properties" type="ArrayOfPropRepTemplate" />
<xs:element minOccurs="0" maxOccurs="1" name="Events" type="ArrayOfFieldRepTemplate" />
<xs:element minOccurs="0" maxOccurs="1" name="Indexers" type="ArrayOfIndexerRepTemplate" />
<xs:element minOccurs="0" maxOccurs="1" name="Iterable" type="IterableRepTemplate" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="TypeRepTemplate" abstract="true">
<xs:complexContent mixed="false">
<xs:extension base="TranslationBase">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="TypeParams" type="ArrayOfString1" />
<xs:element minOccurs="0" maxOccurs="1" name="Uses" type="ArrayOfString2" />
<xs:element minOccurs="0" maxOccurs="1" name="Aliases" type="ArrayOfAliasRepTemplate" />
<xs:element minOccurs="0" maxOccurs="1" name="Casts" type="ArrayOfCastRepTemplate" />
<xs:element minOccurs="0" maxOccurs="1" name="Inherits" type="ArrayOfString3" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="TranslationBase" abstract="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Imports" type="ArrayOfString" />
<xs:element minOccurs="0" maxOccurs="1" name="Java" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Warning" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfString">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Import" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="IterableRepTemplate">
<xs:complexContent mixed="false">
<xs:extension base="TranslationBase">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="ElementType" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="FieldRepTemplate">
<xs:complexContent mixed="false">
<xs:extension base="TranslationBase">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Type" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="PropRepTemplate">
<xs:complexContent mixed="false">
<xs:extension base="FieldRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Get" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Set" type="xs:string" />
</xs:sequence>
<xs:attribute default="true" name="read" type="xs:boolean" />
<xs:attribute default="true" name="write" type="xs:boolean" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="IndexerRepTemplate">
<xs:complexContent mixed="false">
<xs:extension base="PropRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Params" type="ArrayOfParamRepTemplate" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ArrayOfParamRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Param" nillable="true" type="ParamRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ParamRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Type" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
</xs:sequence>
<xs:attribute default="false" name="byref" type="xs:boolean" />
</xs:complexType>
<xs:complexType name="ConstructorRepTemplate">
<xs:complexContent mixed="false">
<xs:extension base="TranslationBase">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Params" type="ArrayOfParamRepTemplate" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="MethodRepTemplate">
<xs:complexContent mixed="false">
<xs:extension base="ConstructorRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="TypeParams" type="ArrayOfString1" />
<xs:element minOccurs="0" maxOccurs="1" name="Return" type="xs:string" />
</xs:sequence>
<xs:attribute default="false" name="static" type="xs:boolean" />
<xs:attribute default="false" name="partial" type="xs:boolean" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ArrayOfString1">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Name" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="CastRepTemplate">
<xs:complexContent mixed="false">
<xs:extension base="TranslationBase">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="From" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="To" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ArrayOfString2">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Use" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfAliasRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Alias" nillable="true" type="AliasRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="AliasRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Alias" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Namespace" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfCastRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Cast" nillable="true" type="CastRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfString3">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Type" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfMethodRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Method" nillable="true" type="MethodRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfPropRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Property" nillable="true" type="PropRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfFieldRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Event" nillable="true" type="FieldRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfIndexerRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Indexer" nillable="true" type="IndexerRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfConstructorRepTemplate">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Constructor" nillable="true" type="ConstructorRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfFieldRepTemplate1">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Field" nillable="true" type="FieldRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfMethodRepTemplate1">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="UnaryOp" nillable="true" type="MethodRepTemplate" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfMethodRepTemplate2">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="BinaryOp" nillable="true" type="MethodRepTemplate" />
</xs:sequence>
</xs:complexType>
</xs:schema>

View File

@ -123,11 +123,11 @@ namespace Twiglet.CS2J.Translator
.Add ("cheatdir=", dir => cfg.CheatDir = dir)
.Add ("netdir=", dirs => addDirectories(cfg.NetRoot, dirs))
.Add ("exnetdir=", dirs => addDirectories(cfg.ExNetRoot, dirs))
.Add ("netschemadir=", dirs => addDirectories(cfg.NetSchemaDir, dirs))
.Add ("appdir=", dirs => addDirectories(cfg.AppRoot, dirs))
.Add ("exappdir=", dirs => addDirectories(cfg.ExAppRoot, dirs))
.Add ("csdir=", dirs => addDirectories(csDir, dirs))
.Add ("excsdir=", dirs => addDirectories(cfg.Exclude, dirs))
.Add ("keyfile=", v => cfg.KeyFile = v)
.Add ("translator-keep-parens=", v => cfg.TranslatorKeepParens = Boolean.Parse(v))
.Add ("translator-timestamp-files=", v => cfg.TranslatorAddTimeStamp = Boolean.Parse(v))
.Add ("translator-blanket-throw=", v => cfg.TranslatorBlanketThrow = Boolean.Parse(v))
@ -164,6 +164,17 @@ namespace Twiglet.CS2J.Translator
RsaKey.FromXmlString(rsaPubXml);
// Load .Net templates
// Do we have schemas for the templates?
if (cfg.NetSchemaDir.Count == 0)
{
// By default look for schemas in net dirs
cfg.NetSchemaDir = new List<string>(cfg.NetRoot);
}
// Comment out for now. I don't see how to wrie an xsd file that will allow elements to appear in any order
// foreach (string schemadir in cfg.NetSchemaDir)
// doFile(schemadir, ".xsd", addNetSchema, null);
foreach (string r in cfg.NetRoot)
doFile(r, ".xml", addNetTranslation, cfg.ExNetRoot);
@ -247,7 +258,7 @@ namespace Twiglet.CS2J.Translator
{
string canonicalPath = Path.GetFullPath(root);
// If this is a directory, walk each file/dir in that directory
if (!excludes.Contains(canonicalPath))
if (excludes == null || !excludes.Contains(canonicalPath))
{
if (Directory.Exists(canonicalPath))
{
@ -351,6 +362,20 @@ namespace Twiglet.CS2J.Translator
return signedXml.CheckSignature(Key);
}
// Here's where we do the real work...
public static void addNetSchema(string fullName)
{
try
{
TypeRepTemplate.TemplateReaderSettings.Schemas.Add("urn:www.twigletsoftware.com:schemas:txtemplate:1:0", fullName);
Console.WriteLine(fullName);
}
catch (Exception e)
{
throw;
}
}
// Here's where we do the real work...
public static void addNetTranslation(string fullName)
{

View File

@ -25,6 +25,7 @@ namespace Twiglet.CS2J.Translator
public string CheatDir { get; set; }
public IList<string> NetRoot { get; set; }
public IList<string> ExNetRoot { get; set; }
public IList<string> NetSchemaDir { get; set; }
public IList<string> AppRoot { get; set; }
public IList<string> ExAppRoot { get; set; }
public IList<string> Exclude { get; set; }
@ -102,6 +103,7 @@ namespace Twiglet.CS2J.Translator
CheatDir = "";
NetRoot = new List<string>();
ExNetRoot = new List<string>();
NetSchemaDir = new List<string>();
AppRoot = new List<string>();
ExAppRoot = new List<string>();
Exclude = new List<string>();

View File

@ -9,6 +9,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using Twiglet.CS2J.Translator.Utils;
@ -2229,12 +2230,44 @@ namespace Twiglet.CS2J.Translator.TypeRep
#region deserialization
private static XmlReaderSettings _templateReaderSettings = null;
/// <summary>
/// Reader Settings used when reading translation templates. Validate against schemas
/// </summary>
public static XmlReaderSettings TemplateReaderSettings
{
get
{
if (_templateReaderSettings == null)
{
_templateReaderSettings = new XmlReaderSettings();
_templateReaderSettings.ValidationType = ValidationType.Schema;
_templateReaderSettings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
_templateReaderSettings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
}
return _templateReaderSettings;
}
}
// Display any warnings or errors while validating translation templates.
private static void ValidationCallBack(object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.WriteLine("\tWarning: Matching schema not found. No validation occurred." + args.Message);
else
Console.WriteLine("\tValidation error: " + args.Message);
}
private static object Deserialize (Stream fs, System.Type t)
{
object o = null;
// Create the XmlReader object.
XmlReader reader = XmlReader.Create(fs, TemplateReaderSettings);
XmlSerializer serializer = new XmlSerializer (t, Constants.TranslationTemplateNamespace);
o = serializer.Deserialize (fs);
o = serializer.Deserialize (reader);
return o;
}