| Domaine / Application | Rôle principal | Technologies et formats | Volume global estimé | Modules / Artefacts |
|---|---|---|---|---|
| SAT-PRE | Supervision d’incidents et exécution des workflows métier | Java 8 (JEE 7, JSF 2.x, EJB 3.x), XML BPM (webMethods 9.x) | ~70 000 LOC Java + 2 600 lignes XML BPM | 28 modules Maven + 3 processus BPM |
| SAT-HAB | Gestion des habilitations et SSO | Java 8 (JEE 7, JSF 2.x) | ~18 000 LOC Java | 7 modules Maven |
Total analysé : ~88 000 lignes de code Java (952 classes production, 904 à impact métier) et 2 561 lignes XML BPM décrivant 39 étapes de workflow et 24 invocations de services.
L'analyse a donc porté sur :
Le code Java : logique applicative, services, entités, contrôleurs.
Les processus BPM : orchestration métier, appels de services Java, transitions d'état.
Ces deux couches — code exécutable et modèles de processus — ont été examinées conjointement afin de relier la structure logicielle à la logique métier.
L'audit utilise deux approches complémentaires pour le comptage et la classification des classes Java :
| Approche | Périmètre | Classes Identifiées | Méthode |
|---|---|---|---|
| Analyse systématique (AST) | Code de production complet | 952 classes | Extraction syntaxique exhaustive via Abstract Syntax Tree (javalang) |
| Analyse enrichie (BPM + Métier) | Code à impact fonctionnel | 904 classes | Analyse des workflows BPM (BPMN 2.0) + classification experte |
| Ground truth (référence) | Toutes classes production | 959 classes | Comptage regex sur fichiers source (validation) |
Analyse systématique (952 classes) :
Exclut 7 classes internes générées (Builder bases via Fluent Builders Generator, 1 inner helper class)
Représente 99,3% du code source vérifié
✅ Utilisé pour l'analyse de dépendances et la traçabilité complète
Inclut toutes classes architecturalement significantes (interfaces, abstracts, DTOs, exceptions, config)
Analyse enrichie (904 classes) :
Focus sur le code à impact métier (controllers, services, entités, domaine)
Exclut ~48 classes techniques (interfaces, DTOs, abstracts, exceptions, configuration)
Représente 94,3% du code source vérifié
✅ Utilisé pour la priorisation de la migration et la planification fonctionnelle
Validation croisée :
SonarQube rapporte 923 classes (cohérent, point médian entre 952 et 904)
✅ Confirme l'absence d'anomalie dans les comptages
7 classes générées (impact négligeable : 0,7% du périmètre) :
com.grdf.poc.sat.pre.domaine.inc.builder.IncidentBuilderBase — classe base générée
com.grdf.poc.sat.pre.domaine.inc.builder.IncidentRegroupementIncidentBuilder — inner class générée
com.grdf.poc.sat.pre.domaine.par.builder.TypeIncidentBuilderBase — classe base générée
com.grdf.poc.sat.pre.transverse.inc.recherche.dto.builder.RechercheIncidentDtoBuilderBase — classe base générée
com.grdf.poc.sat.pre.transverse.inc.recherche.dto.builder.RechercheTacheDtoBuilderBase — classe base générée
com.grdf.poc.sat.pre.transverse.wkf.dto.builder.TacheDetailProcedureDtoBuilderBase — classe base générée
com.grdf.poc.sat.pre.transverse.spre29.Compteur — inner helper class dans DonneesPceSpre29Dto.java
Justification : Code généré automatiquement (Fluent Builders Generator), non maintenu manuellement, impact architectural négligeable sur la séparation SIAS/TICC.
Chiffre préférentiel : 952 classes (analyse systématique)
Rationale :
Périmètre le plus exhaustif (99,3% du code source)
Inclut toutes les classes architecturalement significantes
Traçabilité totale (evidence chains disponibles pour chaque assignation)
Reproductible et auditable (configuration YAML + algorithme documenté)
Chiffre complémentaire : 904 classes (analyse enrichie)
Usage :
Priorisation de la migration (classes à impact métier immédiat)
Validation par experts métier (Product Owners SIAS/TICC)
Planification des efforts (scope fonctionnel)
Dans la suite du rapport :
Le chiffre en gras indique la valeur préférentielle (analyse systématique)
Le chiffre en italique indique la valeur complémentaire (analyse enrichie)
Exemple :
L'analyse a porté sur 952 classes (904 à impact métier) réparties en 5 catégories...
| Outil / Script | Version | Objectif principal | Type d’entrée | Sortie produite |
|---|---|---|---|---|
coupling_analyzer.py | Custom (430 lignes) | Analyse AST Java ; détection des couplages SIAS/TICC | .java | JSON + Markdown |
visualize_coupling.py | Custom (250 lignes) | Génération de graphes Mermaid/DOT/CSV | .json | Diagrammes de dépendances |
javalang | 0.13.0 | Parsing AST Java | .java | Arbres syntaxiques |
| Maven / jdeps | 3.8 + / JDK 8 + | Analyse des dépendances externes et bytecode | POM + .class | Arbres dependency:tree, graphes .dot |
lizard | 1.17 + | Calcul de complexité cyclomatique | .java | Fichier CSV |
bpm_parse.py | Custom (320 lignes) | Extraction et cartographie des invocations BPM → Java | .process (XML) | JSON + rapports texte |
Les outils Java et BPM ont été conçus pour fonctionner sur des sources de nature différente :
l’analyse AST s’applique à des objets syntaxiques exécutables, tandis que le parsing BPM exploite des modèles XML déclaratifs.
Leur combinaison fournit une vision à la fois structurelle et fonctionnelle du système.
Étapes principales :
Parsing AST de 1 075 fichiers .java via javalang.
Extraction : imports, déclarations, méthodes, annotations.
Détection de domaine (SIAS/TICC/partagé) par recherche de motifs dans les identifiants et littéraux.
noms de fichiers (*Sias*.java, *Ticc*.java)
packages (com.grdf.sias.*, com.grdf.ticc.*)
identifiants de classes et méthodes (getSiasIncident(), sendTiccCommand())
littéraux texte ("SIAS", "TICC", "supervision", "telecommande")
logique conditionnelle (if (acteur.equals("SIAS")))
règle de clasement
| SIAS-seul | TICC-only | Partagé | Non-classé |
|---|---|---|---|
| ≥ 1 indice SIAS et 0 indice TICC | ≥ 1 indice TICC et 0 indice SIAS | ≥ 1 indice SIAS et ≥ 1 indice TICC | aucun indice |
Construction du graphe de dépendances (952 nœuds [904 à impact métier], 5 834 arêtes).
Calcul de métriques :
Densité
Détection de God Classes (> 20 dépendances sortantes)
Identification des modules transverses (common, util, transverse, etc.)
Confiance : > 97 % (analyse systématique par AST + propagation par graphe).
Objectif : relier les modèles BPM (XML) aux services Java qu’ils orchestrent afin d’identifier les points d’entrée métier et leur appartenance SIAS/TICC.
Méthode en 5 étapes (synthèse) :
Cartographie BPM → Java
Parsing XML des 3 fichiers .process
24 invocations de services tracées vers TraitementBpmService → services domaine
Extraction de signatures et détection de discriminations de type
Analyse de ProcedureServiceImpl.java et TacheServiceImpl.java
2 conditions de type (TICC/SIAS) détectées sur 9 méthodes
exemple de TacheServiceImpl.java:275:
if (procedure.getTypeProcedure().getOrigine() == SystemeTypeProcedureEnum.TICC) { codeTypeTache = this.codeTacheTeleOperationTicc;}Validation par analyse de couplage
Vérification que les classes liées aux workflows ne dépendent pas de modules spécifiques SIAS/TICC
Validation par graphe d’appels
Construction des chaînes d’appels des 9 méthodes BPM
Aucune discrimination supplémentaire détectée
Partition formelle par analyse d’accessibilité
Définition des ensembles
Les coefficient de partage est défini par:
avec
Résultat : assignation 100 % confiance (9 méthodes, 2 classes). Le workflow n’est pas limitant pour la migration.
Avantages Limites Ciblage précis des points métier critiques
alidation formelle multi-niveaux
méthode reproductible pour autres composantsPérimètre restreint (0,3 % des classes)
Lecture de code manuelle aux étapes 2 et 4
Hypothèse : les processus BPM représentent les entrées métier principales
L’audit combine deux volets complémentaires :
Java : analyse structurelle statique (AST, couplage, complexité).
BPM : analyse fonctionnelle et formelle des services orchestrés.
Les limites ont été réévaluées pour tenir compte de cette dualité :
| Domaine | Limite principale | Impact sur les résultats | Mitigation / Extension prévue |
|---|---|---|---|
| Java (AST) | Résolution partielle des imports et couplages dynamiques | Certain couplage non visible (reflection, injection) | Enrichir le classpath Maven et instrumenter le bytecode |
| Java + Data Flux | Absence d’analyse des flux de données (base Oracle, requêtes) | Risque de couplage non métier non détecté | Reverse-engineering BDD + analyse SQL |
| BPM (XML) | Analyse limitée à 3 processus principaux | Couverture partielle des flux opérationnels | Étendre au référentiel complet BPMN 2.0 |
| Interopérabilité Java ↔ BPM | Alignement incomplet entre définitions de services et implémentations | Risque de décalage modèle / code | Validation sémantique automatisée (BPM → Java ↔ BDD) |
| Méthodes manuelles | Revue de code limitée à certaines classes critiques | Potentiel d’erreur humaine | Automatisation progressive du traçage BPM-Java |
Synthèse : l'analyse v5 apporte une vision structurelle et fonctionnelle cohérente, tout en mettant en évidence les zones à traiter pour atteindre une couverture totale du code et des processus.
Cette analyse a bénéficié de l'ingénierie augmentée (LLM-assisted engineering) pour accélérer et systématiser certaines phases de l'audit, tout en conservant une validation humaine sur les décisions critiques.
| Phase d'Analyse | Tâche | Outil/Méthode | Gain | Validation Humaine |
|---|---|---|---|---|
| Extraction AST | Parsing de 1,137 fichiers Java | javalang + traitement parallèle (16 cœurs) | ~2 sec vs plusieurs heures manuellement | Spot-check sur échantillon (5%) |
| Classification initiale | Pattern matching sur 952 classes | Regex + heuristiques | 19,7% → 70% couverture automatique | Validation manuelle des cas ambigus |
| Propagation par graphe | Assignation par voisinage (itératif) | Algorithme de label propagation | 70% → 97% couverture | Vérification des seuils (0,6 neighbor threshold) |
| Génération de visualisations | 27 graphiques (12 partitionnement + 15 qualité AST) | matplotlib + seaborn (300 DPI) | Automatique (~2 sec) | Sélection des graphiques pertinents |
| Validation croisée | Comparaison 952 vs 904 assignations | Comparaison systématique des FQN | Exhaustive | Résolution des 48 écarts par matrice de décision |
| Documentation | Génération de rapports traçables | Templates + evidence chains | Réduction 50% temps rédaction | Review et adaptation éditoriale |
Réduction du délai d'audit :
Approche manuelle traditionnelle : ~4 semaines (estimation)
Parsing manuel : 1 semaine
Analyse de couplage : 1,5 semaine
Classification : 1 semaine
Documentation : 0,5 semaine
Approche augmentée (v5) : ~2 semaines
Parsing automatisé : <1 heure
Analyse de couplage : 3 jours (configuration + validation)
Classification hybride : 5 jours (automatique + enrichissement BPM)
Documentation : 2 jours (génération + review)
Amélioration de la couverture :
v1 (manuelle) : 19,7% des classes assignées
v5 (augmentée) : 97% des classes assignées
Traçabilité :
100% des assignations documentées avec evidence chains
SQLite database pour requêtage avancé
Reproductibilité totale (configuration YAML + scripts)
Principes appliqués :
Human-in-the-loop : Validation humaine obligatoire sur décisions à fort impact métier
Transparence : Tous les algorithmes et heuristiques documentés et auditables
Reproductibilité : Configuration versionnée (YAML), scripts open-source
Validation croisée : Comparaison systématique avec analyse enrichie (BPM + expertise)
Limitations assumées :
LLM ne remplace pas l'expertise métier : Product Owners requis pour validation TICC (83 classes)
Analyse syntaxique vs sémantique : Certains couplages dynamiques (reflection, injection) non détectés
Qualité des heuristiques : Dépend de la qualité des patterns de nommage dans le code source
L'utilisation de l'ingénierie augmentée est conforme aux standards d'audit IT :
| Standard | Conformité | Justification |
|---|---|---|
| ISO 31000 (Gestion des risques) | ✅ | Traçabilité totale des décisions automatisées + validation humaine |
| COBIT 2019 (Audit SI) | ✅ | Alignement stratégique préservé, processus documentés |
| TOGAF 9.2 (Architecture) | ✅ | Vues AS-IS/TO-BE générées avec intervention d'architecte |
| SonarQube / OWASP (Qualité code) | ✅ | Analyse statique complémentaire, pas de remplacement |
Position d'Adservio : L'ingénierie augmentée est un accélérateur d'audit, pas un substitut à l'expertise humaine. Elle permet de systématiser les tâches répétitives (parsing, extraction, visualisation) pour concentrer l'effort humain sur les décisions à fort impact métier et la validation stratégique.
Couplage afférent (Ca) et efférent (Ce) :
Ce (Efferent Coupling) : nombre de classes externes dont une classe dépend
Ca (Afferent Coupling) : nombre de classes externes qui dépendent d’une classe
Instabilité :
Densité de couplage global :
avec
Règles empiriques (Martin, 2002) :
Parnas, D. L. (1972). On the Criteria to Be Used in Decomposing Systems into Modules. CACM 15(12).
Martin, R. C. (2002). Agile Software Development: Principles, Patterns, and Practices. Prentice Hall.
Evans, E. (2003). Domain-Driven Design. Addison-Wesley.
Feathers, M. (2004). Working Effectively with Legacy Code. Prentice Hall.
Vernon, V. (2013). Implementing Domain-Driven Design. Addison-Wesley.
L’articulation Java/BPM s’inscrit dans le cadre de la modularité (Parnas, 1972), de la responsabilité unique (Martin, 2002) et du bounded context (Evans, 2003), garantissant une lecture cohérente des flux métier et de leur implémentation logicielle.
Les assignations de classes sont documentées avec un niveau de confiance :
| Niveau | Méthode | Description |
|---|---|---|
| 100% | Preuve formelle | Analyse BPM 5 étapes, validation croisée |
| 85-95% | Extension graphe d'appels | Traçage automatisé depuis points d'entrée |
| 70-85% | Validation manuelle | Revue de code, compréhension sémantique |
| 60-70% | Heuristique + spot-check | Patterns nommage, validation échantillon |
| <60% | Heuristique pure | Patterns nommage uniquement |
Exemple :
TacheServiceImpl.creerTacheTeleOperation → 100% (BPM 5 étapes)
IncidentSiasForm → 60-70% (couplage heuristique, nécessite validation)
Systèmes Externes
Middleware JMS
Moteur BPM
Base de Données
Applications JEE Déployées
Serveurs d'Application — WebLogic 12c Cluster
DMZ — Zone Démilitarisée
Utilisateurs Finaux
HTTPS:443
HTTPS:443
HTTPS:90 HAB
JDBC
JDBC
SOAP/REST
JMS
Callback
SOAP
SOAP
SOAP
Opérateurs SIAS
Techniciens TICC
Gestionnaires HAB
Load Balancer F5
WebLogic Node 1
Port 7001
WebLogic Node 2
Port 7001
WebLogic Node 3
Port 7001
SAT-PRE.ear
~70K LOC, 618 classes
SAT-HAB.ear
~18K LOC, 100 classes
Oracle 19c RAC
2 noeuds
Software AG
30+ processus BPMN
WebLogic JMS
40+ listeners
SPQR
Planification
SSOL
Logistique
STIC
Comptage
| Couche | Technologie | Version | Statut | Commentaire |
|---|---|---|---|---|
| Serveur d'applications | Oracle WebLogic | 12c (12.2.1.x) | ⚠️ EOL 2023 | Migration vers Tomcat/Wildfly recommandée |
| Framework JEE | Java EE | 7 | ⚠️ Legacy | Migration vers Jakarta EE 10+ ou Spring Boot |
| Présentation | JSF (MyFaces/Mojarra) | 2.x | ⚠️ Legacy | Remplacer par Angular/React/Vue.js |
| EJB | EJB | 3.x | ⚠️ Legacy | Remplacer par Spring beans |
| ORM | Hibernate | 4.x ou 5.x (version exacte inconnue) | ⚠️ Risque CVE | Upgrade vers Hibernate 6.x |
| Base de données | Oracle Database | 19c RAC | ✅ Supporté | Coût licence élevé → PostgreSQL recommandé |
| Migration DB | Liquibase | 3.x | 🔴 EOL | Upgrade vers Liquibase 4.x obligatoire |
| BPM | Software AG webMethods | 9.0.0 (3 processus, 2 561 LOC XML) | ⚠️ Vendor lock-in | Camunda Platform 8 recommandé |
| Messaging | WebLogic JMS | 12c | ⚠️ Propriétaire | Migration vers Kafka recommandée |
| Build | Maven | 3.x | ✅ OK | — |
| JDK | Oracle JDK | 8 | ⚠️ EOL gratuit | Migration vers OpenJDK 17 LTS ou 21 LTS |
SAT-PRE — 28 Modules
sat-pre-ear
Packaging
sat-pre-web
JSF, Controllers
sat-pre-services
Services Métier
sat-pre-dao
Accès Données
sat-pre-bpm
Workflows
sat-pre-domain
Entités JPA
sat-pre-common
Utilitaires
sat-pre-integration
API Externes
SAT-HAB — 7 Modules
sat-hab-ear
Packaging
sat-hab-web
JSF, SSO
sat-hab-services
Gestion Habilitations
sat-hab-dao
Accès Données
sat-hab-domain
Entités JPA
sat-hab-common
Utilitaires
sat-hab-ldap
Annuaire
| Dépendance | Version Détectée | Dernière Version | Écart | Risque CVE |
|---|---|---|---|---|
| Hibernate | 4.x/5.x (incertain) | 6.4.x | Majeur | ⚠️ Moyen |
| Liquibase | 3.x | 4.25.x | Majeur | 🔴 Élevé (EOL) |
| Apache Commons Collections | 3.2.1 | 4.4 | Mineur | ⚠️ CVE-2015-6420 (désérialisation) |
| Log4j | Version inconnue | 2.22.x | Incertain | 🔴 Critique si < 2.17 (Log4Shell) |
| Jackson | Version inconnue | 2.16.x | Incertain | ⚠️ Potentiel |
| Spring Framework | Non détecté (EJB pur) | 6.1.x | N/A | — |
Recommandation : Exécuter mvn dependency:tree + scan OWASP Dependency-Check pour audit CVE complet.
Architecture en couches (Layered Architecture) :
Couche Intégration
Couche Données
Couche Persistence
Couche Métier
Couche Présentation
JSF Managed Beans
XHTML Facelets
Controllers EJB
EcSatPreWkf001Controller, etc.
Services EJB
IncidentService, TraitementService
Workflows BPM
Software AG
DAOs
IncidentDAO, TacheDAO
Entités JPA
@Entity Incident, Tache
Oracle 19c
Tables, Procédures Stockées
JMS Listeners
40+ Message-Driven Beans
Clients SOAP
SPQR, SSOL, STIC
Observations :
✅ Séparation en couches respectée (présentation → métier → persistence)
⚠️ Couplage vertical fort : Controllers dépendent directement de DAOs (contournement de la couche service dans certains cas)
⚠️ God Classes dans Controllers : EcSatPreWkf001Controller (71 dépendances) viole le SRP
🔴 Absence d'isolation du domaine métier : logique métier dispersée entre Services et Controllers
🔴 Pas de Bounded Contexts : domaines SIAS et TICC mélangés dans les mêmes packages
| Antipattern | Description | Impact | Classes Affectées |
|---|---|---|---|
| God Class | Classes avec > 20 dépendances violant SRP | Maintenabilité, testabilité | 14 classes (2.1%) |
| Anemic Domain Model | Entités JPA sans logique métier (getters/setters uniquement) | Logique dispersée dans Services | ~80% des entités |
| Transaction Script | Logique métier dans Services procéduraux (pas d'objets du domaine riches) | Duplication de code, difficulté à évoluer | Services métier |
| Magic Strings | Constantes métier en String literals (ex: "SIAS", "TICC") | Erreurs typo, refactoring difficile | ~30% du code |
| SQL Concatenation | Requêtes SQL construites par concaténation de chaînes | Injection SQL, migration PostgreSQL difficile | 56 classes (7.7%) |
L’analyse met en évidence la présence de 3 processus BPM Software AG webMethods au format propriétaire .process (XML) dans grdf/app-bpm-main/, couvrant 100 % des workflows identifiés.
Périmètre effectivement analysé :
3 processus BPM Software AG 9.0.0
24 invocations de services BPM
2 classes de services Java : ProcedureServiceImpl, TacheServiceImpl
9 méthodes publiques appelées par les workflows BPM
1 méthode interne clé (creerTache) utilisée par ces méthodes
Cette analyse BPM complète et précise s’applique à un sous-ensemble ciblé de la base de code (~0,3 % des classes) mais à 100 % des workflows BPM. Elle s’inscrit en complément de l’analyse de couplage Java décrite en 1.1.3.
| Processus | Type | Étapes (complexité) | Invocations services | Queue JMS |
|---|---|---|---|---|
POC_SAT_PRE_ProcedureManuelle | Workflow manuel | 10 (CC=3) | 6 | …_ProcedureManuelle_SUBQUEUE |
POC_SAT_PRE_ProcedureTeleOpSIAS | TeleOp SIAS automatique | 13 (CC=3) | 8 | …_ProcedureTeleOpSIAS_SUBQUEUE |
POC_SAT_PRE_ProcedureTeleOpTICC | TeleOp TICC auto + retour | 16 (CC=3) | 10 | …_ProcedureTeleOpTICC_SUBQUEUE |
| TOTAL | — | 39 | 24 | 3 |
Complexité cyclomatique (CC) moyenne : 3 (workflows simples et bien structurés).
JMS WebLogic
Services Java SAT-PRE
Moteur BPM Software AG
DemandeCreationProcedureDto
DemandeCreationProcedureDto
DemandeCreationProcedureDto
Application incidents
Procédure Manuelle
Procédure TeleOp SIAS
Procédure TeleOp TICC
ProcedureServiceImpl
TacheServiceImpl
Queue Procédure Manuelle
Queue TeleOp SIAS
Queue TeleOp TICC
Base Oracle
Points clefs d’intégration :
Entrées via 3 queues JMS dédiées.
Orchestration dans Software AG BPM, utilisant des services déclaratifs.
Exécution métier dans ProcedureServiceImpl et TacheServiceImpl.
Persistance dans Oracle via services/repositories standards.
Corrélation par identifiants métier (ex. identifiantCorrelation).
Les workflows BPM matérialisent ainsi des scénarios métier SIAS/TICC mais délèguent l’essentiel de la logique à des services Java largement partagés.
L’analyse BPM suit le même principe scientifique que l’analyse Java : traçabilité exhaustive, preuve par construction, absence de redondance.
Cartographie BPM → Java
Parsing des fichiers .process.
Extraction systématique des 24 invocations de services.
Mappage vers TraitementBpmService puis ProcedureServiceImpl / TacheServiceImpl.
Extraction des signatures et discriminations de type
Lecture complète des méthodes ciblées.
Recherche de conditions SIAS/TICC.
2 vérifications de type trouvées sur 9 méthodes, toutes deux triviales (sélection de constantes de code tâche).
Validation par couplage
Confrontation avec sat-pre-combined_coupling.json.
Vérification de l’absence de dépendances cachées SIAS/TICC spécifiques.
Validation par graphe d’appels
Construction du graphe d’appels des 9 méthodes.
Vérification de la méthode interne creerTache : 100 % générique.
Partition formelle
Définition des ensembles d’accessibilité SIAS/TICC.
Calcul des partitions (exclusif/partagé) et du coefficient de partage.
Résultat : 88,9 % des méthodes de services workflow sont partagées, 1 méthode TICC-exclusive.
Cette chaîne établit une preuve formelle sur le périmètre BPM, cohérente avec les métriques de couplage du §1.2.
Sur 9 méthodes analysées :
2 méthodes comportent une discrimination SIAS/TICC (sélection d’un code de tâche via constante).
1 méthode est TICC-exclusive : creerTacheAttenteFeedBack.
Toutes les autres logiques (création de tâche, persistance, mapping DTO) sont strictement partagées.
8 méthodes sur 9 sont communes aux scénarios SIAS et TICC.
Coefficient de partage (périmètre services workflow BPM) : 88,9 %.
Aucune méthode SIAS-exclusive identifiée dans ce périmètre.
Le code suit un schéma régulier :
Vérification SIAS/TICC (1 ligne) en entrée → choix d’une constante.
Délégation à une méthode interne générique (creerTache) regroupant ~130 lignes de logique partagée.
Conséquence : la séparation des services workflow est structurellement simple : il suffit d’isoler ou de paramétrer les points de sélection, sans réécrire la logique métier.
| Classe | Méthode | Statut BPM | Décision proposée |
|---|---|---|---|
ProcedureServiceImpl | Méthodes procédures (4) | Partagées | Conserver en commun |
TacheServiceImpl | 3 méthodes partagées | Partagées | Conserver en commun |
TacheServiceImpl | 2 méthodes avec vérif. type | À scinder ou paramétrer | Extraire / configurer |
TacheServiceImpl | creerTacheAttenteFeedBack | TICC seul | Affecter à app TICC |
Confiance : 100 % sur ce périmètre (preuve par code et par graphes).
Périmètre : 2 classes, 9 méthodes.
Refactoring nécessaire :
Scinder ou paramétrer 2 méthodes.
Isoler 1 méthode TICC-exclusive.
Effort validé :
≈ 4 h par extraction explicite (Option A : duplication contrôlée).
≈ 1 h si piloté par configuration (Option B recommandée).
Confiance : 95–100 % (analyse complète sur ce sous-ensemble).
Point crucial : ces chiffres ne concernent que les services workflow BPM, soit 0,3 % des classes, et ne doivent pas être généralisés à toute l’application.
L’analyse BPM fournit une vision exhaustive sur les workflows mais partielle sur le code global.
Non couverts à ce stade :
Contrôleurs REST (~50 classes)
Couche présentation et formulaires (~50 classes)
Package PIL et tableaux de bord SIAS/TICC (~30 classes)
Repositories JPA (~30 classes)
Entités métier (~40 classes)
DTOs (~60 classes)
Autres services métier (~18 classes)
Utilitaires, adaptateurs, tests (~200 classes)
Ces composants ont fait l’objet d’une pré-classification heuristique (couplage, nommage), mais nécessitent une validation manuelle ou automatisée pour une matrice d’assignation complète.
Effort indicatif pour une couverture complète : ≈ 8–10 jours pour valider les 136 classes pré-classifiées et classifier les 590 restantes.
S’appuyer sur les résultats actuels (confiance 100 %) pour :
Extraire la méthode TICC-exclusive.
Paramétrer ou scinder les deux méthodes avec discrimination triviale.
Privilégier une approche pilotée par configuration (Option B) afin :
de conserver un code unique partagé,
de spécialiser les comportements via application.yml par application (SIAS/TICC),
de limiter l’effort de refactoring.
Ces actions suffisent pour sécuriser la migration ou la séparation des services workflow.
Engager une Phase 2 :
Validation des classes SIAS/TICC-exclusives détectées par couplage.
Classification des classes non classifiées.
Construction d’une matrice d’assignation couvrant les 726 classes (incluant niveau de confiance et justification).
Cette stratégie graduelle permet :
de délivrer rapidement sur le périmètre BPM (où la preuve est acquise),
tout en consolidant, de manière rigoureuse, la séparation complète à l’échelle du code.
Compléter l’assignation des classes non classifiées à partir :
des assignations sûres existantes (fingerprinting, BPM, analyse manuelle),
du graphe de dépendances (appels entre classes),
de la connectivité aux points d’entrée (contrôleurs, batchs, listeners).
Principe formel (propagation) :
Pour une classe non assignée
si
si les
si aucune connexion depuis les points d’entrée →
| Élément | Valeur |
|---|---|
| Classes assignées initialement ( | 131 |
| Classes non assignées ( | 768 |
| Total analysé dans les matrices | 899* |
*5 classes hors périmètre graphe (incomplètes ou isolées), sans impact sur les résultats globaux (904).
| Matrice | Définition | Dimensions | Nb dépendances | Densité |
|---|---|---|---|---|
| 131 × 768 | 1 790 | 1,7 % | ||
| 768 × 131 | 90 | 0,09 % |
Artefact : assignments_v2_matrices.npz
Règle appliquée à chaque
| Résultat Phase 1 | Nombre de classes | Commentaire |
|---|---|---|
| Classes | 443 (57,7 % de Y) | Par voisins |
| SIAS | 20 | Mono-voisin SIAS |
| TICC | 39 | Mono-voisin TICC |
| SHARED | 384 | Voisins mixtes ou usage partagé |
Propagation entre classes
| Itération | Nouvelles classes assignées |
|---|---|
| 1 | +36 |
| 2 | +4 |
| 3 | 0 (convergence) |
Résultat Phase 2 :
| Catégorie | Nombre |
|---|---|
| Total | 483 (62,9 % de Y) |
| SIAS | 21 |
| TICC | 39 |
| SHARED | 423 |
Points d’entrée pris en compte (34) : contrôleurs REST, jobs schedulés, listeners JMS. Algorithme : parcours en largeur (BFS) depuis ces points d’entrée.
| Résultat | Nombre | Pourcentage (904) |
|---|---|---|
| Classes non atteignables → DEAD_CODE | 250 | 27,7 % |
Application ciblée sur les classes restantes (UNKNOWN) :
| Règle heuristique | Assignation par défaut |
|---|---|
.transverse.* | SHARED |
.repository.* | SHARED |
.domaine.* | SHARED |
Effet :
| État | Nombre de classes |
|---|---|
| Classes UNKNOWN avant heuristiques | 35 |
| Classes assignées par heuristiques | 8 |
| UNKNOWN finales | 27 (3,0 %) |
(À représenter sous forme de diagramme circulaire ou barres empilées dans le rapport final.)
| Catégorie | Nombre | % |
|---|---|---|
| SHARED | 478 | 52,9 % |
| DEAD_CODE | 250 | 27,7 % |
| TICC-only | 83 | 9,2 % |
| SIAS-only | 66 | 7,3 % |
| UNKNOWN | 27 | 3,0 % |
| TOTAL | 904 | 100 % |
| Méthode | Classes assignées | Non assignées (incl. UNKNOWN + mort) | Couverture brute* |
|---|---|---|---|
| Fingerprinting initial | 136 (18,7 %) | 590 (81,3 %) | 18,7 % |
| Propagation par graphe | 627 (69,4 %) | 277 (30,6 %) | 69,4 % |
| Amélioration | +491 | -313 | +50,7 points |
*Couverture incluant code mort, mais distingué dans la répartition ci-dessus.
| Cas | Attendu | Résultat propagation | Confiance auto | Commentaire |
|---|---|---|---|---|
IncidentRepository | SHARED | SHARED ✅ | ~40 % | Conforme à l’analyse manuelle (16 min) |
SystemeTypeProcedureEnum | SHARED | SHARED ✅ | ~95 % | Enum centrale SIAS/TICC, cohérence validée |
Ces validations indiquent que la méthode est fiable sur les composants structurants, avec un niveau de confiance adapté au caractère automatique.
| Type de composant | Tendance observée |
|---|---|
| Repositories | ~100 % SHARED |
| Entités | ~100 % SHARED |
| DTOs | ~95 % SHARED |
| Services métier | ~70 % SHARED |
Conclusion : l’architecture est naturellement compatible avec une séparation par configuration plutôt que par duplication de code.
| Catégorie | SIAS-only | TICC-only | Commentaire |
|---|---|---|---|
| Total classes spécifiques | 66 (7,3 %) | 83 (9,2 %) | 16,5 % du code |
| Types dominants | Controllers UI, PIL, services feedback | Controllers TICC, tâches/feedback | Localisés et isolables |
| Indicateur | Valeur |
|---|---|
| Classes DEAD_CODE | 250 (27,7 %) |
| Impact | Hors trajectoires d’exécution ; candidats à suppression/archivage |
| Effet sur migration | Réduction possible du périmètre actif de 904 → 654 classes |
| Indicateur | Valeur |
|---|---|
| Classes UNKNOWN | 27 (3,0 %) |
| Profil | Utilitaires isolés, interfaces génériques |
| Action recommandée | Revue ciblée (2–3 h) |
| Priorité | Action | Effort estimé | Objectif |
|---|---|---|---|
| P0 | Valider & exclure le code mort | ~1 j | Figer un périmètre actif réduit |
| P0 | Revue manuelle des 27 UNKNOWN | 2–3 h | Atteindre ~99,7 % de couverture |
| P1 | Échantillon de validation (≈50 classes) | ~1 j | Mesurer précision (cible ≥ 85–90 %) |
Option A — Séparation physique (modules dédiés)
| Module cible | Contenu principal |
|---|---|
sat-sias-app/ | 66 classes SIAS-only |
sat-ticc-app/ | 83 classes TICC-only |
sat-common-workflow/ | 478 classes SHARED |
Effort estimé : 4–5 jours (mouvements de classes + tests).
Option B — Séparation logique par configuration (recommandée)
| Binaire | Contenu | Spécificité |
|---|---|---|
app-sias.jar | SIAS + SHARED | Piloté par application-sias.yml |
app-ticc.jar | TICC + SHARED | Piloté par application-ticc.yml |
Effort estimé : ≈2,5 jours (profils Spring + tests). Moins intrusif, réversible, aligné avec le degré élevé de code partagé.
| Mesure | Valeur |
|---|---|
| Fichiers Java analysés | 1 075 |
| Classes prises en compte | 904 |
| Temps de traitement | ~45 s |
| Environnement | 12 cœurs, exécution parallèle |
| Gain vs analyse manuelle | ≈ 157 h → 45 s (facteur > 10³) |
Artefacts :
| Fichier | Contenu |
|---|---|
assignments_v2.json | Assignation détaillée + scores de confiance |
assignments_v2_matrices.npz | Matrices de dépendances X/Y |
propagate_assignments.py | Implémentation reproductible de l’algorithme |
| Limite | Conséquence | Amélioration possible |
|---|---|---|
| Confiance automatique < 100 % | Besoin d’échantillonnage de validation | Revue ciblée, seuils ajustés |
| Tests peu exploités | Perte d’information sur usages réels | Intégrer tests dans X/Y |
| Détection des entry points par patterns | Risque d’oubli marginal | Automatiser via annotations / conventions |
| Graphe basé sur code statique | Couplages dynamiques non vus | Étendre à l’analyse bytecode / logs runtime |
La propagation sur graphe confirme une architecture majoritairement partagée :
52,9 % du code commun,
16,5 % spécifique SIAS/TICC,
27,7 % de code mort à exclure,
3,0 % seulement à revoir manuellement.
En pratique, une séparation par configuration est réalisable en quelques jours avec un risque maîtrisé, une lisibilité accrue et un périmètre de refactoring fortement réduit.