/*
 * Copyright 2010 Google Inc.
 *
 * 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 com.google.gwt.validation.client.spi;

import java.util.Map;

import javax.validation.ConstraintValidatorFactory;
import javax.validation.MessageInterpolator;
import javax.validation.TraversableResolver;
import javax.validation.spi.ConfigurationState;

/**
 * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
 * production code.
 * <p>
 * Base GWT implementation of {@link ConfigurationState}.
 */
public abstract class BaseConfigurationState implements ConfigurationState {

  public ConstraintValidatorFactory getConstraintValidatorFactory() {
    // TODO(nchalko) implement.
    return null;
  }

  public MessageInterpolator getMessageInterpolator() {
    // TODO(nchalko) implement.
    return null;
  }

  public Map<String, String> getProperties() {
    // TODO(nchalko) implement.
    return null;
  }

  public TraversableResolver getTraversableResolver() {
    // TODO(nchalko) implement.
    return null;
  }

  public boolean isIgnoreXmlConfiguration() {
    // Always ignore XML
    return false;
  }

}