/**
 * 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.mrunit.internal.output;

import static org.apache.hadoop.mrunit.internal.util.ArgumentChecker.returnNonNull;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapred.InputFormat;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.OutputFormat;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mrunit.internal.mapred.MockMapredOutputFormat;
import org.apache.hadoop.mrunit.internal.mapreduce.MockMapreduceOutputFormat;

public class MockOutputCreator<K, V> {

  private Class<? extends OutputFormat> mapredOutputFormatClass;
  private Class<? extends InputFormat> mapredInputFormatClass;

  private Class<? extends org.apache.hadoop.mapreduce.OutputFormat> mapreduceOutputFormatClass;
  private Class<? extends org.apache.hadoop.mapreduce.InputFormat> mapreduceInputFormatClass;

  public void setMapredFormats(Class<? extends OutputFormat> outputFormatClass,
      Class<? extends InputFormat> inputFormatClass) {
    mapredOutputFormatClass = returnNonNull(outputFormatClass);
    mapredInputFormatClass = returnNonNull(inputFormatClass);
  }

  public void setMapreduceFormats(
      Class<? extends org.apache.hadoop.mapreduce.OutputFormat> outputFormatClass,
      Class<? extends org.apache.hadoop.mapreduce.InputFormat> inputFormatClass) {
    mapreduceOutputFormatClass = returnNonNull(outputFormatClass);
    mapreduceInputFormatClass = returnNonNull(inputFormatClass);
  }

  public OutputCollectable<K, V> createOutputCollectable(
      Configuration configuration,
      Configuration outputCopyingOrInputFormatConfiguration) throws IOException {
    outputCopyingOrInputFormatConfiguration = outputCopyingOrInputFormatConfiguration == null ? configuration
        : outputCopyingOrInputFormatConfiguration;
    if (mapredOutputFormatClass != null) {
      return new MockMapredOutputFormat<K, V>(new JobConf(configuration),
          mapredOutputFormatClass, mapredInputFormatClass, new JobConf(
              outputCopyingOrInputFormatConfiguration));
    }
    if (mapreduceOutputFormatClass != null) {
      return new MockMapreduceOutputFormat<K, V>(new Job(configuration),
          mapreduceOutputFormatClass, mapreduceInputFormatClass, new Job(
              outputCopyingOrInputFormatConfiguration));
    }
    return new MockOutputCollector<K, V>(
        outputCopyingOrInputFormatConfiguration);
  }
}
