@Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        this.koraAppElement = this.elements.getTypeElement(CommonClassNames.koraApp.canonicalName());
        if (this.koraAppElement == null) {
            return;
        }
        this.moduleElement = this.elements.getTypeElement(CommonClassNames.module.canonicalName());
        this.koraSubmoduleElement = this.elements.getTypeElement(CommonClassNames.koraSubmodule.canonicalName());
        this.componentElement = this.elements.getTypeElement(CommonClassNames.component.canonicalName());
        this.initialized = true;
        this.ctx = new ProcessingContext(processingEnv);
        log.info("@KoraApp processor started");
    }
@Test
    void testOptionalComponents() throws Throwable {
        var graphDraw = testClass(AppWithOptionalComponents.class);

        var graph = graphDraw.init();

        Assertions.assertThat(graphDraw.getNodes()).hasSize(9);

        Assertions.assertThat(graph.get(findNodeOf(graphDraw, AppWithOptionalComponents.NotEmptyOptionalParameter.class)).value()).isNotNull();
        Assertions.assertThat(graph.get(findNodeOf(graphDraw, AppWithOptionalComponents.EmptyOptionalParameter.class)).value()).isNull();
        Assertions.assertThat(graph.get(findNodeOf(graphDraw, AppWithOptionalComponents.NotEmptyValueOfOptional.class)).value()).isNotNull();
        Assertions.assertThat(graph.get(findNodeOf(graphDraw, AppWithOptionalComponents.EmptyValueOfOptional.class)).value()).isNull();
        Assertions.assertThat(graph.get(findNodeOf(graphDraw, AppWithOptionalComponents.NotEmptyNullable.class)).value()).isNotNull();
        Assertions.assertThat(graph.get(findNodeOf(graphDraw, AppWithOptionalComponents.EmptyNullable.class)).value()).isNull();
    }