/**
 * 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.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.hadoop.conf.Configuration;
import org.apache.hcatalog.common.HCatException;
import org.apache.hcatalog.data.HCatRecord;
import org.apache.hcatalog.data.transfer.state.StateProvider;

/**
 * This abstract class is internal to HCatalog and abstracts away the notion of
 * underlying system from which reads will be done.
 */

public abstract class HCatReader {

    /**
     * This should be called at master node to obtain {@link ReaderContext} which
     * then should be serialized and sent to slave nodes.
     *
     * @return {@link ReaderContext}
     * @throws HCatException
     */
    public abstract ReaderContext prepareRead() throws HCatException;

    /**
     * This should be called at slave nodes to read {@link HCatRecord}s
     *
     * @return {@link Iterator} of {@link HCatRecord}
     * @throws HCatException
     */
    public abstract Iterator<HCatRecord> read() throws HCatException;

    /**
     * This constructor will be invoked by {@link DataTransferFactory} at master
     * node. Don't use this constructor. Instead, use {@link DataTransferFactory}
     *
     * @param re
     * @param config
     */
    protected HCatReader(final ReadEntity re, final Map<String, String> config) {
        this(config);
        this.re = re;
    }

    /**
     * This constructor will be invoked by {@link DataTransferFactory} at slave
     * nodes. Don't use this constructor. Instead, use {@link DataTransferFactory}
     *
     * @param config
     * @param sp
     */

    protected HCatReader(final Configuration config, StateProvider sp) {
        this.conf = config;
        this.sp = sp;
    }

    protected ReadEntity re; // This will be null at slaves.
    protected Configuration conf;
    protected ReaderContext info;
    protected StateProvider sp; // This will be null at master.

    private HCatReader(final Map<String, String> config) {
        Configuration conf = new Configuration();
        if (null != config) {
            for (Entry<String, String> kv : config.entrySet()) {
                conf.set(kv.getKey(), kv.getValue());
            }
        }
        this.conf = conf;
    }

    public Configuration getConf() {
        if (null == conf) {
            throw new IllegalStateException(
                "HCatReader is not constructed correctly.");
        }
        return conf;
    }
}
