/* * Copyright James Leigh (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.NotifyingRepository; import org.openrdf.repository.event.NotifyingRepositoryConnection; import org.openrdf.repository.event.RepositoryConnectionListener; import org.openrdf.repository.event.RepositoryListener; /** * This notifying decorator allows listeners to register with the repository or * connection and be notified when events occur. * * @author James Leigh * @author Herko ter Horst * @author Arjohn Kampman * @see NotifyingRepositoryConnectionWrapper */ public class NotifyingRepositoryWrapper extends RepositoryWrapper implements NotifyingRepository { /*-----------* * Variables * *-----------*/ private boolean activated; private boolean defaultReportDeltas = false; private Set<RepositoryListener> listeners = new CopyOnWriteArraySet<RepositoryListener>(); private Set<RepositoryConnectionListener> conListeners = new CopyOnWriteArraySet<RepositoryConnectionListener>(); /*--------------* * Constructors * *--------------*/ public NotifyingRepositoryWrapper() { super(); } public NotifyingRepositoryWrapper(Repository delegate) { super(delegate); } public NotifyingRepositoryWrapper(Repository delegate, boolean defaultReportDeltas) { this(delegate); setDefaultReportDeltas(defaultReportDeltas); } /*---------* * Methods * *---------*/ public boolean getDefaultReportDeltas() { return defaultReportDeltas; } public void setDefaultReportDeltas(boolean defaultReportDeltas) { this.defaultReportDeltas = defaultReportDeltas; } /** * Registers a <tt>RepositoryListener</tt> that will receive notifications * of operations that are performed on this repository. */ public void addRepositoryListener(RepositoryListener listener) { listeners.add(listener); activated = true; } /** * Removes a registered <tt>RepositoryListener</tt> from this repository. */ public void removeRepositoryListener(RepositoryListener listener) { listeners.remove(listener); activated = !listeners.isEmpty(); } /** * Registers a <tt>RepositoryConnectionListener</tt> that will receive * notifications of operations that are performed on any< connections that * are created by this repository. */ public void addRepositoryConnectionListener(RepositoryConnectionListener listener) { conListeners.add(listener); } /** * Removes a registered <tt>RepositoryConnectionListener</tt> from this * repository. */ public void removeRepositoryConnectinoListener(RepositoryConnectionListener listener) { conListeners.remove(listener); } @Override public NotifyingRepositoryConnection getConnection() throws RepositoryException { NotifyingRepositoryConnection con = new NotifyingRepositoryConnectionWrapper(this, super.getConnection(), getDefaultReportDeltas()); if (activated) { for (RepositoryListener listener : listeners) { listener.getConnection(this, con); } } for (RepositoryConnectionListener l : conListeners) { con.addRepositoryConnectionListener(l); } return con; } @Override public void initialize() throws RepositoryException { super.initialize(); if (activated) { for (RepositoryListener listener : listeners) { listener.initialize(this); } } } @Override public void setDataDir(File dataDir) { super.setDataDir(dataDir); if (activated) { for (RepositoryListener listener : listeners) { listener.setDataDir(this, dataDir); } } } @Override public void shutDown() throws RepositoryException { super.shutDown(); if (activated) { for (RepositoryListener listener : listeners) { listener.shutDown(this); } } } }