package com.griddynamics.jagger.invoker;
import com.griddynamics.jagger.engine.e1.collector.Validator;
import com.griddynamics.jagger.engine.e1.collector.ValidatorException;
import com.griddynamics.jagger.engine.e1.collector.invocation.InvocationInfo;
import com.griddynamics.jagger.engine.e1.collector.invocation.InvocationListener;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: kgribov
* Date: 9/19/13
* Time: 4:42 PM
* To change this template use File | Settings | File Templates.
*/
public class ValidateInvocationListener<Q, R, E> extends InvocationListener<Q, R, E> {
private Iterable<Validator> validators;
private LoadInvocationListener<Q, R, E> metrics;
private InvocationListener<Q, R, E> listener;
public ValidateInvocationListener(Iterable<Validator> validators, Iterable<? extends LoadInvocationListener<Q, R, E>> metrics, List<InvocationListener<Q, R, E>> listeners) {
this.validators = validators;
this.metrics = Invokers.composeAndLogListeners(metrics);
this.listener = InvocationListener.Composer.compose(listeners);
}
@Override
public void onStart(InvocationInfo<Q, R, E> invocationInfo) {
metrics.onStart(invocationInfo.getQuery(), invocationInfo.getEndpoint());
listener.onStart(invocationInfo);
}
@Override
public void onSuccess(InvocationInfo<Q, R, E> invocationInfo) {
Validator failValidator = null;
for (Validator validator : validators){
if (!validator.validate(invocationInfo.getQuery(), invocationInfo.getEndpoint(), invocationInfo.getResult(), invocationInfo.getDuration())){
failValidator = validator;
break;
}
}
if (failValidator != null){
onFail(invocationInfo, new ValidatorException(failValidator.getValidator(), invocationInfo.getResult()));
}else{
metrics.onSuccess(invocationInfo.getQuery(), invocationInfo.getEndpoint(), invocationInfo.getResult(), invocationInfo.getDuration());
listener.onSuccess(invocationInfo);
}
}
@Override
public void onFail(InvocationInfo<Q, R, E> invocationInfo, InvocationException e) {
metrics.onFail(invocationInfo.getQuery(), invocationInfo.getEndpoint(), e);
listener.onFail(invocationInfo, e);
}
@Override
public void onError(InvocationInfo<Q, R, E> invocationInfo, Throwable error) {
metrics.onError(invocationInfo.getQuery(), invocationInfo.getEndpoint(), error);
listener.onError(invocationInfo, error);
}
}