/*
 * Copyright (C) 2011 Citrix Systems, Inc.  All rights reserved.
 * 
 * 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 com.cloud.bridge.util;

import java.io.File;
import java.net.URL;

import javax.servlet.ServletContext;

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.HTTPConstants;


/**
 h* @author Kelven Yang
 */
public class ConfigurationHelper {
	
	private static String configPath;
	
	public static void preConfigureConfigPathFromServletContext(ServletContext context){
    	String servletConficPath = context.getRealPath("/");
    	preSetConfigPath(servletConficPath + File.separator + "WEB-INF" + File.separator + "classes");
	}
	
	public static void preSetConfigPath(String path){
		configPath=path;
	}
	
	public static File findConfigurationFile(String name) {

	if(configPath!=null){
    	File file = new File(configPath + File.separator + name);
        if (file.exists()) {
        	return file;
        }
	}
	ServletContext context = getServletContext();
	if(context!=null){
		String newPath = context.getRealPath("/");
        	File file = new File(newPath + File.separator + "WEB-INF" + File.separator + "classes" + File.separator + name);
	        if (file.exists()) {
			return file;
		}

	}
	String newPath = "conf" + (name.startsWith(File.separator) ? "" : "/") + name;
        URL url = ClassLoader.getSystemResource(newPath);
        if (url != null) {
            return new File(url.getFile());
        }
		
        // if running under Tomcat
        newPath = System.getenv("CATALINA_BASE");
        
        if (newPath == null) {
        	newPath = System.getProperty("catalina.base");
        }
        
        if (newPath == null) {
        	newPath = System.getenv("CATALINA_HOME");
        }
        
        if (newPath == null) {
            return null;
        }
        
        File file = new File(newPath + File.separator + "conf" + File.separator + name);
        if (file.exists()) {
            return file;
        }
        return file;
	}

	public static ServletContext getServletContext()
	{
		try{
			MessageContext mc = MessageContext.getCurrentMessageContext();
			if(mc!=null){
				return (ServletContext) mc.getProperty(HTTPConstants.MC_HTTP_SERVLETCONTEXT);
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}



}
