/**
 * 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.sentry.tests.e2e.metastore;

import java.io.IOException;
import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.hive.cli.CliSessionState;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.metastore.HiveMetaStoreClient;
import org.apache.hadoop.hive.metastore.api.Database;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
import org.apache.hadoop.hive.metastore.api.Order;
import org.apache.hadoop.hive.metastore.api.Partition;
import org.apache.hadoop.hive.metastore.api.SerDeInfo;
import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
import org.apache.hadoop.hive.metastore.api.Table;
import org.apache.hadoop.hive.ql.Driver;
import org.apache.hadoop.hive.ql.processors.CommandProcessorResponse;
import org.apache.hadoop.hive.ql.session.SessionState;
import org.apache.hadoop.hive.serde.serdeConstants;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.pig.PigServer;
import org.apache.sentry.provider.file.PolicyFile;
import org.apache.sentry.tests.e2e.hive.AbstractTestWithStaticConfiguration;
import org.apache.sentry.tests.e2e.hive.hiveserver.HiveServerFactory.HiveServer2Type;
import org.junit.BeforeClass;

public abstract class AbstractMetastoreTestWithStaticConfiguration extends
    AbstractTestWithStaticConfiguration {

  @BeforeClass
  public static void setupTestStaticConfiguration() throws Exception {
    useSentryService = true;
    clearDbPerTest = false;
    testServerType = HiveServer2Type.InternalMetastore.name();
    AbstractTestWithStaticConfiguration.setupTestStaticConfiguration();
  }

  protected static void writePolicyFile(PolicyFile policyFile) throws Exception {
    policyFile.write(context.getPolicyFile());
  }

  public static PolicyFile setAdminOnServer1(String adminGroup)
      throws Exception {
    return SentryPolicyProviderForDb.setAdminOnServer1(adminGroup,
        getSentryClient());
  }
  /**
   * create a metastore table using the given attributes
   * @param client
   * @param dbName
   * @param tabName
   * @param cols
   * @return
   * @throws Exception
   */
  public Table createMetastoreTable(HiveMetaStoreClient client, String dbName,
      String tabName, List<FieldSchema> cols) throws Exception {

    Table tbl = makeMetastoreTableObject(client, dbName, tabName, cols);
    client.createTable(tbl);
    return tbl;
  }

  public Table createMetastoreTableWithLocation(HiveMetaStoreClient client,
      String dbName, String tabName, List<FieldSchema> cols, String location)
      throws Exception {
    Table tbl = makeMetastoreTableObject(client, dbName, tabName, cols);
    tbl.getSd().setLocation(location);
    client.createTable(tbl);
    return tbl;

  }

  public Table createMetastoreTableWithPartition(HiveMetaStoreClient client,
      String dbName, String tabName, List<FieldSchema> cols,
      List<FieldSchema> partionVals) throws Exception {
    Table tbl = makeMetastoreTableObject(client, dbName, tabName, cols);
    tbl.setPartitionKeys(partionVals);
    client.createTable(tbl);
    return client.getTable(dbName, tabName);
  }

  public void addPartition(HiveMetaStoreClient client, String dbName,
      String tblName, List<String> ptnVals, Table tbl) throws Exception {
    Partition part = makeMetastorePartitionObject(dbName, tblName, ptnVals, tbl);
    client.add_partition(part);
  }

  public void addPartitionWithLocation(HiveMetaStoreClient client,
      String dbName, String tblName, List<String> ptnVals, Table tbl,
      String location) throws Exception {
    Partition part = makeMetastorePartitionObject(dbName, tblName, ptnVals,
        tbl, location);
    client.add_partition(part);
  }

  public Table makeMetastoreTableObject(HiveMetaStoreClient client,
      String dbName, String tabName, List<FieldSchema> cols) throws Exception {
    Table tbl = new Table();
    tbl.setDbName(dbName);
    tbl.setTableName(tabName);
    StorageDescriptor sd = new StorageDescriptor();
    tbl.setSd(sd);
    tbl.setParameters(new HashMap<String, String>());
    sd.setCols(cols);
    sd.setCompressed(false);
    sd.setParameters(new HashMap<String, String>());
    sd.setSerdeInfo(new SerDeInfo());
    sd.getSerdeInfo().setName(tbl.getTableName());
    sd.getSerdeInfo().setParameters(new HashMap<String, String>());
    sd.getSerdeInfo().getParameters()
        .put(serdeConstants.SERIALIZATION_FORMAT, "1");
    sd.setSortCols(new ArrayList<Order>());
    return tbl;
  }

  public Partition makeMetastorePartitionObject(String dbName, String tblName,
      List<String> ptnVals, Table tbl, String partitionLocation) {
    Partition part = makeMetastoreBasePartitionObject(dbName, tblName, ptnVals,
        tbl);
    part.getSd().setLocation(partitionLocation);
    return part;
  }

  public Partition makeMetastorePartitionObject(String dbName, String tblName,
      List<String> ptnVals, Table tbl) {
    Partition part = makeMetastoreBasePartitionObject(dbName, tblName, ptnVals,
        tbl);
    return part;
  }

  private Partition makeMetastoreBasePartitionObject(String dbName,
      String tblName, List<String> ptnVals, Table tbl) {
    Partition part4 = new Partition();
    part4.setDbName(dbName);
    part4.setTableName(tblName);
    part4.setValues(ptnVals);
    part4.setParameters(new HashMap<String, String>());
    part4.setSd(tbl.getSd().deepCopy());
    part4.getSd().setSerdeInfo(tbl.getSd().getSerdeInfo().deepCopy());
    part4.setParameters(new HashMap<String, String>());
    return part4;
  }

  public void createMetastoreDB(HiveMetaStoreClient client, String dbName)
      throws Exception {
    Database db = new Database();
    db.setName(dbName);
    client.createDatabase(db);
  }

  public void execHiveSQLwithOverlay(final String sqlStmt,
      final String userName, Map<String, String> overLay) throws Exception {
    final HiveConf hiveConf = new HiveConf();
    for (Map.Entry<String, String> entry : overLay.entrySet()) {
      hiveConf.set(entry.getKey(), entry.getValue());
    }
    UserGroupInformation clientUgi = UserGroupInformation
        .createRemoteUser(userName);
    clientUgi.doAs(new PrivilegedExceptionAction<Object>() {
      @Override
      public Void run() throws Exception {
        Driver driver = new Driver(hiveConf, userName);
        SessionState.start(new CliSessionState(hiveConf));
        CommandProcessorResponse cpr = driver.run(sqlStmt);
        if (cpr.getResponseCode() != 0) {
          throw new IOException("Failed to execute \"" + sqlStmt
              + "\". Driver returned " + cpr.getResponseCode() + " Error: "
              + cpr.getErrorMessage());
        }
        driver.close();
        SessionState.get().close();
        return null;
      }
    });
  }


  public void execHiveSQL(String sqlStmt, String userName) throws Exception {
    execHiveSQLwithOverlay(sqlStmt, userName, new HashMap<String, String>());
  }

  public void execPigLatin(String userName, final PigServer pigServer,
      final String pigLatin) throws Exception {
    UserGroupInformation clientUgi = UserGroupInformation
        .createRemoteUser(userName);
    clientUgi.doAs(
        new PrivilegedExceptionAction<Object>() {
          @Override
          public Void run() throws Exception {
            pigServer.registerQuery(pigLatin);
            return null;
          }
        });
  }

}
