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

import java.io.IOException;
import java.util.List;

import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.util.Bytes;

/**
 * This class is nothing but a delegate for the enclosed proxy,
 * which is created upon setting the configuration.
 */
public class RevisionManagerEndpointClient implements RevisionManager, Configurable {

    private Configuration conf = null;
    private RevisionManager rmProxy;

    @Override
    public Configuration getConf() {
        return this.conf;
    }

    @Override
    public void setConf(Configuration arg0) {
        this.conf = arg0;
    }

    @Override
    public void initialize(Configuration conf) {
        // do nothing
    }

    @Override
    public void open() throws IOException {
        // clone to adjust RPC settings unique to proxy
        Configuration clonedConf = new Configuration(conf);
        // conf.set("hbase.ipc.client.connect.max.retries", "0");
        // conf.setInt(HConstants.HBASE_CLIENT_RPC_MAXATTEMPTS, 1);
        clonedConf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1); // do not retry RPC
        HTable table = new HTable(clonedConf, HConstants.ROOT_TABLE_NAME);
        rmProxy = table.coprocessorProxy(RevisionManagerProtocol.class,
            Bytes.toBytes("anyRow"));
        rmProxy.open();
    }

    @Override
    public void close() throws IOException {
        rmProxy.close();
    }

    @Override
    public void createTable(String table, List<String> columnFamilies) throws IOException {
        rmProxy.createTable(table, columnFamilies);
    }

    @Override
    public void dropTable(String table) throws IOException {
        rmProxy.dropTable(table);
    }

    @Override
    public Transaction beginWriteTransaction(String table, List<String> families) throws IOException {
        return rmProxy.beginWriteTransaction(table, families);
    }

    @Override
    public Transaction beginWriteTransaction(String table, List<String> families, long keepAlive)
        throws IOException {
        return rmProxy.beginWriteTransaction(table, families, keepAlive);
    }

    @Override
    public void commitWriteTransaction(Transaction transaction) throws IOException {
        rmProxy.commitWriteTransaction(transaction);
    }

    @Override
    public void abortWriteTransaction(Transaction transaction) throws IOException {
        rmProxy.abortWriteTransaction(transaction);
    }

    @Override
    public List<FamilyRevision> getAbortedWriteTransactions(String table, String columnFamily)
        throws IOException {
        return rmProxy.getAbortedWriteTransactions(table, columnFamily);
    }

    @Override
    public TableSnapshot createSnapshot(String tableName) throws IOException {
        return rmProxy.createSnapshot(tableName);
    }

    @Override
    public TableSnapshot createSnapshot(String tableName, long revision) throws IOException {
        return rmProxy.createSnapshot(tableName, revision);
    }

    @Override
    public void keepAlive(Transaction transaction) throws IOException {
        rmProxy.keepAlive(transaction);
    }

}
