package de.axone.tools.watcher;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import de.axone.cache.ng.CacheNG.SingleValueAccessor;
/**
* Automatic DataFileWatcher which uses an {@link SingleValueAccessor} to convert
* the files data if it has changed.
*
* @author flo
*
* @param <W> Watched Type as provided by Http/File Watcher
* @param <T> Data-Type
*/
public class AutomaticWatcher<W,T> {
final Watcher<W> backend;
final DataStore<T> store;
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public AutomaticWatcher( Watcher<W> backend ){
assert backend != null;
this.backend = backend;
this.store = new DataStoreImpl<>();
}
public T getData( SingleValueAccessor<W,T> accessor ) {
assert accessor != null;
// First try to get from cache
boolean hasChanged;
lock.readLock().lock();
try{
hasChanged = backend.haveChanged();
} finally {
lock.readLock().unlock();
}
T result;
if( ! hasChanged ){
result = store.getData();
} else {
lock.writeLock().lock();
try {
// Use Accessor to fetch
result = accessor.fetch( backend.getWatched() );
store.setData( result );
} finally {
lock.writeLock().unlock();
}
}
return result;
}
@Override
public String toString() {
return "AutomaticWatcher: " + backend.toString();
}
}