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

import org.apache.jena.atlas.lib.FileOps ;
import org.apache.jena.tdb.sys.SystemTDB ;

public class ConfigTest
{
    private static String testingDataRoot = "testing" ;
    // Place under target
    private static final String testingDir = "target/tdb-testing" ;
    private static final String testingDirDB = "target/tdb-testing/DB" ;
    static boolean nonDeleteableMMapFiles = SystemTDB.isWindows ;
    
    static boolean initialized = false ; 
    
    private static void init()
    {
        FileOps.ensureDir("target") ;
        FileOps.ensureDir(testingDir) ;
        FileOps.ensureDir(testingDirDB) ;
        initialized = true ;
    }
    
    private static int count = 0 ;

    public static void setTestingDataRoot(String dir) { testingDataRoot = dir ; }
    public static String getTestingDataRoot() { return testingDataRoot ; }
    
    /** return a directory */ 
    public static final String getCleanDir() {
        init() ;
        String dir = nonDeleteableMMapFiles ? getTestingDirUnique() : getTestingDirDB() ;
        FileOps.ensureDir(dir); 
        FileOps.clearDirectory(dir) ;
        return dir ;
    }
    /** Get a empty directory name that has not been used before in this JVM */
    
    private static final String getTestingDirUnique()
    {
        init() ;
    	String dn = testingDir+"/D-"+(++count) ;
    	FileOps.ensureDir(dn) ;
    	FileOps.clearDirectory(dn) ;
    	return dn ; 
    }
    
    public static final String getTestingDir()
    {
        init() ;
        return testingDir ;
    }
    
    public static final void deleteTestingDir()
    {
        if ( ! FileOps.exists(testingDir) )
            return ;
        deleteTestingDirDB() ;
        FileOps.clearDirectory(testingDir) ;
        FileOps.deleteSilent(testingDir) ;
    }

    public static final String getTestingDirDB()
    {
        init() ;
        FileOps.ensureDir(testingDirDB) ;
        return testingDirDB ;
    }
    
    public static final void deleteTestingDirDB()
    {
        if ( ! FileOps.exists(testingDirDB) )
            return ;
        FileOps.clearDirectory(testingDirDB) ;
        FileOps.deleteSilent(testingDirDB) ;
    }

}
