EN · DE · RU · FR · ES

#310: ProjectForgeInitializer.kt

projectforge-application/src/main/kotlin/org/projectforge/setup/ProjectForgeInitializer.kt Tipo: Kotlin · Rol: Asistente de configuración · Fuente: projectforge-application/src/main/kotlin/org/projectforge/setup/ProjectForgeInitializer.kt 145 líneas · 111 código · 23 comentarios · 11 en blanco
Archivo de código fuente en projectforge-application/src/main/kotlin/org/projectforge/setup/ProjectForgeInitializer.kt que contiene código Kotlin para la capa del Asistente de configuración.

Estructura del código

Anotaciones: Suppress, JvmStatic

Objetos: ProjectForgeInitializer

Funciones (3): initialize, replace, ensureConfigFile

Propiedades (7): applicationHomeDir, emphasizedLog, counter, serverPort, serverAddress, domainService, jdbc

Importaciones: 14 paquetes

Paquete: org.projectforge.setup

Código fuente (resumido)

package org.projectforge.setup

import mu.KotlinLogging
import org.projectforge.ProjectForgeApp
import org.projectforge.business.configuration.DomainService
import org.projectforge.common.CanonicalFileUtils
import org.projectforge.common.EmphasizedLogSupport
import org.projectforge.common.StringModifier
import org.projectforge.framework.configuration.ConfigXml
import org.projectforge.framework.utils.NumberHelper
import org.projectforge.plugins.core.PluginAdminService
import org.projectforge.start.ProjectForgeApplication
import org.projectforge.start.ProjectForgeApplication.giveUpAndSystemExit
import org.projectforge.start.ProjectForgeHomeFinder
import java.io.File
import java.util.regex.Matcher

private val log = KotlinLogging.logger {}

object ProjectForgeInitializer {
  @JvmStatic
  fun initialize(setupData: SetupData?): File? {
    val applicationHomeDir = setupData?.applicationHomeDir
      ?: return giveUpAndSystemExit("No se configuró ningún directorio en el asistente.")

    if (ProjectForgeHomeFinder.isProjectForgeSourceCodeRepository(applicationHomeDir)) {
      giveUpAndSystemExit("ProjectForge no debería usar el repositorio de código fuente como directorio de inicio: $applicationHomeDir")
    }

    val emphasizedLog =
      EmphasizedLogSupport(log, EmphasizedLogSupport.Priority.NORMAL, EmphasizedLogSupport.Alignment.LEFT)
        .log("Verificando la instalación de ProjectForge...")

    var counter = 0
    if (!applicationHomeDir.exists()) {
      emphasizedLog.log("  ${++counter}. Creando directorio: ${CanonicalFileUtils.absolutePath(applicationHomeDir)}...")
      applicationHomeDir.mkdirs()
      if (!applicationHomeDir.exists() && !applicationHomeDir.isDirectory) {
        emphasizedLog.log("    Error al crear el directorio: ${CanonicalFileUtils.absolutePath(applicationHomeDir)}")
          .logEnd()
        giveUpAndSystemExit("Error al crear el directorio: ${CanonicalFileUtils.absolutePath(applicationHomeDir)}")
      }
    }

    val serverPort = if (setupData.serverPort in 1..65535) setupData.serverPort else 8080
    val serverAddress = setupData.serverAdress

    val domainService = DomainService.internalCreate(setupData.domain)
    counter = ensureConfigFile(applicationHomeDir,
      ProjectForgeApplication.CLASSPATH_INITIAL_PROPERTIES_FILENAME,
      ProjectForgeApplication.PROPERTIES_FILENAME,
      counter,
      emphasizedLog,
      StringModifier {
        var result = replace(it, "server.address", "$serverAddress")
        result = replace(result, "server.port", "$serverPort")
        result = replace(result, "projectforge.domain", domainService.domain)
        result = replace(result, "projectforge.servletContextPath", domainService.contextPath)
        result = replace(result, "projectforge.currencySymbol", setupData.currencySymbol)
        result = replace(result, "projectforge.defaultLocale", setupData.defaultLocale)
        result = replace(result, "projectforge.defaultTimeNotation", setupData.defaultTimeNotation)
        result = replace(result, "projectforge.defaultFirstDayOfWeek", setupData.defaultFirstDayOfWeek)
        if (setupData.developmentMode) {
          result = replace(result, "projectforge.web.development.enableCORSFilter", "true")
        }
        val jdbc = setupData.jdbcSettings
        if (!setupData.useEmbeddedDatabase && jdbc != null) {
          result = replace(result, "spring.datasource.url", jdbc.jdbcUrl)
          result = replace(result, "spring.datasource.username", jdbc.user)
          result = replace(result, "spring.datasource.password", jdbc.password)
          result = replace(result, "spring.datasource.driver-class-name", "org.postgresql.Driver")
        }
        result = replace(result, "projectforge.security.passwordPepper", NumberHelper.getSecureRandomAlphanumeric(20))
        result = replace(
          result,
          "projectforge.security.authenticationTokenEncryptionKey",
          NumberHelper.getSecureRandomAlphanumeric(20)
        )
        result
      }
    )
    ensureConfigFile(
      applicationHomeDir,
      ConfigXml.CLASSPATH_INITIAL_CONFIG_XML_FILE, ConfigXml.CONFIG_XML_FILE, counter, emphasizedLog
    )
/*    @Suppress("UNUSED_VALUE")
    counter = ensureConfigFile(
      applicationHomeDir,
      AttrSchemaServiceSpringBeanImpl.CLASSPATH_INITIAL_ATTR_SCHEMA_CONFIG_FILE,
      AttrSchemaServiceSpringBeanImpl.ATTR_SCHEMA_CONFIG_FILE,
      counter,
      emphasizedLog
    )*/
    emphasizedLog.logEnd()
    if (!setupData.startServer) {
      giveUpAndSystemExit("Inicialización del directorio de inicio de ProjectForge completada. No se seleccionó el inicio automático. Por favor, reinicie el servidor manualmente.")
    }
    PluginAdminService.registerFirstStart()
    return setupData.applicationHomeDir
  }

  private fun replace(text: String, property: String, value: Any?): String {
    return text.replaceFirst(
      "^#?+$property=.*$".toRegex(RegexOption.MULTILINE),
      Matcher.quoteReplacement("$property=$value")
    )
  }

  private fun ensureConfigFile(
    baseDir: File, initialClasspathFilename: String, filename: String, counter: Int,
    emphasizedLog: EmphasizedLogSupport, modifier: StringModifier? = null
  ): Int {
    if (File(baseDir, filename).exists())
      return counter
    emphasizedLog.log("  $counter. Creando archivo de configuración: $filename...")
    if (!ProjectForgeApp.ensureInitialConfigFile(baseDir, initialClasspathFilename, filename, false, modifier)) {
      emphasizedLog.logEnd()
      giveUpAndSystemExit("Error al crear el archivo de configuración '$filename'.")
    }
// ... (truncado, total 123 líneas)

Historial de Git

868d6abb7 2025 -> 2026
63081666f Encabezados de archivos fuente: 2024-> 2025.
b1560ca43 Migración en progreso...
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.