Class McpWorkspaceBootstrap

java.lang.Object
com.github._1c_syntax.bsl.languageserver.mcp.McpWorkspaceBootstrap

@Component public class McpWorkspaceBootstrap extends Object
Регистрация и удаление рабочих папок MCP в общем ServerContextProvider. Индексация выполняется так же, как в analyze.

У папки есть владельцы: явная регистрация и MCP roots. Папка остаётся зарегистрированной, пока её держит хотя бы один владелец, поэтому исчезновение корня из roots не отбирает папку, зарегистрированную явно, и наоборот. Единственный источник правды о владении — этот бин; отдельных копий состояния заводить нельзя, иначе они разойдутся с реальным набором папок. Владение при этом вторично: папка, убранная из контекста мимо этого бина, теряет владельцев.

Удаляются только папки, созданные через MCP. Папки из других источников — прежде всего workspace folders LSP-клиента в режимах lsp --mcp/websocket --mcp — MCP забирать не вправе: их удаление снесло бы рабочий контекст редактора, а вернуть его клиент не может.

Идентичность папки — URI, под которым она лежит в ServerContextProvider, а не путь: Path.toUri() добавляет завершающий слэш только пока каталог существует, поэтому у удалённого с диска каталога тот же Path даёт уже другой URI.

Все изменения набора сериализованы на мониторе бина: источников несколько, а регистрация — «проверить и добавить» с долгой индексацией между шагами, так что параллельные вызовы иначе индексировали бы один каталог дважды.

  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    index(Path srcDir)
    Зарегистрировать каталог исходников как рабочую папку и проиндексировать его.
    int
    index(Path srcDir, @Nullable String workspaceName)
    Зарегистрировать каталог исходников как рабочую папку под заданным именем и проиндексировать его.
    boolean
    register(Path srcDir, @Nullable String workspaceName)
    Взять каталог во владение явной регистрацией, проиндексировав его, если он ещё не зарегистрирован.
    void
    remove(URI workspaceUri)
    Удалить рабочую папку из общего контекста сервера.
    void
    syncRoots(Collection<Path> declaredRoots)
    Привести набор папок, удерживаемых MCP roots, к объявленному клиентом.
    boolean
    unregister(URI workspaceUri)
    Отказаться от явного владения папкой и удалить её, если её больше никто не удерживает.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

  • Method Details

    • register

      public boolean register(Path srcDir, @Nullable String workspaceName)
      Взять каталог во владение явной регистрацией, проиндексировав его, если он ещё не зарегистрирован.

      Атомарно относительно других изменений набора рабочих папок.

      Parameters:
      srcDir - Каталог исходных файлов.
      workspaceName - Имя рабочей папки; null — взять из последнего сегмента URI.
      Returns:
      true, если каталог был зарегистрирован ранее и индексация не выполнялась.
      Throws:
      RuntimeException - Если индексация не удалась; папка при этом не остаётся зарегистрированной наполовину.
    • unregister

      public boolean unregister(URI workspaceUri)
      Отказаться от явного владения папкой и удалить её, если её больше никто не удерживает.

      Атомарно относительно других изменений набора рабочих папок.

      Parameters:
      workspaceUri - URI ранее зарегистрированной рабочей папки — в том виде, в котором она лежит в ServerContextProvider.
      Returns:
      true, если папка удалена; false, если она осталась — её продолжает удерживать корень, объявленный клиентом через MCP roots.
      Throws:
      IllegalArgumentException - Если папку добавили не через MCP: забирать чужую папку (например, workspace folder LSP-клиента) этот бин не вправе.
      IllegalStateException - Если папку не удалось адресовать для удаления — см. remove(URI).
    • syncRoots

      public void syncRoots(Collection<Path> declaredRoots)
      Привести набор папок, удерживаемых MCP roots, к объявленному клиентом.

      Новые корни индексируются, исчезнувшие — освобождаются; папка удаляется, только если её не удерживает явная регистрация. Атомарно относительно других изменений набора рабочих папок.

      Parameters:
      declaredRoots - Каталоги корней, объявленных клиентом.
    • index

      public int index(Path srcDir)
      Зарегистрировать каталог исходников как рабочую папку и проиндексировать его.

      Уже зарегистрированный каталог индексируется повторно — если это нежелательно, используйте register(Path, String).

      Parameters:
      srcDir - Каталог исходных файлов.
      Returns:
      Количество проиндексированных файлов.
    • index

      public int index(Path srcDir, @Nullable String workspaceName)
      Зарегистрировать каталог исходников как рабочую папку под заданным именем и проиндексировать его.
      Parameters:
      srcDir - Каталог исходных файлов.
      workspaceName - Имя рабочей папки; null — взять из последнего сегмента URI.
      Returns:
      Количество проиндексированных файлов.
      Throws:
      RuntimeException - Если индексация не удалась. Папка, добавленная этим вызовом, откатывается — иначе наполовину собранная считалась бы зарегистрированной и повторный register(Path, String) вернул бы «уже зарегистрирована».
    • remove

      public void remove(URI workspaceUri)
      Удалить рабочую папку из общего контекста сервера.
      Parameters:
      workspaceUri - URI ранее добавленной рабочей папки — в том виде, в котором она лежит в ServerContextProvider.
      Throws:
      IllegalStateException - Если папка осталась в контексте: removeWorkspace ищет запись, повторно приводя URI к каноническому виду, а для каталога, которого уже нет на диске, такое приведение даёт другой URI и запись не находится. Владение в этом случае сохраняется, чтобы повторная попытка не выглядела обращением к чужой папке.