EN · DE · RU · FR · ES

#335: ProjectForgeHomeFinder.kt

projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt Type : Kotlin · Rôle : Composant · Source : projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt 403 lignes · 285 code · 88 commentaires · 30 vides
Fichier de code source dans projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt contenant du code Kotlin pour la couche Composant.

Structure du code

Annotations : param, return, JvmStatic

Classes : ProjectForgeHomeFinder, WizardMode

Objets : and

Classes d'énumération : WizardMode

Fonctions (16) : findAndEnsureAppHomeDir, proceedForced, searchAndProceed, proceed, answerValid, saveUserPrefHomeDir, checkAndAdd, checkAndAdd, getExecutableDir, findBaseDirAndAncestors, findBaseDirOnly, checkDirectory, isStandardProjectForgeUserDir, isProjectForgeSourceCodeRepository, isProjectForgeConfigured, isProjectForgeConfigured

Propriétés (28) : userAcceptsGraphicalTerminal, appHomeDir, prefHomeDir, appHomeDir, appHomeDir, setupContext, answer, setupData, userPrefHomeDir, preferences, preferences, savedHomeDir, absolutePath, ENV_PROJECTFORGE_HOME, COMMAND_LINE_VAR_HOME_DIR, DIR_NAMES, homeEnvironmentVariableDefinition, suggestedDirectories, files, canonicalDir, locationUrl, location, file, currentDir, recursiveCounter...

Importations : 17 paquets

Paquet : org.projectforge.start

Code source (abrégé)

package org.projectforge.start

import mu.KotlinLogging
import org.apache.commons.lang3.StringUtils
import org.apache.commons.lang3.SystemUtils
import org.projectforge.ProjectForgeApp
import org.projectforge.common.CanonicalFileUtils
import org.projectforge.common.EmphasizedLogSupport
import org.projectforge.setup.ProjectForgeInitializer.initialize
import org.projectforge.setup.SetupContext
import org.projectforge.setup.SetupData
import org.projectforge.setup.wizard.lanterna.LantSetupWizard.Companion.run
import org.projectforge.setup.wizard.swing.SwingSetupWizard.Companion.run
import java.awt.GraphicsEnvironment
import java.io.File
import java.io.IOException
import java.net.URI
import java.net.URISyntaxException
import java.util.prefs.Preferences

private val log = KotlinLogging.logger {}

/**
 * Helper pour trouver le répertoire personnel de ProjectForge :<br></br>
 *
 *  1. Créez ProjectForge en tant que répertoire de premier niveau de votre répertoire personnel : '$HOME/ProjectForge', ou
 *  1. créez un répertoire et placez le fichier jar quelque part à l'intérieur de ce répertoire. ProjectForge détecte le dossier relatif au jar exécuté, ou
 *  1. créez un répertoire et définissez-le comme paramètre de ligne de commande : java -Dhome.dir=votrerépertoire -jar ..., ou
 *  1. créez un répertoire et définissez-le comme variable d'environnement système $PROJECTFORGE_HOME.
 *
 */
class ProjectForgeHomeFinder {
  private var userAcceptsGraphicalTerminal: WizardMode? = null

  private enum class WizardMode { DESKTOP, CONSOLE, NONE }

  /**
   * Essaie de trouver le répertoire personnel de ProjectForge. S'il n'est pas trouvé ou n'est pas initialisé, un assistant d'installation est démarré.
   *
   * @return Le répertoire personnel. S'il n'est pas trouvé, un System.exit() est effectué et des informations utilisateur sont affichées sur la marche à suivre.
   */
  fun findAndEnsureAppHomeDir(): File? {
    // Essayer le répertoire défini via la ligne de commande : -Dhome.dir :
    var appHomeDir = proceedForced(
      System.getProperty(COMMAND_LINE_VAR_HOME_DIR),
      "Le répertoire personnel de ProjectForge est défini comme paramètre de ligne de commande, mais n'est pas encore initialisé : -D"
          + COMMAND_LINE_VAR_HOME_DIR + "=\$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Essayer le répertoire défini via la ligne de commande : -Dprojectforge.base.dir :
    appHomeDir = proceedForced(
      System.getProperty(ProjectForgeApp.CONFIG_PARAM_BASE_DIR),
      "Le répertoire personnel de ProjectForge est défini comme paramètre de ligne de commande, mais n'est pas encore initialisé : -D"
          + ProjectForgeApp.CONFIG_PARAM_BASE_DIR + "=\$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Essayer le répertoire défini via la variable d'environnement :
    appHomeDir = proceedForced(
      System.getenv(ENV_PROJECTFORGE_HOME),
      "Le répertoire personnel de ProjectForge est défini comme variable d'environnement système $" + ENV_PROJECTFORGE_HOME + " : \$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Essayer le répertoire défini via la variable de préférences utilisateur :
    val prefHomeDir = userPrefHomeDir
    if (prefHomeDir != null) {
      appHomeDir = proceed(
        File(prefHomeDir),
        "Le répertoire personnel de ProjectForge est défini comme préférence utilisateur java " + ENV_PROJECTFORGE_HOME + " : \$APP_HOME_DIR",
        false
      )
      if (appHomeDir != null) return appHomeDir
    }

    // Essayer le répertoire où se trouve le jar exécutable :
    appHomeDir = searchAndProceed(
      File(System.getProperty("user.home")),
      "Le répertoire personnel de ProjectForge trouvé dans le répertoire personnel de l'utilisateur : \$APP_HOME_DIR",
      false
    )
    if (appHomeDir != null) return appHomeDir

    // Essayer le répertoire où se trouve le jar exécutable :
    appHomeDir = searchAndProceed(
      getExecutableDir(true),
      "Le répertoire personnel de ProjectForge trouvé relativement au jar exécutable : \$APP_HOME_DIR",
      false
    )
    if (appHomeDir != null) return appHomeDir

    // Essayer le répertoire courant (lancer l'assistant, car c'est la dernière chance de le faire) :
    appHomeDir = searchAndProceed(
      File("."),
      """Répertoire personnel de ProjectForge non trouvé, recherché dans :
  ${StringUtils.join(suggestedDirectories, "\n  ")}""",
      true
    )
    if (appHomeDir != null) return appHomeDir
    ProjectForgeApplication.giveUpAndSystemExit("Aucun répertoire personnel de ProjectForge trouvé ou configuré, abandon :-(")
    return null // inaccessible, car SystemExit() a été appelé avant.
  }

  /**
   *
   *  1.
   * Si le appHomeDir donné est nul ou vide, null est retourné.
   *
   *  1.
   * Vérifie si le appHomeDir donné existe déjà. Si c'est le cas, le appHomeDir est retourné comme objet File et ProjectForge
   * doit continuer la phase de démarrage avec ce répertoire.
   *
   *  1.
   * Si le appHomeDir donné n'existe pas ou n'est pas déjà initialisé, l'assistant d'installation et l'installation sont démarrés.
   * Si l'utilisateur abandonne ou si une erreur survient, System.exit(1) est appelé, sinon le fichier avec le nouveau répertoire
   * personnel installé est retourné.
   *
   *
// ... (tronqué, total 381 lignes)

Historique Git

868d6abb7 2025 -> 2026
63081666f En-têtes des fichiers source : 2024 -> 2025.
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
7fe9b2c1d Nouvelle bibliothèque jdbc postgresql : 42.3.4 -> 42.5.0