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

import org.apache.uima.UIMA_UnsupportedOperationException;
import org.apache.uima.resource.ResourceManager;
import org.apache.uima.util.InvalidXMLException;

/**
 * Metadata that describes a "Processing" {@link org.apache.uima.resource.Resource} - that is, one
 * that reads or writes to the {@link org.apache.uima.cas.CAS}.
 * <p>
 * As with all {@link MetaDataObject}s, a <code>ProcessingResourceMetaData</code> may or may not be
 * modifiable. An application can find out by calling the {@link #isModifiable()} method.
 * 
 * 
 */
public interface ProcessingResourceMetaData extends ResourceMetaData {

  /**
   * Retrieves the Type System used by this Processing Resource. The Type System contains
   * {@link TypeDescription}s and {@link FeatureDescription}s that are the inputs and/or outputs of
   * this Resource. Some Processing Resources, such as aggregate analysis engines, may not contain a
   * type system and return <code>null</code>.
   * 
   * @return a description of the type system used by this Resource
   */
  TypeSystemDescription getTypeSystem();

  /**
   * Retrieves the Type System used by this Processing Resource. The Type System contains
   * {@link TypeDescription}s and {@link FeatureDescription}s that are the inputs and/or outputs of
   * this Resource.
   * 
   * @param aTypeSystem
   *          a description of the type system used by this Resource.
   * 
   * @throws UIMA_UnsupportedOperationException
   *           if this <code>MetaDataObject</code> is not modifiable.
   */
  void setTypeSystem(TypeSystemDescription aTypeSystem);

  /**
   * Retrieves the Type Priorites for this Processing Resource. Type Priorities may be used to
   * determine the sort order of CAS indexes - see {@link #getFsIndexes()}.
   * 
   * @return the Type Priorities for Resource
   */
  TypePriorities getTypePriorities();

  /**
   * Retrieves the Type Priorites for this Processing Resource. Type Priorities may be used to
   * determine the sort order of CAS indexes - see {@link #getFsIndexes()}.
   * 
   * @param aTypePriorities
   *          the Type Priorities for this Resource
   */
  void setTypePriorities(TypePriorities aTypePriorities);

  /**
   * Retrieves the FS Index collection used by this Processing Resource. FS Indexes are used to
   * iterate over annotations in the {@link org.apache.uima.cas.CAS}.
   * 
   * @return a description of the Feature Structure indexes used by this Resource.
   */
  FsIndexCollection getFsIndexCollection();

  /**
   * Sets the Feature Structure Index collection used by this Processing Resource. FS Indexes are
   * used to iterate over annotations in the {@link org.apache.uima.cas.CAS}.
   * 
   * @param aFsIndexCollection
   *          a description of the Feature Structure indexes used by this Resource.
   * 
   * @throws UIMA_UnsupportedOperationException
   *           if this <code>MetaDataObject</code> is not modifiable.
   */
  void setFsIndexCollection(FsIndexCollection aFsIndexCollection);

  /**
   * Retrieves the Feature Structure indexes by this Processing Resource. These are used to iterate
   * over annotations in the {@link org.apache.uima.cas.CAS}.
   * <p>
   * NOTE: this method predates the {@link FsIndexCollection} object, which may define additional
   * information (name, description, vendor, version) and import other FsIndexCollections, and
   * provides direct access to the {@link FsIndexDescription} objects. To access the
   * {@link FsIndexCollection} object, call {@link #getFsIndexCollection()}.
   * 
   * @return a description of the Feature Structure indexes used by this Resource.
   */
  FsIndexDescription[] getFsIndexes();

  /**
   * Sets the Feature Structure indexes by this Processing Resource. These are used to iterate over
   * annotations in the {@link org.apache.uima.cas.CAS}.
   * <p>
   * NOTE: this method predates the {@link FsIndexCollection} object, which may define additional
   * information (name, description, vendor, version) and import other FsIndexCollections, and
   * provides direct access to the {@link FsIndexDescription} objects. To access the
   * {@link FsIndexCollection} object, call {@link #getFsIndexCollection()}.
   * 
   * @param aFSIndexes
   *          a description of the Feature Structure indexes used by this Resource.
   * 
   * @throws UIMA_UnsupportedOperationException
   *           if this <code>MetaDataObject</code> is not modifiable.
   */
  void setFsIndexes(FsIndexDescription... aFSIndexes);

  /**
   * Retrieves this Processing Resource's {@link Capability Capabilities}. Each capability consists
   * of a set of features or types that this Resource inputs and outputs, along with the
   * preconditions (e.g. language or mime type) on the input Entity.
   * 
   * @return an array of <code>Capabilities</code>.
   */
  Capability[] getCapabilities();

  /**
   * Sets this Processing Resource's {@link Capability Capabilities}. Each capability consists of a
   * set of features or types that this Resource inputs and outputs, along with the preconditions
   * (e.g. language or mime type) on the input Entity.
   * 
   * @param aCapabilities
   *          an array of <code>Capabilities</code>.
   * 
   * @throws UIMA_UnsupportedOperationException
   *           if this <code>MetaDataObject</code> is not modifiable.
   */
  void setCapabilities(Capability... aCapabilities);

  /**
   * Gets this Processing Resource's {@link OperationalProperties}. This includes information such
   * as whether this component will modify the CAS, and whether multiple instances of this component
   * can be run in parallel.
   * 
   * @return operational properties for this component
   */
  OperationalProperties getOperationalProperties();

  /**
   * Sets this Processing Resource's {@link OperationalProperties}. This includes information such
   * as whether this component will modify the CAS, and whether multiple instances of this component
   * can be run in parallel.
   * 
   * @param aOperationalProperties
   *          operational properties for this component
   * 
   * @throws UIMA_UnsupportedOperationException
   *           if this <code>MetaDataObject</code> is not modifiable.
   */
  void setOperationalProperties(OperationalProperties aOperationalProperties);

  /**
   * Resolves any import declarations. This includes imports of type systems, type priorities, and
   * FS index collections. The imported types, type priorities, and FS index collections are added
   * directly onto their respective lists, and the import elements are deleted, so this results in a
   * structure that is equivalent to the imported elements having been defined locally.
   * 
   * @throws InvalidXMLException
   *           if either the import target does not exist or is invalid
   */
  @Override
  void resolveImports() throws InvalidXMLException;

  /**
   * Resolves any import declarations. This includes imports of type systems, type priorities, and
   * FS index collections. The imported types, type priorities, and FS index collections are added
   * directly onto their respective lists, and the import elements are deleted, so this results in a
   * structure that is equivalent to the imported elements having been defined locally.
   * 
   * @param aResourceManager
   *          the Resource Manager used to locate descriptors imported by name. For example, the
   *          path in which to locate these descriptors can be set via the
   *          {@link ResourceManager#setDataPath(String)} method.
   * 
   * @throws InvalidXMLException
   *           if either the import target does not exist or is invalid
   */
  @Override
  void resolveImports(ResourceManager aResourceManager) throws InvalidXMLException;

  /**
   * Gets whether this AE is sofa-aware. This is a derived property that cannot be set directly. An
   * AE is sofa-aware if and only if it declares at least one input sofa or output sofa.
   * 
   * @return true if this component is sofa-aware, false if it is sofa-unaware.
   */
  boolean isSofaAware();
}
