/***
* Copyright (c) 2009 Caelum - www.caelum.com.br/opensource All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package br.com.caelum.vraptor.interceptor;
import static java.util.Arrays.asList;
import java.lang.annotation.Annotation;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import br.com.caelum.vraptor.controller.ControllerInstance;
import br.com.caelum.vraptor.controller.ControllerMethod;
import br.com.caelum.vraptor.ioc.Container;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
@ApplicationScoped
public class CustomAcceptsVerifier {
private final Container container;
/**
* @deprecated CDI eyes only
*/
protected CustomAcceptsVerifier() {
this(null);
}
@Inject
public CustomAcceptsVerifier(Container container) {
this.container = container;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public boolean isValid(Object interceptor, ControllerMethod controllerMethod,
ControllerInstance controllerInstance, List<Annotation> constraints) {
for (Annotation annotation : constraints) {
AcceptsConstraint constraint = annotation.annotationType().getAnnotation(AcceptsConstraint.class);
Class<? extends AcceptsValidator<?>> validatorClass = constraint.value();
AcceptsValidator validator = container.instanceFor(validatorClass);
validator.initialize(annotation);
if (!validator.validate(controllerMethod, controllerInstance)) {
return false;
}
}
return true;
}
public static List<Annotation> getCustomAcceptsAnnotations(Class<?> clazz){
return FluentIterable.from(asList(clazz.getAnnotations()))
.filter(acceptsConstraintMatcher())
.toList();
}
private static Predicate<Annotation> acceptsConstraintMatcher() {
return new Predicate<Annotation>() {
@Override
public boolean apply(Annotation element) {
return element != null && element.annotationType().isAnnotationPresent(AcceptsConstraint.class);
}
};
}
}