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

com.lyncode.jtwig.functions.parameters.resolve.model.ResolvedParameters Maven / Gradle / Ivy

The newest version!
package com.lyncode.jtwig.functions.parameters.resolve.model;

import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.lyncode.jtwig.functions.parameters.input.InputParameters;
import com.lyncode.jtwig.functions.parameters.resolve.api.ParameterResolver;
import com.lyncode.jtwig.functions.reflection.JavaMethodParameter;

import javax.annotation.Nullable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import static com.google.common.collect.Collections2.filter;

public class ResolvedParameters {
    private final List parameters = new ArrayList<>();

    public ResolvedParameters(Method method) {
        Class[] parameterTypes = method.getParameterTypes();
        for (int i = 0;i< parameterTypes.length;i++) {
            this.parameters.add(i, new SpecificationAndValue(new JavaMethodParameter(i, method)));
        }
    }

    public ResolvedParameters resolve(JavaMethodParameter parameter, Object value) {
        parameters.get(parameter.position()).value = Optional.of(new ParameterResolver.Value(value));
        return this;
    }

    public boolean isFullyResolved() {
        return filter(parameters, valueIsAbsent()).isEmpty();
    }

    public Object[] values() {
        return Collections2.transform(parameters, extractValues())
                .toArray();
    }

    public Collection unresolvedParameters() {
        return Collections2.transform(filter(parameters, valueIsAbsent()), extractSpecification());
    }

    private Function extractSpecification() {
        return new Function() {
            @Nullable
            @Override
            public JavaMethodParameter apply(@Nullable SpecificationAndValue input) {
                return input.specification;
            }
        };
    }

    private Predicate valueIsAbsent() {
        return new Predicate() {
            @Override
            public boolean apply(@Nullable SpecificationAndValue input) {
                return !input.value.isPresent();
            }
        };
    }

    private Function extractValues() {
        return new Function() {
            @Nullable
            @Override
            public Object apply(@Nullable SpecificationAndValue input) {
                return input.value.get().value();
            }
        };
    }

    public boolean resolvableBy(InputParameters parameters) {
        return true;
    }

    private class SpecificationAndValue {
        private final JavaMethodParameter specification;
        private Optional value;

        private SpecificationAndValue(JavaMethodParameter specification) {
            this.specification = specification;
            this.value = Optional.absent();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy