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

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.hive.metastore.Warehouse;
import org.apache.hadoop.hive.metastore.api.MetaException;
import org.apache.hadoop.hive.metastore.api.NoSuchObjectException;
import org.apache.hadoop.hive.ql.metadata.Hive;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Utility methods for tests
 */
public class HcatTestUtils {
    private static final Logger LOG = LoggerFactory.getLogger(HcatTestUtils.class);

    public static FsPermission perm007 = FsPermission.createImmutable((short) 0007); // -------rwx
    public static FsPermission perm070 = FsPermission.createImmutable((short) 0070); // ----rwx---
    public static FsPermission perm700 = FsPermission.createImmutable((short) 0700); // -rwx------
    public static FsPermission perm755 = FsPermission.createImmutable((short) 0755); // -rwxr-xr-x
    public static FsPermission perm777 = FsPermission.createImmutable((short) 0777); // -rwxrwxrwx
    public static FsPermission perm300 = FsPermission.createImmutable((short) 0300); // --wx------
    public static FsPermission perm500 = FsPermission.createImmutable((short) 0500); // -r-x------
    public static FsPermission perm555 = FsPermission.createImmutable((short) 0555); // -r-xr-xr-x

    /**
     * Returns the database path.
     */
    public static Path getDbPath(Hive hive, Warehouse wh, String dbName) throws MetaException, HiveException {
        return wh.getDatabasePath(hive.getDatabase(dbName));
    }

    /**
     * Removes all databases and tables from the metastore
     */
    public static void cleanupHMS(Hive hive, Warehouse wh, FsPermission defaultPerm)
        throws HiveException, MetaException, NoSuchObjectException {
        for (String dbName : hive.getAllDatabases()) {
            if (dbName.equals("default")) {
                continue;
            }
            try {
                Path path = getDbPath(hive, wh, dbName);
                FileSystem whFs = path.getFileSystem(hive.getConf());
                whFs.setPermission(path, defaultPerm);
            } catch (IOException ex) {
                //ignore
            }
            hive.dropDatabase(dbName, true, true, true);
        }

        //clean tables in default db
        for (String tablename : hive.getAllTables("default")) {
            hive.dropTable("default", tablename, true, true);
        }
    }

    public static void createTestDataFile(String filename, String[] lines) throws IOException {
        FileWriter writer = null;
        try {
            File file = new File(filename);
            file.deleteOnExit();
            writer = new FileWriter(file);
            for (String line : lines) {
                writer.write(line + "\n");
            }
        } finally {
            if (writer != null) {
                writer.close();
            }
        }

    }

    public static boolean isHadoop23() {
        String version = org.apache.hadoop.util.VersionInfo.getVersion();
        if (version.matches("\\b0\\.23\\..+\\b"))
            return true;
        return false;
    }
}
