#2857 : AdminPage.java
projectforge-wicket/src/main/java/org/projectforge/web/admin/AdminPage.java Page Apache Wicket — tableau de bord d'administration système. Source : projectforge-wicket/src/main/java/org/projectforge/web/admin/AdminPage.java · ~590 lignes 590 lignes · 502 code · 43 commentaires · 45 vides
La page d'administration centrale accessible uniquement aux utilisateurs disposant de privilèges d'administrateur. Fournit des opérations au niveau système regroupées en cinq catégories de menu : Configuration (relecture du XML de configuration, export de la configuration, export des paramètres 2FA), Caches (rafraîchir tous les caches), Actions base de données (mettre à jour les préférences utilisateur, créer les index manquants, vider la base de données, exporter le schéma, optimiser les images d'adresse), Vérification système (vérification d'intégrité), et Développement (validation des clés i18n, débogage UserGroupCache, réindexation Hibernate Search, génération de données de test, alertes système). Le menu Développement n'est visible que lorsque SystemStatus.isDevelopmentMode() est vrai.
Architecture
Étend AbstractStandardFormPage et implémente ISelectCallerPage (pour la sélection de date basée sur un calendrier). La page utilise le modèle de menu de contenu de ProjectForge : chaque groupe d'actions est un ContentMenuEntryPanel avec des entrées de sous-menu, chacune contenant un Link Wicket dont le onClick() délègue à une méthode privée.
La page contient également un composant AdminForm (le corps de la page) qui fournit des éléments d'interface supplémentaires comme le panneau d'informations système, le vérificateur de mises à jour et le visualiseur de logs.
Injection de point d'extrémité statique via set(IProjectForgeEndpoints) — pas d'injection par constructeur mais un setter statique. C'est un modèle hérité : le champ projectForgeEndpoints donne accès aux informations système (version, date de build, statistiques mémoire) affichées sur le formulaire d'administration. Le setter statique est appelé par l'initialiseur de l'application Wicket.
Groupes de menus
| Groupe | Actions | Nécessite |
| Configuration | Relecture du XML de configuration depuis le disque, export de la configuration en tant que propriétés, export de la configuration 2FA | Accès admin |
| Caches | Rafraîchir tous les caches (adresse, utilisateur, groupe, i18n, informations système, etc.) | Accès admin |
| Actions base de données | Mettre à jour toutes les préférences XML utilisateur, créer les index manquants dans la base, vider la base de données, exporter le schéma, optimiser les images d'adresse (réduire + recréer les aperçus) | Accès admin |
| Vérification système | Exécuter une vérification d'intégrité (valide la cohérence de la base de données, les clés étrangères, les enregistrements orphelins) | Accès admin |
| Développement | Validation des clés i18n, export de débogage JSON UserGroupCache, DatabaseTester, réindexation Hibernate Search, création de données de test (100 objets BookDO), message d'alerte système, vidage de la configuration système, affichage des mises à jour de la base de données | Admin + SystemStatus.isDevelopmentMode() |
Contrôle d'accès
La page surcharge onBeforeRender() pour appeler checkAccess() — une méthode héritée de AbstractStandardFormPage qui vérifie que l'utilisateur actuel possède le rôle ADMIN. Dans le cas contraire, l'utilisateur est redirigé vers une page d'accès refusé. C'est la seule vérification d'autorisation — il n'y a pas d'autorisation fine par action ; tout administrateur peut effectuer n'importe quelle opération sur cette page.
Le menu Développement dispose d'une protection supplémentaire : if (SystemStatus.isDevelopmentMode() == false) return; à la fin de addDevelopmentMenu(). Cela signifie que les actions de développement ne sont pas seulement masquées — leurs entrées de menu ne sont jamais ajoutées à la page du tout lorsque le mode développement n'est pas actif.
Dépendances clés
| Import | Rôle |
ConfigXml, Configuration | Lecture/écriture de la configuration système (relecture, export) |
SystemService | Rafraîchissement du cache, vérification d'intégrité système |
DatabaseService | Création d'index, vidage de la base, export du schéma |
DatabaseTester | Développement : test des opérations de base de données |
AddressImageDao | Base de données : réduire et recréer les images d'adresse |
UserXmlPreferencesCache, UserXmlPreferencesMigrationDao | Base de données : mettre à jour le XML des préférences utilisateur |
HibernateSearchReindexer | Développement : reconstruire l'index de recherche Lucene |
BookDao, BookDO | Développement : créer des objets livre de test |
I18nHelper | Développement : valider l'utilisation des clés i18n |
CronSanityCheckJob | Développement : déclencher manuellement la vérification de cohérence nocturne |
SystemAlertMessage, SystemStatus | Développement : définir/vérifier la bannière d'alerte système |
WicketUtils, DownloadUtils | UI : boîtes de dialogue de confirmation JavaScript, déclencheurs de téléchargement de fichiers |
Modèles de conception
Modèle de menu de contenu : Au lieu d'une liste plate de boutons, la page d'administration utilise une structure de menu hiérarchique. Chaque groupe (ContentMenuEntryPanel) contient des entrées de sous-menu, chacune avec un lien Wicket. Cela permet d'organiser plus de 20 actions d'administration en catégories logiques sans submerger l'utilisateur.
Liens de classe interne anonyme : Chaque action est un new Link<Void>() { onClick() { ... } } — des classes internes anonymes qui délèguent à des méthodes privées. C'est le style Wicket standard pré-Java 8. Une réécriture moderne utiliserait des expressions lambda (Link<Void> link = new Link<>(id) { ... } ne peut pas être une lambda car Link est une classe, pas une interface fonctionnelle).
Injection de point d'extrémité statique : projectForgeEndpoints est un champ statique défini via un setter statique. C'est inhabituel dans une application gérée par Spring et existe parce que AdminPage est une page Wicket (pas un bean Spring) et a besoin d'accéder à des informations système normalement fournies par les services Spring. Le setter statique est appelé depuis l'initialisation de l'application Wicket.
Historique Git
| Commit | Ce qui a changé |
868d6abb7 | Copyright 2025→2026. |
eeaafe0df | Ajout du menu d'optimisation des images d'adresse. Nouvelle action "Optimiser les images d'adresse" dans le menu Base de données. Réduit la taille des fichiers d'images d'adresse (compression JPEG ~100 Ko) et recalcule les vignettes d'aperçu. Inclut une boîte de dialogue de confirmation JavaScript. |
ab200b126 | Réduction automatique des images d'adresse. L'action d'optimisation réduit désormais automatiquement les images trop grandes, sans simplement offrir l'option. |
5b042ab5f | Ajout de l'export de débogage UserGroupCache et de DatabaseTester. Nouvelle action "Déboguer UserGroupCache" dans le menu Développement — exporte l'état du cache au format JSON pour analyse hors ligne. Nouvelle action DatabaseTester pour les tests de charge en développement. Ajout de l'enregistrement du module Jackson Hibernate6 pour la sérialisation JSON des proxies Hibernate. |
b309e9be9 | Améliorations des pièces jointes des e-mails (BirthdayButler, Polls). Notification automatique par e-mail lorsque la vérification de cohérence nocturne trouve des erreurs. |
092dbf9c5 | SystemService migré vers Kotlin. Package renommé de systeminfo à system. |
619985f48 | Préparatifs de la version 8.1 — fusion de la PR #247, diverses stabilisations. |
1b50060c3 | Renommage des méthodes BaseDao : get→find, save→insert, getList→select, load→select. Tous les appelants mis à jour — les appels DAO d'AdminPage utilisent les nouveaux noms. |
a72903e36 | Migration StringBuffer→StringBuilder dans tous les fichiers Java/Kotlin. Performance : StringBuilder n'est pas synchronisé, contrairement à StringBuffer. |
3aeda5ef5 | Refonte de la gestion des transactions. Suffixe *InTrans supprimé des méthodes DAO. PfPersistenceContext n'est plus passé en paramètre — utilise ThreadLocal à la place. |
b095e6f7d | Changement majeur dans la gestion des transactions. Réutilise PfPersistenceContext. Les tests étaient cassés à ce stade (pas encore corrigés). |
Attention : Cette page n'a pas d'autorisation par action. Tout utilisateur disposant d'un accès administrateur peut déclencher des vidages de base de données, des exports de schéma, des réindexations Hibernate et la création de données de test — le tout sur la base de données de production. Le menu Développement est protégé par SystemStatus.isDevelopmentMode() mais il s'agit d'un simple booléen sans granularité supplémentaire.
Chemin de migration : C'est l'une des plus anciennes pages encore sur Wicket. Les équivalents API REST pour ces opérations d'administration sont en cours de construction dans projectforge-rest (voir SystemAdminPageRest). Une fois que la couche REST couvrira toutes les opérations d'administration, cette page pourra être remplacée par un tableau de bord d'administration basé sur React.