Search in sources :

Example 1 with InstanceBindingImpl

use of org.elasticsearch.common.inject.internal.InstanceBindingImpl in project elasticsearch by elastic.

the class BindingProcessor method visit.

@Override
public <T> Boolean visit(Binding<T> command) {
    final Object source = command.getSource();
    if (Void.class.equals(command.getKey().getRawType())) {
        if (command instanceof ProviderInstanceBinding && ((ProviderInstanceBinding) command).getProviderInstance() instanceof ProviderMethod) {
            errors.voidProviderMethod();
        } else {
            errors.missingConstantValues();
        }
        return true;
    }
    final Key<T> key = command.getKey();
    Class<? super T> rawType = key.getTypeLiteral().getRawType();
    if (rawType == Provider.class) {
        errors.bindingToProvider();
        return true;
    }
    validateKey(command.getSource(), command.getKey());
    final Scoping scoping = Scopes.makeInjectable(((BindingImpl<?>) command).getScoping(), injector, errors);
    command.acceptTargetVisitor(new BindingTargetVisitor<T, Void>() {

        @Override
        public Void visit(InstanceBinding<? extends T> binding) {
            Set<InjectionPoint> injectionPoints = binding.getInjectionPoints();
            T instance = binding.getInstance();
            Initializable<T> ref = initializer.requestInjection(injector, instance, source, injectionPoints);
            ConstantFactory<? extends T> factory = new ConstantFactory<>(ref);
            InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
            putBinding(new InstanceBindingImpl<>(injector, key, source, scopedFactory, injectionPoints, instance));
            return null;
        }

        @Override
        public Void visit(ProviderInstanceBinding<? extends T> binding) {
            Provider<? extends T> provider = binding.getProviderInstance();
            Set<InjectionPoint> injectionPoints = binding.getInjectionPoints();
            Initializable<Provider<? extends T>> initializable = initializer.<Provider<? extends T>>requestInjection(injector, provider, source, injectionPoints);
            InternalFactory<T> factory = new InternalFactoryToProviderAdapter<>(initializable, source);
            InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
            putBinding(new ProviderInstanceBindingImpl<>(injector, key, source, scopedFactory, scoping, provider, injectionPoints));
            return null;
        }

        @Override
        public Void visit(ProviderKeyBinding<? extends T> binding) {
            Key<? extends Provider<? extends T>> providerKey = binding.getProviderKey();
            BoundProviderFactory<T> boundProviderFactory = new BoundProviderFactory<>(injector, providerKey, source);
            creationListeners.add(boundProviderFactory);
            InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, (InternalFactory<? extends T>) boundProviderFactory, scoping);
            putBinding(new LinkedProviderBindingImpl<>(injector, key, source, scopedFactory, scoping, providerKey));
            return null;
        }

        @Override
        public Void visit(LinkedKeyBinding<? extends T> binding) {
            Key<? extends T> linkedKey = binding.getLinkedKey();
            if (key.equals(linkedKey)) {
                errors.recursiveBinding();
            }
            FactoryProxy<T> factory = new FactoryProxy<>(injector, key, linkedKey, source);
            creationListeners.add(factory);
            InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
            putBinding(new LinkedBindingImpl<>(injector, key, source, scopedFactory, scoping, linkedKey));
            return null;
        }

        @Override
        public Void visit(UntargettedBinding<? extends T> untargetted) {
            // @ImplementedBy annotation or something.
            if (key.hasAnnotationType()) {
                errors.missingImplementation(key);
                putBinding(invalidBinding(injector, key, source));
                return null;
            }
            // This cast is safe after the preceding check.
            final BindingImpl<T> binding;
            try {
                binding = injector.createUnitializedBinding(key, scoping, source, errors);
                putBinding(binding);
            } catch (ErrorsException e) {
                errors.merge(e.getErrors());
                putBinding(invalidBinding(injector, key, source));
                return null;
            }
            uninitializedBindings.add(new Runnable() {

                @Override
                public void run() {
                    try {
                        ((InjectorImpl) binding.getInjector()).initializeBinding(binding, errors.withSource(source));
                    } catch (ErrorsException e) {
                        errors.merge(e.getErrors());
                    }
                }
            });
            return null;
        }

        @Override
        public Void visit(ExposedBinding<? extends T> binding) {
            throw new IllegalArgumentException("Cannot apply a non-module element");
        }

        @Override
        public Void visit(ConvertedConstantBinding<? extends T> binding) {
            throw new IllegalArgumentException("Cannot apply a non-module element");
        }

        @Override
        public Void visit(ConstructorBinding<? extends T> binding) {
            throw new IllegalArgumentException("Cannot apply a non-module element");
        }

        @Override
        public Void visit(ProviderBinding<? extends T> binding) {
            throw new IllegalArgumentException("Cannot apply a non-module element");
        }
    });
    return true;
}
Also used : ExposedBindingImpl(org.elasticsearch.common.inject.internal.ExposedBindingImpl) LinkedProviderBindingImpl(org.elasticsearch.common.inject.internal.LinkedProviderBindingImpl) InstanceBindingImpl(org.elasticsearch.common.inject.internal.InstanceBindingImpl) ProviderInstanceBindingImpl(org.elasticsearch.common.inject.internal.ProviderInstanceBindingImpl) LinkedBindingImpl(org.elasticsearch.common.inject.internal.LinkedBindingImpl) UntargettedBindingImpl(org.elasticsearch.common.inject.internal.UntargettedBindingImpl) BindingImpl(org.elasticsearch.common.inject.internal.BindingImpl) Sets.newHashSet(org.elasticsearch.common.util.set.Sets.newHashSet) Set(java.util.Set) Collections.unmodifiableSet(java.util.Collections.unmodifiableSet) ProviderInstanceBinding(org.elasticsearch.common.inject.spi.ProviderInstanceBinding) InstanceBindingImpl(org.elasticsearch.common.inject.internal.InstanceBindingImpl) ProviderInstanceBindingImpl(org.elasticsearch.common.inject.internal.ProviderInstanceBindingImpl) Scoping(org.elasticsearch.common.inject.internal.Scoping) ProviderInstanceBindingImpl(org.elasticsearch.common.inject.internal.ProviderInstanceBindingImpl) ErrorsException(org.elasticsearch.common.inject.internal.ErrorsException) InternalFactory(org.elasticsearch.common.inject.internal.InternalFactory) ProviderMethod(org.elasticsearch.common.inject.internal.ProviderMethod) LinkedProviderBindingImpl(org.elasticsearch.common.inject.internal.LinkedProviderBindingImpl) LinkedBindingImpl(org.elasticsearch.common.inject.internal.LinkedBindingImpl)

