package org.springframework.data.repository.query;
import reactor.core.publisher.Mono;
import java.util.List;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.data.spel.ExpressionDependencies;
import org.springframework.data.spel.ReactiveExtensionAwareEvaluationContextProvider;
import org.springframework.data.spel.spi.EvaluationContextExtension;
import org.springframework.data.spel.spi.ExtensionIdAware;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.util.Assert;
public class ReactiveExtensionAwareQueryMethodEvaluationContextProvider
implements ReactiveQueryMethodEvaluationContextProvider {
private final ReactiveExtensionAwareEvaluationContextProvider delegate;
public ReactiveExtensionAwareQueryMethodEvaluationContextProvider(ListableBeanFactory beanFactory) {
Assert.notNull(beanFactory, "ListableBeanFactory must not be null!");
this.delegate = new ReactiveExtensionAwareEvaluationContextProvider(beanFactory);
}
public ReactiveExtensionAwareQueryMethodEvaluationContextProvider(List<? extends ExtensionIdAware> extensions) {
Assert.notNull(extensions, "EvaluationContextExtensions must not be null!");
this.delegate = new ReactiveExtensionAwareEvaluationContextProvider(extensions);
}
@Override
public <T extends Parameters<?, ?>> EvaluationContext getEvaluationContext(T parameters, Object[] parameterValues) {
EvaluationContext evaluationContext = delegate.getEvaluationContext(parameterValues);
if (evaluationContext instanceof StandardEvaluationContext) {
((StandardEvaluationContext) evaluationContext).setVariables(
ExtensionAwareQueryMethodEvaluationContextProvider.collectVariables(parameters, parameterValues));
}
return evaluationContext;
}
@Override
public <T extends Parameters<?, ?>> EvaluationContext getEvaluationContext(T parameters, Object[] parameterValues,
ExpressionDependencies dependencies) {
EvaluationContext evaluationContext = delegate.getEvaluationContext(parameterValues, dependencies);
if (evaluationContext instanceof StandardEvaluationContext) {
((StandardEvaluationContext) evaluationContext).setVariables(
ExtensionAwareQueryMethodEvaluationContextProvider.collectVariables(parameters, parameterValues));
}
return evaluationContext;
}
@Override
public <T extends Parameters<?, ?>> Mono<EvaluationContext> getEvaluationContextLater(T parameters,
Object[] parameterValues) {
Mono<StandardEvaluationContext> evaluationContext = delegate.getEvaluationContextLater(parameterValues);
return evaluationContext
.doOnNext(it -> it.setVariables(
ExtensionAwareQueryMethodEvaluationContextProvider.collectVariables(parameters, parameterValues)))
.cast(EvaluationContext.class);
}
@Override
public <T extends Parameters<?, ?>> Mono<EvaluationContext> getEvaluationContextLater(T parameters,
Object[] parameterValues, ExpressionDependencies dependencies) {
Mono<StandardEvaluationContext> evaluationContext = delegate.getEvaluationContextLater(parameterValues,
dependencies);
return evaluationContext
.doOnNext(it -> it.setVariables(
ExtensionAwareQueryMethodEvaluationContextProvider.collectVariables(parameters, parameterValues)))
.cast(EvaluationContext.class);
}
}