Changeset 26912

Show
Ignore:
Timestamp:
21.02.2013 14:04:36 (7 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.

Files:
1 modified

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