Search in sources :

Example 6 with Errors

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

the class InjectionPoint method forInstanceMethodsAndFields.

/**
     * Returns all instance method and field injection points on {@code type}.
     *
     * @return a possibly empty set of injection points. The set has a specified iteration order. All
     *         fields are returned and then all methods. Within the fields, supertype fields are returned
     *         before subtype fields. Similarly, supertype methods are returned before subtype methods.
     * @throws ConfigurationException if there is a malformed injection point on {@code type}, such as
     *                                a field with multiple binding annotations. The exception's {@link
     *                                ConfigurationException#getPartialValue() partial value} is a {@code Set<InjectionPoint>}
     *                                of the valid injection points.
     */
public static Set<InjectionPoint> forInstanceMethodsAndFields(TypeLiteral<?> type) {
    Set<InjectionPoint> result = new HashSet<>();
    Errors errors = new Errors();
    // TODO (crazybob): Filter out overridden members.
    addInjectionPoints(type, Factory.FIELDS, false, result, errors);
    addInjectionPoints(type, Factory.METHODS, false, result, errors);
    result = unmodifiableSet(result);
    if (errors.hasErrors()) {
        throw new ConfigurationException(errors.getMessages()).withPartialValue(result);
    }
    return result;
}
Also used : Errors(org.elasticsearch.common.inject.internal.Errors) ConfigurationException(org.elasticsearch.common.inject.ConfigurationException) HashSet(java.util.HashSet)

Example 7 with Errors

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

the class InjectionPoint method forStaticMethodsAndFields.

/**
     * Returns all static method and field injection points on {@code type}.
     *
     * @return a possibly empty set of injection points. The set has a specified iteration order. All
     *         fields are returned and then all methods. Within the fields, supertype fields are returned
     *         before subtype fields. Similarly, supertype methods are returned before subtype methods.
     * @throws ConfigurationException if there is a malformed injection point on {@code type}, such as
     *                                a field with multiple binding annotations. The exception's {@link
     *                                ConfigurationException#getPartialValue() partial value} is a {@code Set<InjectionPoint>}
     *                                of the valid injection points.
     */
public static Set<InjectionPoint> forStaticMethodsAndFields(TypeLiteral type) {
    Set<InjectionPoint> result = new HashSet<>();
    Errors errors = new Errors();
    addInjectionPoints(type, Factory.FIELDS, true, result, errors);
    addInjectionPoints(type, Factory.METHODS, true, result, errors);
    result = unmodifiableSet(result);
    if (errors.hasErrors()) {
        throw new ConfigurationException(errors.getMessages()).withPartialValue(result);
    }
    return result;
}
Also used : Errors(org.elasticsearch.common.inject.internal.Errors) ConfigurationException(org.elasticsearch.common.inject.ConfigurationException) HashSet(java.util.HashSet)

Example 8 with Errors

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

the class InjectionPoint method forConstructorOf.

/**
     * Returns a new injection point for the injectable constructor of {@code type}.
     *
     * @param type a concrete type with exactly one constructor annotated {@literal @}{@link Inject},
     *             or a no-arguments constructor that is not private.
     * @throws ConfigurationException if there is no injectable constructor, more than one injectable
     *                                constructor, or if parameters of the injectable constructor are malformed, such as a
     *                                parameter with multiple binding annotations.
     */
