# AccessConfiguration.java

    package org.apache.synapse.transport.http.access;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    import java.io.*;
    import java.util.Properties;

    /**
     * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
     *
     * WSO2 Inc. 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.
     */
    public class AccessConfiguration {
        private static final Log log = LogFactory.getLog(AccessConfiguration.class);

        private static String CONF_LOCATION = "conf.location";
        private static AccessConfiguration instance = new AccessConfiguration();
        private Properties props;

        private AccessConfiguration() {
            try {
                props = loadProperties("access-log.properties");
            } catch (Exception ignored) {}
        }

        public static AccessConfiguration getInstance() {
            return instance;
        }

        /**
         * Get an int property of access configuration.
         *
         * @param name name of the system/config property
         * @param def  default value to return if the property is not set
         * @return the value of the property to be used
         */
        public Integer getIntProperty(String name, Integer def) {
            String val = System.getProperty(name);
            if (val == null) {
                val = props.getProperty(name);
            }

            if (val != null) {
                int intVal;
                try {
                    intVal = Integer.valueOf(val);
                } catch (NumberFormatException e) {
                    log.warn("Invalid access configuration property value. " + name +
                            " must be an integer");
                    return def;
                }
                if (log.isTraceEnabled()) {
                    log.debug("Using access configuration parameter : " + name + " = " + val);
                }
                return intVal;
            }

            return def;
        }

        /**
         * Get an int of access configuration.
         *
         * @param name name of the system/config property
         * @return the value of the property, null if the property is not found
         */
        public Integer getIntProperty(String name) {
            return getIntProperty(name, null);
        }

        /**
         * Get a boolean property of access configuration.
         *
         * @param name name of the system/config property
         * @param def  default value to return if the property is not set
         * @return the value of the property to be used
         */
        public Boolean getBooleanProperty(String name, Boolean def) {
            String val = System.getProperty(name);
            if (val == null) {
                val = props.getProperty(name);
            }

            if (val != null) {
                if (log.isTraceEnabled()) {
                    log.debug("Using access configuration parameter : " + name + " = " + val);
                }
                return Boolean.valueOf(val);
            }

            return def;
        }

        /**
         * Get a Boolean property of access configuration.
         *
         * @param name name of the system/config property
         * @return the value of the property, null if the property is not found
         */
        public Boolean getBooleanProperty(String name) {
            return getBooleanProperty(name, null);
        }

        /**
         * Get a String property of access configuration.
         *
         * @param name name of the system/config property
         * @param def  default value to return if the property is not set
         * @return the value of the property to be used
         */
        public String getStringProperty(String name, String def) {
            String val = System.getProperty(name);
            if (val == null) {
                val = props.getProperty(name);
            }

            return val == null ? def : val;
        }

        /**
         * Loads the properties from a given property file path
         *
         * @param filePath Path of the property file
         * @return Properties loaded from given file
         */
        private static Properties loadProperties(String filePath) {

            Properties properties = new Properties();
            ClassLoader cl = Thread.currentThread().getContextClassLoader();

            if (log.isTraceEnabled()) {
                log.debug("Loading the file '" + filePath + "' from classpath");
            }

            InputStream in  = null;

            //if we reach to this assume that the we may have to looking to the customer provided external location for the
            //given properties

            if (System.getProperty(CONF_LOCATION) != null) {
                try {
                    in = new FileInputStream(System.getProperty(CONF_LOCATION) + File.separator + filePath);
                } catch (FileNotFoundException e) {
                    String msg = "Error loading properties from file: " + filePath;
                    log.warn(msg);
                }
            }

            if (in == null) {
                in = cl.getResourceAsStream(filePath);
                if (log.isTraceEnabled()) {
                    log.debug("Unable to load file  '" + filePath + "'");
                }

                filePath = "conf" + File.separatorChar + filePath;
                if (log.isTraceEnabled()) {
                    log.debug("Loading the file '" + filePath + "'");
                }

                in = cl.getResourceAsStream(filePath);
                if (in == null) {
                    if (log.isTraceEnabled()) {
                        log.debug("Unable to load file  '" + filePath + "'");
                    }
                }
            }
            if (in != null) {
                try {
                    properties.load(in);
                } catch (IOException e) {
                    String msg = "Error loading properties from a file at : " + filePath;
                    log.error(msg, e);
                }
            }
            return properties;
        }
    }