// 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
// 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 com.cloud.utils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.log4j.Logger;

public class PropertiesUtil {
    /**
     * Searches the class path and local paths to find the config file.
     * @param path path to find.  if it starts with / then it's absolute path.
     * @return File or null if not found at all.
     */
	
    public static File findConfigFile(String path) {
        ClassLoader cl = PropertiesUtil.class.getClassLoader();
        URL url = cl.getResource(path);
        if (url != null) {
            return new File(url.getFile());
        }
        
        url =  ClassLoader.getSystemResource(path);
        if (url != null) {
            return new File(url.getFile());
        }
        
        File file = new File(path);
        if (file.exists()) {
            return file;
        }
        
        String newPath = "conf" + (path.startsWith(File.separator) ? "" : "/") + path;
        url = ClassLoader.getSystemResource(newPath);
        if (url != null) {
            return new File(url.getFile());
        }
        
        url = cl.getResource(newPath);
        if (url != null) {
            return new File(url.getFile());
        }
        
        newPath = "conf" + (path.startsWith(File.separator) ? "" : File.separator) + path;
        file = new File(newPath);
        if (file.exists()) {
            return file;
        }
        
        newPath = System.getenv("CATALINA_HOME");
        if (newPath == null) {
        	newPath = System.getenv("CATALINA_BASE");
        }
        
        if (newPath == null) {
        	newPath = System.getProperty("catalina.home");
        }
        
        if (newPath == null) {
            return null;
        }
        
        file = new File(newPath + File.separator + "conf" + File.separator + path);
        if (file.exists()) {
            return file;
        }
        
        return null;
    }
    
    public static Map<String, Object> toMap(Properties props) {
        Set<String> names = props.stringPropertyNames();
        HashMap<String, Object> map = new HashMap<String, Object>(names.size());
        for (String name : names) {
            map.put(name, props.getProperty(name));
        }
        
        return map;
    }
    
    /*
     * Returns an InputStream for the given resource 
     * This is needed to read the files within a jar in classpath.
     */
    public static InputStream openStreamFromURL(String path){
        ClassLoader cl = PropertiesUtil.class.getClassLoader();
        URL url = cl.getResource(path);
        if (url != null) {
             try{
                 InputStream stream = url.openStream();
                 return stream;
            } catch (IOException ioex) {
                return null;
            }
        }
        return null;
    }
}

@@ -834,16 +834,86 @@
 o.File;%0A
+import java.io.FileNotFoundException;%0Aimport java.io.FileInputStream;%0A
 import j
@@ -1144,16 +1144,99 @@
 sUtil %7B%0A
+    private static final Logger s_logger = Logger.getLogger(PropertiesUtil.class);%0A
     /**%0A
@@ -3917,11 +3917,1861 @@
 l;%0A    %7D
+%0A%0A    // Returns key=value pairs by parsing a commands.properties/config file%0A    // with syntax; key=cmd;value (with this syntax cmd is stripped) and key=value%0A    public static Map%3CString, String%3E processConfigFile(String%5B%5D configFiles) %7B%0A        Map%3CString, String%3E configMap = new HashMap%3CString, String%3E();%0A        Properties preProcessedCommands = new Properties();%0A        for (String configFile : configFiles) %7B%0A            File commandsFile = findConfigFile(configFile);%0A            if (commandsFile != null) %7B%0A                try %7B%0A                    preProcessedCommands.load(new FileInputStream(commandsFile));%0A                %7D catch (FileNotFoundException fnfex) %7B%0A                    // in case of a file within a jar in classpath, try to open stream using url%0A                    InputStream stream = PropertiesUtil.openStreamFromURL(configFile);%0A                    if (stream != null) %7B%0A                        try %7B%0A                            preProcessedCommands.load(stream);%0A                        %7D catch (IOException e) %7B%0A                            s_logger.error(%22IO Exception, unable to find properties file:%22, fnfex);%0A                        %7D%0A                    %7D else %7B%0A                        s_logger.error(%22Unable to find properites file%22, fnfex);%0A                    %7D%0A                %7D catch (IOException ioe) %7B%0A                    s_logger.error(%22IO Exception loading properties file%22, ioe);%0A                %7D%0A            %7D%0A        %7D%0A%0A        for (Object key : preProcessedCommands.keySet()) %7B%0A            String preProcessedCommand = preProcessedCommands.getProperty((String) key);%0A            int splitIndex = preProcessedCommand.lastIndexOf(%22;%22);%0A            String value = preProcessedCommand.substring(splitIndex+1);%0A            configMap.put((String)key, value);%0A        %7D%0A        return configMap;%0A    %7D
 %0A%7D%0A

Refactor process config file method in utils, return map of key=value