/**
 * 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.tez.api;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

/**
 * {@link Processor} represents the <em>tez</em> entity responsible for
 * consuming {@link Input} and producing {@link Output}. 
 */
public interface Processor {
  
  /**
   * Initialize the <code>Processor</code>.
   * 
   * @param conf job-configuration
   * @param master master process controlling the task
   * @throws IOException 
   * @throws InterruptedException
   */
  public void initialize(Configuration conf, Master master) 
      throws IOException, InterruptedException;
  
  /**
   * Process input data from <code>input</code> and 
   * send it to <code>output</code>.
   * 
   * @param in input
   * @param out output
   * @param master master process controlling the task
   * @throws IOException
   * @throws InterruptedException
   */
  public void process(Input in, Output  out) 
      throws IOException, InterruptedException;

  /**
   * Close the {@link Processor}.
   * 
   * @throws IOException
   * @throws InterruptedException
   */
  public void close() throws IOException, InterruptedException;

}
