/*
* 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.stanbol.enhancer.servicesapi;

import java.util.Set;

import org.apache.clerezza.rdf.core.Graph;

/**
 * An Enhancement Chain represents a configuration that defines what engines 
 * and in what order are used to process ContentItems. The Chain is not
 * responsible for the execution, but only provides the configuration - the
 * execution plan - to the {@link EnhancementJobManager}. <p>
 * Typically Chains are registered as OSGI services. Such Chains are
 * accessible via the {@link ChainManager} service by name - the value of 
 * {@link #PROPERTY_NAME} in the service registration. 
 * Chains that are registered like that can be directly addressed by users by
 * parsing content to <code>/engines/chain/{name}</code>.<p>
 * To use a {@link Chain} for the execution of a {@link ContentItem} with the
 * {@link EnhancementJobManager} it is not required that it is registered as
 * OSGI service. {@link EnhancementJobManager} MUST also accept Chains that are
 * not registered as OSGI service.
 * Chains are registered as 
 * OSGI services and identified by the "stanbol.enhancer.chain.name" property.
 *
 */
public interface Chain {
    /**
     * The property to be used for providing the name of a chain.
     */
    String PROPERTY_NAME = "stanbol.enhancer.chain.name";
    /**
     * Getter for the execution plan reflecting the current configuration of this
     * Chain. The returned {@link Graph} is read only and MUST NOT be changed if 
     * the configuration of this Chain changes. This means that the Chain MUST 
     * create a new Graph instance if the execution plan changes as a result of 
     * a change in the configuration. It MUST NOT change any execution plan 
     * parsed to other components by the getExecutionPlan() method.
     * @return the execution plan as defined by the 
     * <code>http://stanbol.apache.org/ontology/enhancer/executionplan#</code>
     * schema.
     * @throws ChainException If the execution plan can not be created. Typically
     * the case of the Chain requires runtime information to determine the
     * execution plan.
     */
    Graph getExecutionPlan() throws ChainException;
    /**
     * Getter for the set of {@link EnhancementEngine}s referenced by there
     * name within the execution plan. This method is intended to be used 
     * in situations where only the list of engines need to be known (e.g. when
     * checking that all referenced engines are available).
     * @return the set of engine names referenced by this chain
     * @throws ChainException If the engines referenced by this chain can not be
     * determined. This may happen if a chain required runtime information to
     * determine the list of engines.
     */
    Set<String> getEngines() throws ChainException;
    /**
     * The name of this chain as configured by {@link #PROPERTY_NAME}
     * @return the name
     */
    String getName();

}
