From: Owen R. <exo...@us...> - 2004-11-15 05:13:14
|
Update of /cvsroot/netreflector/NetReflector/src/NetReflector/Generators In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2560/src/NetReflector/Generators Added Files: XsdGenerator.cs XsdTypes.cs Log Message: - working on XmlDocumentationGenerator - started Xsd generation for NetReflector - lots of FxCop inspired improvements --- NEW FILE: XsdGenerator.cs --- using System.Xml; using System.Xml.Schema; using Exortech.NetReflector.Util; namespace Exortech.NetReflector.Generators { public class XsdGenerator { private readonly NetReflectorTypeTable table; private XsdTypes typeMap = new XsdTypes(); public XsdGenerator(NetReflectorTypeTable table) { this.table = table; } public XmlSchema Generate() { XmlSchema schema = new XmlSchema(); foreach (IXmlTypeSerialiser serialiser in table) { GenerateSchemaElementForType(schema, serialiser); } return schema; } private void GenerateSchemaElementForType(XmlSchema schema, IXmlTypeSerialiser serialiser) { XmlSchemaElement element = new XmlSchemaElement(); element.Name = serialiser.Attribute.Name; element.SchemaTypeName = new XmlQualifiedName(GetComplexTypeName(serialiser)); schema.Items.Add(element); XmlSchemaComplexType complexType = new XmlSchemaComplexType(); complexType.Name = GetComplexTypeName(serialiser); complexType.Particle = GenerateSchemaElementsForMembers(serialiser.MemberSerialisers); schema.Items.Add(complexType); } private string GetComplexTypeName(IXmlTypeSerialiser serialiser) { return serialiser.Attribute.Name + ".type"; } private XmlSchemaParticle GenerateSchemaElementsForMembers(IXmlMemberSerialiser[] memberSerialisers) { XmlSchemaAll group = new XmlSchemaAll(); foreach (IXmlMemberSerialiser memberSerialiser in memberSerialisers) { XmlSchemaElement item = new XmlSchemaElement(); item.Name = memberSerialiser.Attribute.Name; if (ReflectionUtil.IsCommonType(memberSerialiser.ReflectorMember.MemberType)) { item.SchemaTypeName = typeMap.ConvertToSchemaTypeName(memberSerialiser.ReflectorMember.MemberType); } else { item.SchemaType = GenerateComplexTypeForMember(memberSerialiser); } group.Items.Add(item); } return group; } private XmlSchemaComplexType GenerateComplexTypeForMember(IXmlMemberSerialiser memberSerialiser) { XmlSchemaComplexContentExtension memberExtension = new XmlSchemaComplexContentExtension(); memberExtension.BaseTypeName = new XmlQualifiedName(memberSerialiser.Attribute.Name + ".type"); if (memberSerialiser.Attribute.InstanceTypeKey != null) { memberExtension.Attributes.Add(GenerateInstanceTypeKeyAttribute(memberSerialiser)); } XmlSchemaComplexType memberComplexType = new XmlSchemaComplexType(); memberComplexType.ContentModel = new XmlSchemaComplexContent(); memberComplexType.ContentModel.Content = memberExtension; return memberComplexType; } private XmlSchemaAttribute GenerateInstanceTypeKeyAttribute(IXmlMemberSerialiser memberSerialiser) { XmlSchemaAttribute attribute = new XmlSchemaAttribute(); attribute.Name = memberSerialiser.Attribute.InstanceTypeKey; return attribute; } } } --- NEW FILE: XsdTypes.cs --- using System; using System.Collections; using System.Xml; namespace Exortech.NetReflector.Generators { public class XsdTypes { private Hashtable map = new Hashtable(); public XsdTypes() { map[typeof (string)] = "string"; map[typeof (int)] = "int"; map[typeof (byte)] = "byte"; map[typeof (decimal)] = "decimal"; map[typeof (double)] = "double"; map[typeof (bool)] = "Boolean"; map[typeof (float)] = "float"; map[typeof (long)] = "long"; map[typeof (short)] = "short"; map[typeof (DateTime)] = "string"; /// HACK: until can look up proper conversion } private string this[Type type] { get { object value = map[type]; if (value == null) throw new NetReflectorException(string.Format("Unable to find Xsd type for {0}", type)); return value.ToString(); } } public XmlQualifiedName ConvertToSchemaTypeName(Type type) { return new XmlQualifiedName(this[type].ToString(), "http://www.w3.org/2001/XMLSchema"); } } } |