{"record":{"id":"f7ea3bb238080ff3","repo":"OtterMind/Chat2DB","slug":"unable-to-register-the-chat2db-preview-resource-ha","errorCode":null,"errorMessage":"Unable to register the Chat2DB preview resource handler","messagePattern":"Unable to register the Chat2DB preview resource handler","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"chat2db-community-server/chat2db-community-jcef/src/main/java/ai/chat2db/community/jcef/handler/biz/PreviewResourceScheme.java","lineNumber":60,"sourceCode":"                false,\n                true,\n                true,\n                false,\n                false\n        );\n        if (!registered) {\n            throw new IllegalStateException(\"Unable to register the Chat2DB preview resource scheme\");\n        }\n    }\n\n    public static void registerFactory(CefApp cefApp) {\n        boolean registered = cefApp.registerSchemeHandlerFactory(\n                SCHEME,\n                DOMAIN,\n                (browser, frame, schemeName, request) -> new PreviewResourceHandler()\n        );\n        if (!registered) {\n            throw new IllegalStateException(\"Unable to register the Chat2DB preview resource handler\");\n        }\n    }\n\n    static String createUrl(String rootToken, String relativePath) {\n        return createUrl(rootToken, relativePath, null);\n    }\n\n    static String createUrl(String rootToken, String relativePath, String version) {\n        String encodedPath = Base64.getUrlEncoder().withoutPadding().encodeToString(\n                (relativePath == null ? \"\" : relativePath).getBytes(StandardCharsets.UTF_8)\n        );\n        String url = SCHEME + \"://\" + DOMAIN + \"/\" + rootToken + \"/\" + encodedPath;\n        return version == null || version.isBlank()\n                ? url\n                : url + \"?v=\" + URLEncoder.encode(version, StandardCharsets.UTF_8);\n    }\n\n    static ResourceRequest resolveRequest(String url, String method, String rangeHeader, String ifNoneMatch,","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/OtterMind/Chat2DB/blob/5ee1e990e73fbcae1969dc554be254fedb3ab888/chat2db-community-server/chat2db-community-jcef/src/main/java/ai/chat2db/community/jcef/handler/biz/PreviewResourceScheme.java#L42-L78","documentation":"Thrown by PreviewResourceScheme.registerFactory() when CefApp.registerSchemeHandlerFactory() returns false for the 'chat2db-resource' scheme on the 'preview' domain. CEF rejects factory registration if the scheme+domain combination already has a handler, or if CefApp is past the initialization window that accepts factory registration. Called from onContextInitialized (MainJFrame line 547).","triggerScenarios":"registerSchemeHandlerFactory returns false when a handler is already registered for the same scheme and domain, or when CefApp's context is not in the state that accepts new factory registrations (e.g., called after the browser was already created).","commonSituations":"CefApp re-initialization in the same process; a duplicate registerFactory call from a test or plugin; the scheme handler was registered in a previous context that was not fully torn down; JCEF version change affecting factory registration timing.","solutions":["Ensure registerFactory is called exactly once per CefApp instance, inside onContextInitialized","If CefApp is re-created, restart the JVM process rather than reusing the same process","Search for any other call site that registers a handler for 'chat2db-resource' on domain 'preview'","Verify onContextInitialized is not invoked more than once due to a CEF callback quirk"],"exampleFix":"// before: factory registration may fire on re-init\nPreviewResourceScheme.registerFactory(cefApp_);\n\n// after: idempotent guard\nprivate static volatile boolean factoryRegistered = false;\nif (!factoryRegistered) {\n    PreviewResourceScheme.registerFactory(cefApp_);\n    factoryRegistered = true;\n}","handlingStrategy":"validation","validationCode":"// Ensure registerFactory is called exactly once per CefApp instance\nprivate static final AtomicBoolean factoryRegistered = new AtomicBoolean(false);\n\nif (factoryRegistered.compareAndSet(false, true)) {\n    PreviewResourceScheme.registerFactory(cefApp_);\n} else {\n    log.warn(\"Preview resource factory already registered, skipping\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    PreviewResourceScheme.registerFactory(cefApp_);\n} catch (IllegalStateException e) {\n    log.warn(\"Scheme handler factory registration failed: {}\", e.getMessage());\n}","preventionTips":["Call registerFactory only inside onContextInitialized, exactly once","Do not re-create CefApp within the same process — restart the JVM instead","Search the codebase for any duplicate registerSchemeHandlerFactory call for 'chat2db-resource'"],"tags":["jcef","cef","scheme-registration","lifecycle","desktop"],"backgroundTag":null,"analyzedSha":"5ee1e990e73fbcae1969dc554be254fedb3ab888","analyzedAt":"2026-08-14T07:05:03.077Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}