EN · DE · RU · FR · ES

#335: ProjectForgeHomeFinder.kt

projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt Type: Kotlin · Role: Component · Source: projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt 403 lines · 285 code · 88 comments · 30 blank
Source code file at projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt containing Kotlin code for the Component layer.

Code Structure

Annotations: param, return, JvmStatic

Classes: ProjectForgeHomeFinder, WizardMode

Objects: and

Enum classes: WizardMode

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

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

Imports: 17 packages

Package: org.projectforge.start

Source Code (abridged)

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 for finding ProjectForge's home directory:<br></br>
 *
 *  1. Create ProjectForge as a top level directory of your home directory: '$HOME/ProjectForge', or
 *  1. create a directory and put the jar file somewhere inside this directory. ProjectForge detects the folder relative to the executed jar, or
 *  1. create a directory and define it as command line parameter: java -Dhome.dir=yourdirectory -jar ..., or
 *  1. create a directory and define it as system environment variable $PROJECTFORGE_HOME.
 *
 */
class ProjectForgeHomeFinder {
  private var userAcceptsGraphicalTerminal: WizardMode? = null

  private enum class WizardMode { DESKTOP, CONSOLE, NONE }

  /**
   * Tries to find ProjectForge's home dir. If not found or isn't initialized, a setup wizard is started.
   *
   * @return The home dir. If not found, a System.exit() is done and user information are shown on how to proceed.
   */
  fun findAndEnsureAppHomeDir(): File? {
    // Try directory defined through command line: -Dhome.dir:
    var appHomeDir = proceedForced(
      System.getProperty(COMMAND_LINE_VAR_HOME_DIR),
      "ProjectForge's home dir is defined as command line param, but isn't yet initialized: -D"
          + COMMAND_LINE_VAR_HOME_DIR + "=\$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Try directory defined through command line: -Dprojectforge.base.dir:
    appHomeDir = proceedForced(
      System.getProperty(ProjectForgeApp.CONFIG_PARAM_BASE_DIR),
      "ProjectForge's home dir is defined as command line param, but isn't yet initialized: -D"
          + ProjectForgeApp.CONFIG_PARAM_BASE_DIR + "=\$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Try directory defined through environment variable:
    appHomeDir = proceedForced(
      System.getenv(ENV_PROJECTFORGE_HOME),
      "ProjectForge's home dir is defined as system environment variable $" + ENV_PROJECTFORGE_HOME + ": \$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Try directory defined through user preferences variable:
    val prefHomeDir = userPrefHomeDir
    if (prefHomeDir != null) {
      appHomeDir = proceed(
        File(prefHomeDir),
        "ProjectForge's home dir is defined as java user preference " + ENV_PROJECTFORGE_HOME + ": \$APP_HOME_DIR",
        false
      )
      if (appHomeDir != null) return appHomeDir
    }

    // Try directory where the executable jar resides:
    appHomeDir = searchAndProceed(
      File(System.getProperty("user.home")),
      "ProjectForge's home directory found in the user's home dir: \$APP_HOME_DIR",
      false
    )
    if (appHomeDir != null) return appHomeDir

    // Try directory where the executable jar resides:
    appHomeDir = searchAndProceed(
      getExecutableDir(true),
      "ProjectForge's home directory found relative to executable jar: \$APP_HOME_DIR",
      false
    )
    if (appHomeDir != null) return appHomeDir

    // Try current directory (launch wizard, because it's the last chance to do it):
    appHomeDir = searchAndProceed(
      File("."),
      """ProjectForge's home directory not found, searched for:
  ${StringUtils.join(suggestedDirectories, "\n  ")}""",
      true
    )
    if (appHomeDir != null) return appHomeDir
    ProjectForgeApplication.giveUpAndSystemExit("No home directory of ProjectForge found or configured, giving up :-(")
    return null // unreachable, because SystemExit() was called before.
  }

  /**
   *
   *  1.
   * If the given appHomeDir is null or blank, null is returned.
   *
   *  1.
   * Checks if the given appHomeDir is already given. If so, the appHomeDir is returned as File object and ProjectForge
   * should continue the start-up phase with this directory.
   *
   *  1.
   * If given appHomeDir doesn't exist or isn't already initialized, the setup wizard and installation is started.
   * If aborted by the user or any failure occurs, System.exit(1) is called, otherwise the file with the new installed
   * home directory is returned.
   *
   *
// ... (truncated, total 381 lines)

Git History

868d6abb7 2025 -> 2026
63081666f Source file headers: 2024-> 2025.
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
7fe9b2c1d New postgresql jdbc lib: 42.3.4 -> 42.5.0