EN · DE · RU · FR · ES

#335: ProjectForgeHomeFinder.kt

projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt Typ: Kotlin · Rolle: Komponente · Quelle: projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt 403 Zeilen · 285 Code · 88 Kommentare · 30 leer
Quellcodedatei unter projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt mit Kotlin-Code für die Komponentenschicht.

Codestruktur

Annotationen: param, return, JvmStatic

Klassen: ProjectForgeHomeFinder, WizardMode

Objekte: and

Enum-Klassen: WizardMode

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

Eigenschaften (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...

Importe: 17 Pakete

Paket: org.projectforge.start

Quellcode (gekürzt)

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 {}

/**
 * Hilfsklasse zum Finden des ProjectForge-Heimatverzeichnisses:<br></br>
 *
 *  1. Erstellen Sie ProjectForge als ein Top-Level-Verzeichnis Ihres Home-Verzeichnisses: '$HOME/ProjectForge', oder
 *  1. Erstellen Sie ein Verzeichnis und legen Sie die JAR-Datei irgendwo in diesem Verzeichnis ab. ProjectForge erkennt den Ordner relativ zur ausgeführten JAR, oder
 *  1. Erstellen Sie ein Verzeichnis und definieren Sie es als Kommandozeilenparameter: java -Dhome.dir=IhrVerzeichnis -jar ..., oder
 *  1. Erstellen Sie ein Verzeichnis und definieren Sie es als Systemumgebungsvariable $PROJECTFORGE_HOME.
 *
 */
class ProjectForgeHomeFinder {
  private var userAcceptsGraphicalTerminal: WizardMode? = null

  private enum class WizardMode { DESKTOP, KONSOLE, KEINER }

  /**
   * Versucht, das ProjectForge-Heimatverzeichnis zu finden. Wenn es nicht gefunden oder nicht initialisiert wurde, wird ein Setup-Assistent gestartet.
   *
   * @return Das Heimatverzeichnis. Wenn nicht gefunden, wird ein System.exit() ausgeführt und dem Benutzer werden Informationen zur Vorgehensweise angezeigt.
   */
  fun findAndEnsureAppHomeDir(): File? {
    // Versuche Verzeichnis, das über die Kommandozeile definiert wurde: -Dhome.dir:
    var appHomeDir = proceedForced(
      System.getProperty(COMMAND_LINE_VAR_HOME_DIR),
      "ProjectForge-Heimatverzeichnis ist als Kommandozeilenparameter definiert, aber noch nicht initialisiert: -D"
          + COMMAND_LINE_VAR_HOME_DIR + "=\$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Versuche Verzeichnis, das über die Kommandozeile definiert wurde: -Dprojectforge.base.dir:
    appHomeDir = proceedForced(
      System.getProperty(ProjectForgeApp.CONFIG_PARAM_BASE_DIR),
      "ProjectForge-Heimatverzeichnis ist als Kommandozeilenparameter definiert, aber noch nicht initialisiert: -D"
          + ProjectForgeApp.CONFIG_PARAM_BASE_DIR + "=\$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Versuche Verzeichnis, das über die Umgebungsvariable definiert wurde:
    appHomeDir = proceedForced(
      System.getenv(ENV_PROJECTFORGE_HOME),
      "ProjectForge-Heimatverzeichnis ist als Systemumgebungsvariable $" + ENV_PROJECTFORGE_HOME + ": \$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Versuche Verzeichnis, das über die Benutzereinstellungsvariable definiert wurde:
    val prefHomeDir = userPrefHomeDir
    if (prefHomeDir != null) {
      appHomeDir = proceed(
        File(prefHomeDir),
        "ProjectForge-Heimatverzeichnis ist als Java-Benutzereinstellung " + ENV_PROJECTFORGE_HOME + ": \$APP_HOME_DIR",
        false
      )
      if (appHomeDir != null) return appHomeDir
    }

    // Versuche Verzeichnis, in dem sich die ausführbare JAR-Datei befindet:
    appHomeDir = searchAndProceed(
      File(System.getProperty("user.home")),
      "ProjectForge-Heimatverzeichnis im Home-Verzeichnis des Benutzers gefunden: \$APP_HOME_DIR",
      false
    )
    if (appHomeDir != null) return appHomeDir

    // Versuche Verzeichnis, in dem sich die ausführbare JAR-Datei befindet:
    appHomeDir = searchAndProceed(
      getExecutableDir(true),
      "ProjectForge-Heimatverzeichnis relativ zur ausführbaren JAR-Datei gefunden: \$APP_HOME_DIR",
      false
    )
    if (appHomeDir != null) return appHomeDir

    // Versuche aktuelles Verzeichnis (Assistent starten, da es die letzte Möglichkeit ist):
    appHomeDir = searchAndProceed(
      File("."),
      """ProjectForge-Heimatverzeichnis nicht gefunden, gesucht nach:
  ${StringUtils.join(suggestedDirectories, "\n  ")}""",
      true
    )
    if (appHomeDir != null) return appHomeDir
    ProjectForgeApplication.giveUpAndSystemExit("Kein Heimatverzeichnis von ProjectForge gefunden oder konfiguriert, gebe auf :-(")
    return null // nicht erreichbar, da SystemExit() zuvor aufgerufen wurde.
  }

  /**
   *
   *  1.
   * Wenn das angegebene appHomeDir null oder leer ist, wird null zurückgegeben.
   *
   *  1.
   * Überprüft, ob das angegebene appHomeDir bereits vorhanden ist. Wenn ja, wird appHomeDir als File-Objekt zurückgegeben und ProjectForge
   * sollte die Startphase mit diesem Verzeichnis fortsetzen.
   *
   *  1.
   * Wenn das angegebene appHomeDir nicht existiert oder noch nicht initialisiert ist, werden der Setup-Assistent und die Installation gestartet.
   * Wenn der Benutzer abbricht oder ein Fehler auftritt, wird System.exit(1) aufgerufen, andernfalls wird die Datei mit dem neu installierten
   * Heimatverzeichnis zurückgegeben.
   *
   *
// ... (gekürzt, insgesamt 381 Zeilen)

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quellcodedatei-Header: 2024 -> 2025.
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
7fe9b2c1d Neue PostgreSQL-JDBC-Bibliothek: 42.3.4 -> 42.5.0