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

import java.util.List;
import java.util.Map;

import org.apache.hadoop.conf.Configuration;
import org.apache.sqoop.config.ConfigurationHelper;

/**
 * Factory that produces the correct JobStorage system to work with
 * a particular job descriptor.
 */
public class JobStorageFactory {

  private Configuration conf;

  /**
   * Configuration key describing the list of JobStorage implementations
   * to use to handle jobs.
   */
  public static final String AVAILABLE_STORAGES_KEY =
      "sqoop.job.storage.implementations";

  /** The default list of available JobStorage implementations. */
  private static final String DEFAULT_AVAILABLE_STORAGES =
      "org.apache.sqoop.metastore.GenericJobStorage,"
      + "org.apache.sqoop.metastore.AutoGenericJobStorage";

  public JobStorageFactory(Configuration config) {
    this.conf = config;

    // Ensure that we always have an available storages list.
    if (this.conf.get(AVAILABLE_STORAGES_KEY) == null) {
      this.conf.set(AVAILABLE_STORAGES_KEY, DEFAULT_AVAILABLE_STORAGES);
    }
  }

  /**
   * Given a storage descriptor, determine the correct JobStorage
   * implementation to use to connect to the storage resource and return an
   * instance of it -- or null if no JobStorage instance is appropriate.
   */
  public JobStorage getJobStorage(Map<String, String> descriptor) {
    List<JobStorage> storages = ConfigurationHelper.getInstances(
        conf, AVAILABLE_STORAGES_KEY, JobStorage.class);
    for (JobStorage stor : storages) {
      if (stor.canAccept(descriptor)) {
        return stor;
      }
    }

    return null;
  }
}

