
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 super SpecificationAndValue, Object> 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