/*
* Copyright (c) 2011-2012 ICM Uniwersytet Warszawski All rights reserved.
* See LICENCE.txt file for licensing information.
*/
package eu.emi.security.authn.x509.helpers.trust;
import java.util.Timer;
import eu.emi.security.authn.x509.helpers.ObserversHandler;
import eu.emi.security.authn.x509.helpers.WeakTimerTask;
/**
* Base implementation of Trust Anchor stores which load all certificates into memory. Provides support for
* timed scheduling of trust anchor store refreshes (which can be disabled).
*
* @author K. Benedyczak
*/
public abstract class TimedTrustAnchorStoreBase extends AbstractTrustAnchorStore
{
private Timer timer;
public TimedTrustAnchorStoreBase(Timer timer, long updateInterval, ObserversHandler observers)
{
super(updateInterval, observers);
this.timer = timer;
}
@Override
public synchronized void setUpdateInterval(long newInterval)
{
long old = getUpdateInterval();
super.setUpdateInterval(newInterval);
if (old <= 0)
scheduleUpdate();
}
protected void scheduleUpdate()
{
long updateInterval = getUpdateInterval();
if (updateInterval > 0)
timer.schedule(new AsyncTrustAnchorsUpdateTask(this), updateInterval);
}
/**
* implementation should update the contents of the trust anchor store.
* It need not to bother with scheduling.
*/
protected abstract void update();
/**
* After calling this method no notification will be produced and subsequent
* updates won't be scheduled.
*/
@Override
public void dispose()
{
setUpdateInterval(-1);
}
/**
* Important: static nested class, weak reference to the wrapper.
* @author K. Benedyczak
*/
private static class AsyncTrustAnchorsUpdateTask extends WeakTimerTask<TimedTrustAnchorStoreBase>
{
public AsyncTrustAnchorsUpdateTask(TimedTrustAnchorStoreBase partner)
{
super(partner);
}
@Override
public void run()
{
TimedTrustAnchorStoreBase partner = partnerRef.get();
if (partner == null)
return; //the work is over
try
{
if (partner.getUpdateInterval() > 0)
partner.update();
partner.scheduleUpdate();
} catch (RuntimeException e)
{
//here we are really screwed up - there is a bug and no way to report it
e.printStackTrace();
}
}
}
}