WeldBootstrap.java

package org.jbehave.core.configuration.weld;

import java.util.HashMap;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

import org.jbehave.core.annotations.weld.UsingWeld;
import org.jbehave.core.annotations.weld.WeldConfiguration;
import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.steps.weld.WeldStepsFactory;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

@ApplicationScoped
public class WeldBootstrap extends Weld {
    private WeldContainer weld;

    public WeldBootstrap() {
    }

    @Override
    public WeldContainer initialize() {
        weld = super.initialize();
        return weld;
    }

    public WeldAnnotationBuilder findAnnotationBuilder(Class<?> annotatedClass) {
        return weld.instance().select(InstanceManager.class).get().findBuilder(annotatedClass);
    }

    @ApplicationScoped
    public static class InstanceManager {

        @Inject
        @Any
        @UsingWeld
        private Instance<Object> instances;

        @Inject
        @WeldConfiguration
        private Configuration configuration;

        @Inject
        private WeldStepsFactory stepsFactory;

        private Map<Class<?>, WeldAnnotationBuilder> builders = null;

        public void build() {
            builders = new HashMap<>();
            for (Object o : instances) {
                Class<?> instanceClass = o.getClass();
                WeldAnnotationBuilder builder = new WeldAnnotationBuilder(instanceClass, configuration, stepsFactory);
                builders.put(instanceClass, builder);
            }
        }

        public WeldAnnotationBuilder findBuilder(Class<?> annotatedClass) {
            if (builders == null) {
                build();
            }

            if (builders.containsKey(annotatedClass)) {
                return builders.get(annotatedClass);
            } else {
                return new WeldAnnotationBuilder(annotatedClass, configuration, stepsFactory);
            }
        }

    }

}