Skip to content

Commit

Permalink
Merge pull request #334 from dchallas/develop
Browse files Browse the repository at this point in the history
[JPA] Permettre de personnaliser l'interface dont héritent les daos
  • Loading branch information
JabX authored Feb 8, 2024
2 parents e1d1481 + ef18609 commit c904acf
Show file tree
Hide file tree
Showing 19 changed files with 164 additions and 46 deletions.
10 changes: 10 additions & 0 deletions TopModel.Generator.Jpa/JpaConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,16 @@ public class JpaConfig : GeneratorConfigBase
/// </summary>
public bool UseJdbc { get; set; } = false;

/// <summary>
/// Génération d'interface Abstract avec @NoRepositoryBean permettant de mettre à jour le code généré.
/// </summary>
public bool DaosAbstract { get; set; } = false;

/// <summary>
/// Précise l'interface des Daos générés.
/// </summary>
public string? DaosInterface { get; set; }

/// <summary>
/// Indique s'il faut ajouter les mappers en tant méthode ou constructeur dans les classes qui les déclarent.
/// </summary>
Expand Down
44 changes: 38 additions & 6 deletions TopModel.Generator.Jpa/JpaDaoGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,17 @@ protected override bool FilterClass(Class classe)

protected override string GetFileName(Class classe, string tag)
{
string path = Config.DaosAbstract ? $"Abstract{classe.NamePascal}DAO.java" : $"{classe.NamePascal}DAO.java";
return Path.Combine(
Config.OutputDirectory,
Config.ResolveVariables(Config.DaosPath!, tag, module: classe.Namespace.Module).ToFilePath(),
$"{classe.NamePascal}DAO.java");
path);
}

protected override void HandleClass(string fileName, Class classe, string tag)
{
// Ne génère le DAO qu'une seule fois
if (File.Exists(fileName))
if (!Config.DaosAbstract && File.Exists(fileName))
{
return;
}
Expand Down Expand Up @@ -64,7 +65,32 @@ protected override void HandleClass(string fileName, Class classe, string tag)
pk = classe.PrimaryKey.Count() > 1 ? $"{classe.NamePascal}.{classe.NamePascal}Id" : Config.GetType(classe.PrimaryKey.Single());
}

fw.WriteLine($"public interface {classe.NamePascal}DAO extends {(classe.Reference || Config.UseJdbc ? "CrudRepository" : "JpaRepository")}<{classe.NamePascal}, {pk}> {{");
string daosInterface;
if (Config.DaosInterface != null)
{
int lastIndexOf = Config.DaosInterface.LastIndexOf(".");
string daosInterfaceName = lastIndexOf > -1 ? Config.DaosInterface.Substring(lastIndexOf + 1) : Config.DaosInterface;
daosInterface = $"{daosInterfaceName}<{classe.NamePascal}, {pk}>";
}
else if (classe.Reference || Config.UseJdbc)
{
daosInterface = $"CrudRepository<{classe.NamePascal}, {pk}>";
}
else
{
daosInterface = $"JpaRepository<{classe.NamePascal}, {pk}>";
}

if (Config.DaosAbstract)
{
fw.WriteLine("@NoRepositoryBean");
fw.WriteLine($"interface Abstract{classe.NamePascal}DAO extends {daosInterface} {{");
}
else
{
fw.WriteLine($"interface {classe.NamePascal}DAO extends {daosInterface} {{");
}

fw.WriteLine();
fw.WriteLine("}");
}
Expand All @@ -75,11 +101,12 @@ private void WriteImports(JavaWriter fw, Class classe, string tag)
{
classe.GetImport(Config, tag)
};
if (Config.UseJdbc)

