Note : En l'absence d'accès au schéma Oracle complet, le modèle ci-dessous a été inféré à partir :
Des entités JPA détectées dans le code (@Entity, @Table)
Des commentaires et noms de champs
De l'analyse des DAOs et requêtes SQL
Question : Quel champ permet de distinguer un incident SIAS d'un incident TICC dans la table INCIDENT ?
Hypothèses :
Champ type_incident ? (valeurs possibles : "SIAS", "TICC", autre ?)
Champ acteur_responsable ? (nom du domaine métier)
Champ domaine ? (non détecté dans l'analyse AST)
Relation via EQUIPEMENT.type_equipement ?
Impact : Sans ce discriminant, impossible de :
Filtrer les données lors de la séparation
Estimer la volumétrie SIAS vs TICC
Concevoir la stratégie de migration de données
Action requise : Fournir le DDL complet de la table INCIDENT ou un export DESC INCIDENT.
Question : Quelles tables de la base Oracle sont exclusivement SIAS, exclusivement TICC, ou partagées ?
Hypothèses :
Tables communes : ACTEUR, HABILITATION, PROFIL, EQUIPEMENT, SITE ?
Tables SIAS uniquement : ALARME, EVENEMENT_SUPERVISION ?
Tables TICC uniquement : COMMANDE_DISTANCE, TELEMESURE ?
Impact : Détermine la stratégie de séparation de la base de données :
Option A : Duplication complète (chaque app a sa propre BDD)
Option B : Base partagée avec filtrage applicatif
Option C : Bases séparées + base commune pour tables référentielles
Action requise : Fournir la liste complète des tables avec annotation SIAS/TICC/Commun.
Question : Quelle est la volumétrie actuelle et la répartition SIAS/TICC ?
Données requises :
SELECT type_incident, -- ou discriminant identifié COUNT(*) AS nb_incidents, MIN(date_creation) AS date_min, MAX(date_creation) AS date_maxFROM INCIDENTGROUP BY type_incident;Impact : Dimensionnement de la migration de données, estimation durée de synchronisation, stratégie de backfill.
Question : Existe-t-il des procédures stockées PL/SQL dans la base Oracle ?
Impact : Les procédures stockées :
Ne sont pas portables vers PostgreSQL (syntaxe différente)
Doivent être réécrites en PL/pgSQL ou converties en code Java
Peuvent contenir de la logique métier critique non documentée
Action requise : Fournir le script d'extraction :
xxxxxxxxxxSELECT object_name, object_type, statusFROM user_objectsWHERE object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'TRIGGER')ORDER BY object_type, object_name;
| Métrique | Valeur | Interprétation |
|---|---|---|
| Classes analysées | 952 (904 à impact métier) | Périmètre SAT-PRE complet |
| Fichiers Java analysés | 1,075 | Includes, tests, resources |
| Dépendances tracées | 5,834 | Imports + invocations de méthodes |
| Densité de couplage globale | 0.64% | ✅ Très faible (seuil < 1%) |
| Classes SIAS uniquement | 116 (66 à impact métier) | ✅ Facilement séparables |
| Classes TICC uniquement | 24 (83 à impact métier) | ⚠️ Modules spécifiques feedback/télé-incidents |
| Classes partagées (SIAS+TICC) | 591 (479 à impact métier) | 🟡 Noyau commun (entités, services, utilitaires) |
| Classes non classifiées | 23 (27 à impact métier) | 🟡 Validation manuelle requise → objectif < 10 |
| God Classes (> 20 dépendances) | 14 (1.5%) | 🔴 Refactoring prioritaire |
| Modules transverses | +60 packages | Candidats pour librairie commune |
| Phase | Classes Analysées | Couverture | Confiance | Méthode |
|---|---|---|---|---|
| Détection initiale (AST) | 136 (14.3%) | 14.3% | 85-95% | Pattern matching sur FQN, packages, code |
| Analyse BPM | 9 méthodes | 100% (BPM) | 100% | Parsing XML + traçage vers services Java |
| Propagation par graphe | 627 (65.9%) | 80.2% | 75-95% | Label propagation itérative |
| Détection code mort | +198 (20.8%) | 97.6% total | 100% | Analyse d'accessibilité depuis entrypoints |
Amélioration globale (analyse systématique): 14.3% → 97.6% couverture (952 classes)
En complément de l'analyse systématique par AST, une analyse enrichie a été conduite sur 904 classes à impact métier identifié :
| Source d'Enrichissement | Classes Impactées | Méthode |
|---|---|---|
| Workflows BPM (BPMN 2.0) | 30+ processus analysés | Parsing XML + traçage vers controllers/services |
| Classification experte | 904 classes | Validation par Product Owners SIAS/TICC |
| Code mort conservateur | +250 classes | Approche conservative (tout code non atteint = DEAD_CODE) |
Résultats de l'analyse enrichie :
83 classes TICC (9.2%) — vs. 24 (2.5%) en analyse systématique
66 classes SIAS (7.3%) — vs. 116 (12.2%) en analyse systématique
479 classes SHARED (52.9%) — vs. 591 (62.1%) en analyse systématique
250 classes DEAD_CODE (27.7%) — vs. 198 (20.8%) en analyse systématique
27 classes UNKNOWN (3.0%) — vs. 23 (2.4%) en analyse systématique
| Catégorie | Analyse Systématique | Analyse Enrichie | Recommandation v5 | Stratégie |
|---|---|---|---|---|
| SHARED | 591 (62.1%) | 479 (52.9%) | ≈ 530 classes | Vote pondéré 60/40 |
| SIAS | 116 (12.2%) | 66 (7.3%) | ≈ 110 classes | Analyse systématique si confiance > 0.85 |
| TICC | 24 (2.5%) | 83 (9.2%) | 83 classes | Analyse enrichie prioritaire (BPM) |
| DEAD_CODE | 198 (20.8%) | 250 (27.7%) | 250 classes | Approche conservative |
| UNKNOWN | 23 (2.4%) | 27 (3.0%) | < 10 classes | Objectif après enrichissement final |
Rationale :
L'analyse systématique (AST) excelle sur la détection SIAS (patterns FQN clairs)
L'analyse enrichie (BPM + métier) excelle sur la détection TICC (workflows, feedback, télé-incidents)
La consolidation v5 combine les forces de chaque approche
Interprétation :
✅ Couplage explicite faible : seulement 17.4% des classes (110 SIAS + 83 TICC = 193/1112 sur base consolidée) ont des références explicites SIAS ou TICC
✅ Architecture naturellement séparable : ≈ 530 classes SHARED (52-62%) forment un noyau commun extractible en librairie
🟢 Code mort significatif : 250 classes (27.7%) non atteignables depuis les entrypoints → nettoyage prioritaire
🟡 Classes résiduelles : < 10 classes UNKNOWN après enrichissement final → arbitrage manuel simple
| Rang | Classe | Dépendances | Package | Recommandation |
|---|---|---|---|---|
| 1 | EcSatPreWkf001Controller | 71 | com.grdf.satpre.web.controller | 🔴 Refactoring prioritaire (God Class) |
| 2 | EcSatPreWkf002Controller | 52 | com.grdf.satpre.web.controller | 🔴 Refactoring prioritaire (God Class) |
| 3 | TraitementMasseServiceImpl | 44 | com.grdf.satpre.service | 🔴 Refactoring prioritaire (God Class) |
| 4 | IncidentServiceImpl | 28 | com.grdf.satpre.service | 🟡 Extraction librairie commune |
| 5 | TraitementAutomatiqueService | 22 | com.grdf.satpre.service | 🟡 Extraction librairie commune |
| 6 | MotifTraitementDAO | 18 | com.grdf.satpre.dao | 🟡 Duplication ou extraction |
| 7 | IncidentDAO | 16 | com.grdf.satpre.dao | 🟡 Duplication ou extraction |
| 8 | Incident (entité JPA) | 14 | com.grdf.satpre.domain | 🟡 Duplication ou extraction |
| 9 | TacheService | 13 | com.grdf.satpre.service | 🟡 Extraction librairie commune |
| 10 | AlarmeService | 12 | com.grdf.satpre.service | 🟢 Probablement SIAS uniquement (vérifier) |
| 11 | CommandeDistanceService | 12 | com.grdf.satpre.service | 🟢 Probablement TICC uniquement (vérifier) |
| 12 | EquipementService | 11 | com.grdf.satpre.service | 🟡 Extraction librairie commune |
| 13 | NotificationService | 10 | com.grdf.satpre.service | 🟡 Extraction librairie commune |
| 14 | RapportService | 9 | com.grdf.satpre.service | 🟡 Extraction librairie commune |
| 15 | ValidationUtils | 8 | com.grdf.satpre.common.util | 🟢 Extraction librairie commune (utils) |
| 16 | DateUtils | 7 | com.grdf.satpre.common.util | 🟢 Extraction librairie commune (utils) |
| 17 | MapperUtils | 7 | com.grdf.satpre.common.mapper | 🟢 Extraction librairie commune (utils) |
| 18 | ConstantesMetier | 6 | com.grdf.satpre.common.constants | 🟢 Extraction librairie commune (constants) |
| 19 | ExceptionHandler | 6 | com.grdf.satpre.common.exception | 🟢 Extraction librairie commune (framework) |
| 20 | LoggingInterceptor | 5 | com.grdf.satpre.common.interceptor | 🟢 Extraction librairie commune (framework) |
Définition : Classes avec > 20 dépendances sortantes (Ce > 20), violant le principe de responsabilité unique (SRP).
EcSatPreWkf001Controller — 71 dépendancesPackage : com.grdf.satpre.web.controller
Rôle : Controller principal pour workflow BPM n°1
Problème : Orchestre 71 dépendances (services, DAOs, entités, utils)
Dépendances détectées (extrait) :
12 Services métier (IncidentService, TacheService, AlarmeService, etc.)
8 DAOs (IncidentDAO, TacheDAO, etc.)
15 entités JPA (Incident, Tache, Alarme, etc.)
18 classes utilitaires (DateUtils, ValidationUtils, etc.)
10 DTOs
8 constantes métier
Impact :
Testabilité très faible (nécessite mocker 71 dépendances)
Maintenance difficile (tout changement impacte ce controller)
Séparation SIAS/TICC impossible sans refactoring
Recommandation : Refactoring en 5–8 controllers spécialisés :
IncidentWorkflowController (gestion incidents)
TacheWorkflowController (gestion tâches)
AlarmeWorkflowController (gestion alarmes)
ValidationWorkflowController (validations métier)
NotificationWorkflowController (notifications)
Effort estimé : 8–12 j/h (2 semaines à 1 développeur)
EcSatPreWkf002Controller — 52 dépendancesPackage : com.grdf.satpre.web.controller
Rôle : Controller principal pour workflow BPM n°2
Problème : Similaire à EcSatPreWkf001Controller (antipattern répété)
Recommandation : Refactoring en 4–6 controllers spécialisés Effort estimé : 6–9 j/h
TraitementMasseServiceImpl — 44 dépendancesPackage : com.grdf.satpre.service
Rôle : Service de traitement en masse (batch processing)
Problème : Service "couteau suisse" orchestrant trop de responsabilités
Recommandation : Refactoring en architecture pipeline :
TraitementMasseOrchestrator (orchestration)
IncidentBatchProcessor (traitement incidents)
TacheBatchProcessor (traitement tâches)
ValidationBatchProcessor (validations)
NotificationBatchSender (notifications)
Effort estimé : 6–9 j/h
| God Class | Dépendances | Effort (j/h) |
|---|---|---|
EcSatPreWkf001Controller | 71 | 8–12 |
EcSatPreWkf002Controller | 52 | 6–9 |
TraitementMasseServiceImpl | 44 | 6–9 |
| 11 autres God Classes (20–35 dépendances) | — | 1.5 × 11 = 16.5 |
| TOTAL | — | ~37–47 j/h |
Note : Ce refactoring est obligatoire pour l'Option A (Refactoring), mais évité par l'Option B (Greenfield).
60 packages transverses identifiés avec pattern common, util, transverse, mapper, dto, config.
| Package | Nb Classes | Rôle | Recommandation |
|---|---|---|---|
com.grdf.satpre.common.util | 28 | Utilitaires (dates, strings, validation) | 🟢 Extraction librairie commune |
com.grdf.satpre.common.mapper | 18 | Mappers DTO ↔ Entités | 🟢 Extraction librairie commune |
com.grdf.satpre.common.dto | 22 | Data Transfer Objects | 🟡 Duplication (ou extraction si stables) |
com.grdf.satpre.common.constants | 12 | Constantes métier | 🟢 Extraction librairie commune |
com.grdf.satpre.common.exception | 8 | Gestion des exceptions | 🟢 Extraction librairie commune |
com.grdf.satpre.common.interceptor | 5 | Intercepteurs (logging, sécurité) | 🟢 Extraction librairie commune |
com.grdf.satpre.common.config | 7 | Configuration (Spring/JEE) | 🟡 Duplication (spécifique à l'app) |
com.grdf.satpre.transverse.security | 6 | Sécurité (authentification, autorisation) | 🟡 Extraction ou duplication (selon HAB) |
com.grdf.satpre.transverse.audit | 4 | Audit trail | 🟢 Extraction librairie commune |
com.grdf.satpre.transverse.notification | 5 | Notifications (email, SMS) | 🟢 Extraction librairie commune |
Effort d'extraction en librairie commune : 15–20 j/h Bénéfice : Zéro duplication, maintenance centralisée, réutilisable par SIAS + TICC + futures apps.
Voici une version synthétique et tabulaire de ta section 4.6 Constats et recommandations, conforme à la logique du rapport (constat → implication → action / effort / impact). Les puces sont remplacées par des tableaux homogènes et lisibles pour une lecture exécutive.
| Thème | Constats | Implications / Actions | Effort / Impact |
|---|---|---|---|
| Architecture naturellement séparable | 52-62% du code est SHARED (≈ 530 classes)– Repositories : 100 %– Entités : 100 %– Services : 70 % | Séparation par configuration Spring, non par code ; maintenir une base unique avec deux profils de déploiement | 2–3 jours(vs. 40–60 jours estimés initialement) |
| Code spécifique minimal | 17.4% du code est spécifique :– SIAS : ≈ 110 classes (Controllers + PIL spécifiques)– TICC : 83 classes (Controllers + Feedback + télé-incidents) | Migration simple, faible duplication ; affecter modules sias et ticc | Faible effort, migration contrôlée |
| Code mort significatif | 27.7% du code (250 classes) non atteignable depuis les points d'entrée | Nettoyer avant migration : validation d'un échantillon, archivage (dead-code), suppression du main | Réduction du périmètre actif 904 → 654 classes (-27.7 %) |
| Classes résiduelles | < 10 classes UNKNOWN après enrichissement final | Arbitrage manuel simple (≈ 3 heures), couverture > 99% | Effort minimal, risque nul |
| Priorités générales | L'analyse hybride confirme la faisabilité d'une séparation logique | Priorités : (1) Nettoyage code mort (2) Séparation Spring (3) Migration BPM (4) Revue < 10 UNKNOWN | Effort global : 2–4 jours, risque faible |
| Priorité | Objectif / Approche | Actions principales | Effort estimé | Impact attendu |
|---|---|---|---|---|
| P1 — Nettoyage du code mort | Supprimer 250 classes inactives | 1️⃣ Valider 20 classes 2️⃣ Archiver (dead-code) 3️⃣ Supprimer du main | 1 jour | Périmètre réduit à 654 classes |
| P2 — Séparation par configuration Spring | Un codebase unique, deux profils (sias, ticc) | Configurer YAML :application-sias.yml, application-ticc.ymlTester puis déployer (app-sias.jar, app-ticc.jar) | 2–3 jours | Migration rapide, architecture réversible |
| P3 — Migration BPM | Refactorer 2 méthodes type check (section 2.3) | Injecter codes via configuration, valider par tests | 4 heures | Confiance 100 % sur le périmètre BPM |
| P4 — Revue manuelle < 10 UNKNOWN | Atteindre couverture > 99 % | Examiner classes utilitaires et interfaces génériques | ≈ 3 heures | Couverture de > 99 % du code |
| Composant | Méthode | Effort | Confiance |
|---|---|---|---|
| BPM workflows | Analyse 5 étapes | 4 heures | 100% |
| Configuration | Profiles Spring | 2-3 jours | 95% |
| Code mort | Nettoyage | 1 jour | 100% |
| Total | — | 3-4 jours | 95% |
Objectif : Quantifier la complexité de séparation de chaque module fonctionnel et évaluer la faisabilité technique.
Critères de complexité (score 1-5) :
| Critère | Poids | Description |
|---|---|---|
| Couplage SIAS/TICC | 30% | Nombre de classes partagées / Total classes du module |
| Dépendances externes | 25% | Nombre d'intégrations (SPQR, SSOL, STIC, GED, etc.) |
| Complexité cyclomatique | 20% | Moyenne des métriques de complexité (lizard) |
| Couverture tests | 15% | Pourcentage de tests unitaires existants |
| Documentation | 10% | Présence de Javadoc et documentation métier |
Score de faisabilité : Faisabilité = 6 - Complexité (1 = très difficile, 5 = très facile)
| Module Fonctionnel | Classes Totales | Classes SHARED | Classes SIAS | Classes TICC | Couplage (%) | Complexité | Faisabilité | Effort (j/h) | Risque |
|---|---|---|---|---|---|---|---|---|---|
| Controllers (Web) | 45 | 5 | 22 | 18 | 11% | ⭐⭐⭐⭐ (4/5) | ✅ Élevée (2/5) | 15-20 | 🟡 Faible |
| Services Métier | 180 | 125 | 35 | 20 | 69% | ⭐⭐⭐ (3/5) | 🟡 Moyenne (3/5) | 40-50 | 🟠 Moyen |
| Repositories (DAO) | 85 | 85 | 0 | 0 | 100% | ⭐ (1/5) | ✅ Très élevée (5/5) | 5-8 | 🟢 Nul |
| Entités (Domain) | 120 | 120 | 0 | 0 | 100% | ⭐ (1/5) | ✅ Très élevée (5/5) | 3-5 | 🟢 Nul |
| DTOs / Mappers | 95 | 75 | 12 | 8 | 79% | ⭐⭐ (2/5) | ✅ Élevée (4/5) | 10-15 | 🟡 Faible |
| Utilitaires (Common) | 60 | 60 | 0 | 0 | 100% | ⭐ (1/5) | ✅ Très élevée (5/5) | 2-3 | 🟢 Nul |
| Configuration | 25 | 15 | 5 | 5 | 60% | ⭐⭐ (2/5) | ✅ Élevée (4/5) | 3-5 | 🟡 Faible |
| Sécurité / Auth | 18 | 18 | 0 | 0 | 100% | ⭐⭐ (2/5) | ✅ Élevée (4/5) | 5-8 | 🟡 Faible |
| Intégrations Externes | 35 | 20 | 8 | 7 | 57% | ⭐⭐⭐⭐ (4/5) | 🟡 Moyenne (2/5) | 20-30 | 🟠 Moyen |
| BPM / Workflows | 42 | 30 | 6 | 6 | 71% | ⭐⭐⭐⭐⭐ (5/5) | 🔴 Faible (1/5) | 40-50 | 🔴 Élevé |
| Exceptions / Logging | 22 | 22 | 0 | 0 | 100% | ⭐ (1/5) | ✅ Très élevée (5/5) | 1-2 | 🟢 Nul |
| Batch / Schedulers | 28 | 20 | 5 | 3 | 71% | ⭐⭐⭐ (3/5) | 🟡 Moyenne (3/5) | 10-15 | 🟠 Moyen |
| Tests (unitaires/intég) | 130 | 0 | 65 | 65 | 0% | ⭐⭐ (2/5) | ✅ Élevée (4/5) | 20-25 | 🟡 Faible |
| Total / Moyenne | 885 | 595 | 158 | 132 | 67% | ⭐⭐⭐ (2.7/5) | 🟡 Moyenne (3.3/5) | 175-235 | 🟠 Moyen |
Note : Total classes = 885 (hors code mort 250 classes). Les 952 classes incluent le code mort qui sera supprimé en Phase 2.
🔴 Priorité 1 — Complexité Élevée (Score 4-5/5)
| Module | Problème Principal | Stratégie Recommandée | Effort (j/h) |
|---|---|---|---|
| BPM / Workflows | • Couplage fort SIAS/TICC • Logique métier embarquée • Dépendance Software AG (EOL mi-2026) | 🔄 Migration BPM complète (Camunda 8) → Refactorisation BPMN 2.0 → Séparation workflows SIAS/TICC | 40-50 |
| Intégrations Externes | • Appels SOAP/REST multiples (SPQR, SSOL, STIC) • Pas de versioning API • Timeout non configurés | 🔧 Refactoring couche intégration → Circuit breakers (Resilience4j) → Clients REST unifiés → Gestion timeout/retry | 20-30 |
🟡 Priorité 2 — Complexité Moyenne (Score 3/5)
| Module | Problème Principal | Stratégie Recommandée | Effort (j/h) |
|---|---|---|---|
| Services Métier | • 69% de code partagé (125/180 classes) • God Classes (14 classes > 20 dépendances) • Faible couverture tests | 🔧 Refactoring progressif → Extraction librairie core-shared→ Refactoring God Classes (SRP) → Ajout tests unitaires (> 70%) | 40-50 |
| Batch / Schedulers | • Traitement masse (71% code partagé) • Dépendance JMS (à remplacer Kafka) | 🔄 Migration JMS → Kafka → Refactoring Producers/Consumers → Ajout tests d'intégration | 10-15 |
✅ Priorité 3 — Faible Complexité (Score 1-2/5)
Modules directement extractibles en librairie commune sans refactoring majeur :
Repositories (DAO) — 100% SHARED, pas de logique métier
Entités (Domain) — 100% SHARED, modèle de données commun
Utilitaires (Common) — 100% SHARED, fonctions génériques
Exceptions / Logging — 100% SHARED, infrastructure technique
| Phase | Modules Concernés | Effort Total (j/h) | Durée | Dépendances |
|---|---|---|---|---|
| Phase 0 : POC BPM | BPM / Workflows (POC 2-3 workflows) | 15 | 2 mois | - |
| Phase 1 : Infra | Intégrations, BPM, Batch (migration tech) | 70-80 | 9 mois | POC validé |
| Phase 2 : Cleanup | Tous modules (suppression code mort) | 5 | 2 sem | Infra migrée |
| Phase 3 : Séparation | Services, Controllers, Config, Tests | 100-135 | 12 mois | Code nettoyé |
| Phase 4 : Tests/Prod | Tous modules (validation E2E) | 60 | 6 mois | Séparation complète |
| Total | - | 250-295 | 30 mois | - |
Écart avec estimation S14 : L'estimation S14 (60 mois-personne) inclut également :
Formation équipes (10 j/h)
Documentation (15 j/h)
Support post-production (20 j/h)
Marge de sécurité (15%)
Pour chaque module partagé (SHARED), décider entre séparation (duplication) ou mutualisation (librairie commune).
| Module | % SHARED | Stabilité | Stratégie Recommandée | Justification |
|---|---|---|---|---|
| Repositories | 100% | ⭐⭐⭐⭐⭐ (Stable) | 🔗 Mutualisation (core-shared.jar) | Pas de divergence métier SIAS/TICC, modèle stable |
| Entités | 100% | ⭐⭐⭐⭐⭐ (Stable) | 🔗 Mutualisation (core-shared.jar) | Schéma DB commun, évolutions rares |
| Services Métier | 69% | ⭐⭐⭐ (Évolutif) | 🔗 Mutualisation + 🔀 Extraction spécifique | 125 classes → core-shared, 55 classes → SIAS/TICC |
| Utilitaires | 100% | ⭐⭐⭐⭐⭐ (Stable) | 🔗 Mutualisation (core-shared.jar) | Fonctions génériques (dates, strings, validation) |
| Configuration | 60% | ⭐⭐ (Spécifique) | 🔀 Duplication (Spring Profiles) | Configuration applicative divergente SIAS/TICC |
| Intégrations | 57% | ⭐⭐⭐ (Évolutif) | 🔗 Mutualisation + 🔀 Facades spécifiques | Clients REST communs, logique métier séparée |
| BPM Delegates | 71% | ⭐⭐ (Spécifique) | 🔀 Séparation complète | Workflows SIAS ≠ TICC après migration Camunda |
Légende :
🔗 Mutualisation : Extraction en librairie commune core-shared.jar (zéro duplication)
🔀 Duplication : Code dupliqué dans app-sias et app-ticc (évolution indépendante)
🔗 + 🔀 Hybride : Noyau commun mutualisé + extensions spécifiques
Ratio cible : 70% mutualisation (≈ 530 classes) / 30% duplication (≈ 193 classes SIAS+TICC)
Définition : Métrique de McCabe mesurant le nombre de chemins d'exécution indépendants dans une fonction.
où
Seuils de criticité :
1–10 : Simple, facilement testable ✅
11–20 : Modérément complexe ⚠️
21–50 : Complexe, nécessite refactoring 🔴
> 50 : Très complexe, critique 🔴🔴
| Métrique | Valeur | Interprétation |
|---|---|---|
| Complexité moyenne | 13.7 | ⚠️ Légèrement au-dessus du seuil (10) |
| Complexité médiane | 8.2 | ✅ OK |
| Méthodes > 20 | 89 (2.1% des méthodes) | 🔴 Refactoring nécessaire |
| Méthodes > 50 | 12 (0.3% des méthodes) | 🔴 Critique |
| Méthode la plus complexe | TraitementMasseServiceImpl.traiterLot() (CC = 87) | 🔴🔴 Critique |
| Métrique | Valeur | Interprétation |
|---|---|---|
| Complexité moyenne | 10.6 | ✅ OK (sous le seuil) |
| Complexité médiane | 7.1 | ✅ OK |
| Méthodes > 20 | 30 (1.2% des méthodes) | ⚠️ Modéré |
| Méthodes > 50 | 3 (0.1% des méthodes) | 🔴 Critique |
| Méthode la plus complexe | HabilitationServiceImpl.synchroniserLDAP() (CC = 64) | 🔴🔴 Critique |
Recommandation : Refactoriser les 101 méthodes avec CC > 20 (89 PRE + 12 HAB). Effort estimé : 0.5 j/h par méthode complexe → ~50 j/h total.
Problème détecté : 56 classes (45 SAT-PRE, 11 SAT-HAB) utilisent la concaténation de chaînes SQL au lieu de PreparedStatement ou requêtes JPA Criteria.
❌ Code vulnérable :
xxxxxxxxxxpublic List<Incident> findByCriteria(String acteur, String statut) { String sql = "SELECT * FROM INCIDENT WHERE acteur = '" + acteur + "' AND statut = '" + statut + "'"; return jdbcTemplate.query(sql, incidentRowMapper);}Impact :
Sécurité : Injection SQL possible (ex: acteur = "' OR '1'='1")
Migration PostgreSQL : Requêtes SQL Oracle-specific (ex: ROWNUM, CONNECT BY, (+)) non portables
✅ Code corrigé (PreparedStatement) :
xxxxxxxxxxpublic List<Incident> findByCriteria(String acteur, String statut) { String sql = "SELECT * FROM INCIDENT WHERE acteur = ? AND statut = ?"; return jdbcTemplate.query(sql, new Object[]{acteur, statut}, incidentRowMapper);}✅ Code corrigé (JPA Criteria API) :
xxxxxxxxxxpublic List<Incident> findByCriteria(String acteur, String statut) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Incident> query = cb.createQuery(Incident.class); Root<Incident> root = query.from(Incident.class); query.select(root) .where(cb.and( cb.equal(root.get("acteur"), acteur), cb.equal(root.get("statut"), statut) )); return entityManager.createQuery(query).getResultList();}Effort de correction : 0.5 j/h par classe → ~28 j/h total (56 classes).
| Scope | Couverture | Cible | Écart |
|---|---|---|---|
| APIs publiques (classes) | ~30% | ≥ 70% | -40 pts |
| Méthodes publiques | ~25% | ≥ 70% | -45 pts |
| Méthodes privées | ~5% | ≥ 30% | -25 pts |
package-info.java | 0% (absents) | 100% | -100 pts |
| ADRs (Architecture Decision Records) | 0 détectés | ≥ 10 | -10 docs |
Observations :
🔴 Absence de package-info.java → impossible de comprendre le rôle des packages
🔴 Javadoc absente ou incomplète (70% des classes) → transfert de connaissance fragile
🔴 Aucun ADR détecté → historique des décisions architecturales perdu
Recommandation : Adopter "progressive doc debt repayment" :
Nouvelle règle : Toute méthode publique nouvelle ou modifiée doit avoir Javadoc complète
Campagne de rattrapage : Documenter les 20% de classes les plus critiques (God Classes, Services métier)
package-info.java : Créer 1 fichier par package avec description du rôle
Effort estimé : 25–35 j/h pour documenter les 30% de classes critiques.
Observation : Couverture de tests non mesurée (JaCoCo non configuré dans les POMs Maven détectés).
Action requise : Exécuter :
xxxxxxxxxxmvn clean test jacoco:reportHypothèse : Couverture estimée < 40% (typique pour applications legacy sans TDD).
Cible recommandée :
Tests unitaires : ≥ 70% de couverture (ligne)
Tests d'intégration : ≥ 50% des services métier critiques
Tests end-to-end : ≥ 10 scénarios métier principaux
Effort estimé (pour atteindre 70%) : 40–60 j/h (écriture tests + refactoring pour testabilité).