/**
 * 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.hadoop.mapred.pipes;

import java.io.IOException;

import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapred.InputSplit;
import org.apache.hadoop.mapred.JobConf;

/**
 * The abstract description of the downward (from Java to C++) Pipes protocol.
 * All of these calls are asynchronous and return before the message has been 
 * processed.
 */
interface DownwardProtocol<K extends WritableComparable, V extends Writable> {
  /**
   * Start communication
   * @throws IOException
   */
  void start() throws IOException;
  
  /**
   * Set the JobConf for the task.
   * @param conf
   * @throws IOException
   */
  void setJobConf(JobConf conf) throws IOException;
  
  /**
   * Set the input types for Maps.
   * @param keyType the name of the key's type
   * @param valueType the name of the value's type
   * @throws IOException
   */
  void setInputTypes(String keyType, String valueType) throws IOException;
  
  /**
   * Run a map task in the child.
   * @param split The input split for this map.
   * @param numReduces The number of reduces for this job.
   * @param pipedInput Is the input coming from Java?
   * @throws IOException
   */
  void runMap(InputSplit split, int numReduces, 
              boolean pipedInput) throws IOException;
  
  /**
   * For maps with pipedInput, the key/value pairs are sent via this messaage.
   * @param key The record's key
   * @param value The record's value
   * @throws IOException
   */
  void mapItem(K key, V value) throws IOException;
  
  /**
   * Run a reduce task in the child
   * @param reduce the index of the reduce (0 .. numReduces - 1)
   * @param pipedOutput is the output being sent to Java?
   * @throws IOException
   */
  void runReduce(int reduce, boolean pipedOutput) throws IOException;
  
  /**
   * The reduce should be given a new key
   * @param key the new key
   * @throws IOException
   */
  void reduceKey(K key) throws IOException;
  
  /**
   * The reduce should be given a new value
   * @param value the new value
   * @throws IOException
   */
  void reduceValue(V value) throws IOException;
  
  /**
   * The task has no more input coming, but it should finish processing it's 
   * input.
   * @throws IOException
   */
  void endOfInput() throws IOException;
  
  /**
   * The task should stop as soon as possible, because something has gone wrong.
   * @throws IOException
   */
  void abort() throws IOException;
  
  /**
   * Flush the data through any buffers.
   */
  void flush() throws IOException;
  
  /**
   * Close the connection.
   */
  void close() throws IOException, InterruptedException;
}
