/*
 * 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.nutch.metadata;

/**
 * A collection of Dublin Core metadata names.
 * 
 * @see <a href="http://dublincore.org">dublincore.org</a>
 * 
 * @author Chris Mattmann
 * @author J&eacute;r&ocirc;me Charron
 */
public interface DublinCore {

  /**
   * Typically, Format may include the media-type or dimensions of the resource.
   * Format may be used to determine the software, hardware or other equipment
   * needed to display or operate the resource. Examples of dimensions include
   * size and duration. Recommended best practice is to select a value from a
   * controlled vocabulary (for example, the list of Internet Media Types [MIME]
   * defining computer media formats).
   */
  public static final String FORMAT = "format";

  /**
   * Recommended best practice is to identify the resource by means of a string
   * or number conforming to a formal identification system. Example formal
   * identification systems include the Uniform Resource Identifier (URI)
   * (including the Uniform Resource Locator (URL)), the Digital Object
   * Identifier (DOI) and the International Standard Book Number (ISBN).
   */
  public static final String IDENTIFIER = "identifier";

  /**
   * Date on which the resource was changed.
   */
  public static final String MODIFIED = "modified";

  /**
   * An entity responsible for making contributions to the content of the
   * resource. Examples of a Contributor include a person, an organisation, or a
   * service. Typically, the name of a Contributor should be used to indicate
   * the entity.
   */
  public static final String CONTRIBUTOR = "contributor";

  /**
   * The extent or scope of the content of the resource. Coverage will typically
   * include spatial location (a place name or geographic coordinates), temporal
   * period (a period label, date, or date range) or jurisdiction (such as a
   * named administrative entity). Recommended best practice is to select a
   * value from a controlled vocabulary (for example, the Thesaurus of
   * Geographic Names [TGN]) and that, where appropriate, named places or time
   * periods be used in preference to numeric identifiers such as sets of
   * coordinates or date ranges.
   */
  public static final String COVERAGE = "coverage";

  /**
   * An entity primarily responsible for making the content of the resource.
   * Examples of a Creator include a person, an organisation, or a service.
   * Typically, the name of a Creator should be used to indicate the entity.
   */
  public static final String CREATOR = "creator";

  /**
   * A date associated with an event in the life cycle of the resource.
   * Typically, Date will be associated with the creation or availability of the
   * resource. Recommended best practice for encoding the date value is defined
   * in a profile of ISO 8601 [W3CDTF] and follows the YYYY-MM-DD format.
   */
  public static final String DATE = "date";

  /**
   * An account of the content of the resource. Description may include but is
   * not limited to: an abstract, table of contents, reference to a graphical
   * representation of content or a free-text account of the content.
   */
  public static final String DESCRIPTION = "description";

  /**
   * A language of the intellectual content of the resource. Recommended best
   * practice is to use RFC 3066 [RFC3066], which, in conjunction with ISO 639
   * [ISO639], defines two- and three-letter primary language tags with optional
   * subtags. Examples include "en" or "eng" for English, "akk" for Akkadian,
   * and "en-GB" for English used in the United Kingdom.
   */
  public static final String LANGUAGE = "language";

  /**
   * An entity responsible for making the resource available. Examples of a
   * Publisher include a person, an organisation, or a service. Typically, the
   * name of a Publisher should be used to indicate the entity.
   */
  public static final String PUBLISHER = "publisher";

  /**
   * A reference to a related resource. Recommended best practice is to
   * reference the resource by means of a string or number conforming to a
   * formal identification system.
   */
  public static final String RELATION = "relation";

  /**
   * Information about rights held in and over the resource. Typically, a Rights
   * element will contain a rights management statement for the resource, or
   * reference a service providing such information. Rights information often
   * encompasses Intellectual Property Rights (IPR), Copyright, and various
   * Property Rights. If the Rights element is absent, no assumptions can be
   * made about the status of these and other rights with respect to the
   * resource.
   */
  public static final String RIGHTS = "rights";

  /**
   * A reference to a resource from which the present resource is derived. The
   * present resource may be derived from the Source resource in whole or in
   * part. Recommended best practice is to reference the resource by means of a
   * string or number conforming to a formal identification system.
   */
  public static final String SOURCE = "source";

  /**
   * The topic of the content of the resource. Typically, a Subject will be
   * expressed as keywords, key phrases or classification codes that describe a
   * topic of the resource. Recommended best practice is to select a value from
   * a controlled vocabulary or formal classification scheme.
   */
  public static final String SUBJECT = "subject";

  /**
   * A name given to the resource. Typically, a Title will be a name by which
   * the resource is formally known.
   */
  public static final String TITLE = "title";

  /**
   * The nature or genre of the content of the resource. Type includes terms
   * describing general categories, functions, genres, or aggregation levels for
   * content. Recommended best practice is to select a value from a controlled
   * vocabulary (for example, the DCMI Type Vocabulary [DCMITYPE]). To describe
   * the physical or digital manifestation of the resource, use the Format
   * element.
   */
  public static final String TYPE = "type";

}
