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

import java.util.List;

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.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.Privilege;

/**
 * This class is an implementation of HiveAuthorizationProvider to provide
 * authorization functionality for HBase tables.
 */
class HBaseAuthorizationProvider implements HiveAuthorizationProvider {

    @Override
    public Configuration getConf() {
        return null;
    }

    @Override
    public void setConf(Configuration conf) {
    }

    /*
    * (non-Javadoc)
    *
    * @see
    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
    * #init(org.apache.hadoop.conf.Configuration)
    */
    @Override
    public void init(Configuration conf) throws HiveException {
    }

    @Override
    public HiveAuthenticationProvider getAuthenticator() {
        return null;
    }

    @Override
    public void setAuthenticator(HiveAuthenticationProvider authenticator) {
    }

    /*
    * (non-Javadoc)
    *
    * @see
    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
    * #authorize(org.apache.hadoop.hive.ql.security.authorization.Privilege[],
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
    */
    @Override
    public void authorize(Privilege[] readRequiredPriv,
                          Privilege[] writeRequiredPriv) throws HiveException,
        AuthorizationException {
    }

    /*
    * (non-Javadoc)
    *
    * @see
    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
    * #authorize(org.apache.hadoop.hive.metastore.api.Database,
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
    */
    @Override
    public void authorize(Database db, Privilege[] readRequiredPriv,
                          Privilege[] writeRequiredPriv) throws HiveException,
        AuthorizationException {
    }

    /*
    * (non-Javadoc)
    *
    * @see
    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
    * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
    */
    @Override
    public void authorize(Table table, Privilege[] readRequiredPriv,
                          Privilege[] writeRequiredPriv) throws HiveException,
        AuthorizationException {
    }

    /*
    * (non-Javadoc)
    *
    * @see
    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
    * #authorize(org.apache.hadoop.hive.ql.metadata.Partition,
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
    */
    @Override
    public void authorize(Partition part, Privilege[] readRequiredPriv,
                          Privilege[] writeRequiredPriv) throws HiveException,
        AuthorizationException {
    }

    /*
    * (non-Javadoc)
    *
    * @see
    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
    * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
    * org.apache.hadoop.hive.ql.metadata.Partition, java.util.List,
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
    */
    @Override
    public void authorize(Table table, Partition part, List<String> columns,
                          Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
        throws HiveException, AuthorizationException {
    }

}
