package com.jeesuite.rest.resolver;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

import javax.validation.ParameterNameProvider;
import javax.validation.Validation;
import javax.ws.rs.container.ResourceContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.ContextResolver;

import org.glassfish.jersey.server.validation.ValidationConfig;
import org.glassfish.jersey.server.validation.internal.InjectingConstraintValidatorFactory;

public class ValidationContextResolver implements ContextResolver<ValidationConfig> {

	@Context
	private ResourceContext resourceContext;

	@Override
	public ValidationConfig getContext(final Class<?> type) {
		final ValidationConfig config = new ValidationConfig();
		config.constraintValidatorFactory(resourceContext.getResource(InjectingConstraintValidatorFactory.class));
		config.parameterNameProvider(new CustomParameterNameProvider());
		return config;
	}

	/**
	 * See ContactCardTest#testAddInvalidContact.
	 */
	private class CustomParameterNameProvider implements ParameterNameProvider {

		private final ParameterNameProvider nameProvider;

		public CustomParameterNameProvider() {
			nameProvider = Validation.byDefaultProvider().configure().getDefaultParameterNameProvider();
		}

		@Override
		public List<String> getParameterNames(final Constructor<?> constructor) {
			return nameProvider.getParameterNames(constructor);
		}

		@Override
		public List<String> getParameterNames(final Method method) {
			if ("addContact".equals(method.getName())) {
				return Arrays.asList("contact");
			}
			return nameProvider.getParameterNames(method);
		}
	}
}