EN · DE · RU · FR · ES

#230: MerlinStatistics.kt

plugins/org.projectforge.plugins.merlin/src/main/kotlin/org/projectforge/plugins/merlin/MerlinStatistics.kt Тип: Kotlin · Роль: Регистрация плагина · Исходник: plugins/org.projectforge.plugins.merlin/src/main/kotlin/org/projectforge/plugins/merlin/MerlinStatistics.kt 142 строки · 99 кода · 31 комментарий · 12 пустых
Файл исходного кода в plugins/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
  }
}

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024-> 2025.
acb790ad2 Исправление различных опечаток
b6092df09 Авторские права 2023 -> 2024
ab45d51fa Авторские права 2001-2022 -> 2001-2023.