/*
 * 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;

/**
 * @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);
    ParameterNameProvider getDefaultParameterNameProvider();

    BootstrapConfiguration getBootstrapConfiguration();
}

