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


/**
 * The PathUtil class is a utility class to provide information about various
 * znode paths. The following is the znode structure used for storing information.
 * baseDir/ClockNode
 * baseDir/TrasactionBasePath
 * baseDir/TrasactionBasePath/TableA/revisionID
 * baseDir/TrasactionBasePath/TableA/columnFamily-1
 * baseDir/TrasactionBasePath/TableA/columnFamily-1/runnningTxns
 * baseDir/TrasactionBasePath/TableA/columnFamily-1/abortedTxns
 * baseDir/TrasactionBasePath/TableB/revisionID
 * baseDir/TrasactionBasePath/TableB/columnFamily-1
 * baseDir/TrasactionBasePath/TableB/columnFamily-1/runnningTxns
 * baseDir/TrasactionBasePath/TableB/columnFamily-1/abortedTxns

 */
public class PathUtil {

    static final String DATA_DIR = "/data";
    static final String CLOCK_NODE = "/clock";

    /**
     * This method returns the data path associated with the currently
     * running transactions of a given table and column/column family.
     * @param baseDir
     * @param tableName
     * @param columnFamily
     * @return The path of the running transactions data.
     */
    static String getRunningTxnInfoPath(String baseDir, String tableName,
                                        String columnFamily) {
        String txnBasePath = getTransactionBasePath(baseDir);
        String path = txnBasePath + "/" + tableName + "/" + columnFamily
            + "/runningTxns";
        return path;
    }

    /**
     * This method returns the data path associated with the aborted
     * transactions of a given table and column/column family.
     * @param baseDir The base directory for revision management.
     * @param tableName The name of the table.
     * @param columnFamily
     * @return The path of the aborted transactions data.
     */
    static String getAbortInformationPath(String baseDir, String tableName,
                                          String columnFamily) {
        String txnBasePath = getTransactionBasePath(baseDir);
        String path = txnBasePath + "/" + tableName + "/" + columnFamily
            + "/abortData";
        return path;
    }

    /**
     * Gets the revision id node for a given table.
     *
     * @param baseDir the base dir for revision management.
     * @param tableName the table name
     * @return the revision id node path.
     */
    static String getRevisionIDNode(String baseDir, String tableName) {
        String rmBasePath = getTransactionBasePath(baseDir);
        String revisionIDNode = rmBasePath + "/" + tableName + "/idgen";
        return revisionIDNode;
    }

    /**
     * Gets the lock management node for any znode that needs to be locked.
     *
     * @param path the path of the znode.
     * @return the lock management node path.
     */
    static String getLockManagementNode(String path) {
        String lockNode = path + "_locknode_";
        return lockNode;
    }

    /**
     * This method returns the base path for the transaction data.
     *
     * @param baseDir The base dir for revision management.
     * @return The base path for the transaction data.
     */
    static String getTransactionBasePath(String baseDir) {
        String txnBaseNode = baseDir + DATA_DIR;
        return txnBaseNode;
    }

    /**
     * Gets the txn data path for a given table.
     *
     * @param baseDir the base dir for revision management.
     * @param tableName the table name
     * @return the txn data path for the table.
     */
    static String getTxnDataPath(String baseDir, String tableName) {
        String txnBasePath = getTransactionBasePath(baseDir);
        String path = txnBasePath + "/" + tableName;
        return path;
    }

    /**
     * This method returns the data path for clock node.
     *
     * @param baseDir
     * @return The data path for clock.
     */
    static String getClockPath(String baseDir) {
        String clockNode = baseDir + CLOCK_NODE;
        return clockNode;
    }
}
