All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.quarkiverse.cucumber.ScenarioContext Maven / Gradle / Ivy

package io.quarkiverse.cucumber;

import java.lang.annotation.Annotation;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;

import jakarta.enterprise.context.spi.Contextual;
import jakarta.enterprise.context.spi.CreationalContext;

import io.quarkus.arc.ContextInstanceHandle;
import io.quarkus.arc.InjectableBean;
import io.quarkus.arc.InjectableContext;
import io.quarkus.arc.impl.ContextInstanceHandleImpl;

public class ScenarioContext implements InjectableContext {

    private final ConcurrentMap, ContextInstanceHandle> instances = new ConcurrentHashMap<>();
    private final Lock beanLock = new ReentrantLock();

    @Override
    public void destroy() {
        for (var contextInstanceHandle : instances.values()) {
            contextInstanceHandle.destroy();
        }
        instances.clear();
    }

    @Override
    public void destroy(Contextual contextual) {
        try (var contextInstanceHandle = instances.remove(contextual)) {
            if (contextInstanceHandle != null) {
                contextInstanceHandle.destroy();
            }
        }
    }

    @Override
    public Class getScope() {
        return ScenarioScope.class;
    }

    @Override
    @SuppressWarnings("unchecked")
    public  T get(Contextual contextual, CreationalContext creationalContext) {
        var contextInstanceHandle = (ContextInstanceHandle) instances.get(contextual);
        if (contextInstanceHandle != null) {
            return contextInstanceHandle.get();
        } else if (creationalContext != null) {
            beanLock.lock();
            try {
                T createdInstance = contextual.create(creationalContext);
                instances.put(
                        contextual,
                        new ContextInstanceHandleImpl<>(
                                (InjectableBean) contextual,
                                createdInstance,
                                creationalContext));
                return createdInstance;
            } finally {
                beanLock.unlock();
            }
        } else {
            return null;
        }
    }

    @Override
    public  T get(Contextual contextual) {
        return get(contextual, null);
    }

    @Override
    public boolean isActive() {
        return true;
    }

    @Override
    public ContextState getState() {
        return new ScenarioContextState(instances);
    }

    private record ScenarioContextState(
            Map, ContextInstanceHandle> instances) implements ContextState {

        @Override
        public Map, Object> getContextualInstances() {
            return instances.values().stream()
                    .collect(Collectors.toMap(ContextInstanceHandle::getBean, ContextInstanceHandle::get));
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy