/*
 * Created on 10-Sep-2009
 *
 * TODO 
 */
package uk.ac.roe.wfau;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Random;

import javax.naming.Context;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.jmock.Mock;



/**
 * @author mar
 *
 */

public class DatabaseConnection {
    static Logger logger=Logger.getLogger("wsa.simple");
    static {

        try {
            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // A class not found error means the SQL driver class could not be
            // found.
            // Which means that this driver would not be available until this is
            // remedied. This flag variable will signal this to the class!
            logger.error("ImageList,SQLRetrieverThread::static(): Could not load SQLServerDriver class! "+stack2string.getString(e));
          }
          
    }
    public static Random rand= new Random();
    
    public static Connection getConnection(String [] servers, String database, String archive, HttpSession sess) {
        return  getConnection(servers,database,archive,sess,null);
    }
    public static Connection getConnection(String [] servers, String database, String dbUser, String dbPasswd, String startServer) {
        String conn=null;
        int noOfServers=servers.length;
        int server=rand.nextInt(noOfServers);
        if (startServer != null) {
            for (int i=0; i < noOfServers; i++) {
                if (servers[i].equalsIgnoreCase(startServer)) {
                    server=i;
                }
            }
        }
        
         for (int i=0; i<noOfServers;i++) {
            server=server+i;
            if (server >= noOfServers) {
                server=0;
            }
            try {
                return DriverManager.getConnection(DatabaseURL.getDatabaseURL(servers[server],database,dbUser,dbPasswd,true));
            }
            catch (SQLException se) {
                logger.error("databaseConnection ERROR "+se+" "+servers[server]+" "+database+" "+dbUser);
            }
            finally {
                logger.info("DBURL: "+DatabaseURL.getDatabaseURL(servers[server],database,dbUser,dbPasswd,true));
            }
            
        }
        
        return null;
        
    }
    public static Connection getConnection(String [] servers, String database, String archive, HttpSession sess, String startServer) {

        String dbUser=VDFSSession.getDBUser(sess,archive);
        String dbPasswd=dbUser+"pw";
        if (!WSASession.getCommunity(sess).equalsIgnoreCase(WSASchema.PRERELEASECOMMUNITY) && database.equalsIgnoreCase(WSASchema.rollingDB) && VDFSSession.getLoginBoolean(sess,archive)){
            dbUser=WSASchema.rollingDBUser;
            dbPasswd=WSASchema.rollingDBPasswd;
            database=WSASchema.actualRollingDB;
        }
        if (!WSASession.getCommunity(sess).equalsIgnoreCase(WSASchema.PRERELEASECOMMUNITY) && database.equalsIgnoreCase(VSASchema.rollingDB) && VDFSSession.getLoginBoolean(sess,archive)){
            dbUser=WSASchema.rollingDBUser;
            dbPasswd=WSASchema.rollingDBPasswd;
            database=VSASchema.actualRollingDB;
        }
        
       return getConnection(servers,database,dbUser,dbPasswd,startServer);
        
    }

    public static void main(String[] args) {
      
  
        
        String [] servers={"ramses1","ramses2"};
        for (int i=0;i<100;i++) {
            getConnection(servers,null,null,null);
        }
  
        
    }
}
