/// <summary> /// Generates the <see cref="CodeCompileUnit"/> based on the provide context. /// </summary> /// <param name="codeGeneratorContext">The code generator context.</param> public CodeCompileUnit GenerateDataContractCode(ICodeGeneratorContext codeGeneratorContext) { CodeCompileUnit codeCompileUnit = CodeExtension.GenerateDataContractCode(codeGeneratorContext.XmlSchemas); CodeExtension.RemoveDefaultTypes(codeCompileUnit); codeCompileUnit.ImplementsBaijiSerialization(codeGeneratorContext); if (codeGeneratorContext.CodeGenOptions.AddCustomRequestInterface) { DataContractGenerator.BuildElementName2TypeNameMapping(codeGeneratorContext); DataContractGenerator.ImplementCustomInterface(codeGeneratorContext, codeCompileUnit); } if (codeGeneratorContext.CodeGenOptions.ForceElementNamespace) { DataContractGenerator.BuildElementName2TargetNamespaceMapping(codeGeneratorContext); } return(codeCompileUnit); }
/// <summary> /// Generates the <see cref="CodeNamespace"/> based on the provide context. /// </summary> /// <param name="codeGeneratorContext">The code generator context.</param> public CodeNamespace[] GenerateCodes(ICodeGeneratorContext codeGeneratorContext) { CodeGenOptions codeGenOptions = codeGeneratorContext.CodeGenOptions; XmlSchemas xmlSchemas = codeGeneratorContext.XmlSchemas; // Generate DataContracts const CodeGenerationOptions generationOptions = CodeGenerationOptions.GenerateProperties; List <CodeNamespace> codeNamespaces = new List <CodeNamespace>(); // TypeName to XmlSchemaType mapping IDictionary <string, XmlSchemaType> typeName2schemaTypeMapping = codeGeneratorContext.TypeName2schemaTypeMapping; foreach (XmlSchema schema in xmlSchemas) { CodeNamespace codeNamespace = new CodeNamespace(); codeNamespace.UserData.Add(Constants.SCHEMA, schema); XmlCodeExporter exporter = new XmlCodeExporter(codeNamespace); XmlSchemaImporter importer = new XmlSchemaImporter(xmlSchemas, generationOptions, new ImportContext(new CodeIdentifiers(), false)); foreach (XmlSchemaElement element in schema.Elements.Values) { XmlTypeMapping typeMapping = importer.ImportTypeMapping(element.QualifiedName); if (element.IsAbstract) { continue; } exporter.ExportTypeMapping(typeMapping); typeName2schemaTypeMapping[typeMapping.TypeName] = element.ElementSchemaType; } foreach (XmlSchemaType schemaType in schema.SchemaTypes.Values) { if (String.IsNullOrWhiteSpace(schemaType.SourceUri)) { schemaType.SourceUri = schema.SourceUri; } XmlTypeMapping typeMapping = importer.ImportSchemaType(schemaType.QualifiedName); if (CouldBeAnArray(schemaType)) { continue; } exporter.ExportTypeMapping(typeMapping); typeName2schemaTypeMapping[typeMapping.TypeName] = schemaType; } if (codeNamespace.Types.Count > 0) { codeNamespaces.Add(codeNamespace); } } if (codeNamespaces.Count == 0) { throw new Exception("No types were generated."); } // Build type name to code type declaration mapping codeGeneratorContext.CodeTypeMap = DataContractGenerator.BuildCodeTypeMap(codeNamespaces.ToArray()); if (codeGenOptions.ForceElementName) { DataContractGenerator.BuildElementName2TypeNameMapping(codeGeneratorContext); } if (codeGenOptions.ForceElementNamespace) { DataContractGenerator.BuildElementName2TargetNamespaceMapping(codeGeneratorContext); } for (int i = 0; i < codeNamespaces.Count; i++) { CodeNamespace codeNamespace = codeNamespaces[i]; // Decorate data contracts code ICodeExtension codeExtension = new CodeExtension(); codeExtension.Process(codeNamespace, codeGeneratorContext); CodeExtension.RemoveDefaultTypes(codeNamespace); List <CodeTypeDeclaration> types = new List <CodeTypeDeclaration>(); XmlSchema schema = codeNamespace.UserData[Constants.SCHEMA] as XmlSchema; foreach (XmlSchemaType schemaType in schema.SchemaTypes.Values) { foreach (CodeTypeDeclaration codeType in codeNamespace.Types) { if (codeType.Name == schemaType.Name && schema.SourceUri == schemaType.SourceUri) { types.Add(codeType); } } } codeNamespace.Types.Clear(); codeNamespace.Types.AddRange(types.ToArray()); if (codeNamespace.Types.Count == 0) { codeNamespaces.RemoveAt(i--); } } return(codeNamespaces.ToArray()); }
/// <summary> /// Generates the <see cref="CodeNamespace"/> based on the provide context. /// </summary> /// <param name="codeGeneratorContext">The code generator context.</param> public CodeNamespace GenerateCode(ICodeGeneratorContext codeGeneratorContext) { CodeGenOptions codeGenOptions = codeGeneratorContext.CodeGenOptions; XmlSchemas xmlSchemas = codeGeneratorContext.XmlSchemas; CodeNamespace codeNamespace = new CodeNamespace(); // Generate DataContracts const CodeGenerationOptions generationOptions = CodeGenerationOptions.GenerateProperties; var exporter = new XmlCodeExporter(codeNamespace); var importer = new XmlSchemaImporter(xmlSchemas, generationOptions, new ImportContext(new CodeIdentifiers(), false)); // TypeName to XmlSchemaType mapping IDictionary <string, XmlSchemaType> typeName2schemaTypeMapping = codeGeneratorContext.TypeName2schemaTypeMapping; foreach (XmlSchema schema in xmlSchemas) { foreach (XmlSchemaElement element in schema.Elements.Values) { XmlTypeMapping typeMapping = importer.ImportTypeMapping(element.QualifiedName); if (element.IsAbstract) { continue; } exporter.ExportTypeMapping(typeMapping); typeName2schemaTypeMapping[typeMapping.TypeName] = element.ElementSchemaType; } foreach (XmlSchemaType complexType in schema.SchemaTypes.Values) { XmlTypeMapping typeMapping = importer.ImportSchemaType(complexType.QualifiedName); if (CouldBeAnArray(complexType)) { continue; } exporter.ExportTypeMapping(typeMapping); typeName2schemaTypeMapping[typeMapping.TypeName] = complexType; } } if (codeNamespace.Types.Count == 0) { throw new Exception("No types were generated."); } // Build type name to code type declaration mapping codeGeneratorContext.CodeTypeMap = BuildCodeTypeMap(codeNamespace); if (codeGenOptions.ForceElementName) { DataContractGenerator.BuildElementName2TypeNameMapping(codeGeneratorContext); } if (codeGenOptions.ForceElementNamespace) { DataContractGenerator.BuildElementName2TargetNamespaceMapping(codeGeneratorContext); } // Decorate data contracts code ICodeExtension codeExtension = new CodeExtension(); codeExtension.Process(codeNamespace, codeGeneratorContext); CodeExtension.RemoveDefaultTypes(codeNamespace); return(codeNamespace); }