MerlinStatistics.ktplugins/org.projectforge.plugins.merlin/src/main/kotlin/org/projectforge/plugins/merlin/MerlinStatistics.kt, содержащий код Kotlin для уровня регистрации плагина.Аннотации: author, get, micromata
Классы: MerlinStatistics
Функции (6): update, updateDtoVariables, toString, conditionalsAsMarkdown, conditionalsUsesVariable, createFileDescriptor
Свойства (17): variables, conditionals, templateStatistics, templateDefinition, template, statistics, counter, name, used, masterVariable, variable, name, variable, statistics, newVariable, sb, fileDescriptor
Импорты: 7 пакетов
Пакет: org.projectforge.plugins.merlin
package org.projectforge.plugins.merlin
import com.fasterxml.jackson.annotation.JsonIgnore
import de.micromata.merlin.persistency.FileDescriptor
import de.micromata.merlin.word.templating.Template
import de.micromata.merlin.word.templating.TemplateDefinition
import de.micromata.merlin.word.templating.TemplateStatistics
import de.micromata.merlin.word.templating.WordTemplateChecker
import org.projectforge.framework.ToStringUtil
/**
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
class MerlinStatistics {
val variables = mutableListOf<MerlinVariable>()
val conditionals = mutableListOf<MerlinConditional>()
@get:JsonIgnore
var templateStatistics: TemplateStatistics? = null
private set
@get:JsonIgnore
var templateDefinition: TemplateDefinition? = null
@get:JsonIgnore
var template: Template? = null
fun update(templateChecker: WordTemplateChecker, wordFilename: String) {
template = templateChecker.template
template!!.fileDescriptor = createFileDescriptor(wordFilename)
val statistics = templateChecker.template.statistics
this.templateDefinition = templateChecker.template.templateDefinition
this.templateStatistics = statistics
synchronized(conditionals) {
conditionals.clear()
statistics?.conditionals?.conditionalsSet?.forEach {
conditionals.add(MerlinConditional(it))
}
}
synchronized(variables) {
variables.clear()
var counter = 0
statistics?.inputVariables?.forEach { variableDefinition ->
val name = variableDefinition.name
val used = statistics.usedVariables?.contains(name) == true
val masterVariable = statistics.masterVariables?.contains(name) == true || conditionalsUsesVariable(name)
val variable = MerlinVariable.from(variableDefinition).with(
id = counter++,
name = name,
used = used,
masterVariable = masterVariable,
)
variables.add(variable)
}
templateDefinition?.dependentVariableDefinitions?.forEach { variableDefinition ->
val name = variableDefinition.name
val variable = MerlinVariable.from(variableDefinition).with(
id = counter++,
name = name,
used = statistics?.usedVariables?.contains(name) == true
)
variables.add(variable)
}
}
}
/**
* Обновляет переменные DTO: добавляет переменные статистики, ещё не включённые в DTO,
* и обновляет информацию об использовании (определена, главная переменная и т.д.)
* для переменных DTO и зависимых переменных.
*/
fun updateDtoVariables(dto: MerlinTemplate) {
val statistics = templateStatistics ?: return
dto.variables.forEach {
it.used = statistics.usedVariables?.contains(it.name) == true
it.masterVariable = statistics.masterVariables?.contains(it.name) == true || conditionalsUsesVariable(it.name)
}
dto.dependentVariables.forEach {
it.used = statistics.usedVariables?.contains(it.name) == true
}
// Добавляет недостающие переменные в DTO, но найденные в шаблоне.
variables.forEach { variable ->
if (dto.findVariableByName(variable.name) == null) {
val newVariable = MerlinVariable()
newVariable.copyFrom(variable)
newVariable.id = null // Принудительно использовать собственный id (если переменная была переименована).
dto.variables.add(newVariable) // Добавляется как переменная; зависимые переменные будут переназначены в конце этого метода
// с помощью [MerlinTemplate.reorderVariables].
}
}
dto.reorderVariables()
}
override fun toString(): String {
return ToStringUtil.toJsonString(this)
}
fun conditionalsAsMarkdown(): String {
val sb = StringBuilder()
conditionals.forEach {
it.asMarkDown(sb, "")
}
return sb.toString()
}
fun conditionalsUsesVariable(name: String): Boolean {
conditionals.forEach {
if (it.usesVariable(name)) {
return true
}
}
return false
}
private fun createFileDescriptor(filename: String): FileDescriptor {
val fileDescriptor = FileDescriptor()
fileDescriptor.filename = filename
return fileDescriptor
}
}
868d6abb7 2025 -> 2026 63081666f Заголовки исходных файлов: 2024-> 2025. acb790ad2 Исправление различных опечаток b6092df09 Авторские права 2023 -> 2024 ab45d51fa Авторские права 2001-2022 -> 2001-2023.