From 0f9b7466cd5d00a75df24b8d59ae95b9ff4c71af Mon Sep 17 00:00:00 2001 From: Damien <damien.frikha@kleegroup.com> Date: Wed, 25 Oct 2023 13:53:43 +0200 Subject: [PATCH] Ajout parsing property params sur mapper from --- TopModel.Core/FileModel/ModelFile.cs | 4 +- TopModel.Core/Loaders/ClassLoader.cs | 89 +++++++++++++------ TopModel.Core/Loaders/PropertyLoader.cs | 2 +- TopModel.Core/Model/DataFlowSource.cs | 2 +- TopModel.Core/Model/FromMapper.cs | 10 ++- TopModel.Core/Model/PropertyMapping.cs | 13 +++ TopModel.Core/ModelExtensions.cs | 4 +- TopModel.Core/ModelStore.cs | 20 ++--- TopModel.Core/TopModel.Core.csproj | 1 + TopModel.Core/schema.json | 87 +++++++++++------- .../MapperGeneratorBase.cs | 6 +- TopModel.Generator.Csharp/CsharpConfig.cs | 2 +- TopModel.Generator.Csharp/MapperGenerator.cs | 12 +-- .../ImportsJpaExtensions.cs | 2 +- TopModel.Generator.Jpa/JpaConfig.cs | 2 +- TopModel.Generator.Jpa/JpaMapperGenerator.cs | 14 +-- .../JpaModelConstructorGenerator.cs | 12 +-- .../SpringDataFlowGenerator.cs | 6 +- 18 files changed, 182 insertions(+), 106 deletions(-) create mode 100644 TopModel.Core/Model/PropertyMapping.cs diff --git a/TopModel.Core/FileModel/ModelFile.cs b/TopModel.Core/FileModel/ModelFile.cs index 1ad4559d..96636b88 100644 --- a/TopModel.Core/FileModel/ModelFile.cs +++ b/TopModel.Core/FileModel/ModelFile.cs @@ -61,8 +61,8 @@ public class ModelFile .Concat(Classes.SelectMany(c => new[] { c.DefaultPropertyReference, c.OrderPropertyReference, c.FlagPropertyReference }.Select(r => (r, (object)c.ExtendedProperties.FirstOrDefault(p => p.Name == r?.ReferenceName))))) .Concat(Classes.SelectMany(c => c.UniqueKeyReferences.SelectMany(uk => uk).Select(propRef => (propRef, (object)c.Properties.FirstOrDefault(p => p.Name == propRef.ReferenceName))))) .Concat(Classes.SelectMany(c => c.ValueReferences.SelectMany(rv => rv.Value).Select(prop => (prop.Key, (object)c.ExtendedProperties.FirstOrDefault(p => p.Name == prop.Key.ReferenceName))))) - .Concat(Classes.SelectMany(c => c.FromMappers.SelectMany(m => m.Params).Concat(c.ToMappers)).Select(p => (p.ClassReference as Reference, (object)p.Class))) - .Concat(Classes.SelectMany(c => c.FromMappers.SelectMany(m => m.Params).Concat(c.ToMappers).SelectMany(m => m.MappingReferences.SelectMany(mr => new[] { (mr.Key, (object)c.ExtendedProperties.FirstOrDefault(k => k.Name == mr.Key.ReferenceName)), (mr.Value, mr.Value.ReferenceName == "this" || mr.Value.ReferenceName == "false" ? new Keyword { ModelFile = c.ModelFile } : m.Mappings.Values.FirstOrDefault(k => k.Name == mr.Value.ReferenceName)) })))) + .Concat(Classes.SelectMany(c => c.FromMappers.SelectMany(m => m.ClassParams).Concat(c.ToMappers)).Select(p => (p.ClassReference as Reference, (object)p.Class))) + .Concat(Classes.SelectMany(c => c.FromMappers.SelectMany(m => m.ClassParams).Concat(c.ToMappers).SelectMany(m => m.MappingReferences.SelectMany(mr => new[] { (mr.Key, (object)c.ExtendedProperties.FirstOrDefault(k => k.Name == mr.Key.ReferenceName)), (mr.Value, mr.Value.ReferenceName == "this" || mr.Value.ReferenceName == "false" ? new Keyword { ModelFile = c.ModelFile } : m.Mappings.Values.FirstOrDefault(k => k.Name == mr.Value.ReferenceName)) })))) .Concat(Converters.SelectMany(c => c.DomainsFromReferences.Select(d => (d as Reference, c.From.FirstOrDefault(dom => dom.Name == d.ReferenceName) as object)))) .Concat(Converters.SelectMany(c => c.DomainsToReferences.Select(d => (d as Reference, c.To.FirstOrDefault(dom => dom.Name == d.ReferenceName) as object)))) .Concat(DataFlows.Select(d => (d.ClassReference as Reference, d.Class as object))) diff --git a/TopModel.Core/Loaders/ClassLoader.cs b/TopModel.Core/Loaders/ClassLoader.cs index afc0a643..4d3200f0 100644 --- a/TopModel.Core/Loaders/ClassLoader.cs +++ b/TopModel.Core/Loaders/ClassLoader.cs @@ -152,37 +152,74 @@ public Class Load(Parser parser) mapper.Reference = new LocatedString(prop); parser.ConsumeSequence(() => { - var param = new ClassMappings(); - mapper.Params.Add(param); + parser.Consume<MappingStart>(); + if (parser.Current is Scalar { Value: "class" }) + { + var param = new ClassMappings(); + mapper.Params.Add(param); + + Scalar classScalar = null!; + while (parser.Current is not MappingEnd) + { + var prop = parser.Consume<Scalar>(); + switch (prop.Value) + { + case "class": + classScalar = parser.Consume<Scalar>(); + param.ClassReference = new ClassReference(classScalar); + break; + case "required": + param.Required = parser.Consume<Scalar>().Value == "true"; + break; + case "comment": + param.Comment = parser.Consume<Scalar>().Value; + break; + case "name": + param.Name = new LocatedString(parser.Consume<Scalar>()); + break; + case "mappings": + parser.ConsumeMapping(prop => + { + param.MappingReferences.Add(new Reference(prop), new Reference(parser.Consume<Scalar>())); + }); + break; + } + } - Scalar classScalar = null!; - parser.ConsumeMapping(prop => + param.Name ??= new LocatedString(classScalar) { Value = param.ClassReference.ReferenceName.ToCamelCase(strictIfUppercase: true) }; + } + else if (parser.Current is Scalar { Value: "property" }) { - switch (prop.Value) + while (parser.Current is not MappingEnd) { - case "class": - classScalar = parser.Consume<Scalar>(); - param.ClassReference = new ClassReference(classScalar); - break; - case "required": - param.Required = parser.Consume<Scalar>().Value == "true"; - break; - case "comment": - param.Comment = parser.Consume<Scalar>().Value; - break; - case "name": - param.Name = new LocatedString(parser.Consume<Scalar>()); - break; - case "mappings": - parser.ConsumeMapping(prop => - { - param.MappingReferences.Add(new Reference(prop), new Reference(parser.Consume<Scalar>())); - }); - break; + var prop = parser.Consume<Scalar>(); + switch (prop.Value) + { + case "property": + foreach (var p in _propertyLoader.Load(parser)) + { + var param = new PropertyMapping { Property = p }; + mapper.Params.Add(param); + } + + break; + case "target": + var targetReference = new Reference(parser.Consume<Scalar>()); + foreach (var cp in mapper.PropertyParams) + { + cp.TargetPropertyReference = targetReference; + } + + break; + } } - }); + } + else + { + throw new ModelException(classe, $"Erreur dans la construction des paramètres du mapper 'from'."); + } - param.Name ??= new LocatedString(classScalar) { Value = param.ClassReference.ReferenceName.ToCamelCase(strictIfUppercase: true) }; + parser.Consume<MappingEnd>(); }); break; } diff --git a/TopModel.Core/Loaders/PropertyLoader.cs b/TopModel.Core/Loaders/PropertyLoader.cs index 5d4b92dc..4544006a 100644 --- a/TopModel.Core/Loaders/PropertyLoader.cs +++ b/TopModel.Core/Loaders/PropertyLoader.cs @@ -19,7 +19,7 @@ public IEnumerable<IProperty> Load(Parser parser) parser.Consume<MappingStart>(); switch (parser.Current) { - case Scalar { Value: "name" } s: + case Scalar { Value: "name" }: var rp = new RegularProperty { UseLegacyRoleName = _modelConfig.UseLegacyRoleNames }; while (parser.Current is not MappingEnd) diff --git a/TopModel.Core/Model/DataFlowSource.cs b/TopModel.Core/Model/DataFlowSource.cs index cb826eb5..158f56c7 100644 --- a/TopModel.Core/Model/DataFlowSource.cs +++ b/TopModel.Core/Model/DataFlowSource.cs @@ -24,7 +24,7 @@ public class DataFlowSource #nullable enable public FromMapper? TargetFromMapper { - get => DataFlow.Class.FromMappers.FirstOrDefault(fm => fm.Params.Count == 1 && fm.Params.First().Class == Class); + get => DataFlow.Class.FromMappers.FirstOrDefault(fm => fm.Params.Count == 1 && fm.ClassParams.First().Class == Class); } public ClassMappings? FirstSourceToMapper diff --git a/TopModel.Core/Model/FromMapper.cs b/TopModel.Core/Model/FromMapper.cs index 199ec20e..69740c77 100644 --- a/TopModel.Core/Model/FromMapper.cs +++ b/TopModel.Core/Model/FromMapper.cs @@ -1,11 +1,17 @@ -namespace TopModel.Core; +using OneOf; + +namespace TopModel.Core; public class FromMapper { #nullable enable public string? Comment { get; set; } - public List<ClassMappings> Params { get; } = new(); + public List<OneOf<ClassMappings, PropertyMapping>> Params { get; } = new(); + + public IEnumerable<ClassMappings> ClassParams => Params.Where(p => p.IsT0).Select(p => p.AsT0); + + public IEnumerable<PropertyMapping> PropertyParams => Params.Where(p => p.IsT1).Select(p => p.AsT1); #nullable disable internal LocatedString Reference { get; set; } diff --git a/TopModel.Core/Model/PropertyMapping.cs b/TopModel.Core/Model/PropertyMapping.cs new file mode 100644 index 00000000..c56ea808 --- /dev/null +++ b/TopModel.Core/Model/PropertyMapping.cs @@ -0,0 +1,13 @@ +#nullable disable +using TopModel.Core.FileModel; + +namespace TopModel.Core; + +public class PropertyMapping +{ + public IProperty Property { get; set; } + + public IProperty TargetProperty { get; set; } + + public Reference TargetPropertyReference { get; set; } +} diff --git a/TopModel.Core/ModelExtensions.cs b/TopModel.Core/ModelExtensions.cs index 2a9fe79c..5826c82c 100644 --- a/TopModel.Core/ModelExtensions.cs +++ b/TopModel.Core/ModelExtensions.cs @@ -27,7 +27,7 @@ public static class ModelExtensions .Select(c => (Reference: c.ExtendsReference!, File: c.GetFile()))) .Concat(modelStore.DataFlows.Where(d => d.Class == classe).Select(d => (Reference: d.ClassReference, File: d.GetFile()))) .Concat(modelStore.DataFlows.SelectMany(d => d.Sources.Where(s => s.Class == classe).Select(s => (Reference: s.ClassReference, File: d.GetFile())))) - .Concat(modelStore.Classes.SelectMany(c => c.FromMappers.SelectMany(c => c.Params).Concat(c.ToMappers).Where(m => m.Class == classe).Select(m => (Reference: m.ClassReference, File: c.GetFile())))) + .Concat(modelStore.Classes.SelectMany(c => c.FromMappers.SelectMany(c => c.ClassParams).Concat(c.ToMappers).Where(m => m.Class == classe).Select(m => (Reference: m.ClassReference, File: c.GetFile())))) .Where(r => r.Reference is not null) .DistinctBy(l => l.File.Name + l.Reference.Start.Line); } @@ -198,7 +198,7 @@ public static ModelFile GetFile(this object? objet) foreach (var classe in modelStore.Classes) { - foreach (var mappings in classe.FromMappers.SelectMany(m => m.Params).Concat(classe.ToMappers)) + foreach (var mappings in classe.FromMappers.SelectMany(m => m.ClassParams).Concat(classe.ToMappers)) { if (mappings.Mappings.ContainsKey(fp)) { diff --git a/TopModel.Core/ModelStore.cs b/TopModel.Core/ModelStore.cs index 65b00255..b0e8679b 100644 --- a/TopModel.Core/ModelStore.cs +++ b/TopModel.Core/ModelStore.cs @@ -1074,7 +1074,7 @@ IEnumerable<ModelError> ResolveAliases(IEnumerable<AliasProperty> alps) // Résolutions des mappers foreach (var classe in modelFile.Classes) { - foreach (var mappings in classe.FromMappers.SelectMany(m => m.Params).Concat(classe.ToMappers)) + foreach (var mappings in classe.FromMappers.SelectMany(m => m.ClassParams).Concat(classe.ToMappers)) { if (!referencedClasses.TryGetValue(mappings.ClassReference.ReferenceName, out var mappedClass)) { @@ -1174,12 +1174,12 @@ IEnumerable<ModelError> ResolveAliases(IEnumerable<AliasProperty> alps) foreach (var mapper in classe.FromMappers) { - foreach (var param in mapper.Params.Where((e, i) => mapper.Params.Where((p, j) => p.Name == e.Name && j < i).Any())) + foreach (var param in mapper.ClassParams.Where((e, i) => mapper.ClassParams.Where((p, j) => p.Name == e.Name && j < i).Any())) { yield return new ModelError(classe, $"Le nom '{param.Name}' est déjà utilisé.", param.GetLocation()) { ModelErrorType = ModelErrorType.TMD0003 }; } - var mappings = mapper.Params.SelectMany(p => p.MappingReferences); + var mappings = mapper.ClassParams.SelectMany(p => p.MappingReferences); var hasDoublon = false; foreach (var mapping in mappings.Where((e, i) => e.Value.ReferenceName != "false" && mappings.Where((p, j) => p.Value.ReferenceName != "false" && p.Key.ReferenceName == e.Key.ReferenceName && j < i).Any())) @@ -1190,9 +1190,9 @@ IEnumerable<ModelError> ResolveAliases(IEnumerable<AliasProperty> alps) if (!hasDoublon) { - var explicitMappings = mapper.Params.SelectMany(p => p.Mappings).ToList(); + var explicitMappings = mapper.ClassParams.SelectMany(p => p.Mappings).ToList(); - foreach (var param in mapper.Params.Where(p => p.Class != null)) + foreach (var param in mapper.ClassParams.Where(p => p.Class != null)) { foreach (var property in classe.ExtendedProperties.OfType<AliasProperty>().Where(property => !property.Readonly && !explicitMappings.Any(m => m.Key == property) && !param.MappingReferences.Any(m => m.Key.ReferenceName == property.Name && m.Value.ReferenceName == "false"))) { @@ -1208,9 +1208,9 @@ IEnumerable<ModelError> ResolveAliases(IEnumerable<AliasProperty> alps) } } - var explicitAndAliasMappings = mapper.Params.SelectMany(p => p.Mappings).ToList(); + var explicitAndAliasMappings = mapper.ClassParams.SelectMany(p => p.Mappings).ToList(); - foreach (var param in mapper.Params.Where(p => p.Class != null)) + foreach (var param in mapper.ClassParams.Where(p => p.Class != null)) { foreach (var property in classe.ExtendedProperties.OfType<IFieldProperty>().Where(property => !property.Readonly && !explicitAndAliasMappings.Any(m => m.Key == property) && !param.MappingReferences.Any(m => m.Key.ReferenceName == property.Name && m.Value.ReferenceName == "false"))) { @@ -1224,11 +1224,11 @@ IEnumerable<ModelError> ResolveAliases(IEnumerable<AliasProperty> alps) } } - var finalMappings = mapper.Params.SelectMany(p => p.Mappings).ToList(); + var finalMappings = mapper.ClassParams.SelectMany(p => p.Mappings).ToList(); foreach (var mapping in finalMappings.Where((e, i) => finalMappings.Where((p, j) => p.Key == e.Key && j < i).Any())) { - yield return new ModelError(classe, $"Plusieurs propriétés de la classe peuvent être mappées sur '{mapping.Key.Name}' : {string.Join(", ", mapper.Params.SelectMany(p => p.Mappings.Where(m => m.Key == mapping.Key).Select(m => $"'{p.Name}.{m.Value}'")))}.", mapper.GetLocation()) { ModelErrorType = ModelErrorType.TMD1016 }; + yield return new ModelError(classe, $"Plusieurs propriétés de la classe peuvent être mappées sur '{mapping.Key.Name}' : {string.Join(", ", mapper.ClassParams.SelectMany(p => p.Mappings.Where(m => m.Key == mapping.Key).Select(m => $"'{p.Name}.{m.Value}'")))}.", mapper.GetLocation()) { ModelErrorType = ModelErrorType.TMD1016 }; } } } @@ -1287,7 +1287,7 @@ IEnumerable<ModelError> ResolveAliases(IEnumerable<AliasProperty> alps) { foreach (var mapper in classe.FromMappers) { - if (!mapper.Params.SelectMany(p => p.Mappings).Any()) + if (!mapper.ClassParams.SelectMany(p => p.Mappings).Any()) { yield return new ModelError(classe, "Aucun mapping n'a été trouvé sur ce mapper.", mapper.GetLocation()) { ModelErrorType = ModelErrorType.TMD1025 }; } diff --git a/TopModel.Core/TopModel.Core.csproj b/TopModel.Core/TopModel.Core.csproj index 8a55eaca..6a28b322 100644 --- a/TopModel.Core/TopModel.Core.csproj +++ b/TopModel.Core/TopModel.Core.csproj @@ -38,6 +38,7 @@ <ItemGroup> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" /> <PackageReference Include="NJsonSchema" Version="10.8.0" /> + <PackageReference Include="OneOf" Version="3.0.263" /> <PackageReference Include="YamlDotNet" Version="13.1.0" /> </ItemGroup> diff --git a/TopModel.Core/schema.json b/TopModel.Core/schema.json index 412000ca..42466b84 100644 --- a/TopModel.Core/schema.json +++ b/TopModel.Core/schema.json @@ -826,44 +826,63 @@ "type": "array", "description": "Liste des paramètres du mapper.", "items": { - "type": "object", - "description": "Paramètre pour le mapper.", - "required": [ - "class" - ], - "additionalProperties": false, - "properties": { - "class": { - "type": "string", - "description": "Classe depuis laquelle recopier des propriétés." - }, - "required": { - "type": "boolean", - "description": "Paramètre obligatoire. 'true' par défaut." - }, - "comment": { - "type": "string", - "description": "Commentaire facultatif du mapper." - }, - "name": { - "type": "string", - "description": "Nom du paramètre. Utilise le nom de la classe par défaut." - }, - "mappings": { + "oneOf": [ + { "type": "object", - "description": "Correspondances de champs entre la classe courante et la classe en paramètre. Les propriétés doivent avoir le même domaine pour pouvoir établir une correspondance.\n\nLes correspondances entre alias, puis entre propriétés de même nom et de même domaine sont ajoutées automatiquement sauf indication contraire (correspondance explicite sur une autre propriété, ou correspondance renseignée à `false` pour la désactiver).", - "additionalProperties": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "boolean" + "description": "Paramètre pour le mapper.", + "required": [ + "class" + ], + "additionalProperties": false, + "properties": { + "class": { + "type": "string", + "description": "Classe depuis laquelle recopier des propriétés." + }, + "required": { + "type": "boolean", + "description": "Paramètre obligatoire. 'true' par défaut." + }, + "comment": { + "type": "string", + "description": "Commentaire facultatif du mapper." + }, + "name": { + "type": "string", + "description": "Nom du paramètre. Utilise le nom de la classe par défaut." + }, + "mappings": { + "type": "object", + "description": "Correspondances de champs entre la classe courante et la classe en paramètre. Les propriétés doivent avoir le même domaine pour pouvoir établir une correspondance.\n\nLes correspondances entre alias, puis entre propriétés de même nom et de même domaine sont ajoutées automatiquement sauf indication contraire (correspondance explicite sur une autre propriété, ou correspondance renseignée à `false` pour la désactiver).", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] } - ] + } + } + }, + { + "type": "object", + "description": "Paramètre pour le mapper", + "required": [ "property" ], + "additionalProperties": false, + "properties": { + "property": { + "$ref": "#/definitions/property" + }, + "target": { + "type": "string", + "description": "Propriété cible de la classe courante pour cette propriété. Cette propriété doit avoir le même domaine que la propriété source." + } } } - } + ] } } } diff --git a/TopModel.Generator.Core/MapperGeneratorBase.cs b/TopModel.Generator.Core/MapperGeneratorBase.cs index dda12813..eac00e83 100644 --- a/TopModel.Generator.Core/MapperGeneratorBase.cs +++ b/TopModel.Generator.Core/MapperGeneratorBase.cs @@ -19,7 +19,7 @@ public MapperGeneratorBase(ILogger<MapperGeneratorBase<T>> logger) protected IEnumerable<(Class Classe, FromMapper Mapper)> FromMappers => Classes .SelectMany(classe => classe.FromMappers.Select(mapper => (classe, mapper))) - .Where(mapper => mapper.mapper.Params.All(p => Classes.Contains(p.Class))) + .Where(mapper => mapper.mapper.ClassParams.All(p => Classes.Contains(p.Class))) .Select(c => (c.classe, c.mapper)); protected IEnumerable<(Class Classe, ClassMappings Mapper)> ToMappers => Classes @@ -46,7 +46,7 @@ protected override void HandleFiles(IEnumerable<ModelFile> files) .Distinct() .OrderBy(m => m.Classe.NamePascal, StringComparer.Ordinal) .ThenBy(m => m.Mapper.Params.Count) - .ThenBy(m => string.Join(',', m.Mapper.Params.Select(p => p.Name)), StringComparer.Ordinal) + .ThenBy(m => string.Join(',', m.Mapper.ClassParams.Select(p => p.Name)), StringComparer.Ordinal) .ToArray(), Tags: tags); }); @@ -81,7 +81,7 @@ private IEnumerable<string> GetMapperTags((Class Classe, FromMapper Mapper) mapp return mapper.Classe.Tags; } - var persistentParam = mapper.Mapper.Params.FirstOrDefault(p => IsPersistent(p.Class)); + var persistentParam = mapper.Mapper.ClassParams.FirstOrDefault(p => IsPersistent(p.Class)); if (persistentParam != null) { return persistentParam.Class.Tags; diff --git a/TopModel.Generator.Csharp/CsharpConfig.cs b/TopModel.Generator.Csharp/CsharpConfig.cs index c2216c2e..1ceea025 100644 --- a/TopModel.Generator.Csharp/CsharpConfig.cs +++ b/TopModel.Generator.Csharp/CsharpConfig.cs @@ -272,7 +272,7 @@ public string GetMapperFilePath((Class Classe, ClassMappings Mapper) mapper, str return (mapper.Classe.Namespace, pmp); } - var persistentParam = mapper.Mapper.Params.FirstOrDefault(p => p.Class.IsPersistent); + var persistentParam = mapper.Mapper.ClassParams.FirstOrDefault(p => p.Class.IsPersistent); if (persistentParam != null) { return (persistentParam.Class.Namespace, pmp); diff --git a/TopModel.Generator.Csharp/MapperGenerator.cs b/TopModel.Generator.Csharp/MapperGenerator.cs index 9eac26f2..001081dc 100644 --- a/TopModel.Generator.Csharp/MapperGenerator.cs +++ b/TopModel.Generator.Csharp/MapperGenerator.cs @@ -39,7 +39,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla var ns = Config.GetNamespace(mapperNs, modelPath, tag); - var usings = fromMappers.SelectMany(m => m.Mapper.Params.Select(p => p.Class).Concat(new[] { m.Classe })) + var usings = fromMappers.SelectMany(m => m.Mapper.ClassParams.Select(p => p.Class).Concat(new[] { m.Classe })) .Concat(toMappers.SelectMany(m => new[] { m.Classe, m.Mapper.Class })) .Select(c => Config.GetNamespace(c, GetBestClassTag(c, tag))) .Where(@using => !ns.Contains(@using)) @@ -62,7 +62,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla var (classe, mapper) = fromMapper; w.WriteSummary(1, $"Crée une nouvelle instance de '{classe.NamePascal}'{(mapper.Comment != null ? $"\n{mapper.Comment}" : string.Empty)}"); - foreach (var param in mapper.Params) + foreach (var param in mapper.ClassParams) { if (param.Comment != null) { @@ -85,7 +85,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla w.Write(1, $"public static {classe.NamePascal} Create{classe.NamePascal}"); } - w.WriteLine($"({string.Join(", ", mapper.Params.Select(p => $"{(p.Class.Abstract ? "I" : string.Empty)}{p.Class.NamePascal} {p.Name}{(!p.Required ? " = null" : string.Empty)}"))})"); + w.WriteLine($"({string.Join(", ", mapper.ClassParams.Select(p => $"{(p.Class.Abstract ? "I" : string.Empty)}{p.Class.NamePascal} {p.Name}{(!p.Required ? " = null" : string.Empty)}"))})"); if (classe.Abstract) { @@ -94,7 +94,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla w.WriteLine(1, "{"); - foreach (var param in mapper.Params.Where(p => p.Required)) + foreach (var param in mapper.ClassParams.Where(p => p.Required)) { w.WriteLine(2, $"if ({param.Name} is null)"); w.WriteLine(2, "{"); @@ -113,7 +113,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla w.WriteLine(2, "{"); } - foreach (var param in mapper.Params) + foreach (var param in mapper.ClassParams) { var mappings = param.Mappings.ToList(); foreach (var mapping in mappings) @@ -152,7 +152,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla } } - if (mapper.Params.IndexOf(param) < mapper.Params.Count - 1 || mappings.IndexOf(mapping) < mappings.Count - 1) + if (mapper.Params.IndexOf(param) < mapper.ClassParams.Count() - 1 || mappings.IndexOf(mapping) < mappings.Count - 1) { w.Write(","); } diff --git a/TopModel.Generator.Jpa/ImportsJpaExtensions.cs b/TopModel.Generator.Jpa/ImportsJpaExtensions.cs index 7512cba1..a7000309 100644 --- a/TopModel.Generator.Jpa/ImportsJpaExtensions.cs +++ b/TopModel.Generator.Jpa/ImportsJpaExtensions.cs @@ -21,7 +21,7 @@ public static List<string> GetImports(this Class classe, JpaConfig config, strin if (config.MappersInClass) { imports - .AddRange(classe.FromMappers.Where(fm => fm.Params.All(fmp => availableClasses.Contains(fmp.Class))).SelectMany(fm => fm.Params).Select(fmp => fmp.Class.GetImport(config, tag))); + .AddRange(classe.FromMappers.Where(fm => fm.ClassParams.All(fmp => availableClasses.Contains(fmp.Class))).SelectMany(fm => fm.ClassParams).Select(fmp => fmp.Class.GetImport(config, tag))); imports .AddRange(classe.ToMappers.Where(tm => availableClasses.Contains(tm.Class)).Select(fmp => fmp.Class.GetImport(config, tag))); } diff --git a/TopModel.Generator.Jpa/JpaConfig.cs b/TopModel.Generator.Jpa/JpaConfig.cs index c2ed0b98..116a4a98 100644 --- a/TopModel.Generator.Jpa/JpaConfig.cs +++ b/TopModel.Generator.Jpa/JpaConfig.cs @@ -229,7 +229,7 @@ public string GetMapperImport(Namespace ns, string modelPath, string tag) return (mapper.Classe.Namespace, EntitiesPath); } - var persistentParam = mapper.Mapper.Params.FirstOrDefault(p => p.Class.IsPersistent); + var persistentParam = mapper.Mapper.ClassParams.FirstOrDefault(p => p.Class.IsPersistent); if (persistentParam != null) { return (persistentParam.Class.Namespace, EntitiesPath); diff --git a/TopModel.Generator.Jpa/JpaMapperGenerator.cs b/TopModel.Generator.Jpa/JpaMapperGenerator.cs index fcd68a4a..e2326488 100644 --- a/TopModel.Generator.Jpa/JpaMapperGenerator.cs +++ b/TopModel.Generator.Jpa/JpaMapperGenerator.cs @@ -40,7 +40,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla using var fw = new JavaWriter(fileName, _logger, package, null); - var imports = fromMappers.SelectMany(m => m.Mapper.Params.Select(p => p.Class).Concat(new[] { m.Classe })) + var imports = fromMappers.SelectMany(m => m.Mapper.ClassParams.Select(p => p.Class).Concat(new[] { m.Classe })) .Concat(toMappers.SelectMany(m => new[] { m.Classe, m.Mapper.Class })) .Where(c => Classes.Contains(c)) .Select(c => c.GetImport(Config, c.Tags.Contains(tag) ? tag : c.Tags.Intersect(Config.Tags).First())) @@ -118,9 +118,9 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla getter = $"{Config.GetMapperName(cpMapperNs, cpMapperModelPath)}.{cpMapper.Name.Value.ToCamelCase()}({sourceName}.{cp.NameByClassPascal.WithPrefix(getterPrefix)}(), target.get{apSource.NameByClassPascal}())"; fw.AddImport(Config.GetMapperImport(cpMapperNs, cpMapperModelPath, tag)!); } - else if (cp.Composition.FromMappers.Any(f => f.Params.Count == 1 && f.Params.First().Class == apSource.Association)) + else if (cp.Composition.FromMappers.Any(f => f.Params.Count == 1 && f.ClassParams.First().Class == apSource.Association)) { - var cpMapper = cp.Composition.FromMappers.Find(f => f.Params.Count == 1 && f.Params.First().Class == apSource.Association)!; + var cpMapper = cp.Composition.FromMappers.Find(f => f.Params.Count == 1 && f.ClassParams.First().Class == apSource.Association)!; var (cpMapperNs, cpMapperModelPath) = Config.GetMapperLocation((cp.Composition, cpMapper)); getter = $"{sourceName}.{apSource.NameByClassPascal.WithPrefix(getterPrefix)}()"; @@ -234,7 +234,7 @@ private void WriteFromMapper(Class classe, FromMapper mapper, JavaWriter fw, str fw.WriteLine(); fw.WriteDocStart(1, $"Map les champs des classes passées en paramètre dans l'objet target'"); fw.WriteParam("target", $"Instance de '{classe}' (ou null pour créer une nouvelle instance)"); - foreach (var param in mapper.Params) + foreach (var param in mapper.ClassParams) { if (param.Comment != null) { @@ -248,7 +248,7 @@ private void WriteFromMapper(Class classe, FromMapper mapper, JavaWriter fw, str fw.WriteReturns(1, $"Une nouvelle instance de '{classe.NamePascal}' ou bien l'instance passée en paramètres sur lesquels les champs sources ont été mappée"); fw.WriteDocEnd(1); - fw.WriteLine(1, $"public static {classe.NamePascal} create{classe.NamePascal}({string.Join(", ", mapper.Params.Select(p => $"{p.Class} {p.Name.ToCamelCase()}"))}, {classe.NamePascal} target) {{"); + fw.WriteLine(1, $"public static {classe.NamePascal} create{classe.NamePascal}({string.Join(", ", mapper.ClassParams.Select(p => $"{p.Class} {p.Name.ToCamelCase()}"))}, {classe.NamePascal} target) {{"); fw.WriteLine(2, "if (target == null) {"); if (classe.Abstract) { @@ -269,7 +269,7 @@ private void WriteFromMapper(Class classe, FromMapper mapper, JavaWriter fw, str var isFirst = true; - foreach (var param in mapper.Params.Where(p => p.Mappings.Count > 0)) + foreach (var param in mapper.ClassParams.Where(p => p.Mappings.Count > 0)) { if (param.Required && !classe.Abstract) { @@ -280,7 +280,7 @@ private void WriteFromMapper(Class classe, FromMapper mapper, JavaWriter fw, str } } - foreach (var param in mapper.Params.Where(p => p.Mappings.Count > 0)) + foreach (var param in mapper.ClassParams.Where(p => p.Mappings.Count > 0)) { var mappings = param.Mappings.ToList(); var indent = 2; diff --git a/TopModel.Generator.Jpa/JpaModelConstructorGenerator.cs b/TopModel.Generator.Jpa/JpaModelConstructorGenerator.cs index 486cc5c0..2ff39f51 100644 --- a/TopModel.Generator.Jpa/JpaModelConstructorGenerator.cs +++ b/TopModel.Generator.Jpa/JpaModelConstructorGenerator.cs @@ -80,9 +80,9 @@ public void WriteEnumConstructor(JavaWriter fw, Class classe, List<Class> availa public void WriteFromMappers(JavaWriter fw, Class classe, List<Class> availableClasses, string tag) { - var fromMappers = classe.FromMappers.Where(c => c.Params.All(p => availableClasses.Contains(p.Class))).Select(m => (classe, m)) - .OrderBy(m => m.classe.NamePascal) - .ToList(); + var fromMappers = classe.FromMappers.Where(c => c.ClassParams.All(p => availableClasses.Contains(p.Class))).Select(m => (classe, m)) + .OrderBy(m => m.classe.NamePascal) + .ToList(); foreach (var fromMapper in fromMappers) { @@ -94,7 +94,7 @@ public void WriteFromMappers(JavaWriter fw, Class classe, List<Class> availableC fw.WriteLine(1, $" * {mapper.Comment}"); } - foreach (var param in mapper.Params) + foreach (var param in mapper.ClassParams) { if (param.Comment != null) { @@ -106,14 +106,14 @@ public void WriteFromMappers(JavaWriter fw, Class classe, List<Class> availableC fw.WriteReturns(1, $"Une nouvelle instance de '{classe.NamePascal}'"); fw.WriteDocEnd(1); - fw.WriteLine(1, $"public {classe.NamePascal}({string.Join(", ", mapper.Params.Select(p => $"{p.Class.NamePascal} {p.Name.ToCamelCase()}"))}) {{"); + fw.WriteLine(1, $"public {classe.NamePascal}({string.Join(", ", mapper.ClassParams.Select(p => $"{p.Class.NamePascal} {p.Name.ToCamelCase()}"))}) {{"); if (classe.Extends != null) { fw.WriteLine(2, $"super();"); } var (mapperNs, mapperModelPath) = _config.GetMapperLocation(fromMapper); - fw.WriteLine(2, $"{_config.GetMapperName(mapperNs, mapperModelPath)}.create{classe.NamePascal}({string.Join(", ", mapper.Params.Select(p => p.Name.ToCamelCase()))}, this);"); + fw.WriteLine(2, $"{_config.GetMapperName(mapperNs, mapperModelPath)}.create{classe.NamePascal}({string.Join(", ", mapper.ClassParams.Select(p => p.Name.ToCamelCase()))}, this);"); fw.AddImport(_config.GetMapperImport(mapperNs, mapperModelPath, tag)!); fw.WriteLine(1, "}"); } diff --git a/TopModel.Generator.Jpa/SpringDataFlowGenerator.cs b/TopModel.Generator.Jpa/SpringDataFlowGenerator.cs index f7d4a9c7..115f6ac6 100644 --- a/TopModel.Generator.Jpa/SpringDataFlowGenerator.cs +++ b/TopModel.Generator.Jpa/SpringDataFlowGenerator.cs @@ -477,9 +477,9 @@ private void WriteWriterMapper(JavaWriter fw, DataFlow dataFlow, string tag) var mapper = dataFlow.Class.FromMappers.Where(m => { var result = true; - for (int i = 0; i < m.Params.Count; i++) + for (int i = 0; i < m.ClassParams.Count(); i++) { - result = result && m.Params[i].Class == dataFlow.Sources[i].Class; + result = result && m.ClassParams.ElementAt(i).Class == dataFlow.Sources[i].Class; } return result; @@ -491,7 +491,7 @@ private void WriteWriterMapper(JavaWriter fw, DataFlow dataFlow, string tag) } foreach (var property in dataFlow.Class.ExtendedProperties.OfType<IFieldProperty>() - .Where(p => mapper == null || mapper.Params.SelectMany(pa => pa.Mappings).Select(mapping => mapping.Key).Contains(p))) + .Where(p => mapper == null || mapper.ClassParams.SelectMany(pa => pa.Mappings).Select(mapping => mapping.Key).Contains(p))) { var sqlType = property.Domain.Implementations["sql"].Type ?? string.Empty; string dataType = sqlType.ToUpper() switch