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

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.metastore.api.Database;
import org.apache.hadoop.hive.ql.metadata.AuthorizationException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.HiveStorageHandler;
import org.apache.hadoop.hive.ql.metadata.Partition;
import org.apache.hadoop.hive.ql.metadata.Table;
import org.apache.hadoop.hive.ql.security.HiveAuthenticationProvider;
import org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider;
import org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProviderBase;
import org.apache.hadoop.hive.ql.security.authorization.Privilege;
import org.apache.hadoop.util.ReflectionUtils;
import org.apache.hcatalog.mapreduce.HCatStorageHandler;

/**
 * A HiveAuthorizationProvider which delegates the authorization requests to 
 * the underlying AuthorizationProviders obtained from the StorageHandler.
 */
public class StorageDelegationAuthorizationProvider extends HiveAuthorizationProviderBase {

    protected HiveAuthorizationProvider hdfsAuthorizer = new HdfsAuthorizationProvider();

    protected static Map<String, String> authProviders = new HashMap<String, String>();

    @Override
    public void setConf(Configuration conf) {
        super.setConf(conf);
        hdfsAuthorizer.setConf(conf);
    }

    @Override
    public void setAuthenticator(HiveAuthenticationProvider authenticator) {
        super.setAuthenticator(authenticator);
        hdfsAuthorizer.setAuthenticator(authenticator);
    }

    static {
        registerAuthProvider("org.apache.hadoop.hive.hbase.HBaseStorageHandler",
            "org.apache.hcatalog.hbase.HBaseAuthorizationProvider");
        registerAuthProvider("org.apache.hcatalog.hbase.HBaseHCatStorageHandler",
            "org.apache.hcatalog.hbase.HBaseAuthorizationProvider");
    }

    //workaround until Hive adds StorageHandler.getAuthorizationProvider(). Remove these parts afterwards
    public static void registerAuthProvider(String storageHandlerClass,
                                            String authProviderClass) {
        authProviders.put(storageHandlerClass, authProviderClass);
    }

    /** Returns the StorageHandler of the Table obtained from the HCatStorageHandler */
    protected HiveAuthorizationProvider getDelegate(Table table) throws HiveException {
        HiveStorageHandler handler = table.getStorageHandler();

        if (handler != null) {
            if (handler instanceof HCatStorageHandler) {
                return ((HCatStorageHandler) handler).getAuthorizationProvider();
            } else {
                String authProviderClass = authProviders.get(handler.getClass().getCanonicalName());

                if (authProviderClass != null) {
                    try {
                        ReflectionUtils.newInstance(getConf().getClassByName(authProviderClass), getConf());
                    } catch (ClassNotFoundException ex) {
                        throw new HiveException("Cannot instantiate delegation AuthotizationProvider");
                    }
                }

                //else we do not have anything to delegate to
                throw new HiveException(String.format("Storage Handler for table:%s is not an instance " +
                    "of HCatStorageHandler", table.getTableName()));
            }
        } else {
            //return an authorizer for HDFS
            return hdfsAuthorizer;
        }
    }

    @Override
    public void authorize(Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
        throws HiveException, AuthorizationException {
        //global authorizations against warehouse hdfs directory
        hdfsAuthorizer.authorize(readRequiredPriv, writeRequiredPriv);
    }

    @Override
    public void authorize(Database db, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
        throws HiveException, AuthorizationException {
        //db's are tied to a hdfs location
        hdfsAuthorizer.authorize(db, readRequiredPriv, writeRequiredPriv);
    }

    @Override
    public void authorize(Table table, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
        throws HiveException, AuthorizationException {
        getDelegate(table).authorize(table, readRequiredPriv, writeRequiredPriv);
    }

    @Override
    public void authorize(Partition part, Privilege[] readRequiredPriv,
                          Privilege[] writeRequiredPriv) throws HiveException, AuthorizationException {
        getDelegate(part.getTable()).authorize(part, readRequiredPriv, writeRequiredPriv);
    }

    @Override
    public void authorize(Table table, Partition part, List<String> columns,
                          Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv) throws HiveException,
        AuthorizationException {
        getDelegate(table).authorize(table, part, columns, readRequiredPriv, writeRequiredPriv);
    }
}
