/**
 * 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.Configuration;
import org.apache.hadoop.hbase.CoprocessorEnvironment;
import org.apache.hadoop.hbase.coprocessor.BaseEndpointCoprocessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Implementation of RevisionManager as HBase RPC endpoint. This class will control the lifecycle of
 * and delegate to the actual RevisionManager implementation and make it available as a service
 * hosted in the HBase region server (instead of running it in the client (storage handler).
 * In the case of {@link ZKBasedRevisionManager} now only the region servers need write access to
 * manage revision data.
 */
public class RevisionManagerEndpoint extends BaseEndpointCoprocessor implements RevisionManagerProtocol {

    private static final Logger LOGGER =
        LoggerFactory.getLogger(RevisionManagerEndpoint.class.getName());

    private RevisionManager rmImpl = null;

    @Override
    public void start(CoprocessorEnvironment env) {
        super.start(env);
        try {
            Configuration conf = RevisionManagerConfiguration.create(env.getConfiguration());
            String className = conf.get(RMConstants.REVISION_MGR_ENDPOINT_IMPL_CLASS,
                ZKBasedRevisionManager.class.getName());
            LOGGER.debug("Using Revision Manager implementation: {}", className);
            rmImpl = RevisionManagerFactory.getOpenedRevisionManager(className, conf);
        } catch (IOException e) {
            LOGGER.error("Failed to initialize revision manager", e);
        }
    }

    @Override
    public void stop(CoprocessorEnvironment env) {
        if (rmImpl != null) {
            try {
                rmImpl.close();
            } catch (IOException e) {
                LOGGER.warn("Error closing revision manager.", e);
            }
        }
        super.stop(env);
    }

    @Override
    public void initialize(Configuration conf) {
        // do nothing, HBase controls life cycle
    }

    @Override
    public void open() throws IOException {
        // do nothing, HBase controls life cycle
    }

    @Override
    public void close() throws IOException {
        // do nothing, HBase controls life cycle
    }

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

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

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

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

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

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

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

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

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

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

}