if (Config.DaosInterface != null)
{
imports.Add("org.springframework.data.repository.CrudRepository");
imports.Add($"{Config.DaosInterface}");
}
else if (classe.Reference)
else if (classe.Reference || Config.UseJdbc)
{
imports.Add("org.springframework.data.repository.CrudRepository");
}
Expand All @@ -88,6 +115,11 @@ private void WriteImports(JavaWriter fw, Class classe, string tag)
imports.Add("org.springframework.data.jpa.repository.JpaRepository");
}

if (Config.DaosAbstract)
{
imports.Add("org.springframework.data.repository.NoRepositoryBean");
}

fw.AddImports(imports);
}
}
10 changes: 10 additions & 0 deletions TopModel.Generator.Jpa/jpa.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,16 @@
"description": "Générer les entités en mode JDBC",
"default": "false"
},
"daosAbstract": {
"type": "boolean",
"description": " Génération d'interface Abstract avec @NoRepositoryBean permettant de mettre à jour le code généré",
"default": "false"
},
"daosInterface": {
"type": "string",
"description": "Précise l'interface des Daos générés.",
"default": "false"
},
"mappersInClass": {
"type": "boolean",
"description": "Indique s'il faut ajouter les mappers en tant méthode ou constructeur dans les classes qui les déclarent"
Expand Down
23 changes: 23 additions & 0 deletions docs/generator/jpa.md
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,29 @@ Le générateur créé un fichier de configuration de job par module. Ce job ord

_Variables par tag_: **oui** (plusieurs DAOs pourraient être générés si un fichier à plusieurs tags)


- `daosAbstract`

Génération des DAO sous forme 'Abtract' à hériter pour l'utiliser dans le projet dans le projet avec :
- le nom Abstract{classe.NamePascal}DAO
- le fichier java sera mise à jour (écrasé) à chaque génération de code
- l'annotation @NoRepositoryBean ajoutée (org.springframework.data.repository.NoRepositoryBean) permettant de ne pas considérer cette interface comme un DAO
- il faut donc créer une interface qui en hérite dans le projet
- le 'daosPath' peut être dans un répertoire de type 'javagen'

- `daosInterface`

Permet de surcharger les interfaces par default des DAOS:
- si UseJdbc, l'interface est org.springframework.data.repository.CrudRepository
- si Reference, l'interface est org.springframework.data.repository.CrudRepository
- si aucun des deux, l'interface est org.springframework.data.jpa.repository.JpaRepository
- si daosInterface est précisée, les autres cas ne sont pas utilisés.

Seul le nom de la classe est configurable, elle doit respecter le même pattern générique que JpaRespository et CrudRepository soit :
- La classe de l'entité en premier
- La classe de l'identifiant en second
- {DaosInterface}<{classe.NamePascal}, {pk}>

- `dtosPath`

Localisation des classes non persistées du modèle, relative au répertoire de génération.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package topmodel.jpa.sample.demo.daos.repository;

import org.springframework.data.repository.CrudRepository;

public interface CustomCrudRepository<T, ID> extends CrudRepository<T, ID> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package topmodel.jpa.sample.demo.daos.securite.profil;

public interface DroitDAO extends AbstractDroitDAO {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package topmodel.jpa.sample.demo.daos.securite.profil;

public interface ProfilDAO extends AbstractProfilDAO {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package topmodel.jpa.sample.demo.daos.securite.profil;

public interface TypeDroitDAO extends AbstractTypeDroitDAO {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package topmodel.jpa.sample.demo.daos.securite.utilisateur;

public interface TypeUtilisateurDAO extends AbstractTypeUtilisateurDAO {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package topmodel.jpa.sample.demo.daos.securite.utilisateur;

public interface UtilisateurDAO extends AbstractUtilisateurDAO {

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@

package topmodel.jpa.sample.demo.daos.securite.profil;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

import topmodel.jpa.sample.demo.daos.repository.CustomCrudRepository;
import topmodel.jpa.sample.demo.entities.securite.profil.Droit;
import topmodel.jpa.sample.demo.enums.securite.profil.DroitCode;


public interface DroitDAO extends CrudRepository<Droit, DroitCode> {
@NoRepositoryBean
interface AbstractDroitDAO extends CustomCrudRepository<Droit, DroitCode> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
////
//// ATTENTION CE FICHIER EST GENERE AUTOMATIQUEMENT !
////

package topmodel.jpa.sample.demo.daos.securite.profil;

import org.springframework.data.repository.NoRepositoryBean;

import topmodel.jpa.sample.demo.daos.repository.CustomCrudRepository;
import topmodel.jpa.sample.demo.entities.securite.profil.Profil;


@NoRepositoryBean
interface AbstractProfilDAO extends CustomCrudRepository<Profil, Integer> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@

package topmodel.jpa.sample.demo.daos.securite.profil;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

import topmodel.jpa.sample.demo.daos.repository.CustomCrudRepository;
import topmodel.jpa.sample.demo.entities.securite.profil.TypeDroit;
import topmodel.jpa.sample.demo.enums.securite.profil.TypeDroitCode;


public interface TypeDroitDAO extends CrudRepository<TypeDroit, TypeDroitCode> {
@NoRepositoryBean
interface AbstractTypeDroitDAO extends CustomCrudRepository<TypeDroit, TypeDroitCode> {

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@

package topmodel.jpa.sample.demo.daos.securite.utilisateur;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

import topmodel.jpa.sample.demo.daos.repository.CustomCrudRepository;
import topmodel.jpa.sample.demo.entities.securite.utilisateur.TypeUtilisateur;
import topmodel.jpa.sample.demo.enums.securite.utilisateur.TypeUtilisateurCode;


public interface TypeUtilisateurDAO extends CrudRepository<TypeUtilisateur, TypeUtilisateurCode> {
@NoRepositoryBean
interface AbstractTypeUtilisateurDAO extends CustomCrudRepository<TypeUtilisateur, TypeUtilisateurCode> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
////
//// ATTENTION CE FICHIER EST GENERE AUTOMATIQUEMENT !
////

package topmodel.jpa.sample.demo.daos.securite.utilisateur;

import org.springframework.data.repository.NoRepositoryBean;

import topmodel.jpa.sample.demo.daos.repository.CustomCrudRepository;
import topmodel.jpa.sample.demo.entities.securite.utilisateur.Utilisateur;


@NoRepositoryBean
interface AbstractUtilisateurDAO extends CustomCrudRepository<Utilisateur, Integer> {

}

This file was deleted.

4 changes: 3 additions & 1 deletion samples/generators/jpa/topmodel.config
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# yaml-language-server: $schema=./topmodel.config.schema.json
# yaml-language-server: $schema=./topmodel.config.schema.json
---
app: topmodel.jpa.sample.demo
modelRoot: ../../model
Expand All @@ -22,3 +22,5 @@ jpa:
fieldsEnum: Persisted_Dto
enumShortcutMode: false
persistenceMode: jakarta
daosInterface: topmodel.jpa.sample.demo.daos.repository.CustomCrudRepository
daosAbstract: true
10 changes: 5 additions & 5 deletions samples/model/jpa.topmodel.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ generatedFiles:
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/UtilisateurClient.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/server/securite/profil/ProfilController.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/server/securite/utilisateur/UtilisateurController.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/profil/DroitDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/profil/ProfilDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/profil/TypeDroitDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/utilisateur/TypeUtilisateurDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/utilisateur/UtilisateurDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/profil/AbstractDroitDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/profil/AbstractProfilDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/profil/AbstractTypeDroitDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/utilisateur/AbstractTypeUtilisateurDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/utilisateur/AbstractUtilisateurDAO.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/dtos/securite/profil/ProfilItem.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/dtos/securite/profil/ProfilRead.java
- ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/dtos/securite/profil/ProfilWrite.java
Expand Down

0 comments on commit c904acf

Please sign in to comment.