Example 2 with InstanceBindingImpl

use of org.elasticsearch.common.inject.internal.InstanceBindingImpl in project elasticsearch by elastic.

the class InjectorImpl method createTypeLiteralBinding.

/**
     * Converts a binding for a {@code Key<TypeLiteral<T>>} to the value {@code TypeLiteral<T>}. It's
     * a bit awkward because we have to pull out the inner type in the type literal.
     */
private <T> BindingImpl<TypeLiteral<T>> createTypeLiteralBinding(Key<TypeLiteral<T>> key, Errors errors) throws ErrorsException {
    Type typeLiteralType = key.getTypeLiteral().getType();
    if (!(typeLiteralType instanceof ParameterizedType)) {
        throw errors.cannotInjectRawTypeLiteral().toException();
    }
    ParameterizedType parameterizedType = (ParameterizedType) typeLiteralType;
    Type innerType = parameterizedType.getActualTypeArguments()[0];
    // this proves problematic, we can probably fix TypeLiteral to support type variables
    if (!(innerType instanceof Class) && !(innerType instanceof GenericArrayType) && !(innerType instanceof ParameterizedType)) {
        throw errors.cannotInjectTypeLiteralOf(innerType).toException();
    }
    // by definition, innerType == T, so this is safe
    @SuppressWarnings("unchecked") TypeLiteral<T> value = (TypeLiteral<T>) TypeLiteral.get(innerType);
    InternalFactory<TypeLiteral<T>> factory = new ConstantFactory<>(Initializables.of(value));
    return new InstanceBindingImpl<>(this, key, SourceProvider.UNKNOWN_SOURCE, factory, emptySet(), value);
}
Also used : ParameterizedType(java.lang.reflect.ParameterizedType) GenericArrayType(java.lang.reflect.GenericArrayType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) InstanceBindingImpl(org.elasticsearch.common.inject.internal.InstanceBindingImpl) GenericArrayType(java.lang.reflect.GenericArrayType)

