/**
 * 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;
import com.cloudera.sqoop.metastore.JobStorage;

/**
 * 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 =
      "com.cloudera.sqoop.metastore.GenericJobStorage";

  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;
  }
}

