EN · DE · RU · FR · ES

#1135 : UserXmlPreferencesMigrationDao.kt

projectforge-business/src/main/kotlin/org/projectforge/business/user/UserXmlPreferencesMigrationDao.kt Type : Kotlin · Rôle : Objet d'accès aux données · Source : projectforge-business/src/main/kotlin/org/projectforge/business/user/UserXmlPreferencesMigrationDao.kt 149 lignes · 89 code · 47 commentaires · 13 vides
Objet d'accès aux données pour les entités UserXmlPreferencesMigration. Étend BaseDao pour fournir des opérations CRUD, des requêtes Hibernate Search et un accès aux données au niveau de la logique métier.

Structure du code

Annotations : param, micromata, Service, author, Autowired

Classes : UserXmlPreferencesMigrationDao

Fonctions (5) : migrateAllUserPrefs, migrate, deleteOldKeys, migrateUserPrefs, migrate

Propriétés (11) : accessChecker, userGroupCache, userXmlPreferencesDao, userXmlPreferencesCache, persistenceService, list, versionNumber, numberOfUpdatedEntries, userId, user, data

Importations : 8 paquetages

Paquetage : org.projectforge.business.user

Code source (abrégé)

package org.projectforge.business.user

import org.apache.commons.lang3.Validate
import org.projectforge.business.user.UserXmlPreferencesDO.Companion.getCurrentVersion
import org.projectforge.framework.access.AccessChecker
import org.projectforge.framework.persistence.jpa.PfPersistenceService
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service

/**
 * Stocke tous les objets persistants de l'utilisateur tels que les paramètres de filtre, les paramètres personnels et les persiste dans la base de données.
 *
 * @author Kai Reinhard (k.reinhard@micromata.de)
 */
@Service
open class UserXmlPreferencesMigrationDao {
    @Autowired
    private lateinit var accessChecker: AccessChecker

    @Autowired
    private lateinit var userGroupCache: UserGroupCache

    @Autowired
    private lateinit var userXmlPreferencesDao: UserXmlPreferencesDao

    @Autowired
    private lateinit var userXmlPreferencesCache: UserXmlPreferencesCache

    @Autowired
    private lateinit var persistenceService: PfPersistenceService

    open fun migrateAllUserPrefs(): String {
        accessChecker.checkIsLoggedInUserMemberOfAdminGroup()
        val buf = StringBuilder()
        val list = persistenceService.executeQuery(
            "from ${UserXmlPreferencesDO::class.java.simpleName} t order by user.id, key",
            UserXmlPreferencesDO::class.java,
        )
        var versionNumber = Int.MAX_VALUE
        for (userPrefs in list) {
            buf.append(migrateUserPrefs(userPrefs))
            if (userPrefs.version < versionNumber) {
                versionNumber = userPrefs.version
            }
        }
        migrate(versionNumber)
        userXmlPreferencesCache.refresh()
        return buf.toString()
    }

    /**
     * Vous pouvez insérer ici des instructions de mise à jour ou de suppression pour toutes les entrées de préférences XML utilisateur (par exemple, supprimer toutes les entrées avec une
     * clé inutilisée).
     *
     * @param version Numéro de version de l'entrée la plus ancienne.
     */
    protected fun migrate(version: Int) {
        if (version < 4) {
            // deleteOldKeys("org.projectforge.web.humanresources.HRViewForm:Filter");
            // deleteOldKeys("org.projectforge.web.fibu.AuftragListAction:Filter");
            // deleteOldKeys("OLD-VERSION-1.1");
            // hibernateTemplate.flush();
        }
    }

    /**
     * Les clés non prises en charge ou inutilisées doivent être supprimées. Cette méthode supprime toutes les entrées avec la clé donnée.
     *
     * @param key Clé des entrées à supprimer.
     */
    protected fun deleteOldKeys(key: String) {
        val numberOfUpdatedEntries = persistenceService.runInTransaction { context ->
            context.executeUpdate("delete from ${UserXmlPreferencesDO::class.java.simpleName} where key = '$key'")
        }
        log.info("$numberOfUpdatedEntries '$key' entrées supprimées.")
    }

    protected fun migrateUserPrefs(userPrefs: UserXmlPreferencesDO): String {
        val userId = userPrefs.user?.id ?: return ""
        val buf = StringBuilder()
        buf.append("Vérification des préférences utilisateur pour l'utilisateur '")
        val user = userGroupCache.getUser(userId)
        if (user != null) {
            buf.append(user.username)
        } else {
            buf.append(userId)
        }
        buf.append("' : ").append(userPrefs.identifier).append(" ... ")
        if (userPrefs.version >= getCurrentVersion()) {
            buf.append("version ").append(userPrefs.version).append(" (à jour)\n")
            return buf.toString()
        }
        migrate(userPrefs)
        val data = userXmlPreferencesDao.deserialize(userPrefs)
        buf.append("version ")
        buf.append(userPrefs.version)
        if (data != null || "<null/>" == userPrefs.serializedValue) {
            buf.append(" OK ")
        } else {
            buf.append(" ***non réutilisable*** ")
        }
        buf.append("\n")
        if (data == null) {
            return buf.toString()
        }
        return buf.toString()
    }

    companion object {
        private val log: Logger = LoggerFactory
            .getLogger(UserXmlPreferencesMigrationDao::class.java)

        /**
         * Corrige les versions incompatibles des préférences utilisateur avant la désérialisation.
         *
         * @param userPrefs
         */
// ... (tronqué, total 127 lignes)

Historique Git

868d6abb7 2025 -> 2026
63081666f En-têtes des fichiers source : 2024 -> 2025.
4d58829cc UserPrefCache et UserXmlPreferencesCache refactorisés.
85b4e1175 PfPersistenceService et PfPersistenceContext : query renommé en executeQuery.
108ecf629 !!!!! Gros changement dans la gestion des transactions : réutilisation maximale de PfPersistenceContext (pas encore terminé). Les tests ne s'exécutent pas encore. Transactions en lecture seule supprimées de PfPersistenceService, opérations d'écriture de PfPersistenceService supprimées.