ContextControl.java

package com.github.jonasrutishauser.cdi.test.core.context;

import java.util.HashMap;

import org.jboss.weld.context.bound.BoundConversationContext;
import org.jboss.weld.context.bound.BoundSessionContext;
import org.jboss.weld.context.bound.MutableBoundRequest;

import com.github.jonasrutishauser.cdi.test.api.TestInfo;
import com.github.jonasrutishauser.cdi.test.api.context.TestScoped;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.BeforeDestroyed;
import jakarta.enterprise.context.Destroyed;
import jakarta.enterprise.context.Initialized;
import jakarta.enterprise.context.control.RequestContextController;
import jakarta.enterprise.event.Event;
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.inject.Inject;

@ApplicationScoped
public class ContextControl {

    private final TestContext testContext;
    private final Event<TestInfo> event;

    private final BoundSessionContext sessionContext;
    private final BoundConversationContext conversationContext;
    private final RequestContextController requestContextController;

    ContextControl() {
        this(null, null, null, null, null);
    }
    
    @Inject
    ContextControl(BeanManager beanManager, Event<TestInfo> event, BoundSessionContext sessionContext,
            BoundConversationContext conversationContext, RequestContextController requestContextController) {
        this.testContext = (TestContext) beanManager.getContext(TestScoped.class);
        this.event = event;
        this.sessionContext = sessionContext;
        this.conversationContext = conversationContext;
        this.requestContextController = requestContextController;
    }

    public void start(TestInfo testInfo) {
        testContext.setTestInfo(testInfo);
        event.select(Initialized.Literal.of(TestScoped.class)).fire(testInfo);
        HashMap<String, Object> sessionStore = new HashMap<>();
        sessionContext.associate(sessionStore);
        sessionContext.activate();
        conversationContext.associate(new MutableBoundRequest(new HashMap<>(), sessionStore));
        conversationContext.activate();
        requestContextController.activate();
    }

    public void preStop() {
        event.select(BeforeDestroyed.Literal.of(TestScoped.class)).fire(testContext.getTestInfo());
    }

    public TestInfo stop() {
        requestContextController.deactivate();
        conversationContext.deactivate();
        sessionContext.invalidate();
        sessionContext.deactivate();
        sessionContext.dissociate(null);
        TestInfo testInfo = testContext.clearTestInfo();
        event.select(Destroyed.Literal.of(TestScoped.class)).fire(testInfo);
        return testInfo;
    }

}