{"record":{"id":"e43e677a373e45a8","repo":"pinpoint-apm/pinpoint","slug":"processingenvoptionsholder-not-initialized-yet","errorCode":null,"errorMessage":"ProcessingEnvOptionsHolder not initialized yet.","messagePattern":"ProcessingEnvOptionsHolder not initialized yet\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"commons-mapstruct-spi/src/main/java/com/navercorp/pinpoint/mapstruct/spi/ProcessingEnvOptionsHolder.java","lineNumber":64,"sourceCode":"    @Override\n    public synchronized void init(ProcessingEnvironment processingEnv) {\n        super.init(processingEnv);\n        options = ImmutableMap.copyOf(processingEnv.getOptions());\n    }\n\n    @Override\n    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n        return false;\n    }\n\n    @Override\n    public SourceVersion getSupportedSourceVersion() {\n        return SourceVersion.latestSupported();\n    }\n\n    public boolean containsKey(String key) {\n        if (options == null) {\n            throw new IllegalStateException(\"ProcessingEnvOptionsHolder not initialized yet.\");\n        }\n        return options.containsKey(key);\n    }\n\n    public String getOption(String key) {\n        if (options == null) {\n            throw new IllegalStateException(\"ProcessingEnvOptionsHolder not initialized yet.\");\n        }\n        return options.get(key);\n    }\n}","sourceCodeStart":46,"sourceCodeEnd":75,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/commons-mapstruct-spi/src/main/java/com/navercorp/pinpoint/mapstruct/spi/ProcessingEnvOptionsHolder.java#L46-L75","documentation":"ProcessingEnvOptionsHolder caches the annotation-processor processing environment options for Pinpoint's MapStruct SPI. containsKey throws IllegalStateException when it is called before init(processingEnv) has populated the options map, i.e. the holder is queried outside the annotation-processing lifecycle.","triggerScenarios":"Calling ProcessingEnvOptionsHolder.getInstance().containsKey(key) before the processor's init() has run — e.g. from code executed during class loading, a static initializer, or a unit test that never calls init().","commonSituations":"Unit-testing SPI code without simulating the annotation processor lifecycle; calling the holder from another processor or tool before the MapStruct processor initialized; refactorings that moved option lookups earlier in the lifecycle.","solutions":["Ensure the annotation processor's init(ProcessingEnvironment) method runs before any containsKey/getOption call.","In tests, call the holder's init method with a mock ProcessingEnvironment (and its getOptions()) before asserting.","Check that no static field initializer touches the holder at class-load time before processing starts."],"exampleFix":"// before\nboolean has = ProcessingEnvOptionsHolder.getInstance().containsKey(\"mapstruct.defaultComponentModel\");\n// after (test setup)\nProcessingEnvOptionsHolder.getInstance().init(mockProcessingEnv);\nboolean has = ProcessingEnvOptionsHolder.getInstance().containsKey(\"mapstruct.defaultComponentModel\");","handlingStrategy":"validation","validationCode":"if (!ProcessingEnvOptionsHolder.isInitialized()) {\n    throw new IllegalStateException(\"Call init(processingEnv) before using ProcessingEnvOptionsHolder\");\n}\nboolean has = ProcessingEnvOptionsHolder.getInstance().containsKey(key);","typeGuard":null,"tryCatchPattern":"try {\n    has = ProcessingEnvOptionsHolder.getInstance().containsKey(key);\n} catch (IllegalStateException e) {\n    // holder not initialized: initialize with env then retry\n    ProcessingEnvOptionsHolder.getInstance().init(processingEnv);\n    has = ProcessingEnvOptionsHolder.getInstance().containsKey(key);\n}","preventionTips":["Only access the holder inside annotation processor lifecycle methods (init/process).","Avoid touching the holder from static initializers.","In tests, always call init() with a mock ProcessingEnvironment in setup."],"tags":["java","annotation-processor","initialization","lifecycle"],"backgroundTag":"module-init-failed","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}