/*
 * Copyright 2012 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.impl.metadata;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.validation.groups.Default;

/**
 * Describes information about a bean which is used for validation purposes.
 */
public class BeanMetadata {
  private final Class<?> beanClass;
  private final List<Class<?>> defaultGroupSequence;
  private final boolean defaultGroupSequenceRedefined;

  public BeanMetadata(Class<?> beanClass, Class<?>... defaultGroupSequence) {
    this.beanClass = beanClass;
    this.defaultGroupSequence = Collections.unmodifiableList(Arrays.asList(defaultGroupSequence));
    this.defaultGroupSequenceRedefined = !(defaultGroupSequence.length == 1 &&
        defaultGroupSequence[0].equals(Default.class));
  }

  public boolean defaultGroupSequenceIsRedefined() {
    return defaultGroupSequenceRedefined;
  }

  public Class<?> getBeanClass() {
    return beanClass;
  }

  public List<Class<?>> getDefaultGroupSequence() {
    return defaultGroupSequence;
  }
}
