com.smartmarmot.orabbix.Configurator.java Source code

Java tutorial

Introduction

Here is the source code for com.smartmarmot.orabbix.Configurator.java

Source

/*
 * Copyright (C) 2010 Andrea Dalle Vacche.
 * 
 * This file is part of orabbix.
 *
 * orabbix is free software: you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * orabbix is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * orabbix. If not, see <http://www.gnu.org/licenses/>.
 */

package com.smartmarmot.orabbix;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

import org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS;
import org.apache.commons.dbcp.datasources.SharedPoolDataSource;
import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Level;

import com.smartmarmot.common.SmartLogger;
import com.smartmarmot.common.db.DBConn;

public class Configurator {
    private static Properties _props;

    protected static Properties getPropsFromFile(String _filename) {
        try {
            verifyConfig();
            Properties propsq = new Properties();
            FileInputStream fisq;
            if (_filename != "" && _filename != null) {
                File queryFile = new File(_filename);
                fisq = new FileInputStream(new java.io.File(queryFile.getAbsoluteFile().getCanonicalPath()));
                queryFile = null;
                SmartLogger.logThis(Level.DEBUG, "Loaded the properties from " + _filename);
                propsq.load(fisq);
                fisq.close();
                return propsq;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            SmartLogger.logThis(Level.ERROR, "Error on Configurator reading properties file getPropsFromFile("
                    + _filename + ") " + e.getMessage());
            return null;
        }
        return null;
    }

    protected static Query[] getQueries(Properties _propsq) throws Exception {
        return getQueries(Constants.QUERY_LIST, _propsq);
    }

    private static Query[] getQueries(String parameter, Properties _propsq) throws Exception {
        try {
            StringTokenizer stq = new StringTokenizer(_propsq.getProperty(parameter), Constants.DELIMITER);
            String[] QueryLists = new String[stq.countTokens()];
            int count = 0;
            while (stq.hasMoreTokens()) {
                String token = stq.nextToken().toString().trim();
                QueryLists[count] = token;
                count++;
            }

            Collection<Query> Queries = new ArrayList<Query>();
            for (int i = 0; i < QueryLists.length; i++) {
                try {
                    Query q = getQueryProperties(_propsq, QueryLists[i]);
                    Queries.add(q);
                } catch (Exception e1) {
                    SmartLogger.logThis(Level.ERROR,
                            "Error on Configurator on reading query " + QueryLists[i] + e1);
                    SmartLogger.logThis(Level.INFO, "Query " + QueryLists[i] + " skipped due to error " + e1);

                }
            }
            Query[] queries = (Query[]) Queries.toArray(new Query[0]);
            return queries;
        } catch (Exception ex) {

            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator on reading properties file " + _propsq.toString() + " getQueries("
                            + parameter + "," + _propsq.toString() + ") " + ex.getMessage());
            return null;
        }

    }

    private static Query getQueryProperties(Properties _propsq, String _queryName) throws Exception {
        try {

            String query = "";
            try {
                query = new String(_propsq.getProperty(_queryName + "." + Constants.QUERY_POSTFIX));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.ERROR, "Error while getting " + _queryName + "." + Constants.QUERY_POSTFIX
                        + " " + ex.getMessage());
            }

            String noDataFound = "";
            try {
                noDataFound = new String(_propsq.getProperty(_queryName + "." + Constants.QUERY_NO_DATA_FOUND));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_NO_DATA_FOUND
                        + " null or not present " + ex.getMessage());
            }
            String raceCondQuery = "";
            try {
                raceCondQuery = new String(_propsq.getProperty(_queryName + "." + Constants.RACE_CONDITION_QUERY));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.RACE_CONDITION_QUERY
                        + " null or not present " + ex.getMessage());
            }
            String raceCondValue = "";
            try {
                raceCondValue = new String(_propsq.getProperty(_queryName + "." + Constants.RACE_CONDITION_VALUE));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.RACE_CONDITION_VALUE
                        + " null or not present " + ex.getMessage());
            }
            /**
             * set Period if not defined period =2 min.
             */
            int period = -1;
            try {
                period = new Integer(_propsq.getProperty(_queryName + "." + Constants.QUERY_PERIOD));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_PERIOD
                        + " null or not present " + ex.getMessage());
                try {
                    period = new Integer(_propsq.getProperty(Constants.QUERY_DEFAULT_PERIOD));
                } catch (Exception ex1) {
                    SmartLogger.logThis(Level.DEBUG, "Note: " + Constants.QUERY_DEFAULT_PERIOD
                            + " null or not present using default values 2 min.");
                    period = 2;
                }
            }

            Boolean active = true;
            try {
                String active_str = _propsq.getProperty(_queryName + "." + Constants.QUERY_ACTIVE);
                if (active_str != null) {
                    if (active_str.equalsIgnoreCase("false")) {
                        active = false;
                    }
                }
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_ACTIVE
                        + " null or not present " + ex.getMessage());
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_ACTIVE
                        + " null or not present using default values TRUE");
            }

            Boolean trim = true;
            try {
                String trim_str = _propsq.getProperty(_queryName + "." + Constants.QUERY_TRIM);
                if (trim_str != null) {
                    if (trim_str.equalsIgnoreCase("false")) {
                        trim = false;
                    }
                }
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_TRIM
                        + " null or not present " + ex.getMessage());
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_TRIM
                        + " null or not present using default values TRUE");
            }

            Boolean space = true;
            try {
                String space_str = _propsq.getProperty(_queryName + "." + Constants.QUERY_SPACE);
                if (space_str != null) {
                    if (space_str.equalsIgnoreCase("false")) {
                        space = false;
                    }
                }
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_SPACE
                        + " null or not present " + ex.getMessage());
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_SPACE
                        + " null or not present using default values TRUE");
            }

            List<Integer> excludeColumns = new ArrayList<Integer>();
            try {
                String excludeColumnsList = new String(
                        _propsq.getProperty(_queryName + "." + Constants.QUERY_EXCLUDE_COLUMNS));

                StringTokenizer st = new StringTokenizer(excludeColumnsList, Constants.DELIMITER);
                while (st.hasMoreTokens()) {
                    String token = st.nextToken().toString();
                    Integer tmpInteger = new Integer(token);
                    excludeColumns.add(tmpInteger);
                }
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "." + Constants.QUERY_EXCLUDE_COLUMNS
                        + " error " + ex.getMessage());
            }

            List<Integer> raceExcludeColumns = new ArrayList<Integer>();
            try {
                String excludeColumnsList = new String(
                        _propsq.getProperty(_queryName + "." + Constants.RACE_CONDITION_EXCLUDE_COLUMNS));

                StringTokenizer st = new StringTokenizer(excludeColumnsList, Constants.DELIMITER);
                while (st.hasMoreTokens()) {
                    String token = st.nextToken().toString();
                    Integer tmpInteger = new Integer(token);
                    excludeColumns.add(tmpInteger);
                }
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG, "Note: " + _queryName + "."
                        + Constants.RACE_CONDITION_EXCLUDE_COLUMNS + " error " + ex.getMessage());
            }

            List<String> itemColumns = new ArrayList<String>();
            try {
                String itemColumnsList = new String(
                        _propsq.getProperty(_queryName + "." + Constants.QUERY_ITEM_COLUMNS));

                StringTokenizer st = new StringTokenizer(itemColumnsList, Constants.DELIMITER);
                while (st.hasMoreTokens()) {
                    String token = st.nextToken().toString();
                    itemColumns.add(token);
                    space = true;
                }
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG,
                        "Note: " + _queryName + "." + Constants.QUERY_ITEM_COLUMNS + " error " + ex.getMessage());
            }

            Query q = new Query(query, _queryName, noDataFound, raceCondQuery, raceCondValue, period, active, trim,
                    space, excludeColumns, raceExcludeColumns, itemColumns);

            return q;
        } catch (Exception ex) {

            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator on getQueryProperties(" + _propsq.toString() + ") " + ex.getMessage());
            return null;
        }
    }

    /*protected  Query[] refresh(Query[] _myquery, String _prpFile,String _extraPrpFile) {
       if (_prpFile!=null){
     Properties _prp = getPropsFromFile(_prpFile);
     Query[] q = Configurator.getQueries(_prp);
        
         
         
     _prp = getPropsFromFile(_extraPrpFile);
     Query[] q = Configurator.getQueries(_prp);
         
         
     Configurator.getQueryProperties(_prpFile, q);
       }
           
           
       /*Properties _prp = getPropsFromFile(_prpFile);
       for (int i = 0; i < _myquery.length; i++) {
     try {
        Query qnew = Configurator.getQueryProperties(_prp, _myquery[i]
              .getName());
        if (!_myquery[i].getSQL().equalsIgnoreCase(qnew.getSQL())) {
           _myquery[i].setSql(qnew.getSQL());
           SmartLogger.logThis(Level.INFO, "Statement changed on query "
                 + _myquery[i].getName() + " new statement ->"
                 + qnew.getSQL());
        }
        if ((_myquery[i].getActive().equals(true) && qnew.getActive()
              .equals(false))
              || (_myquery[i].getActive().equals(false) && qnew
                    .getActive().equals(true))) {
        
           _myquery[i].setActive(qnew.getActive());
           SmartLogger.logThis(Level.INFO, "Status of query "
                 + _myquery[i].getName() + " has changed ->"
                 + qnew.getActive());
        }
        if (_myquery[i].getPeriod() != qnew.getPeriod()) {
           _myquery[i].setPeriod(qnew.getPeriod());
           if (qnew.getPeriod() > 0) {
              Date now = new Date(System.currentTimeMillis());
              Date newNextRun = new Date(now.getTime()
                    + (qnew.getPeriod() * 1000 * 60));
              _myquery[i].setNextrun(newNextRun);
           }
           SmartLogger.logThis(Level.INFO, "Period of query "
                 + _myquery[i].getName() + " has changed ->"
                 + qnew.getPeriod());
        }
        if (!_myquery[i].getRaceQuery().equalsIgnoreCase(
              qnew.getRaceQuery())) {
           _myquery[i].setRaceQuery(qnew.getRaceQuery());
           SmartLogger.logThis(Level.INFO, "RaceQuery for query "
                 + _myquery[i].getName() + " has changed ->"
                 + qnew.getRaceQuery());
        }
        if (!_myquery[i].getRaceValue().equalsIgnoreCase(
              qnew.getRaceValue())) {
           _myquery[i].setRaceQuery(qnew.getRaceQuery());
           SmartLogger.logThis(Level.INFO, "RaceValue of query "
                 + _myquery[i].getName() + " has changed ->"
                 + qnew.getRaceValue());
        }
     } catch (Exception e) {
        // TODO Auto-generated catch block
        SmartLogger.logThis(Level.ERROR,
              "Error on Configurator while getting getQueryProperties( "
                    + _prp + " , " + _myquery[i].getName()
                    + ") Error " + e.getMessage());
     }
       }
       return _myquery;
    }*/

    private static void verifyConfig() {
        if (_props == null) {
            throw new IllegalArgumentException("empty properties");
        }

    }

    public Configurator(String _url) throws IOException {
        Properties props = new Properties();

        FileInputStream fis;
        try {
            try {
                File configFile = new File(_url);
                fis = new FileInputStream(new java.io.File(configFile.getAbsoluteFile().getCanonicalPath()));
                props.load(fis);
                fis.close();
            } catch (Exception e) {
                SmartLogger.logThis(Level.ERROR,
                        "Error on Configurator while retriving configuration file " + _url + " " + e.getMessage());
            }
            _props = props;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            SmartLogger.logThis(Level.ERROR, "Error on Configurator " + e.getMessage());
        }
    }

    private DBConn getConnection(String dbName) throws Exception {
        try {
            verifyConfig();

            SmartLogger.logThis(Level.DEBUG, "getConnection for database " + dbName);
            String url = "";
            try {
                url = new String(_props.getProperty(dbName + "." + Constants.CONN_URL));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.ERROR, "Error on Configurator getConnection while getting " + dbName + "."
                        + Constants.CONN_URL + " " + ex.getMessage());
            }

            String uname = "";
            try {
                uname = new String(_props.getProperty(dbName + "." + Constants.CONN_USERNAME));
            } catch (Exception ex) {
                try {
                    SmartLogger.logThis(Level.DEBUG, "Error on Configurator getConnection while getting " + dbName
                            + "." + Constants.CONN_USERNAME + " " + ex.getMessage());

                    uname = new String(_props.getProperty(Constants.CONN_DEFAULT_USERNAME));
                } catch (Exception ex1) {
                    SmartLogger.logThis(Level.ERROR, "Error on Configurator getConnection while getting "
                            + Constants.CONN_DEFAULT_USERNAME + " " + ex1.getMessage());
                }
            }
            String password = "";
            try {
                password = new String(_props.getProperty(dbName + "." + Constants.CONN_PASSWORD));
            } catch (Exception ex) {
                try {
                    SmartLogger.logThis(Level.DEBUG, "Error on Configurator getConnection while getting " + dbName
                            + "." + Constants.CONN_PASSWORD + " " + ex.getMessage());
                    password = new String(_props.getProperty(Constants.CONN_DEFAULT_PASSWORD));
                } catch (Exception ex1) {
                    SmartLogger.logThis(Level.ERROR, "Error on Configurator getConnection while getting " + dbName
                            + "." + Constants.CONN_PASSWORD + " " + ex.getMessage());
                }
            }
            DriverAdapterCPDS cpds = new DriverAdapterCPDS();
            cpds.setDriver(Constants.ORACLE_DRIVER);
            cpds.setUrl(url.toString());
            cpds.setUser(uname.toString());
            cpds.setPassword(password.toString());
            SharedPoolDataSource tds = new SharedPoolDataSource();
            tds.setConnectionPoolDataSource(cpds);
            // tds.setMaxActive(5);
            Integer maxActive = new Integer(5);
            try {
                maxActive = new Integer(_props.getProperty(dbName + "." + Constants.CONN_MAX_ACTIVE));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG,
                        "Note: " + dbName + "." + Constants.CONN_MAX_ACTIVE + " " + ex.getMessage());
                try {
                    maxActive = new Integer(
                            _props.getProperty(Constants.DATABASES_LIST + "." + Constants.CONN_MAX_ACTIVE));
                } catch (Exception e) {
                    SmartLogger.logThis(Level.WARN, "Note: " + Constants.DATABASES_LIST + "."
                            + Constants.CONN_MAX_ACTIVE + " " + e.getMessage());
                    SmartLogger.logThis(Level.WARN, "Warning I will use default value " + maxActive);
                }
            }
            tds.setMaxActive(maxActive.intValue());
            Integer maxWait = new Integer(100);
            try {
                maxWait = new Integer(_props.getProperty(dbName + "." + Constants.CONN_MAX_WAIT));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG,
                        "Note: " + dbName + "." + Constants.CONN_MAX_WAIT + " " + ex.getMessage());
                try {
                    maxWait = new Integer(
                            _props.getProperty(Constants.DATABASES_LIST + "." + Constants.CONN_MAX_WAIT));
                } catch (Exception e) {
                    SmartLogger.logThis(Level.WARN, "Note: " + Constants.DATABASES_LIST + "."
                            + Constants.CONN_MAX_WAIT + " " + e.getMessage());
                    SmartLogger.logThis(Level.WARN, "Warning I will use default value " + maxWait);
                }
            }
            tds.setMaxWait(maxWait.intValue());
            Integer maxIdle = new Integer(1);
            try {
                maxIdle = new Integer(_props.getProperty(dbName + "." + Constants.CONN_MAX_IDLE));
            } catch (Exception ex) {
                SmartLogger.logThis(Level.DEBUG,
                        "Note: " + dbName + "." + Constants.CONN_MAX_IDLE + " " + ex.getMessage());
                try {
                    maxIdle = new Integer(
                            _props.getProperty(Constants.DATABASES_LIST + "." + Constants.CONN_MAX_IDLE));
                } catch (Exception e) {
                    SmartLogger.logThis(Level.WARN, "Note: " + Constants.DATABASES_LIST + "."
                            + Constants.CONN_MAX_IDLE + " " + e.getMessage());
                    SmartLogger.logThis(Level.WARN, "Warning I will use default value " + maxIdle);
                }
            }
            tds.setMaxIdle(maxIdle.intValue());

            SmartLogger.logThis(Level.INFO, "DB Pool created: " + tds);
            SmartLogger.logThis(Level.INFO, "URL=" + url.toString());
            SmartLogger.logThis(Level.INFO, "maxPoolSize=" + tds.getMaxActive());
            SmartLogger.logThis(Level.INFO, "maxIdleSize=" + tds.getMaxIdle());
            SmartLogger.logThis(Level.INFO, "maxIdleTime=" + tds.getMinEvictableIdleTimeMillis() + "ms");
            SmartLogger.logThis(Level.INFO, "poolTimeout=" + tds.getMaxWait());
            SmartLogger.logThis(Level.INFO,
                    "timeBetweenEvictionRunsMillis=" + tds.getTimeBetweenEvictionRunsMillis());
            SmartLogger.logThis(Level.INFO, "numTestsPerEvictionRun=" + tds.getNumTestsPerEvictionRun());

            tds.setValidationQuery(Constants.ORACLE_VALIDATION_QUERY);
            Connection con = null;
            con = tds.getConnection();
            PreparedStatement p_stmt = null;
            p_stmt = con.prepareStatement(Constants.ORACLE_WHOAMI_QUERY);
            ResultSet rs = null;
            rs = p_stmt.executeQuery();
            String tempStr = new String("");
            ResultSetMetaData rsmd = rs.getMetaData();
            int numColumns = rsmd.getColumnCount();
            while (rs.next()) {
                for (int r = 1; r < numColumns + 1; r++) {
                    tempStr = tempStr + rs.getObject(r).toString().trim();
                }
            }
            SmartLogger.logThis(Level.INFO, "Connected as " + tempStr);

            con.close();
            con = null;
            con = tds.getConnection();
            p_stmt = con.prepareStatement(Constants.ORACLE_DBNAME_QUERY);
            rs = p_stmt.executeQuery();
            rsmd = rs.getMetaData();
            numColumns = rsmd.getColumnCount();
            tempStr = "";
            while (rs.next()) {
                for (int r = 1; r < numColumns + 1; r++) {
                    tempStr = tempStr + rs.getObject(r).toString().trim();
                }
            }
            SmartLogger.logThis(Level.INFO, "--------- on Database -> " + tempStr);
            con.close();
            con = null;
            DBConn mydbconn = new DBConn(tds, dbName.toString());
            return mydbconn;

        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator for database " + dbName + " -->" + ex.getMessage());
            return null;
        }
    }

    public DBConn[] getConnections() throws Exception {
        try {
            verifyConfig();
            String[] DatabaseList = getDBList();
            Collection<DBConn> connections = new ArrayList<DBConn>();
            for (int i = 0; i < DatabaseList.length; i++) {
                DBConn dbc = this.getConnection(DatabaseList[i]);
                if (dbc != null) {
                    connections.add(dbc);
                } else {
                    SmartLogger.logThis(Level.INFO, "This Database " + DatabaseList[i] + " removed");
                }
            }
            // fis.close();
            DBConn[] connArray = (DBConn[]) connections.toArray(new DBConn[0]);
            return connArray;
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR, "Error on Configurator getConnections " + ex.getMessage());
            return null;
        }
    }

    public String[] getDBList() throws Exception {
        try {
            verifyConfig();
            String dblist = "";
            try {
                dblist = new String(_props.getProperty(Constants.DATABASES_LIST));
            } catch (Exception e) {
                SmartLogger.logThis(Level.ERROR, "Error on Configurator while retriving the databases list "
                        + Constants.DATABASES_LIST + " " + e);
            }

            StringTokenizer st = new StringTokenizer(dblist, Constants.DELIMITER);
            String[] DatabaseList = new String[st.countTokens()];
            int count = 0;
            while (st.hasMoreTokens()) {
                String token = st.nextToken().toString();
                DatabaseList[count] = token;
                count++;
            }
            // fisdb.close();
            return DatabaseList;
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR, "Error on Configurator while retriving the databases list "
                    + Constants.DATABASES_LIST + " " + ex);
            return null;
        }
    }

    public Integer getMaxThread() throws Exception {
        try {
            verifyConfig();
            return new Integer(_props.getProperty(Constants.ORABBIX_DAEMON_THREAD));
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator while retriving the " + Constants.ORABBIX_DAEMON_THREAD + " " + ex);
            return null;
        }
    }

    public String getPidFile() throws Exception {
        try {
            verifyConfig();
            String _pidfile = new String(_props.getProperty(Constants.ORABBIX_PIDFILE));
            SmartLogger.logThis(Level.INFO, "PidFile -> " + _pidfile);

            if (_pidfile == "") {
                SmartLogger.logThis(Level.ERROR, "Error retrieving pidfile from " + _props);
            }
            return _pidfile;

        } catch (Exception ex) {

            SmartLogger.logThis(Level.ERROR, "Error on Configurator getPidFile " + ex);
            return null;
        }
    }

    public static String getQueryFile() {
        String queryFile = new String(_props.getProperty(Constants.QUERY_LIST_FILE));
        return queryFile;
    }

    public static String getQueryFile(String dbName) {
        try {
            verifyConfig();
            if (_props.getProperty(dbName + "." + Constants.QUERY_LIST_FILE) != null) {
                return (_props.getProperty(dbName + "." + Constants.QUERY_LIST_FILE));
            }
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator on getQueryFile(" + dbName + ") " + ex.getMessage());
            SmartLogger.logThis(Level.WARN, "I'm going to return getQueryFile() ");
            return getQueryFile();
        }
        return null;
    }

    public static String getExtraQueryFile(String dbName) {
        try {
            verifyConfig();
            if (_props.getProperty(dbName + "." + Constants.EXTRA_QUERY_LIST_FILE) != null) {
                return (_props.getProperty(dbName + "." + Constants.EXTRA_QUERY_LIST_FILE));
            }
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator on getExtraQueryFile(" + dbName + ") " + ex.getMessage());
        }
        return null;
    }

    public Properties getQueryProp() {
        verifyConfig();
        Properties propsq = new Properties();
        try {
            FileInputStream fisq;
            String fiqp = new String(_props.getProperty(Constants.QUERY_LIST_FILE));
            File queryFile = new File(fiqp);
            fisq = new FileInputStream(new java.io.File(queryFile.getAbsoluteFile().getCanonicalPath()));
            queryFile = null;
            propsq.load(fisq);
            fisq.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            SmartLogger.logThis(Level.ERROR, "Error on Configurator  while getting " + Constants.QUERY_LIST_FILE
                    + " error -> " + e.getMessage());
            return null;
        }
        return propsq;
    }

    public Properties getQueryProp(String dbname) {
        try {
            verifyConfig();
            Properties propsq = new Properties();
            FileInputStream fisq;
            if (dbname != "" && dbname != null) {
                // logger.warn("Method called with null or empty string on Configurator "+dbname);
                File queryFile = new File(_props.getProperty(dbname + "." + Constants.QUERY_LIST_FILE));
                fisq = new FileInputStream(new java.io.File(queryFile.getAbsoluteFile().getCanonicalPath()));
                queryFile = null;
                SmartLogger.logThis(Level.DEBUG, "Debug loaded the " + dbname + "." + Constants.QUERY_LIST_FILE);
                // fisq = new FileInputStream (new java.io.File(
                // _props.getProperty(dbname+"."+Constants.QUERY_LIST_FILE)));
            } else {
                // fisq = new FileInputStream (new java.io.File(
                // _props.getProperty(Constants.QUERY_LIST_FILE)));
                SmartLogger.logThis(Level.DEBUG, "Debug I'm loading the default " + Constants.QUERY_LIST_FILE + " "
                        + dbname + " don't have it's own");
                File queryFile = new File(_props.getProperty(Constants.QUERY_LIST_FILE));
                fisq = new FileInputStream(new java.io.File(queryFile.getAbsoluteFile().getCanonicalPath()));
                queryFile = null;
            }
            propsq.load(fisq);
            fisq.close();
            return propsq;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator getting " + Constants.QUERY_LIST_FILE + " " + dbname + e.getMessage());
            return null;
        }
    }

    public String getZabbixServer() throws Exception {
        try {
            verifyConfig();
            return _props.getProperty(Constants.ZABBIX_SERVER_HOST);

        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR, "Error on Configurator while retriving zabbix server host "
                    + Constants.ZABBIX_SERVER_HOST + " or port " + Constants.ZABBIX_SERVER_PORT + " " + ex);
            return null;
        }
    }

    public int getZabbixServerPort() throws Exception {
        try {
            verifyConfig();
            Integer port = new Integer(_props.getProperty(Constants.ZABBIX_SERVER_PORT));
            return port.intValue();
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR, "Error on Configurator while retriving zabbix server port "
                    + Constants.ZABBIX_SERVER_PORT + " " + ex);
            SmartLogger.logThis(Level.WARN, "I will use the default port " + Constants.ZABBIX_SERVER_DEFAULT_PORT);
            return Constants.ZABBIX_SERVER_DEFAULT_PORT;
        }
    }

    public Hashtable<String, Integer> getZabbixServers() throws Exception {
        String zxblist = new String();
        try {
            zxblist = new String(_props.getProperty(Constants.ZABBIX_SERVER_LIST));
        } catch (Exception e) {
            SmartLogger.logThis(Level.ERROR, "Error on getZabbixServers while getting "
                    + Constants.ZABBIX_SERVER_LIST + " " + e.getMessage());
        }
        StringTokenizer st = new StringTokenizer(zxblist, Constants.DELIMITER);
        Hashtable<String, Integer> ZabbixServers = new Hashtable<String, Integer>();
        int count = 0;
        while (st.hasMoreTokens()) {
            String token = st.nextToken().toString();
            String server = new String();
            try {
                server = new String(_props.getProperty(token + "." + Constants.ZABBIX_SERVER_HOST));
            } catch (Exception e) {
                SmartLogger.logThis(Level.ERROR, "Error on getZabbixServers while getting " + token + "."
                        + Constants.ZABBIX_SERVER_HOST + " " + e.getMessage());
            }
            Integer port = new Integer(Constants.ZABBIX_SERVER_DEFAULT_PORT);
            try {
                port = new Integer(_props.getProperty(token + "." + Constants.ZABBIX_SERVER_PORT));
            } catch (Exception e) {
                SmartLogger.logThis(Level.WARN, "Warning on getZabbixServers while getting " + token + "."
                        + Constants.ZABBIX_SERVER_PORT + " " + e.getMessage());
                SmartLogger.logThis(Level.WARN, "Warning I will use the default port" + port);
            }
            ZabbixServers.put(server, port);
            count++;
        }
        // fisdb.close();
        return ZabbixServers;
    }

    public static boolean hasQueryFile(String dbName) {
        if (dbName == null) {
            return false;
        }
        try {
            verifyConfig();
            if (_props.getProperty(dbName + "." + Constants.QUERY_LIST_FILE) != null) {
                return true;
            }
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator getting" + Constants.QUERY_LIST_FILE + dbName + ex.getMessage());
            return false;
        }
        return false;
    }

    public static boolean hasExtraQueryFile(String dbName) {
        if (dbName == null) {
            return false;
        }
        try {
            verifyConfig();
            if (_props.getProperty(dbName + "." + Constants.EXTRA_QUERY_LIST_FILE) != null) {
                return true;
            }
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator getting" + Constants.EXTRA_QUERY_LIST_FILE + dbName + ex.getMessage());
            return false;
        }
        return false;
    }

    public boolean isEqualsDBList(DBConn[] _dbc) throws Exception {
        try {
            verifyConfig();

            String[] localdblist = this.getDBList();
            String[] remotedblist = new String[_dbc.length];
            for (int i = 0; i < _dbc.length; i++) {
                remotedblist[i] = _dbc[i].getName();
            }
            return ArrayUtils.isEquals(localdblist, remotedblist);
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator while comparing the databases lists on isEqualsDBList " + ex);
            return false;
        }
    }

    public DBConn[] rebuildDBList(DBConn[] _dbc) {
        try {
            verifyConfig();
            String[] localdblist = this.getDBList();
            String[] remotedblist = new String[_dbc.length];
            for (int i = 0; i < _dbc.length; i++) {
                remotedblist[i] = _dbc[i].getName();
            }

            Collection<DBConn> connections = new ArrayList<DBConn>();
            for (int j = 0; j < localdblist.length; j++) {
                if (ArrayUtils.contains(remotedblist, localdblist[j])) {
                    DBConn tmpDBConn;
                    tmpDBConn = _dbc[ArrayUtils.indexOf(remotedblist, localdblist[j])];
                    connections.add(tmpDBConn);
                }
                if (!ArrayUtils.contains(remotedblist, localdblist[j])) {
                    /*
                     * adding database
                     */
                    SmartLogger.logThis(Level.INFO, "New database founded! " + localdblist[j]);
                    DBConn tmpDBConn = this.getConnection(localdblist[j]);
                    if (tmpDBConn != null) {
                        connections.add(tmpDBConn);
                    }
                }
            }
            for (int x = 0; x < _dbc.length; x++) {
                if (!ArrayUtils.contains(localdblist, _dbc[x].getName())) {
                    SmartLogger.logThis(Level.WARN,
                            "Database " + _dbc[x].getName() + " removed from configuration file");
                    /**
                     * removing database
                     */
                    // _dbc[x].closeAll();
                    _dbc[x].getSPDS().close();
                    SmartLogger.logThis(Level.WARN, "Database " + _dbc[x].getName() + " conections closed");
                    _dbc[x] = null;
                }
            }
            DBConn[] connArray = (DBConn[]) connections.toArray(new DBConn[0]);
            return connArray;
        } catch (Exception ex) {
            SmartLogger.logThis(Level.ERROR, "Error on Configurator while retriving the databases list "
                    + Constants.DATABASES_LIST + " error:" + ex);
            return _dbc;
        }

    }

    public static Integer getSleep() throws Exception {
        try {
            verifyConfig();
            Integer sleep = new Integer(5);
            try {
                sleep = new Integer(_props.getProperty(Constants.ORABBIX_DAEMON_SLEEP));
            } catch (Exception e) {
                SmartLogger.logThis(Level.WARN, "Warning while getting " + Constants.ORABBIX_DAEMON_SLEEP
                        + " I will use the default " + sleep);
            }
            return sleep;

        } catch (Exception ex) {

            SmartLogger.logThis(Level.ERROR,
                    "Error on Configurator while retriving " + Constants.ORABBIX_DAEMON_SLEEP + " " + ex);
            return null;
        }
    }

    public static boolean propVerify(String _prop) {
        // TODO Auto-generated method stub

        if (_prop != null) {
            if (!_prop.isEmpty() && !_prop.equals("")) {
                Properties props = new Properties();
                FileInputStream fisq;
                File queryFile = new File(_prop);
                try {
                    fisq = new FileInputStream(new java.io.File(queryFile.getAbsoluteFile().getCanonicalPath()));
                    props.load(fisq);
                    fisq.close();
                    return true;
                } catch (Exception ex) {
                    SmartLogger.logThis(Level.DEBUG,
                            "Error on Configurator while checking file " + _prop + " " + ex);
                    return false;
                }
            }
        }
        return false;
    }

    public static Querybox buildQueryBoxbyDBName(String dbname) {
        String queryFile = null;
        String extraQueryFile = null;

        if (hasQueryFile(dbname)) {
            queryFile = getQueryFile(dbname);
        } else {
            queryFile = getQueryFile();
        }

        if (hasExtraQueryFile(dbname)) {
            extraQueryFile = getExtraQueryFile(dbname);
        }

        Querybox qboxtmp = new Querybox(dbname, queryFile, extraQueryFile);
        return qboxtmp;
    }

}