EN · DE · RU · FR · ES

#1019: SystemSanityCheckJob.kt

projectforge-business/src/main/kotlin/org/projectforge/business/jobs/SystemSanityCheckJob.kt Тип: Kotlin · Роль: Компонент · Источник: projectforge-business/src/main/kotlin/org/projectforge/business/jobs/SystemSanityCheckJob.kt 82 строки · 55 кода · 23 комментария · 4 пустых
Плановое/системное задание для SystemSanityCheck. Реализует периодическое обслуживание или логику проверки целостности, выполняемую планировщиком заданий PF.

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

Классы: SystemSanityCheckJob

Супертип(ы): AbstractJob

Функции (2): executeJob, asString

Свойства (7): taskDao, tasks, taskMap, rootTask, abandonedTasks, ancestor, rootTaskFound

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

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

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

package org.projectforge.business.jobs

import org.projectforge.business.task.TaskDO
import org.projectforge.business.task.TaskDao
import org.projectforge.business.task.TaskNode
import org.projectforge.jobs.AbstractJob
import org.projectforge.jobs.JobExecutionContext

class SystemSanityCheckJob(val taskDao: TaskDao) : AbstractJob("Проверка целостности системы") {
    override fun executeJob() {
        jobExecutionContext.addMessage("Целостность задач (заброшенные задачи)")
        val tasks: List<TaskDO> = taskDao.selectAll(false)
        jobExecutionContext.addMessage("Найдено ${tasks.size} задач(и).")
        val taskMap: MutableMap<Long?, TaskDO> = HashMap()
        for (task in tasks) {
            taskMap[task.id] = task
        }
        var rootTask = false
        var abandonedTasks = false
        for (task in tasks) {
            if (task.parentTask == null) {
                if (rootTask) {
                    jobExecutionContext.addError("Найдена ещё одна корневая задача: ${asString(task)}")
                } else {
                    jobExecutionContext.addMessage("Найдена корневая задача: ${asString(task)}")
                    rootTask = true
                }
            } else {
                var ancestor = taskMap[task.parentTaskId]
                var rootTaskFound = false
                for (i in 0..49) { // Макс. глубина 50, иначе циклическая задача!
                    if (ancestor == null) {
                        break
                    }
                    if (ancestor.parentTaskId == null) {
                        // Корневая задача найдена, OK.
                        rootTaskFound = true
                        break
                    }
                    ancestor = taskMap[ancestor.parentTaskId]
                }
                if (!rootTaskFound) {
                    jobExecutionContext.addError("Найдена заброшенная задача (циклические задачи без пути к корню): ${asString(task)}")
                    abandonedTasks = true
                }
            }
            taskMap[task.id] = task
        }
        if (!abandonedTasks) {
            jobExecutionContext.addMessage("Тест пройден, заброшенных задач не обнаружено.")
        } else {
            jobExecutionContext.addError("Тест НЕ ПРОЙДЕН, обнаружены заброшенные задачи.")
        }
    }

    private fun asString(task: TaskDO): String {
        return "TaskNode[id=[${task.id}], created=[${task.created}] title=[${task.title}]]"
    }
}

История Git

868d6abb7 2025 -> 2026
034eebd5d Обработка HTML и заданий.
63081666f Заголовки исходных файлов: 2024 -> 2025.
619985f48 Релиз 8.1 snapshot (#247)