Ignore:
Timestamp:
2013-02-21T14:04:36+13:00 (11 years ago)
Author:
davidb
Message:

Some adjustments to code, focusing on use of openDatabase() and closeDatabase(). Some of the changes a general spruce up, but main change triggered by needing a cleanUp function that ensures the Derby database is really shutdown when the servlet stops. Previous to this change, we could get warnings about a memory leak in catalina.out caused by threads (e.g. [derby.antiGC]) started by /greenstone3 servlet but not stopped.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/Authentication.java

    r26425 r26912  
    127127    protected static final String GET_USER_INFORMATION_SERVICE = "GetUserInformation";
    128128
    129     protected DerbyWrapper _derbyWrapper = null;
     129    protected static DerbyWrapper _derbyWrapper = null;
     130        protected static boolean _derbyWrapperDoneForcedShutdown = false;
    130131
    131132    protected String _recaptchaPrivateKey = null;
     
    135136    public Authentication()
    136137    {
     138    }
     139
     140        public void cleanUp() {
     141
     142        super.cleanUp();
     143
     144        if (!_derbyWrapperDoneForcedShutdown) {     
     145
     146        // This boolean is used to ensure we always shutdown the derby server, even if it is never
     147        // used by the Authentication server.  This is because the Tomcat greenstone3.xml
     148        // config file also specifies a connection to the database, which can result in the
     149        // server being initialized when the servlet is first accessed.  Note also,
     150        // Authentication is a ServiceRack, meaning cleanUp() is called for each service
     151        // supported, however we only need to shutdown the Derby server once.  Again
     152        // this boolean variable helps achieve this.
     153
     154        logger.info("Authentication Service performing forced shutdown of Derby Server ...");
     155       
     156        DerbyWrapper.shutdownDatabaseServer();
     157        _derbyWrapper = null;
     158        _derbyWrapperDonwForcedShutdown = true;
     159
    137160    }
    138161
     
    254277        }
    255278
    256         DerbyWrapper dbWrapper = new DerbyWrapper();
    257 
    258         String usersDB_dir = this.site_home + File.separatorChar + "etc" + File.separatorChar + "usersDB";
    259         dbWrapper.connectDatabase(usersDB_dir, true);
    260 
    261         UserQueryResult userQueryResult;
     279        openDatabase();
     280
    262281        try
    263282        {
    264             userQueryResult = dbWrapper.findUser(username);
     283                UserQueryResult userQueryResult = _derbyWrapper.findUser(username);
     284           
    265285            Vector<UserTermInfo> terms = userQueryResult.getUserTerms();
    266286
     
    268288            {
    269289                GSXML.addError(this.doc, result, _errorMessageMap.get(ERROR_REQUESTED_USER_NOT_FOUND));
     290                closeDatabase();
    270291                return result;
    271292            }
     
    292313            ex.printStackTrace();
    293314        }
     315
     316
     317        closeDatabase();
    294318
    295319        return result;
     
    803827    private void checkAdminUserExists()
    804828    {
    805         if (_derbyWrapper == null)
    806         {
    807             openDatabase();
    808         }
     829            openDatabase();
    809830
    810831        UserQueryResult userQueryResult = _derbyWrapper.findUser(null, null);
    811         closeDatabase();
    812832
    813833        if (userQueryResult != null)
     
    835855    private boolean openDatabase()
    836856    {
     857        if (_derbyWrapper == null) {
    837858        _derbyWrapper = new DerbyWrapper();
    838859
     
    860881            _derbyWrapper.connectDatabase(usersDB_dir, false);
    861882        }
    862         return true;
     883        }
     884        return true;
    863885    }
    864886
     
    873895
    874896    private int addUserInformationToNode(String username, Element serviceNode)
    875     {
    876         if (_derbyWrapper == null)
    877         {
    878             openDatabase();
    879         }
     897    {       
     898            openDatabase();
    880899
    881900        UserQueryResult userQueryResult = _derbyWrapper.findUser(username, null);
    882         closeDatabase();
    883901
    884902        if (userQueryResult != null)
     
    901919        }
    902920
    903         if (_derbyWrapper == null)
    904         {
    905             openDatabase();
    906         }
     921        openDatabase();
    907922
    908923        boolean success = _derbyWrapper.deleteUser(username);
     924
     925        if (success)
     926        {
     927            closeDatabase();
     928            return NO_ERROR;
     929        }
     930
    909931        closeDatabase();
    910 
    911         if (success)
    912         {
    913             return NO_ERROR;
    914         }
    915 
    916932        return ERROR_REMOVING_USER;
    917933    }
     
    919935    private int addUser(String newUsername, String newPassword, String newGroups, String newStatus, String newComment, String newEmail)
    920936    {
    921         if (_derbyWrapper == null)
    922         {
    923             openDatabase();
    924         }
     937            openDatabase();
    925938
    926939        newGroups = newGroups.replaceAll(" ", "");
     
    928941        //Check if the user already exists
    929942        UserQueryResult userQueryResult = _derbyWrapper.findUser(newUsername, null);
     943
    930944        if (userQueryResult != null)
    931945        {
     
    943957            }
    944958        }
     959
    945960        closeDatabase();
    946961        return NO_ERROR;
     
    949964    private boolean checkUserExists(String username)
    950965    {
    951         if (_derbyWrapper == null)
    952         {
    953             openDatabase();
    954         }
     966            boolean check_status = false;
     967
     968        openDatabase();
    955969
    956970        try
     
    960974            if (result != null)
    961975            {
    962                 return true;
    963             }
    964             else
    965             {
    966                 return false;
     976                check_status = true;
    967977            }
    968978
     
    970980        catch (Exception ex)
    971981        {
    972             return false;
    973         }
    974         finally
    975         {
    976             closeDatabase();
    977         }
     982            // some error occurred accessing the database
     983            ex.printStackTrace();
     984        }
     985
     986        closeDatabase();
     987        return check_status;
    978988    }
    979989
    980990    private String retrieveDataForUser(String username, String dataType)
    981991    {
    982         if (_derbyWrapper == null)
    983         {
    984             openDatabase();
    985         }
    986 
    987         String password = null;
     992            openDatabase();
     993
     994        String data = null;
    988995
    989996        try
     
    9961003                if (dataType.equals("password"))
    9971004                {
    998                     return ((UserTermInfo) userInfo.get(i)).password;
     1005                    data = ((UserTermInfo) userInfo.get(i)).password;
     1006                    break;
    9991007                }
    10001008                else if (dataType.equals("groups"))
    10011009                {
    1002                     return ((UserTermInfo) userInfo.get(i)).groups;
     1010                    data = ((UserTermInfo) userInfo.get(i)).groups;
     1011                    break;
    10031012                }
    10041013                else if (dataType.equals("status"))
    10051014                {
    1006                     return ((UserTermInfo) userInfo.get(i)).accountstatus;
     1015                    data = ((UserTermInfo) userInfo.get(i)).accountstatus;
     1016                    break;
    10071017                }
    10081018                else if (dataType.equals("comment"))
    10091019                {
    1010                     return ((UserTermInfo) userInfo.get(i)).comment;
     1020                    data = ((UserTermInfo) userInfo.get(i)).comment;
     1021                    break;
    10111022                }
    10121023                else if (dataType.equals("email"))
    10131024                {
    1014                     return ((UserTermInfo) userInfo.get(i)).email;
     1025                    data = ((UserTermInfo) userInfo.get(i)).email;
     1026                    break;
    10151027                }
    10161028            }
     
    10221034
    10231035        closeDatabase();
    1024         return password;
     1036        return data;
    10251037    }
    10261038
Note: See TracChangeset for help on using the changeset viewer.