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

com.gluonhq.ignite.dagger.DaggerContext Maven / Gradle / Ivy

There is a newer version: 1.2.2
Show newest version
package com.gluonhq.ignite.dagger;

import com.gluonhq.ignite.DIContext;
import dagger.Module;
import dagger.ObjectGraph;
import dagger.Provides;
import javafx.fxml.FXMLLoader;

import javax.inject.Singleton;
import java.util.Collection;
import java.util.HashSet;
import java.util.Objects;
import java.util.function.Supplier;

/**
 * Implementation of Dependency Injection context for Dagger
 */
public class DaggerContext implements DIContext {

    private final Object contextRoot;
    private final Supplier> modules;

    private ObjectGraph injector;

    /**
     * Create the Dagger context
     * @param contextRoot root object to inject
     * @param modules custom Dagger modules
     */
    public DaggerContext( Object contextRoot, Supplier> modules) {
        this.contextRoot = Objects.requireNonNull(contextRoot);
        this.modules = Objects.requireNonNull(modules);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void injectMembers(Object instance) {
        injector.inject(instance);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public  T getInstance(Class cls) {
        return injector.get(cls);
    }

    /**
     * {@inheritDoc}
     */
    public final void init() {
        Collection allModules = new HashSet<>();
        allModules.addAll(modules.get());
        allModules.add(new FXModule());
        injector = ObjectGraph.create(allModules.toArray());
        injectMembers(contextRoot);
    }

    @Module(library = true, complete = false)
    class FXModule  {

        @Provides
        @Singleton
        FXMLLoader provideFxmlLoader() {
            FXMLLoader loader = new FXMLLoader();
            loader.setControllerFactory(DaggerContext.this::getInstance);
            return loader;
        }

    }

}