EN · DE · RU · FR · ES

#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

GroupeActionsNécessite
ConfigurationRelecture du XML de configuration depuis le disque, export de la configuration en tant que propriétés, export de la configuration 2FAAccès admin
CachesRafraîchir tous les caches (adresse, utilisateur, groupe, i18n, informations système, etc.)Accès admin
Actions base de donnéesMettre à 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èmeExé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éveloppementValidation 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éesAdmin + 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

ImportRôle
ConfigXml, ConfigurationLecture/écriture de la configuration système (relecture, export)
SystemServiceRafraîchissement du cache, vérification d'intégrité système
DatabaseServiceCréation d'index, vidage de la base, export du schéma
DatabaseTesterDéveloppement : test des opérations de base de données
AddressImageDaoBase de données : réduire et recréer les images d'adresse
UserXmlPreferencesCache, UserXmlPreferencesMigrationDaoBase de données : mettre à jour le XML des préférences utilisateur
HibernateSearchReindexerDéveloppement : reconstruire l'index de recherche Lucene
BookDao, BookDODéveloppement : créer des objets livre de test
I18nHelperDéveloppement : valider l'utilisation des clés i18n
CronSanityCheckJobDéveloppement : déclencher manuellement la vérification de cohérence nocturne
SystemAlertMessage, SystemStatusDéveloppement : définir/vérifier la bannière d'alerte système
WicketUtils, DownloadUtilsUI : 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

CommitCe qui a changé
868d6abb7Copyright 2025→2026.
eeaafe0dfAjout 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.
ab200b126Réduction automatique des images d'adresse. L'action d'optimisation réduit désormais automatiquement les images trop grandes, sans simplement offrir l'option.
5b042ab5fAjout 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.
b309e9be9Amé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.
092dbf9c5SystemService migré vers Kotlin. Package renommé de systeminfo à system.
619985f48Préparatifs de la version 8.1 — fusion de la PR #247, diverses stabilisations.
1b50060c3Renommage des méthodes BaseDao : getfind, saveinsert, getListselect, loadselect. Tous les appelants mis à jour — les appels DAO d'AdminPage utilisent les nouveaux noms.
a72903e36Migration StringBufferStringBuilder dans tous les fichiers Java/Kotlin. Performance : StringBuilder n'est pas synchronisé, contrairement à StringBuffer.
3aeda5ef5Refonte de la gestion des transactions. Suffixe *InTrans supprimé des méthodes DAO. PfPersistenceContext n'est plus passé en paramètre — utilise ThreadLocal à la place.
b095e6f7dChangement 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.