diff options
Diffstat (limited to 'base/common/src/com/netscape/cmscore/dbs/KeyRepository.java')
-rw-r--r-- | base/common/src/com/netscape/cmscore/dbs/KeyRepository.java | 131 |
1 files changed, 71 insertions, 60 deletions
diff --git a/base/common/src/com/netscape/cmscore/dbs/KeyRepository.java b/base/common/src/com/netscape/cmscore/dbs/KeyRepository.java index 3b2186b23..3e7759772 100644 --- a/base/common/src/com/netscape/cmscore/dbs/KeyRepository.java +++ b/base/common/src/com/netscape/cmscore/dbs/KeyRepository.java @@ -22,6 +22,10 @@ import java.security.PublicKey; import java.util.Date; import java.util.Enumeration; import java.util.Vector; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; import netscape.security.x509.X500Name; @@ -43,14 +47,16 @@ import com.netscape.certsrv.dbs.repository.IRepository; * A class represents a Key repository. This is the container of * archived keys. * <P> - * + * * @author thomask * @version $Revision$, $Date$ */ public class KeyRepository extends Repository implements IKeyRepository { - public KeyStatusUpdateThread mKeyStatusUpdateThread = null; - protected IDBSubsystem mDBService = null; + public KeyStatusUpdateTask mKeyStatusUpdateTask; + protected IDBSubsystem mDBService; + + IRepository requestRepository; /** * Internal constants @@ -61,7 +67,7 @@ public class KeyRepository extends Repository implements IKeyRepository { * Constructs a key repository. It checks if the key repository * does exist. If not, it creates the repository. * <P> - * + * * @param service db service * @exception EBaseException failed to setup key repository */ @@ -146,26 +152,44 @@ public class KeyRepository extends Repository implements IKeyRepository { } public void setKeyStatusUpdateInterval(IRepository requestRepo, int interval) { + CMS.debug("In setKeyStatusUpdateInterval " + interval); + + this.requestRepository = requestRepo; + + // stop running task + if (mKeyStatusUpdateTask != null) { + mKeyStatusUpdateTask.stop(); + } + // don't run the thread if serial management is disabled. - if ((interval == 0) || (!mDBService.getEnableSerialMgmt())) { - CMS.debug("In setKeyStatusUpdateInterval interval = 0" + interval); - if (mKeyStatusUpdateThread != null) { - mKeyStatusUpdateThread.stop(); - } + if (interval == 0 || !mDBService.getEnableSerialMgmt()) { + CMS.debug("In setKeyStatusUpdateInterval interval = 0"); return; } - CMS.debug("In setKeyStatusUpdateInterval mKeyStatusUpdateThread " + mKeyStatusUpdateThread); - if (mKeyStatusUpdateThread == null) { - CMS.debug("In setKeyStatusUpdateInterval about to create KeyStatusUpdateThread "); - mKeyStatusUpdateThread = new KeyStatusUpdateThread(this, requestRepo, "KeyStatusUpdateThread"); - mKeyStatusUpdateThread.setInterval(interval); - mKeyStatusUpdateThread.start(); - } else { - CMS.debug("In setKeyStatusUpdateInterval it thinks the thread is up already "); - mKeyStatusUpdateThread.setInterval(interval); - // dont do anything if we have a thread running already + CMS.debug("In setKeyStatusUpdateInterval scheduling key status update every " + interval + " seconds."); + mKeyStatusUpdateTask = new KeyStatusUpdateTask(this, interval); + mKeyStatusUpdateTask.start(); + } + + /** + * This method blocks when another thread is running + */ + public synchronized void updateKeyStatus() { + try { + CMS.debug("About to start checkRanges"); + + CMS.debug("Starting key checkRanges"); + checkRanges(); + CMS.debug("key checkRanges done"); + + CMS.debug("Starting request checkRanges"); + requestRepository.checkRanges(); + CMS.debug("request checkRanges done"); + + } catch (Exception e) { + CMS.debug("key checkRanges done: " + e.toString()); } } @@ -198,7 +222,7 @@ public class KeyRepository extends Repository implements IKeyRepository { /** * Archives a key to the repository. * <P> - * + * * @param record key record * @exception EBaseException failed to archive key */ @@ -220,7 +244,7 @@ public class KeyRepository extends Repository implements IKeyRepository { /** * Recovers an archived key by serial number. * <P> - * + * * @param serialNo serial number * @return key record * @exception EBaseException failed to recover key @@ -246,7 +270,7 @@ public class KeyRepository extends Repository implements IKeyRepository { /** * Recovers an archived key by owner name. * <P> - * + * * @param ownerName owner name * @return key record * @exception EBaseException failed to recover key @@ -368,7 +392,7 @@ public class KeyRepository extends Repository implements IKeyRepository { String result = ""; for (int i = 0; i < data.length; i++) { - result = result + "\\" + Integer.toHexString((int) data[i]); + result = result + "\\" + Integer.toHexString(data[i]); } return result; } @@ -534,53 +558,40 @@ public class KeyRepository extends Repository implements IKeyRepository { } public void shutdown() { - //if (mKeyStatusUpdateThread != null) - // mKeyStatusUpdateThread.destroy(); + if (mKeyStatusUpdateTask != null) { + mKeyStatusUpdateTask.stop(); + } } } -class KeyStatusUpdateThread extends Thread { - KeyRepository _kr = null; - IRepository _rr = null; - int _interval; +class KeyStatusUpdateTask implements Runnable { + KeyRepository repository; + int interval; - KeyStatusUpdateThread(KeyRepository kr, IRepository rr, String name) { - super(name); - CMS.debug("new KeyStatusUpdateThread"); + ScheduledExecutorService executorService; - _kr = kr; - _rr = rr; + public KeyStatusUpdateTask(KeyRepository repository, int interval) { + this.repository = repository; + this.interval = interval; } - public void setInterval(int interval) { - _interval = interval; + public void start() { + // schedule task to run immediately and repeat after specified interval + executorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { + public Thread newThread(Runnable r) { + return new Thread(r, "KeyStatusUpdateTask"); + } + }); + executorService.scheduleWithFixedDelay(this, 0, interval, TimeUnit.SECONDS); } public void run() { - CMS.debug("Inside run method of KeyStatusUpdateThread"); - - while (true) { - try { - // block the update while another thread - // (such as the CRL Update) is running - CMS.debug("About to start checkRanges"); - synchronized (_kr.mKeyStatusUpdateThread) { - CMS.debug("Starting key checkRanges"); - _kr.checkRanges(); - CMS.debug("key checkRanges done"); - - CMS.debug("Starting request checkRanges"); - _rr.checkRanges(); - CMS.debug("request checkRanges done"); - } - } catch (Exception e) { - CMS.debug("key checkRanges done"); - } - try { - sleep(_interval * 1000); - } catch (InterruptedException e) { - } - } + repository.updateKeyStatus(); + } + + public void stop() { + // shutdown executorService without interrupting running task + if (executorService != null) executorService.shutdown(); } } |