Skip to content

Commit

Permalink
[JPA] Implémentation des compositions sur les classes persistées
Browse files Browse the repository at this point in the history
  • Loading branch information
gideruette committed Aug 27, 2024
1 parent d9d51ec commit ea971f2
Show file tree
Hide file tree
Showing 15 changed files with 116 additions and 40 deletions.
2 changes: 1 addition & 1 deletion TopModel.Generator.Core/GeneratorConfigBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ public void InitVariables(string app, int number)

var hasMissingVar = false;

foreach (var property in GetType().GetProperties().Where(p => p.PropertyType == typeof(string)))
foreach (var property in GetType().GetProperties().Where(p => p.PropertyType == typeof(string) && p.CanWrite))
{
var value = (string?)property.GetValue(this);
if (value != null)
Expand Down
7 changes: 7 additions & 0 deletions TopModel.Generator.Jpa/JpaConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ public class JpaConfig : GeneratorConfigBase
/// </summary>
public string? DbSchema { get; set; }

/// <summary>
/// Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd
/// </summary>
public string CompositionConverterCanonicalName { get; set; } = "{package}.{class}Converter";

public string CompositionConverterSimpleName => CompositionConverterCanonicalName.Split('.').Last();

/// <summary>
/// Option pour générer des adders pour les associations oneToMany et ManyToMany
/// </summary>
Expand Down
13 changes: 0 additions & 13 deletions TopModel.Generator.Jpa/JpaModelGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,6 @@ protected override string GetFileName(Class classe, string tag)

protected override void HandleClass(string fileName, Class classe, string tag)
{
CheckClass(classe);

var packageName = Config.GetPackageName(classe, tag);
using var fw = new JavaWriter(fileName, _logger, packageName, null);

Expand Down Expand Up @@ -147,17 +145,6 @@ protected override void HandleClass(string fileName, Class classe, string tag)
fw.WriteLine("}");
}

private void CheckClass(Class classe)
{
foreach (var property in classe.GetProperties(AvailableClasses).OfType<CompositionProperty>())
{
if (!classe.IsPersistent && property.Composition.IsPersistent)
{
throw new ModelException(property, $"La propriété ${property} persistée ne peut pas faire l'objet d'une composition dans la classe {classe.Name} car elle ne l'est pas");
}
}
}

private void WriteAdders(JavaWriter fw, Class classe, string tag)
{
if (classe.IsPersistent && Config.AssociationAdders)
Expand Down
41 changes: 30 additions & 11 deletions TopModel.Generator.Jpa/JpaModelPropertyGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,18 @@ public void WriteCompositePrimaryKeyClass(JavaWriter fw, Class classe, string ta
fw.WriteLine(1, "}");
}

public void WriteCompositionProperty(JavaWriter fw, CompositionProperty property)
public void WriteCompositionProperty(JavaWriter fw, CompositionProperty property, string tag)
{
fw.WriteDocEnd(1);
if (property.Class.IsPersistent)
{
var javaOrJakarta = _config.PersistenceMode.ToString().ToLower();
fw.AddImport($"{javaOrJakarta}.persistence.Convert");
fw.AddImport(_config.CompositionConverterCanonicalName.Replace("{class}", property.Class.Name).Replace("{package}", _config.GetPackageName(property.Class, tag)));
fw.WriteLine(1, $"@Convert(converter = {_config.CompositionConverterSimpleName.Replace("{class}", property.Class.Name)}.class)");
WriteColumnAnnotation(fw, property, 1);
}

fw.WriteLine(1, $"private {_config.GetType(property)} {property.NameCamel};");
}

Expand Down Expand Up @@ -127,7 +136,7 @@ public void WriteProperty(JavaWriter fw, Class classe, IProperty property, strin
switch (property)
{
case CompositionProperty cp:
WriteCompositionProperty(fw, cp);
WriteCompositionProperty(fw, cp, tag);
break;
case AssociationProperty { Association.IsPersistent: true } ap:
WriteAssociationProperty(fw, classe, ap, tag);
Expand Down Expand Up @@ -328,31 +337,41 @@ private void WriteAutogeneratedAnnotations(JavaWriter fw, Class classe, string j
}
}

private void WriteColumnAnnotation(JavaWriter fw, IFieldProperty property, int indentLevel)
private void WriteColumnAnnotation(JavaWriter fw, IProperty property, int indentLevel)
{
var javaOrJakarta = _config.PersistenceMode.ToString().ToLower();
string column;
if (!_config.UseJdbc)
{
column = @$"@Column(name = ""{property.SqlName}"", nullable = {(!property.Required).ToString().ToFirstLower()}";
if (property.Domain.Length != null)
if (property.Domain != null)
{

Check warning on line 348 in TopModel.Generator.Jpa/JpaModelPropertyGenerator.cs

View workflow job for this annotation

GitHub Actions / build

if (_config.GetImplementation(property.Domain)?.Type?.ToUpper() == "STRING")

if (property.Domain.Length != null)
{
column += $", length = {property.Domain.Length}";
if (_config.GetImplementation(property.Domain)?.Type?.ToUpper() == "STRING")
{
column += $", length = {property.Domain.Length}";
}
else
{
column += $", precision = {property.Domain.Length}";
}
}
else

if (property.Domain.Scale != null)
{
column += $", precision = {property.Domain.Length}";
column += $", scale = {property.Domain.Scale}";
}

column += @$", columnDefinition = ""{property.Domain.Implementations["sql"].Type}""";
}

if (property.Domain.Scale != null)
if (property is CompositionProperty && property.Domain is null)
{
column += $", scale = {property.Domain.Scale}";
column += @$", columnDefinition = ""jsonb""";
}

column += @$", columnDefinition = ""{property.Domain.Implementations["sql"].Type}""";
column += ")";
fw.AddImport($"{javaOrJakarta}.persistence.Column");
}
Expand Down
13 changes: 8 additions & 5 deletions TopModel.Generator.Jpa/jpa.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down Expand Up @@ -133,10 +139,7 @@
"type": "string",
"description": "Encodage des fichiers de resource.",
"default": "Latin1",
"enum": [
"Latin1",
"UTF8"
]
"enum": ["Latin1", "UTF8"]
},
"useJdbc": {
"type": "boolean",
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/angular/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/csharp/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/database/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/focus/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/jpa/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/open-api/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/pg/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/php/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/ssdt/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down
8 changes: 7 additions & 1 deletion samples/generators/translation/topmodel.config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,13 @@
},
"apiPath": {
"type": "string",
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'."
"description": "Localisation du l'API générée (client ou serveur), relative au répertoire de génération. Par défaut, 'javagen:{app}/api/{module}'.",
"default": "javagen:{app}/api/{module}"
},
"compositionConverterCanonicalName": {
"type": "string",
"description": "Nom complet de la classe permettant de convertir les compositions stockées en json dans la bdd. Supporte le template {package} et {class}",
"default": "{package}.{class}Converter"
},
"apiGeneration": {
"oneOf": [
Expand Down

0 comments on commit ea971f2

Please sign in to comment.