/**
* Copyright (c) Istituto Nazionale di Fisica Nucleare, 2006-2014.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.italiangrid.voms.store.impl;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.italiangrid.voms.VOMSError;
import org.italiangrid.voms.store.UpdatingVOMSTrustStore;
import org.italiangrid.voms.store.VOMSTrustStoreStatusListener;
import org.italiangrid.voms.util.NullListener;
/**
* A VOMS trust store that periodically updates itself. The update frequency is
* set once at VOMS trust store creation time.
*
*
* @author Andrea Ceccanti
*
*/
public class DefaultUpdatingVOMSTrustStore extends DefaultVOMSTrustStore
implements UpdatingVOMSTrustStore {
/**
* Default trust store update frequency (10 minutes).
*/
public static final long DEFAULT_UPDATE_FREQUENCY = TimeUnit.MINUTES
.toMillis(10);
/**
* This trust store update frequency in milliseconds.
*/
private long updateFrequency;
/**
* The scheduler used to schedule the update tasks.
*/
private final ScheduledExecutorService scheduler = Executors
.newSingleThreadScheduledExecutor(new VOMSNamedThreadFactory());
/**
* Builds a trust store configured as defined in the parameters.
*
* @param localTrustDirs
* where VOMS trust information will be looked for
* @param updateFrequency
* the update frequency in milliseconds
* @param listener
* a listener that is notified of interesting events related to this
* store
*/
public DefaultUpdatingVOMSTrustStore(List<String> localTrustDirs,
long updateFrequency, VOMSTrustStoreStatusListener listener) {
super(localTrustDirs, listener);
updateFrequencySanityChecks(updateFrequency);
this.updateFrequency = updateFrequency;
scheduleUpdate();
}
/**
* Builds a trust store configured as defined in the parameters.
*
* @param updateFrequency
* the update frequency in milliseconds
*
*/
public DefaultUpdatingVOMSTrustStore(long updateFrequency) {
this(buildDefaultTrustedDirs(), updateFrequency, NullListener.INSTANCE);
}
/**
* Builds a trust store configured as defined in the parameters.
*
* @param localTrustDirs
* where VOMS trust information will be looked for
* @param updateFrequency
* the update frequency in milliseconds
*
*/
public DefaultUpdatingVOMSTrustStore(List<String> localTrustDirs,
long updateFrequency) {
this(localTrustDirs, updateFrequency, NullListener.INSTANCE);
}
/**
* Builds a trust store configured as defined in the parameters.
*
* @param localTrustDirs
* where VOMS trust information will be looked for
*/
public DefaultUpdatingVOMSTrustStore(List<String> localTrustDirs) {
this(localTrustDirs, DEFAULT_UPDATE_FREQUENCY, NullListener.INSTANCE);
}
/**
* Builds a trust store. VOMS information will be searched in the default VOMS
* dir location ({@link DefaultVOMSTrustStore#DEFAULT_VOMS_DIR}).
*
* This store will be refreshed according to the value of
* {@link #DEFAULT_UPDATE_FREQUENCY}.
*/
public DefaultUpdatingVOMSTrustStore() {
this(buildDefaultTrustedDirs(), DEFAULT_UPDATE_FREQUENCY,
NullListener.INSTANCE);
}
protected void updateFrequencySanityChecks(long updateFrequency) {
if (updateFrequency <= 0)
throw new VOMSError(
"Please provide a positive value for this store update frequency!");
}
protected void scheduleUpdate() {
write.lock();
try {
long frequency = getUpdateFrequency();
scheduler.scheduleWithFixedDelay(new Runnable() {
// Just run update on the VOMS trust store and log any error
public void run() {
update();
}
}, frequency, // First execution delay
frequency, // Next iterations delay
TimeUnit.MILLISECONDS);
} finally {
write.unlock();
}
}
/**
* Returns the update frequency, in milliseconds, for this store.
*/
public long getUpdateFrequency() {
read.lock();
try {
return updateFrequency;
} finally {
read.unlock();
}
}
/**
* Updates the information in this store
*/
public void update() {
loadTrustInformation();
}
/**
* Cancel the background tasks which updates this store.
*/
public void cancel() {
write.lock();
try {
scheduler.shutdownNow();
} finally {
write.unlock();
}
}
}