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

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.Writable;

//TODO EVENTUALLY Add more interfaces. Maybe make this an abstract class.
/**
 * Contains context information for Output. For example, shuffle headers, size
 * of output, etc. TODO Ideally should be Output specific.
 */

public class OutputContext implements Writable {

  public OutputContext(int shufflePort) {
    this.shufflePort = shufflePort;
  }
  
  public OutputContext() {
  }

  public int shufflePort;

  public int getShufflePort() {
    return this.shufflePort;
  }

  @Override
  public void write(DataOutput out) throws IOException {
    out.writeInt(shufflePort);
  }

  @Override
  public void readFields(DataInput in) throws IOException {
    shufflePort = in.readInt();
  }
  
  @Override
  public String toString() {
    return "shufflePort: " + shufflePort;
  }
}
