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

import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat;
import org.apache.sqoop.SqoopOptions;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.sqoop.util.Jars;

/**
 * A set of parameters describing an import operation; this is passed to
 * ConnManager.importTable() as its argument.
 */
public class ImportJobContext {

  private String tableName;
  private String jarFile;
  private SqoopOptions options;
  private Class<? extends InputFormat> inputFormatClass;
  private Path destination;
  private ConnManager manager;

  public ImportJobContext(final String table, final String jar,
      final SqoopOptions opts, final Path destination) {
    this.tableName = table;
    this.jarFile = jar;
    if (this.jarFile == null) {
      // Set the jarFile to the hadoop core jar file.
      this.jarFile = Jars.getJarPathForClass(Configuration.class);
    }
    this.options = opts;
    this.inputFormatClass = DataDrivenDBInputFormat.class;
    this.destination = destination;
  }

  /** @return the name of the table to import. */
  public String getTableName() {
    return tableName;
  }

  /** @return the name of the jar file containing the user's compiled
   * ORM classes to use during the import.
   */
  public String getJarFile() {
    return jarFile;
  }

  /** @return the SqoopOptions configured by the user */
  public SqoopOptions getOptions() {
    return options;
  }

  /** Set the InputFormat to use for the import job. */
  public void setInputFormat(Class<? extends InputFormat> ifClass) {
    this.inputFormatClass = ifClass;
  }

  /** @return the InputFormat to use for the import job. */
  public Class<? extends InputFormat> getInputFormat() {
    return this.inputFormatClass;
  }

  /**
   * @return the destination path to where the output files will
   * be first saved.
   */
  public Path getDestination() {
    return this.destination;
  }

  /**
   * Set the ConnManager instance to be used during the import's
   * configuration.
   */
  public void setConnManager(ConnManager mgr) {
    this.manager = mgr;
  }

  /**
   * Get the ConnManager instance to use during an import's
   * configuration stage.
   */
  public ConnManager getConnManager() {
    return this.manager;
  }

}

