/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.repository.event.base;
import java.io.File;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.base.RepositoryWrapper;
import org.openrdf.repository.event.InterceptingRepository;
import org.openrdf.repository.event.InterceptingRepositoryConnection;
import org.openrdf.repository.event.RepositoryInterceptor;
/**
* Wrapper that notifies interceptors of events on Repositories before they
* happen. Any interceptor can block the operation by returning true from the
* relevant notification method. To do so will also cause the notification
* process to stop, i.e. no other interceptors will be notified. The order in
* which interceptors are notified is unspecified.
*
* @author Herko ter Horst
* @see InterceptingRepositoryConnectionWrapper
*/
public class InterceptingRepositoryWrapper extends RepositoryWrapper implements InterceptingRepository {
/*-----------*
* Variables *
*-----------*/
private boolean activated;
private Set<RepositoryInterceptor> interceptors = new CopyOnWriteArraySet<RepositoryInterceptor>();
/*--------------*
* Constructors *
*--------------*/
public InterceptingRepositoryWrapper() {
super();
}
public InterceptingRepositoryWrapper(Repository delegate) {
super(delegate);
}
/*---------*
* Methods *
*---------*/
/**
* Registers a <tt>RepositoryInterceptor</tt> that will receive
* notifications of operations that are performed on this repository.
*/
public void addRepositoryInterceptor(RepositoryInterceptor interceptor) {
interceptors.add(interceptor);
activated = true;
}
/**
* Removes a registered <tt>RepositoryInterceptor</tt> from this
* repository.
*/
public void removeRepositoryInterceptor(RepositoryInterceptor interceptor) {
interceptors.remove(interceptor);
activated = !interceptors.isEmpty();
}
@Override
public InterceptingRepositoryConnection getConnection()
throws RepositoryException
{
InterceptingRepositoryConnection conn = new InterceptingRepositoryConnectionWrapper(this,
super.getConnection());
if (activated) {
boolean denied = false;
for (RepositoryInterceptor interceptor : interceptors) {
denied = interceptor.getConnection(this, conn);
if (!denied) {
break;
}
}
if (!denied) {
conn = null;
}
}
return conn;
}
@Override
public void initialize()
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryInterceptor interceptor : interceptors) {
denied = interceptor.initialize(this);
if (denied) {
break;
}
}
}
if (!denied) {
super.initialize();
}
}
@Override
public void setDataDir(File dataDir)
{
boolean denied = false;
if (activated) {
for (RepositoryInterceptor interceptor : interceptors) {
denied = interceptor.setDataDir(this, dataDir);
if (denied) {
break;
}
}
}
if (!denied) {
super.setDataDir(dataDir);
}
}
@Override
public void shutDown()
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryInterceptor interceptor : interceptors) {
denied = interceptor.shutDown(this);
if (denied) {
break;
}
}
}
if (!denied) {
super.shutDown();
}
}
}