/**
 * 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 org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.conf.Configuration;

/**
 * Utility to instantiate the revision manager (not a true factory actually).
 * Depends on HBase configuration to resolve ZooKeeper connection (when ZK is used).
 */
public class RevisionManagerFactory {

    public static final String REVISION_MGR_IMPL_CLASS = "revision.manager.impl.class";

    /**
     * Gets an instance of revision manager.
     *
     * @param conf The configuration required to created the revision manager.
     * @return the revision manager An instance of revision manager.
     * @throws IOException Signals that an I/O exception has occurred.
     */
    private static RevisionManager getRevisionManager(String className, Configuration conf) throws IOException {

        RevisionManager revisionMgr;
        ClassLoader classLoader = Thread.currentThread()
            .getContextClassLoader();
        if (classLoader == null) {
            classLoader = RevisionManagerFactory.class.getClassLoader();
        }
        try {
            Class<? extends RevisionManager> revisionMgrClass = Class
                .forName(className, true, classLoader).asSubclass(RevisionManager.class);
            revisionMgr = (RevisionManager) revisionMgrClass.newInstance();
            revisionMgr.initialize(conf);
        } catch (ClassNotFoundException e) {
            throw new IOException(
                "The implementation class of revision manager not found.",
                e);
        } catch (InstantiationException e) {
            throw new IOException(
                "Exception encountered during instantiating revision manager implementation.",
                e);
        } catch (IllegalAccessException e) {
            throw new IOException(
                "IllegalAccessException encountered during instantiating revision manager implementation.",
                e);
        } catch (IllegalArgumentException e) {
            throw new IOException(
                "IllegalArgumentException encountered during instantiating revision manager implementation.",
                e);
        }
        return revisionMgr;
    }

    /**
     * Internally used by endpoint implementation to instantiate from different configuration setting.
     * @param className
     * @param conf
     * @return
     * @throws IOException
     */
    static RevisionManager getOpenedRevisionManager(String className, Configuration conf) throws IOException {

        RevisionManager revisionMgr = RevisionManagerFactory.getRevisionManager(className, conf);
        if (revisionMgr instanceof Configurable) {
            ((Configurable) revisionMgr).setConf(conf);
        }
        revisionMgr.open();
        return revisionMgr;
    }

    /**
     * Gets an instance of revision manager which is opened.
     * The revision manager implementation can be specified as {@link #REVISION_MGR_IMPL_CLASS},
     * default is {@link ZKBasedRevisionManager}.
     * @param conf revision manager configuration
     * @return RevisionManager An instance of revision manager.
     * @throws IOException
     */
    public static RevisionManager getOpenedRevisionManager(Configuration conf) throws IOException {
        String className = conf.get(RevisionManagerFactory.REVISION_MGR_IMPL_CLASS,
            ZKBasedRevisionManager.class.getName());
        return getOpenedRevisionManager(className, conf);
    }

}
