Class McpWorkspaceBootstrap
ServerContextProvider.
Индексация выполняется так же, как в analyze.
У папки есть владельцы: явная регистрация и MCP roots. Папка остаётся зарегистрированной, пока её держит хотя бы один владелец, поэтому исчезновение корня из roots не отбирает папку, зарегистрированную явно, и наоборот. Единственный источник правды о владении — этот бин; отдельных копий состояния заводить нельзя, иначе они разойдутся с реальным набором папок. Владение при этом вторично: папка, убранная из контекста мимо этого бина, теряет владельцев.
Удаляются только папки, созданные через MCP. Папки из других источников — прежде всего
workspace folders LSP-клиента в режимах lsp --mcp/websocket --mcp — MCP забирать
не вправе: их удаление снесло бы рабочий контекст редактора, а вернуть его клиент не может.
Идентичность папки — URI, под которым она лежит в ServerContextProvider, а не путь:
Path.toUri() добавляет завершающий слэш только пока каталог существует, поэтому у
удалённого с диска каталога тот же Path даёт уже другой URI.
Все изменения набора сериализованы на мониторе бина: источников несколько, а регистрация — «проверить и добавить» с долгой индексацией между шагами, так что параллельные вызовы иначе индексировали бы один каталог дважды.
-
Constructor Summary
ConstructorsConstructorDescriptionMcpWorkspaceBootstrap(LanguageServerConfiguration configuration, ServerContextProvider serverContextProvider) -
Method Summary
Modifier and TypeMethodDescriptionintЗарегистрировать каталог исходников как рабочую папку и проиндексировать его.intЗарегистрировать каталог исходников как рабочую папку под заданным именем и проиндексировать его.booleanВзять каталог во владение явной регистрацией, проиндексировав его, если он ещё не зарегистрирован.voidУдалить рабочую папку из общего контекста сервера.voidsyncRoots(Collection<Path> declaredRoots) Привести набор папок, удерживаемых MCP roots, к объявленному клиентом.booleanunregister(URI workspaceUri) Отказаться от явного владения папкой и удалить её, если её больше никто не удерживает.
-
Constructor Details
-
McpWorkspaceBootstrap
@ConstructorProperties({"configuration","serverContextProvider"}) public McpWorkspaceBootstrap(LanguageServerConfiguration configuration, ServerContextProvider serverContextProvider)
-
-
Method Details
-
register
Взять каталог во владение явной регистрацией, проиндексировав его, если он ещё не зарегистрирован.Атомарно относительно других изменений набора рабочих папок.
- Parameters:
srcDir- Каталог исходных файлов.workspaceName- Имя рабочей папки;null— взять из последнего сегмента URI.- Returns:
true, если каталог был зарегистрирован ранее и индексация не выполнялась.- Throws:
RuntimeException- Если индексация не удалась; папка при этом не остаётся зарегистрированной наполовину.
-
unregister
Отказаться от явного владения папкой и удалить её, если её больше никто не удерживает.Атомарно относительно других изменений набора рабочих папок.
- Parameters:
workspaceUri- URI ранее зарегистрированной рабочей папки — в том виде, в котором она лежит вServerContextProvider.- Returns:
true, если папка удалена;false, если она осталась — её продолжает удерживать корень, объявленный клиентом через MCP roots.- Throws:
IllegalArgumentException- Если папку добавили не через MCP: забирать чужую папку (например, workspace folder LSP-клиента) этот бин не вправе.IllegalStateException- Если папку не удалось адресовать для удаления — см.remove(URI).
-
syncRoots
Привести набор папок, удерживаемых MCP roots, к объявленному клиентом.Новые корни индексируются, исчезнувшие — освобождаются; папка удаляется, только если её не удерживает явная регистрация. Атомарно относительно других изменений набора рабочих папок.
- Parameters:
declaredRoots- Каталоги корней, объявленных клиентом.
-
index
Зарегистрировать каталог исходников как рабочую папку и проиндексировать его.Уже зарегистрированный каталог индексируется повторно — если это нежелательно, используйте
register(Path, String).- Parameters:
srcDir- Каталог исходных файлов.- Returns:
- Количество проиндексированных файлов.
-
index
Зарегистрировать каталог исходников как рабочую папку под заданным именем и проиндексировать его.- Parameters:
srcDir- Каталог исходных файлов.workspaceName- Имя рабочей папки;null— взять из последнего сегмента URI.- Returns:
- Количество проиндексированных файлов.
- Throws:
RuntimeException- Если индексация не удалась. Папка, добавленная этим вызовом, откатывается — иначе наполовину собранная считалась бы зарегистрированной и повторныйregister(Path, String)вернул бы «уже зарегистрирована».
-
remove
Удалить рабочую папку из общего контекста сервера.- Parameters:
workspaceUri- URI ранее добавленной рабочей папки — в том виде, в котором она лежит вServerContextProvider.- Throws:
IllegalStateException- Если папка осталась в контексте:removeWorkspaceищет запись, повторно приводя URI к каноническому виду, а для каталога, которого уже нет на диске, такое приведение даёт другой URI и запись не находится. Владение в этом случае сохраняется, чтобы повторная попытка не выглядела обращением к чужой папке.
-