/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with this
 * work for additional information regarding copyright ownership. The ASF
 * licenses this file to you 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 javax.validation;

import java.io.InputStream;

import javax.validation.valueextraction.ValueExtractor;

/**
 * @version $Rev$ $Date$
 */
public interface Configuration<T extends Configuration<T>> {

    T ignoreXmlConfiguration();

    T messageInterpolator(MessageInterpolator interpolator);

    T traversableResolver(TraversableResolver resolver);

    T constraintValidatorFactory(ConstraintValidatorFactory constraintValidatorFactory);

    T addMapping(InputStream stream);

    T addProperty(String name, String value);

    MessageInterpolator getDefaultMessageInterpolator();

    TraversableResolver getDefaultTraversableResolver();

    ConstraintValidatorFactory getDefaultConstraintValidatorFactory();

    ValidatorFactory buildValidatorFactory();

    /** @since 1.1 */
    T parameterNameProvider(ParameterNameProvider parameterNameProvider);

    /** @since 1.1 */
    ParameterNameProvider getDefaultParameterNameProvider();

    /** @since 1.1 */
    BootstrapConfiguration getBootstrapConfiguration();

    /** @since 2.0 */
    T clockProvider(ClockProvider clockProvider);

    /** @since 2.0 */
    T addValueExtractor(ValueExtractor<?> extractor);

    /** @since 2.0 */
    ClockProvider getDefaultClockProvider();
}
