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:
parent
1a29534e3f
commit
b0bc6dca4d
211
CS2JLibrary/NetFramework/schemas/ClassRepTemplate.xsd
Executable file
211
CS2JLibrary/NetFramework/schemas/ClassRepTemplate.xsd
Executable 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>
|
@ -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)
|
||||
{
|
||||
|
@ -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>();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user