Example 3 with InstanceBindingImpl

use of org.elasticsearch.common.inject.internal.InstanceBindingImpl in project elasticsearch by elastic.

the class InjectorImpl method createMembersInjectorBinding.

private <T> BindingImpl<MembersInjector<T>> createMembersInjectorBinding(Key<MembersInjector<T>> key, Errors errors) throws ErrorsException {
    Type membersInjectorType = key.getTypeLiteral().getType();
    if (!(membersInjectorType instanceof ParameterizedType)) {
        throw errors.cannotInjectRawMembersInjector().toException();
    }
    // safe because T came from Key<MembersInjector<T>>
    @SuppressWarnings("unchecked") TypeLiteral<T> instanceType = (TypeLiteral<T>) TypeLiteral.get(((ParameterizedType) membersInjectorType).getActualTypeArguments()[0]);
    MembersInjector<T> membersInjector = membersInjectorStore.get(instanceType, errors);
    InternalFactory<MembersInjector<T>> factory = new ConstantFactory<>(Initializables.of(membersInjector));
    return new InstanceBindingImpl<>(this, key, SourceProvider.UNKNOWN_SOURCE, factory, emptySet(), membersInjector);
}
Also used : ParameterizedType(java.lang.reflect.ParameterizedType) GenericArrayType(java.lang.reflect.GenericArrayType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) InstanceBindingImpl(org.elasticsearch.common.inject.internal.InstanceBindingImpl)

Example 4 with InstanceBindingImpl

use of org.elasticsearch.common.inject.internal.InstanceBindingImpl in project crate by crate.

the class InjectorImpl method createMembersInjectorBinding.

private <T> BindingImpl<MembersInjector<T>> createMembersInjectorBinding(Key<MembersInjector<T>> key, Errors errors) throws ErrorsException {
    Type membersInjectorType = key.getTypeLiteral().getType();
    if (!(membersInjectorType instanceof ParameterizedType)) {
        throw errors.cannotInjectRawMembersInjector().toException();
    }
    // safe because T came from Key<MembersInjector<T>>
    @SuppressWarnings("unchecked") TypeLiteral<T> instanceType = (TypeLiteral<T>) TypeLiteral.get(((ParameterizedType) membersInjectorType).getActualTypeArguments()[0]);
    MembersInjector<T> membersInjector = membersInjectorStore.get(instanceType, errors);
    InternalFactory<MembersInjector<T>> factory = new ConstantFactory<>(Initializables.of(membersInjector));
    return new InstanceBindingImpl<>(this, key, SourceProvider.UNKNOWN_SOURCE, factory, emptySet(), membersInjector);
}
Also used : ParameterizedType(java.lang.reflect.ParameterizedType) GenericArrayType(java.lang.reflect.GenericArrayType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) InstanceBindingImpl(org.elasticsearch.common.inject.internal.InstanceBindingImpl)

Example 5 with InstanceBindingImpl

use of org.elasticsearch.common.inject.internal.InstanceBindingImpl in project crate by crate.

the class BindingProcessor method visit.