public static InjectionPoint forConstructorOf(TypeLiteral<?> type) {
    Class<?> rawType = getRawType(type.getType());
    Errors errors = new Errors(rawType);
    Constructor<?> injectableConstructor = null;
    for (Constructor<?> constructor : rawType.getConstructors()) {
        Inject inject = constructor.getAnnotation(Inject.class);
        if (inject != null) {
            if (inject.optional()) {
                errors.optionalConstructor(constructor);
            }
            if (injectableConstructor != null) {
                errors.tooManyConstructors(rawType);
            }
            injectableConstructor = constructor;
            checkForMisplacedBindingAnnotations(injectableConstructor, errors);
        }
    }
    errors.throwConfigurationExceptionIfErrorsExist();
    if (injectableConstructor != null) {
        return new InjectionPoint(type, injectableConstructor);
    }
    // If no annotated constructor is found, look for a no-arg constructor instead.
    try {
        Constructor<?> noArgConstructor = rawType.getConstructor();
        // Disallow private constructors on non-private classes (unless they have @Inject)
        if (Modifier.isPrivate(noArgConstructor.getModifiers()) && !Modifier.isPrivate(rawType.getModifiers())) {
            errors.missingConstructor(rawType);
            throw new ConfigurationException(errors.getMessages());
        }
        checkForMisplacedBindingAnnotations(noArgConstructor, errors);
        return new InjectionPoint(type, noArgConstructor);
    } catch (NoSuchMethodException e) {
        errors.missingConstructor(rawType);
        throw new ConfigurationException(errors.getMessages());
    }
}
Also used : Inject(org.elasticsearch.common.inject.Inject) Errors(org.elasticsearch.common.inject.internal.Errors) ConfigurationException(org.elasticsearch.common.inject.ConfigurationException)

Example 9 with Errors

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

the class AbstractProcessor method process.

public void process(InjectorImpl injector, List<Element> elements) {
    Errors errorsAnyElement = this.errors;
    this.injector = injector;
    try {
        for (Iterator<Element> i = elements.iterator(); i.hasNext(); ) {
            Element element = i.next();
            this.errors = errorsAnyElement.withSource(element.getSource());
            Boolean allDone = element.acceptVisitor(this);
            if (allDone) {
                i.remove();
            }
        }
    } finally {
        this.errors = errorsAnyElement;
        this.injector = null;
    }
}
Also used : Errors(org.elasticsearch.common.inject.internal.Errors) Element(org.elasticsearch.common.inject.spi.Element)

Example 10 with Errors

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

the class InjectorImpl method getProvider.

@Override
public <T> Provider<T> getProvider(final Key<T> key) {
    Errors errors = new Errors(key);
    try {
        Provider<T> result = getProviderOrThrow(key, errors);
        errors.throwIfNewErrors(0);
        return result;
    } catch (ErrorsException e) {
        throw new ConfigurationException(errors.merge(e.getErrors()).getMessages());
    }
}
Also used : Errors(org.elasticsearch.common.inject.internal.Errors) ErrorsException(org.elasticsearch.common.inject.internal.ErrorsException)

Aggregations

Errors (org.elasticsearch.common.inject.internal.Errors)11 ErrorsException (org.elasticsearch.common.inject.internal.ErrorsException)7 ConfigurationException (org.elasticsearch.common.inject.ConfigurationException)3 ArrayList (java.util.ArrayList)2 HashSet (java.util.HashSet)2 InternalContext (org.elasticsearch.common.inject.internal.InternalContext)2 Annotation (java.lang.annotation.Annotation)1 Field (java.lang.reflect.Field)1 Inject (org.elasticsearch.common.inject.Inject)1 BindingImpl (org.elasticsearch.common.inject.internal.BindingImpl)1 InstanceBindingImpl (org.elasticsearch.common.inject.internal.InstanceBindingImpl)1 InternalFactory (org.elasticsearch.common.inject.internal.InternalFactory)1 LinkedBindingImpl (org.elasticsearch.common.inject.internal.LinkedBindingImpl)1 LinkedProviderBindingImpl (org.elasticsearch.common.inject.internal.LinkedProviderBindingImpl)1 SourceProvider (org.elasticsearch.common.inject.internal.SourceProvider)1 Dependency (org.elasticsearch.common.inject.spi.Dependency)1 Element (org.elasticsearch.common.inject.spi.Element)1 InjectionPoint (org.elasticsearch.common.inject.spi.InjectionPoint)1