EN · DE · RU · FR · ES

#335: ProjectForgeHomeFinder.kt

projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt Тип: Kotlin · Роль: Компонент · Источник: projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt 403 строки · 285 кода · 88 комментариев · 30 пустых
Файл исходного кода по пути projectforge-application/src/main/kotlin/org/projectforge/start/ProjectForgeHomeFinder.kt, содержащий код Kotlin для слоя Компонентов.

Структура кода

Аннотации: param, return, JvmStatic

Классы: ProjectForgeHomeFinder, WizardMode

Объекты: and

Enum-классы: WizardMode

Функции (16): findAndEnsureAppHomeDir, proceedForced, searchAndProceed, proceed, answerValid, saveUserPrefHomeDir, checkAndAdd, checkAndAdd, getExecutableDir, findBaseDirAndAncestors, findBaseDirOnly, checkDirectory, isStandardProjectForgeUserDir, isProjectForgeSourceCodeRepository, isProjectForgeConfigured, isProjectForgeConfigured

Свойства (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...

Импорты: 17 пакетов

Пакет: org.projectforge.start

Исходный код (сокращён)

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

/**
 * Вспомогательный класс для поиска домашнего каталога ProjectForge:<br></br>
 *
 *  1. Создайте ProjectForge как каталог верхнего уровня в вашем домашнем каталоге: '$HOME/ProjectForge', или
 *  1. создайте каталог и поместите jar-файл где-нибудь внутри этого каталога. ProjectForge обнаружит папку относительно запущенного jar, или
 *  1. создайте каталог и укажите его как параметр командной строки: java -Dhome.dir=ваш_каталог -jar ..., или
 *  1. создайте каталог и укажите его как системную переменную окружения $PROJECTFORGE_HOME.
 *
 */
class ProjectForgeHomeFinder {
  private var userAcceptsGraphicalTerminal: WizardMode? = null

  private enum class WizardMode { DESKTOP, CONSOLE, NONE }

  /**
   * Пытается найти домашний каталог ProjectForge. Если не найден или не инициализирован, запускается мастер настройки.
   *
   * @return Домашний каталог. Если не найден, выполняется System.exit() и пользователю показывается информация о дальнейших действиях.
   */
  fun findAndEnsureAppHomeDir(): File? {
    // Попытка найти каталог, заданный через командную строку: -Dhome.dir:
    var appHomeDir = proceedForced(
      System.getProperty(COMMAND_LINE_VAR_HOME_DIR),
      "Домашний каталог ProjectForge задан параметром командной строки, но ещё не инициализирован: -D"
          + COMMAND_LINE_VAR_HOME_DIR + "=\$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Попытка найти каталог, заданный через командную строку: -Dprojectforge.base.dir:
    appHomeDir = proceedForced(
      System.getProperty(ProjectForgeApp.CONFIG_PARAM_BASE_DIR),
      "Домашний каталог ProjectForge задан параметром командной строки, но ещё не инициализирован: -D"
          + ProjectForgeApp.CONFIG_PARAM_BASE_DIR + "=\$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Попытка найти каталог, заданный через переменную окружения:
    appHomeDir = proceedForced(
      System.getenv(ENV_PROJECTFORGE_HOME),
      "Домашний каталог ProjectForge задан системной переменной окружения $" + ENV_PROJECTFORGE_HOME + ": \$APP_HOME_DIR"
    )
    if (appHomeDir != null) return appHomeDir

    // Попытка найти каталог, заданный через пользовательские настройки:
    val prefHomeDir = userPrefHomeDir
    if (prefHomeDir != null) {
      appHomeDir = proceed(
        File(prefHomeDir),
        "Домашний каталог ProjectForge задан в пользовательских настройках Java " + ENV_PROJECTFORGE_HOME + ": \$APP_HOME_DIR",
        false
      )
      if (appHomeDir != null) return appHomeDir
    }

    // Попытка найти каталог, где находится исполняемый jar-файл:
    appHomeDir = searchAndProceed(
      File(System.getProperty("user.home")),
      "Домашний каталог ProjectForge найден в домашнем каталоге пользователя: \$APP_HOME_DIR",
      false
    )
    if (appHomeDir != null) return appHomeDir

    // Попытка найти каталог, где находится исполняемый jar-файл:
    appHomeDir = searchAndProceed(
      getExecutableDir(true),
      "Домашний каталог ProjectForge найден относительно исполняемого jar: \$APP_HOME_DIR",
      false
    )
    if (appHomeDir != null) return appHomeDir

    // Попытка найти текущий каталог (запуск мастера, так как это последний шанс):
    appHomeDir = searchAndProceed(
      File("."),
      """Домашний каталог ProjectForge не найден, поиск осуществлялся в:
  ${StringUtils.join(suggestedDirectories, "\n  ")}""",
      true
    )
    if (appHomeDir != null) return appHomeDir
    ProjectForgeApplication.giveUpAndSystemExit("Домашний каталог ProjectForge не найден и не настроен, завершение работы :-(")
    return null // недостижимо, так как перед этим был вызван SystemExit().
  }

  /**
   *
   *  1.
   * Если переданный appHomeDir равен null или пуст, возвращается null.
   *
   *  1.
   * Проверяет, существует ли переданный appHomeDir. Если да, возвращается объект File для этого каталога, и ProjectForge
   * продолжает фазу запуска с этим каталогом.
   *
   *  1.
   * Если переданный appHomeDir не существует или не инициализирован, запускается мастер настройки и установка.
   * Если пользователь прервал процесс или произошла ошибка, вызывается System.exit(1), иначе возвращается файл с новым
   * установленным домашним каталогом.
   *
   *
// ... (сокращено, всего 381 строка)

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024 -> 2025.
b6092df09 Авторские права 2023 -> 2024
ab45d51fa Авторские права 2001-2022 -> 2001-2023.
7fe9b2c1d Новая библиотека jdbc для postgresql: 42.3.4 -> 42.5.0