/*
* Copyright James Leigh (c) 2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.repository.event.base;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.base.RepositoryConnectionWrapper;
import org.openrdf.repository.event.InterceptingRepositoryConnection;
import org.openrdf.repository.event.RepositoryConnectionInterceptor;
/**
* Wrapper that notifies interceptors of events on RepositoryConnections 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 InterceptingRepositoryWrapper
*/
public class InterceptingRepositoryConnectionWrapper extends RepositoryConnectionWrapper implements InterceptingRepositoryConnection {
/*-----------*
* Variables *
*-----------*/
private boolean activated;
private Set<RepositoryConnectionInterceptor> interceptors = new CopyOnWriteArraySet<RepositoryConnectionInterceptor>();
/*--------------*
* Construcotrs *
*--------------*/
public InterceptingRepositoryConnectionWrapper(Repository repository, RepositoryConnection connection) {
super(repository, connection);
}
/*---------*
* Methods *
*---------*/
/**
* Registers a <tt>RepositoryConnectionInterceptor</tt> that will receive
* notifications of operations that are performed on this connection.
*/
public void addRepositoryConnectionInterceptor(RepositoryConnectionInterceptor interceptor) {
interceptors.add(interceptor);
activated = true;
}
/**
* Removes a registered <tt>RepositoryConnectionInterceptor</tt> from this
* connection.
*/
public void removeRepositoryConnectionInterceptor(RepositoryConnectionInterceptor interceptor) {
interceptors.remove(interceptor);
activated = !interceptors.isEmpty();
}
@Override
protected boolean isDelegatingAdd()
{
return !activated;
}
@Override
protected boolean isDelegatingRemove()
{
return !activated;
}
@Override
public void addWithoutCommit(Resource subject, URI predicate, Value object, Resource... contexts)
throws RepositoryException
{
if (!getDelegate().hasStatement(subject, predicate, object, false, contexts)) {
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.add(this, subject, predicate, object, contexts);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().add(subject, predicate, object, contexts);
}
}
}
@Override
public void clear(Resource... contexts)
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.clear(this, contexts);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().clear(contexts);
}
}
@Override
public void close()
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.close(this);
if (denied) {
break;
}
}
}
if (!denied) {
super.close();
}
}
@Override
public void commit()
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.commit(this);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().commit();
}
}
@Override
public void removeWithoutCommit(Resource subject, URI predicate, Value object, Resource... contexts)
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.remove(this, subject, predicate, object, contexts);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().remove(subject, predicate, object, contexts);
}
}
@Override
public void removeNamespace(String prefix)
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.removeNamespace(this, prefix);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().removeNamespace(prefix);
}
}
@Override
public void clearNamespaces()
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.clearNamespaces(this);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().clearNamespaces();
}
}
@Override
public void rollback()
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.rollback(this);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().rollback();
}
}
@Override
public void setAutoCommit(boolean autoCommit)
throws RepositoryException
{
boolean denied = false;
boolean wasAutoCommit = isAutoCommit();
if (activated && wasAutoCommit != autoCommit) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.setAutoCommit(this, autoCommit);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().setAutoCommit(autoCommit);
}
}
@Override
public void setNamespace(String prefix, String name)
throws RepositoryException
{
boolean denied = false;
if (activated) {
for (RepositoryConnectionInterceptor interceptor : interceptors) {
denied = interceptor.setNamespace(this, prefix, name);
if (denied) {
break;
}
}
}
if (!denied) {
getDelegate().setNamespace(prefix, name);
}
}
}