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

com.google.inject.internal.BoundProviderFactory Maven / Gradle / Ivy

package com.google.inject.internal;

import com.google.inject.Key;
import com.google.inject.internal.InjectorImpl.JitLimitation;
import com.google.inject.spi.Dependency;

import javax.inject.Provider;

/**
 * Delegates to a custom factory which is also bound in the injector.
 */
final class BoundProviderFactory extends ProviderInternalFactory implements CreationListener {

    private final Key> providerKey;

    private final ProvisionListenerStackCallback provisionCallback;

    private final InjectorImpl injector;

    private InternalFactory> providerFactory;

    BoundProviderFactory(
            InjectorImpl injector,
            Key> providerKey,
            Object source,
            ProvisionListenerStackCallback provisionCallback) {
        super(source);
        this.provisionCallback = provisionCallback;
        this.injector = injector;
        this.providerKey = providerKey;
    }

    @Override
    public void notify(Errors errors) {
        try {
            providerFactory = injector.getInternalFactory(providerKey, errors.withSource(source), JitLimitation.NEW_OR_EXISTING_JIT);
        } catch (ErrorsException e) {
            errors.merge(e.getErrors());
        }
    }

    @Override
    public T get(InternalContext context, Dependency dependency, boolean linked)
            throws InternalProvisionException {
        context.pushState(providerKey, source);
        try {
            javax.inject.Provider provider = providerFactory.get(context, dependency, true);
            return circularGet(provider, context, dependency, provisionCallback);
        } catch (InternalProvisionException ipe) {
            throw ipe.addSource(providerKey);
        } finally {
            context.popState();
        }
    }

    @Override
    protected T provision(Provider provider, Dependency dependency,
                          ConstructionContext constructionContext) throws InternalProvisionException {
        try {
            return super.provision(provider, dependency, constructionContext);
        } catch (RuntimeException userException) {
            throw InternalProvisionException.errorInProvider(userException);
        }
    }

    @Override
    public String toString() {
        return providerKey.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy