/*
 * Copyright 2006-2012 The Apache Software Foundation.
 *
 * Licensed 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.jdo.exectck;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Helper class that sets properties required for running the JDO TCK.
 *
 */
public class PropertyUtils {

    /**
     * Separates white space separated items from a String into Collection entries
     * Used to collect command line argument lists into a Collection
     *
     * @param names String of white space separated items
     * @param list  HashSet to contain String items
     */
    public static void string2Set(String names, Collection<String> list) {
        String[] items = names.split("[ \t\n]");
        for (String s : items) {
            list.add(s);
        }
    }

    /**
     * Separates white space separated items from a String into HashSet entries
     * Used to collect command line argument lists into a Collection
     *
     * @param names String of white space separated items
     * @param list  HashSet to contain String items
     */
    public static void string2List(String names, List<String> list) {
//        System.out.println("names are " + names);
        String[] items = names.split("[ \t\n]");
        for (String s : items) {
            list.add(s);
        }
//        System.out.println("List names are " + list.toString());
    }

    /**
     * Parses a set of config files for the mapping entry and
     * provides the mapping values in a Collection<String>.
     * @param cfglist config file names
     * @param confDir directory where config files are found
     * @param mappings object to containg mapping values
     */
    public static void mappingsSet(Collection<String> cfglist, String confDir,
            Collection<String> mappings) {

        for (String cfg : cfglist) {
            String mapping = "";
            String confName = confDir + File.separator + cfg;

            Properties props = new Properties();
            FileInputStream fis = null;
//            System.out.println("confName is " + confName);
            try {
                fis = new FileInputStream(confName);
                props.load(fis);
                mapping = props.getProperty("jdo.tck.mapping");
//                System.out.println("Next mapping is " + mapping);
            } catch (IOException e) {
                e.printStackTrace();
                try {
                    if (fis != null) {
                        fis.close();
                    }
                } catch (IOException ex) {
                    Logger.getLogger(PropertyUtils.class.getName()).log(Level.SEVERE, null, ex);
                }
                return;
            }

            mappings.add(mapping);
        }
    }

    /*
     * Open a properties file and return a Properties object
     */
    public static Properties getProperties(String fname){
        Properties props = new Properties();
        FileInputStream fis = null;
            try {
                fis = new FileInputStream(new File(fname));
                props.load(fis);
            } catch (IOException e) {
                e.printStackTrace();
                try {
                    if (fis != null) {
                        fis.close();
                    }
                } catch (IOException ex) {
                    Logger.getLogger(PropertyUtils.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        return props;
    }

    /*
     * Set the value of key if found in properties.
     */
    public static void setSysProperty(Properties properties, String key, String newkey) {
        String value = properties.getProperty("key");
        if (value != null) {
            System.setProperty(newkey, value);
        }
    }

    public static void setSysProperty(Properties properties, String key) {
        setSysProperty(properties, key, key);
    }
}
