/**
 * 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.hcatalog.data.transfer;

import java.util.Map;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hcatalog.data.transfer.impl.HCatInputFormatReader;
import org.apache.hcatalog.data.transfer.impl.HCatOutputFormatWriter;
import org.apache.hcatalog.data.transfer.state.DefaultStateProvider;
import org.apache.hcatalog.data.transfer.state.StateProvider;

/**
 * Use this factory to get instances of {@link HCatReader} or {@link HCatWriter}
 * at master and slave nodes.
 */

public class DataTransferFactory {

    /**
     * This should be called once from master node to obtain an instance of
     * {@link HCatReader}.
     *
     * @param re
     *          ReadEntity built using {@link ReadEntity.Builder}
     * @param config
     *          any configuration which master node wants to pass to HCatalog
     * @return {@link HCatReader}
     */
    public static HCatReader getHCatReader(final ReadEntity re,
                                           final Map<String, String> config) {
        // In future, this may examine ReadEntity and/or config to return
        // appropriate HCatReader
        return new HCatInputFormatReader(re, config);
    }

    /**
     * This should only be called once from every slave node to obtain an instance
     * of {@link HCatReader}.
     *
     * @param split
     *          input split obtained at master node
     * @param config
     *          configuration obtained at master node
     * @return {@link HCatReader}
     */
    public static HCatReader getHCatReader(final InputSplit split,
                                           final Configuration config) {
        // In future, this may examine config to return appropriate HCatReader
        return getHCatReader(split, config, DefaultStateProvider.get());
    }

    /**
     * This should only be called once from every slave node to obtain an instance
     * of {@link HCatReader}. This should be called if an external system has some
     * state to provide to HCatalog.
     *
     * @param split
     *          input split obtained at master node
     * @param config
     *          configuration obtained at master node
     * @param sp
     *          {@link StateProvider}
     * @return {@link HCatReader}
     */
    public static HCatReader getHCatReader(final InputSplit split,
                                           final Configuration config, StateProvider sp) {
        // In future, this may examine config to return appropriate HCatReader
        return new HCatInputFormatReader(split, config, sp);
    }

    /**
     * This should be called at master node to obtain an instance of
     * {@link HCatWriter}.
     *
     * @param we
     *          WriteEntity built using {@link WriteEntity.Builder}
     * @param config
     *          any configuration which master wants to pass to HCatalog
     * @return {@link HCatWriter}
     */
    public static HCatWriter getHCatWriter(final WriteEntity we,
                                           final Map<String, String> config) {
        // In future, this may examine WriteEntity and/or config to return
        // appropriate HCatWriter
        return new HCatOutputFormatWriter(we, config);
    }

    /**
     * This should be called at slave nodes to obtain an instance of
     * {@link HCatWriter}.
     *
     * @param cntxt
     *          {@link WriterContext} obtained at master node
     * @return {@link HCatWriter}
     */
    public static HCatWriter getHCatWriter(final WriterContext cntxt) {
        // In future, this may examine context to return appropriate HCatWriter
        return getHCatWriter(cntxt, DefaultStateProvider.get());
    }

    /**
     * This should be called at slave nodes to obtain an instance of
     * {@link HCatWriter}. If an external system has some mechanism for providing
     * state to HCatalog, this constructor can be used.
     *
     * @param cntxt
     *          {@link WriterContext} obtained at master node
     * @param sp
     *          {@link StateProvider}
     * @return {@link HCatWriter}
     */
    public static HCatWriter getHCatWriter(final WriterContext cntxt,
                                           final StateProvider sp) {
        // In future, this may examine context to return appropriate HCatWriter
        return new HCatOutputFormatWriter(cntxt.getConf(), sp);
    }
}
