/*
 * 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 org.apache.uima.resource.metadata;

/**
 * A description of a CAS Type. This implements <code>MetaDataObject</code>, which implements
 * {@link org.apache.uima.util.XMLizable}, so it can be serialized to and deserialized from an XML
 * element.
 * 
 * 
 */
public interface TypeDescription extends MetaDataObject {

  TypeDescription[] EMPTY_TYPE_DESCRIPTIONS = new TypeDescription[0];

  /**
   * Gets the name of this Type.
   * 
   * @return the name of this Type
   */
  String getName();

  /**
   * Sets the name of this Type.
   * 
   * @param aName
   *          the name of this Type
   */
  void setName(String aName);

  /**
   * Gets the verbose description of this Type.
   * 
   * @return the description of this Type
   */
  String getDescription();

  /**
   * Sets the verbose description of this Type.
   * 
   * @param aDescription
   *          the description of this Type
   */
  void setDescription(String aDescription);

  /**
   * Gets the name of the supertype for this Type. This is the Type from which this Type inherits.
   * 
   * @return the name of the supertype for this Type
   */
  String getSupertypeName();

  /**
   * Sets the name of the supertype for this Type. This is the Type from which this Type inherits.
   * 
   * @param aTypeName
   *          the name of the supertype for this Type
   */
  void setSupertypeName(String aTypeName);

  /**
   * Gets the descriptions of the features for this Type.
   * 
   * @return the descriptions of the features for this Type.
   */
  FeatureDescription[] getFeatures();

  /**
   * Sets the descriptions of the features for this Type.
   * 
   * @param aFeatures
   *          descriptions of the features for this Type.
   */
  void setFeatures(FeatureDescription[] aFeatures);

  /**
   * Gets the allowed values for instances of this Type. This is used only for special "enumerated
   * types" that extend the String type and define a specific set of allowed values. For all other
   * Types this will return <code>null</code>. Note that if a type has allowed values, it may not
   * have features.
   * 
   * @return the allowed values for instances of this Type
   */
  AllowedValue[] getAllowedValues();

  /**
   * Sets the allowed values for instances of this Type. This is used only for special "enumerated
   * types" that extend the String type and define a specific set of allowed values. For all other
   * Types this property should be <code>null</code>. Note that if a type has allowed values, it may
   * not have features.
   * 
   * @param aAllowedValues
   *          the allowed values for instances of this Type
   */
  void setAllowedValues(AllowedValue... aAllowedValues);

  /**
   * Convenience method which adds a FeatureDescription to this TypeDescription.
   * 
   * @param aFeatureName
   *          name of feature to add
   * @param aDescription
   *          verbose description of the feature
   * @param aRangeTypeName
   *          name of feature's range type
   * 
   * @return description of the new Feature
   */
  FeatureDescription addFeature(String aFeatureName, String aDescription, String aRangeTypeName);

  /**
   * Convenience method which adds a FeatureDescription to this TypeDescription. Used for array or
   * list valued features, which have additional attributes.
   * 
   * @param aFeatureName
   *          name of feature to add
   * @param aDescription
   *          verbose description of the feature
   * @param aRangeTypeName
   *          name of feature's range type
   * @param aElementTypeName
   *          type of element expected to be contained in the array or list
   * @param aMultipleReferencesAllowed
   *          whether an array or list that's assigned to this feature can also be referenced from
   *          another feature. This is a Boolean object so that the null value can be used to
   *          represent the case where the user has not specified a value.
   * 
   * @return description of the new Feature
   */
  FeatureDescription addFeature(String aFeatureName, String aDescription, String aRangeTypeName,
          String aElementTypeName, Boolean aMultipleReferencesAllowed);
}
