public void setupWorkspace(URI workspaceURI) {
        // already set up
        if (this.workspaceURI != null) return;
        this.workspaceStatus = WorkspaceStatus.INDEXING;

        this.workspaceURI = workspaceURI;

        logger.info("Scanning workspace: " + workspaceURI.toString());
        setReparseDescendants(false);

        List<String> schemaFiles = FileUtils.findSchemaFiles(workspaceURI.toString(), this.logger);
        List<String> rankProfileFiles = FileUtils.findRankProfileFiles(workspaceURI.toString(), this.logger);

        int totalFiles = schemaFiles.size() + rankProfileFiles.size();

        Progress progress = progressHandler.newWorkDoneProgress("Indexing workspace");

        for (int i = 0; i < totalFiles; i++) {
            String fileURI;
            if (i < schemaFiles.size()) {
                fileURI = schemaFiles.get(i);
            } else {
                fileURI = rankProfileFiles.get(i - schemaFiles.size());
            }

            addDocument(fileURI);
            progress.partialResult(i + " of " + totalFiles + " files indexed.", i * 50 / totalFiles);
        }

        reparseInInheritanceOrder(progress);
        setReparseDescendants(true);

        progress.end("Finished");

        this.workspaceStatus = WorkspaceStatus.SETUP_COMPLETED;
        logger.info("Workspace setup finished.");
    }
Class responsible for maintaining the set of open documents and reparsing them.
When {@link SchemaDocumentScheduler#updateFile} is called, it will call {@link DocumentManager#updateFileContent} on the appropriate file 
and also other files that may have dependencies on the contents of the file.
integration/schema-language-server/language-server/src/main/java/ai/vespa/schemals/schemadocument/SchemaDocumentScheduler.java