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

import java.util.Map;

/**
 * Represents a processor which consumes {@link LogicalInput}s and produces
 * {@link LogicalOutput}s
 */
public interface LogicalIOProcessor extends Processor {

  /**
   * Runs the {@link LogicalProcessor}
   * 
   * @param inputs
   *          a map of the source vertex name to {@link LogicalInput} - one per
   *          incoming edge.
   * @param outputs
   *          a map of the destination vertex name to {@link LogicalOutput} -
   *          one per outgoing edge
   * @throws Exception TODO
   */
  public void run(Map<String, LogicalInput> inputs,
      Map<String, LogicalOutput> outputs) throws Exception;

}