@Override
public <T> Boolean visit(Binding<T> command) {
    final Object source = command.getSource();
    if (Void.class.equals(command.getKey().getRawType())) {
        if (command instanceof ProviderInstanceBinding && ((ProviderInstanceBinding) command).getProviderInstance() instanceof ProviderMethod) {
            errors.voidProviderMethod();
        } else {
            errors.missingConstantValues();
        }
        return true;
    }
    final Key<T> key = command.getKey();
    Class<? super T> rawType = key.getTypeLiteral().getRawType();
    if (rawType == Provider.class) {
        errors.bindingToProvider();
        return true;
    }
    validateKey(command.getSource(), command.getKey());
    final Scoping scoping = Scopes.makeInjectable(((BindingImpl<?>) command).getScoping(), injector, errors);
    command.acceptTargetVisitor(new BindingTargetVisitor<T, Void>() {

        @Override
        public Void visit(InstanceBinding<? extends T> binding) {
            Set<InjectionPoint> injectionPoints = binding.getInjectionPoints();
            T instance = binding.getInstance();
            Initializable<T> ref = initializer.requestInjection(injector, instance, source, injectionPoints);
            ConstantFactory<? extends T> factory = new ConstantFactory<>(ref);
            InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
            putBinding(new InstanceBindingImpl<>(injector, key, source, scopedFactory, injectionPoints, instance));
            return null;
        }

        @Override
        public Void visit(ProviderInstanceBinding<? extends T> binding) {
            Provider<? extends T> provider = binding.getProviderInstance();
            Set<InjectionPoint> injectionPoints = binding.getInjectionPoints();
            Initializable<Provider<? extends T>> initializable = initializer.<Provider<? extends T>>requestInjection(injector, provider, source, injectionPoints);
            InternalFactory<T> factory = new InternalFactoryToProviderAdapter<>(initializable, source);
            InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
            putBinding(new ProviderInstanceBindingImpl<>(injector, key, source, scopedFactory, scoping, provider, injectionPoints));
            return null;
        }

        @Override
        public Void visit(ProviderKeyBinding<? extends T> binding) {
            Key<? extends Provider<? extends T>> providerKey = binding.getProviderKey();
            BoundProviderFactory<T> boundProviderFactory = new BoundProviderFactory<>(injector, providerKey, source);
            creationListeners.add(boundProviderFactory);
            InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, (InternalFactory<? extends T>) boundProviderFactory, scoping);
            putBinding(new LinkedProviderBindingImpl<>(injector, key, source, scopedFactory, scoping, providerKey));
            return null;
        }

        @Override
        public Void visit(LinkedKeyBinding<? extends T> binding) {
            Key<? extends T> linkedKey = binding.getLinkedKey();
            if (key.equals(linkedKey)) {
                errors.recursiveBinding();
            }
            FactoryProxy<T> factory = new FactoryProxy<>(injector, key, linkedKey, source);
            creationListeners.add(factory);
            InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
            putBinding(new LinkedBindingImpl<>(injector, key, source, scopedFactory, scoping, linkedKey));
            return null;
        }

        @Override
        public Void visit(UntargettedBinding<? extends T> untargetted) {
            // @ImplementedBy annotation or something.
            if (key.hasAnnotationType()) {
                errors.missingImplementation(key);
                putBinding(invalidBinding(injector, key, source));
                return null;
            }
            // This cast is safe after the preceding check.
            final BindingImpl<T> binding;
            try {
                binding = injector.createUnitializedBinding(key, scoping, source, errors);
                putBinding(binding);
            } catch (ErrorsException e) {
                errors.merge(e.getErrors());
                putBinding(invalidBinding(injector, key, source));
                return null;
            }
            uninitializedBindings.add(new Runnable() {

                @Override
                public void run() {
                    try {
                        ((InjectorImpl) binding.getInjector()).initializeBinding(binding, errors.withSource(source));
                    } catch (ErrorsException e) {
                        errors.merge(e.getErrors());
                    }
                }
            });
            return null;
        }

        @Override
        public Void visit(ExposedBinding<? extends T> binding) {
            throw new IllegalArgumentException("Cannot apply a non-module element");
        }

        @Override
        public Void visit(ConvertedConstantBinding<? extends T> binding) {
            throw new IllegalArgumentException("Cannot apply a non-module element");
        }

        @Override
        public Void visit(ConstructorBinding<? extends T> binding) {
            throw new IllegalArgumentException("Cannot apply a non-module element");
        }

        @Override
        public Void visit(ProviderBinding<? extends T> binding) {
            throw new IllegalArgumentException("Cannot apply a non-module element");
        }
    });
    return true;
}
Also used : ExposedBindingImpl(org.elasticsearch.common.inject.internal.ExposedBindingImpl) LinkedProviderBindingImpl(org.elasticsearch.common.inject.internal.LinkedProviderBindingImpl) InstanceBindingImpl(org.elasticsearch.common.inject.internal.InstanceBindingImpl) ProviderInstanceBindingImpl(org.elasticsearch.common.inject.internal.ProviderInstanceBindingImpl) LinkedBindingImpl(org.elasticsearch.common.inject.internal.LinkedBindingImpl) UntargettedBindingImpl(org.elasticsearch.common.inject.internal.UntargettedBindingImpl) BindingImpl(org.elasticsearch.common.inject.internal.BindingImpl) Set(java.util.Set) ProviderInstanceBinding(org.elasticsearch.common.inject.spi.ProviderInstanceBinding) InstanceBindingImpl(org.elasticsearch.common.inject.internal.InstanceBindingImpl) ProviderInstanceBindingImpl(org.elasticsearch.common.inject.internal.ProviderInstanceBindingImpl) Scoping(org.elasticsearch.common.inject.internal.Scoping) ProviderInstanceBindingImpl(org.elasticsearch.common.inject.internal.ProviderInstanceBindingImpl) ErrorsException(org.elasticsearch.common.inject.internal.ErrorsException) InternalFactory(org.elasticsearch.common.inject.internal.InternalFactory) ProviderMethod(org.elasticsearch.common.inject.internal.ProviderMethod) LinkedProviderBindingImpl(org.elasticsearch.common.inject.internal.LinkedProviderBindingImpl) LinkedBindingImpl(org.elasticsearch.common.inject.internal.LinkedBindingImpl)

