Class ConfigurationFileSystemWatcher

java.lang.Object
com.github._1c_syntax.bsl.languageserver.configuration.watcher.ConfigurationFileSystemWatcher

@Component public class ConfigurationFileSystemWatcher extends Object
Отслеживатель изменений файлов конфигурации.

Мониторит глобальный файл конфигурации и файлы конфигурации каждого workspace. При обнаружении изменения (удаление, создание, редактирование) делегирует обработку в ConfigurationFileChangeListener.

  • Constructor Details

  • Method Details

    • init

      @PostConstruct public void init() throws IOException
      Throws:
      IOException
    • onDestroy

      @PreDestroy public void onDestroy() throws IOException
      Throws:
      IOException
    • watch

      @Scheduled(fixedDelay=5000L) public void watch()
      Фоновая процедура, отслеживающая изменения файлов.

      Java NIO WatchService.register для уже зарегистрированной директории возвращает тот же WatchKey (см. javadoc); поэтому globalWatchKey и workspaceWatchKeys.get(uri) могут быть физически одним и тем же объектом, когда workspace LSC при init подтянул настройки из глобального файла и configurationFile workspace указывает на ту же директорию. В таком случае «два listener'а на один файл» нельзя реализовать через два независимых ключа: первый pollEvents() consume-ит события у другого.

      Решение — диспатч по файлу: один проход по уникальным ключам, события каждого ключа распределяются между всеми заинтересованными listener'ами (global + workspace LSC, у которых файл совпадает с LanguageServerConfiguration.getConfigurationFile()).

    • handleGlobalConfigurationChanged

      @EventListener public void handleGlobalConfigurationChanged(GlobalLanguageServerConfigurationChangedEvent event)
      Обработчик события GlobalLanguageServerConfigurationChangedEvent.
      Parameters:
      event - Событие
    • handleWorkspaceAdded

      @EventListener public void handleWorkspaceAdded(WorkspaceAddedEvent event)
      Обработчик добавления нового workspace.

      Workspace-контекст уже установлен в EventPublisherAspect перед публикацией WorkspaceAddedEvent, поэтому прямое обращение к workspace-scoped прокси через event.getServerContext().getLanguageServerConfiguration() корректно.

      Parameters:
      event - Событие добавления workspace
    • handleBeforeWorkspaceRemoved

      @EventListener public void handleBeforeWorkspaceRemoved(BeforeWorkspaceRemovedEvent event)
      Обработчик удаления workspace (перед удалением).
      Parameters:
      event - Событие удаления workspace