EN · DE · RU · FR · ES

#1135: UserXmlPreferencesMigrationDao.kt

projectforge-business/src/main/kotlin/org/projectforge/business/user/UserXmlPreferencesMigrationDao.kt Тип: Kotlin · Роль: Объект доступа к данным · Источник: projectforge-business/src/main/kotlin/org/projectforge/business/user/UserXmlPreferencesMigrationDao.kt 149 строк · 89 кода · 47 комментариев · 13 пустых
Объект доступа к данным для сущностей UserXmlPreferencesMigration. Расширяет BaseDao, предоставляя CRUD-операции, запросы Hibernate Search и доступ к данным на уровне бизнес-логики.

Структура кода

Аннотации: param, micromata, Service, author, Autowired

Классы: UserXmlPreferencesMigrationDao

Функции (5): migrateAllUserPrefs, migrate, deleteOldKeys, migrateUserPrefs, migrate

Свойства (11): accessChecker, userGroupCache, userXmlPreferencesDao, userXmlPreferencesCache, persistenceService, list, versionNumber, numberOfUpdatedEntries, userId, user, data

Импорты: 8 пакетов

Пакет: org.projectforge.business.user

Исходный код (сокращённый)

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

/**
 * Сохраняет все постоянные объекты пользователя, такие как настройки фильтров, личные настройки,
 * и сохраняет их в базе данных.
 *
 * @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()
    }

    /**
     * Здесь можно вставить операторы обновления или удаления для всех записей xml-настроек пользователя
     * (например, удалить все записи с неиспользуемым ключом).
     *
     * @param version Номер версии самой старой записи.
     */
    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();
        }
    }

    /**
     * Неподдерживаемые или неиспользуемые ключи следует удалять.
     * Этот метод удаляет все записи с указанным ключом.
     *
     * @param key Ключ записей для удаления.
     */
    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' записей удалено.")
    }

    protected fun migrateUserPrefs(userPrefs: UserXmlPreferencesDO): String {
        val userId = userPrefs.user?.id ?: return ""
        val buf = StringBuilder()
        buf.append("Проверка настроек пользователя для '")
        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("версия ").append(userPrefs.version).append(" (актуально)\n")
            return buf.toString()
        }
        migrate(userPrefs)
        val data = userXmlPreferencesDao.deserialize(userPrefs)
        buf.append("версия ")
        buf.append(userPrefs.version)
        if (data != null || "<null/>" == userPrefs.serializedValue) {
            buf.append(" ОК ")
        } else {
            buf.append(" ***непригодно для повторного использования*** ")
        }
        buf.append("\n")
        if (data == null) {
            return buf.toString()
        }
        return buf.toString()
    }

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

        /**
         * Исправляет несовместимые версии настроек пользователя перед десериализацией.
         *
         * @param userPrefs
         */
// ... (сокращено, всего 127 строк)

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024 -> 2025.
4d58829cc Рефакторинг UserPrefCache и UserXmlPreferencesCache.
85b4e1175 PfPersistenceService и PfPersistenceContext: запрос переименован в executeQuery.
108ecf629 !!!!! Большое изменение обработки транзакций: максимально возможное повторное использование PfPersistenceContext (ещё не завершено). Тесты пока не запускаются. Транзакции только для чтения в PfPersistenceService удалены, операции записи в PfPersistenceService удалены.