Aggregations

InstanceBindingImpl (org.elasticsearch.common.inject.internal.InstanceBindingImpl)6 GenericArrayType (java.lang.reflect.GenericArrayType)4 ParameterizedType (java.lang.reflect.ParameterizedType)4 Type (java.lang.reflect.Type)4 Set (java.util.Set)2 BindingImpl (org.elasticsearch.common.inject.internal.BindingImpl)2 ErrorsException (org.elasticsearch.common.inject.internal.ErrorsException)2 ExposedBindingImpl (org.elasticsearch.common.inject.internal.ExposedBindingImpl)2 InternalFactory (org.elasticsearch.common.inject.internal.InternalFactory)2 LinkedBindingImpl (org.elasticsearch.common.inject.internal.LinkedBindingImpl)2 LinkedProviderBindingImpl (org.elasticsearch.common.inject.internal.LinkedProviderBindingImpl)2 ProviderInstanceBindingImpl (org.elasticsearch.common.inject.internal.ProviderInstanceBindingImpl)2 ProviderMethod (org.elasticsearch.common.inject.internal.ProviderMethod)2 Scoping (org.elasticsearch.common.inject.internal.Scoping)2 UntargettedBindingImpl (org.elasticsearch.common.inject.internal.UntargettedBindingImpl)2 ProviderInstanceBinding (org.elasticsearch.common.inject.spi.ProviderInstanceBinding)2 Collections.unmodifiableSet (java.util.Collections.unmodifiableSet)1 Sets.newHashSet (org.elasticsearch.common.util.set.Sets.newHashSet)1