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

org.deephacks.tools4j.config.internal.core.ConfigCdiBootstrap Maven / Gradle / Ivy

There is a newer version: 0.15.0
Show newest version
package org.deephacks.tools4j.config.internal.core;

import org.deephacks.tools4j.config.Config;
import org.deephacks.tools4j.config.ConfigContext;
import org.deephacks.tools4j.config.ConfigDefault;

import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.AfterDeploymentValidation;
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.inject.Singleton;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Singleton
public class ConfigCdiBootstrap implements Extension {
private static final Set> schemas = new HashSet<>();
    private static final Set defaults = new HashSet<>();

    public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager bm) {
        event.addContext(new ConfigCdiContext(bm));
    }

    public void afterDeploymentValidation(@Observes AfterDeploymentValidation event, BeanManager bm) {
        ConfigContext ctx = getInstance(ConfigContext.class, bm);
        for (Class cls : schemas){
            ctx.register(cls);
        }
        ctx.registerDefault(defaults.toArray(new Object[0]));
    }

    public static  T getInstance(Class cls, BeanManager bm){
        Set> beans = bm.getBeans(cls);
        Bean bean = bm.resolve(beans);
        CreationalContext cc = bm.createCreationalContext(bean);
        return (T) bm.getReference(bean, cls, cc);
    }

    public  void processAnnotatedType(@Observes ProcessAnnotatedType pat) {
        AnnotatedType type = pat.getAnnotatedType();
        if (type.isAnnotationPresent(Config.class)) {
            schemas.add(pat.getAnnotatedType().getJavaClass());
        }
        for (AnnotatedMethod m : type.getMethods()) {
            ConfigDefault def = m.getAnnotation(ConfigDefault.class);
            if (def != null && m.isStatic()) {
                Method method = m.getJavaMember();
                try {
                    Object o = method.invoke(null, (Object[]) null);
                    if (o instanceof List) {
                        List list = (List) o;
                        for (Object obj : list) {
                            defaults.add(obj);
                        }
                    } else {
                        defaults.add(o);
                    }
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

}