You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by jo...@apache.org on 2007/10/09 01:08:34 UTC

svn commit: r582993 - in /maven/archiva/trunk/archiva-base: archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ archiva-indexer/src/test/java/org/apache...

Author: joakime
Date: Mon Oct  8 16:08:32 2007
New Revision: 582993

URL: http://svn.apache.org/viewvc?rev=582993&view=rev
Log:
Reducing chattiness by adding ConfigurationListener to give option of event on configuration save as a whole, not each field.


Added:
    maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationEvent.java   (with props)
    maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationListener.java   (with props)
Modified:
    maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ArchivaConfiguration.java
    maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java
    maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java
    maven/archiva/trunk/archiva-base/archiva-indexer/src/test/java/org/apache/maven/archiva/indexer/MockConfiguration.java
    maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/MockConfiguration.java

Modified: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ArchivaConfiguration.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ArchivaConfiguration.java?rev=582993&r1=582992&r2=582993&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ArchivaConfiguration.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ArchivaConfiguration.java Mon Oct  8 16:08:32 2007
@@ -49,9 +49,24 @@
         throws RegistryException, IndeterminateConfigurationException;
 
     /**
-     * Add a change listener so that registry changes are propogated.
+     * Add a configuration listener to notify of changes to the configuration.
      *
      * @param listener the listener
+     */
+    void addListener( ConfigurationListener listener );
+    
+    /**
+     * Remove a configuration listener to stop notifications of changes to the configuration.
+     *
+     * @param listener the listener
+     */
+    void removeListener( ConfigurationListener listener );
+    
+    /**
+     * Add a registry listener to notify of events in plexus-registry.
+     *
+     * @param listener the listener
+     * TODO: Remove in future.
      */
     void addChangeListener( RegistryListener listener );
 }

Added: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationEvent.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationEvent.java?rev=582993&view=auto
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationEvent.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationEvent.java Mon Oct  8 16:08:32 2007
@@ -0,0 +1,77 @@
+package org.apache.maven.archiva.configuration;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * ConfigurationEvent 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ConfigurationEvent
+{
+    public static final int SAVED = 1;
+
+    public static final int CHANGED = 2;
+
+    private int type;
+
+    public ConfigurationEvent( int type )
+    {
+        this.type = type;
+    }
+
+    public int getType()
+    {
+        return type;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + type;
+        return result;
+    }
+
+    @Override
+    public boolean equals( Object obj )
+    {
+        if ( this == obj )
+        {
+            return true;
+        }
+        if ( obj == null )
+        {
+            return false;
+        }
+        if ( getClass() != obj.getClass() )
+        {
+            return false;
+        }
+        final ConfigurationEvent other = (ConfigurationEvent) obj;
+        if ( type != other.type )
+        {
+            return false;
+        }
+        return true;
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationEvent.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationEvent.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationListener.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationListener.java?rev=582993&view=auto
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationListener.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationListener.java Mon Oct  8 16:08:32 2007
@@ -0,0 +1,34 @@
+package org.apache.maven.archiva.configuration;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * ConfigurationListener 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public interface ConfigurationListener
+{
+    /**
+     * Generic event point to notify components that something has happend in the configuration.
+     */
+    public void configurationEvent(ConfigurationEvent event);
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationListener.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ConfigurationListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java?rev=582993&r1=582992&r2=582993&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java Mon Oct  8 16:08:32 2007
@@ -35,10 +35,11 @@
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Implementation of configuration holder that retrieves it from the registry.
@@ -84,9 +85,14 @@
     private String userConfigFilename;
 
     /**
-     * Listeners we've registered.
+     * Configuration Listeners we've registered.
      */
-    private List<RegistryListener> listeners = new LinkedList<RegistryListener>();
+    private Set<ConfigurationListener> listeners = new HashSet<ConfigurationListener>();
+    
+    /**
+     * Registry Listeners we've registered.
+     */
+    private Set<RegistryListener> registryListeners = new HashSet<RegistryListener>();
 
     public String getFilteredUserConfigFilename()
     {
@@ -249,6 +255,8 @@
 
         new ConfigurationRegistryWriter().write( configuration, section );
         section.save();
+        
+        triggerEvent( ConfigurationEvent.SAVED );
 
         this.configuration = processExpressions( configuration );
     }
@@ -270,28 +278,64 @@
         try
         {
             ( (Initializable) registry ).initialize();
-
-            for ( Iterator<RegistryListener> i = listeners.iterator(); i.hasNext(); )
+            
+            for ( RegistryListener regListener: registryListeners )
             {
-                RegistryListener l = i.next();
-
-                addRegistryChangeListener( l );
+                addRegistryChangeListener( regListener );
             }
         }
         catch ( InitializationException e )
         {
             throw new RegistryException( "Unable to reinitialize configuration: " + e.getMessage(), e );
         }
+        
+        triggerEvent( ConfigurationEvent.SAVED );
 
         return registry.getSection( KEY + ".user" );
     }
 
+    private void triggerEvent( int type )
+    {
+        ConfigurationEvent evt = new ConfigurationEvent( type );
+        for ( ConfigurationListener listener : listeners )
+        {
+            try
+            {
+                listener.configurationEvent( evt );
+            }
+            catch ( Throwable t )
+            {
+                getLogger().warn( "Unable to notify of saved configuration event.", t );
+            }
+        }
+    }
+
+    public void addListener( ConfigurationListener listener )
+    {
+        if ( listener == null )
+        {
+            return;
+        }
+
+        listeners.add( listener );
+    }
+
+    public void removeListener( ConfigurationListener listener )
+    {
+        if ( listener == null )
+        {
+            return;
+        }
+
+        listeners.remove( listener );
+    }
+    
     public void addChangeListener( RegistryListener listener )
     {
         addRegistryChangeListener( listener );
 
         // keep track for later
-        listeners.add( listener );
+        registryListeners.add( listener );
     }
 
     private void addRegistryChangeListener( RegistryListener listener )
@@ -307,6 +351,7 @@
             section.addChangeListener( listener );
         }
     }
+
 
     public void initialize()
         throws InitializationException

Modified: maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java?rev=582993&r1=582992&r2=582993&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java Mon Oct  8 16:08:32 2007
@@ -21,9 +21,7 @@
 
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.registry.Registry;
-import org.codehaus.plexus.registry.RegistryListener;
 import org.codehaus.plexus.util.FileUtils;
-import org.easymock.AbstractMatcher;
 import org.easymock.MockControl;
 
 import java.io.File;
@@ -38,6 +36,7 @@
 public class ArchivaConfigurationTest
     extends PlexusTestCase
 {
+    @SuppressWarnings("unused")
     private Registry registry;
 
     protected void setUp()
@@ -108,7 +107,7 @@
         assertEquals( "check known consumers", 9, repoScanning.getKnownContentConsumers().size() );
         assertEquals( "check invalid consumers", 1, repoScanning.getInvalidContentConsumers().size() );
 
-        List patterns = filetypes.getFileTypePatterns( "artifacts" );
+        List<String> patterns = filetypes.getFileTypePatterns( "artifacts" );
         assertNotNull( "check 'artifacts' file type", patterns );
         assertEquals( "check 'artifacts' patterns", 13, patterns.size() );
 
@@ -192,15 +191,12 @@
         configuration.getWebapp().getUi().setAppletFindEnabled( false );
 
         // add a change listener
-        MockControl control = createRegistryListenerMockControl();
-        RegistryListener listener = (RegistryListener) control.getMock();
-        archivaConfiguration.addChangeListener( listener );
-
-        listener.beforeConfigurationChange( registry, "version", "1" );
-        listener.beforeConfigurationChange( registry, "webapp.ui.appletFindEnabled", Boolean.FALSE );
-
-        listener.afterConfigurationChange( registry, "version", "1" );
-        listener.afterConfigurationChange( registry, "webapp.ui.appletFindEnabled", Boolean.FALSE );
+        MockControl control = createConfigurationListenerMockControl();
+        ConfigurationListener listener = (ConfigurationListener) control.getMock();
+        archivaConfiguration.addListener( listener );
+        
+        listener.configurationEvent( new ConfigurationEvent( ConfigurationEvent.SAVED ) );
+        control.setVoidCallable();
 
         control.replay();
 
@@ -221,21 +217,9 @@
         assertFalse( "check value", configuration.getWebapp().getUi().isAppletFindEnabled() );
     }
 
-    private static MockControl createRegistryListenerMockControl()
+    private static MockControl createConfigurationListenerMockControl()
     {
-        MockControl control = MockControl.createControl( RegistryListener.class );
-        control.setDefaultMatcher( new AbstractMatcher()
-        {
-            protected boolean argumentMatches( Object object, Object object1 )
-            {
-                return object instanceof Registry || super.argumentMatches( object, object1 );
-            }
-
-            protected String argumentToString( Object object )
-            {
-                return object instanceof Registry ? "<any>" : super.argumentToString( object );
-            }
-        } );
+        MockControl control = MockControl.createControl( ConfigurationListener.class );
         return control;
     }
 
@@ -291,12 +275,13 @@
         configuration.getWebapp().getUi().setAppletFindEnabled( false );
 
         // add a change listener
-        MockControl control = createRegistryListenerMockControl();
-        RegistryListener listener = (RegistryListener) control.getMock();
-        archivaConfiguration.addChangeListener( listener );
-
-        listener.beforeConfigurationChange( registry, "webapp.ui.appletFindEnabled", Boolean.FALSE );
-        listener.afterConfigurationChange( registry, "webapp.ui.appletFindEnabled", Boolean.FALSE );
+        MockControl control = createConfigurationListenerMockControl();
+        ConfigurationListener listener = (ConfigurationListener) control.getMock();
+        archivaConfiguration.addListener( listener );
+
+        listener.configurationEvent( new ConfigurationEvent( ConfigurationEvent.SAVED ) );
+        // once from default creation, and again from manual call to save
+        control.setVoidCallable( 2 );
 
         control.replay();
 

Modified: maven/archiva/trunk/archiva-base/archiva-indexer/src/test/java/org/apache/maven/archiva/indexer/MockConfiguration.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-indexer/src/test/java/org/apache/maven/archiva/indexer/MockConfiguration.java?rev=582993&r1=582992&r2=582993&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-indexer/src/test/java/org/apache/maven/archiva/indexer/MockConfiguration.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-indexer/src/test/java/org/apache/maven/archiva/indexer/MockConfiguration.java Mon Oct  8 16:08:32 2007
@@ -21,14 +21,14 @@
 
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.ConfigurationListener;
 import org.codehaus.plexus.registry.Registry;
 import org.codehaus.plexus.registry.RegistryException;
 import org.codehaus.plexus.registry.RegistryListener;
 import org.easymock.MockControl;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * MockConfiguration 
@@ -43,7 +43,8 @@
 {
     private Configuration configuration = new Configuration();
 
-    private List listeners = new ArrayList();
+    private Set<RegistryListener> registryListeners = new HashSet<RegistryListener>();
+    private Set<ConfigurationListener> configListeners = new HashSet<ConfigurationListener>();
 
     private MockControl registryControl;
 
@@ -57,7 +58,7 @@
 
     public void addChangeListener( RegistryListener listener )
     {
-        listeners.add( listener );
+        registryListeners.add( listener );
     }
 
     public Configuration getConfiguration()
@@ -73,10 +74,8 @@
 
     public void triggerChange( String name, String value )
     {
-        Iterator it = listeners.iterator();
-        while ( it.hasNext() )
+        for(RegistryListener listener: registryListeners)
         {
-            RegistryListener listener = (RegistryListener) it.next();
             try
             {
                 listener.afterConfigurationChange( registryMock, name, value );
@@ -86,5 +85,15 @@
                 e.printStackTrace();
             }
         }
+    }
+
+    public void addListener( ConfigurationListener listener )
+    {
+        configListeners.add(listener);
+    }
+
+    public void removeListener( ConfigurationListener listener )
+    {
+        configListeners.remove( listener );
     }
 }

Modified: maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java?rev=582993&r1=582992&r2=582993&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java Mon Oct  8 16:08:32 2007
@@ -21,13 +21,14 @@
 
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.ConfigurationListener;
 import org.codehaus.plexus.registry.Registry;
 import org.codehaus.plexus.registry.RegistryException;
 import org.codehaus.plexus.registry.RegistryListener;
 import org.easymock.MockControl;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * MockConfiguration 
@@ -43,7 +44,8 @@
 {
     private Configuration configuration = new Configuration();
 
-    private List<RegistryListener> listeners = new ArrayList<RegistryListener>();
+    private Set<RegistryListener> registryListeners = new HashSet<RegistryListener>();
+    private Set<ConfigurationListener> configListeners = new HashSet<ConfigurationListener>();
 
     private MockControl registryControl;
 
@@ -57,7 +59,7 @@
 
     public void addChangeListener( RegistryListener listener )
     {
-        listeners.add( listener );
+        registryListeners.add( listener );
     }
 
     public Configuration getConfiguration()
@@ -73,7 +75,7 @@
 
     public void triggerChange( String name, String value )
     {
-        for( RegistryListener listener: listeners )
+        for(RegistryListener listener: registryListeners)
         {
             try
             {
@@ -84,5 +86,15 @@
                 e.printStackTrace();
             }
         }
+    }
+
+    public void addListener( ConfigurationListener listener )
+    {
+        configListeners.add(listener);
+    }
+
+    public void removeListener( ConfigurationListener listener )
+    {
+        configListeners.remove( listener );
     }
 }

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/MockConfiguration.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/MockConfiguration.java?rev=582993&r1=582992&r2=582993&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/MockConfiguration.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/MockConfiguration.java Mon Oct  8 16:08:32 2007
@@ -21,14 +21,17 @@
 
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.ConfigurationListener;
 import org.codehaus.plexus.registry.Registry;
 import org.codehaus.plexus.registry.RegistryException;
 import org.codehaus.plexus.registry.RegistryListener;
 import org.easymock.MockControl;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 /**
  * MockConfiguration 
@@ -44,7 +47,8 @@
 {
     private Configuration configuration = new Configuration();
 
-    private List<RegistryListener> listeners = new ArrayList<RegistryListener>();
+    private Set<RegistryListener> registryListeners = new HashSet<RegistryListener>();
+    private Set<ConfigurationListener> configListeners = new HashSet<ConfigurationListener>();
 
     private MockControl registryControl;
 
@@ -58,7 +62,7 @@
 
     public void addChangeListener( RegistryListener listener )
     {
-        listeners.add( listener );
+        registryListeners.add( listener );
     }
 
     public Configuration getConfiguration()
@@ -74,10 +78,8 @@
 
     public void triggerChange( String name, String value )
     {
-        Iterator<RegistryListener> it = listeners.iterator();
-        while ( it.hasNext() )
+        for(RegistryListener listener: registryListeners)
         {
-            RegistryListener listener = (RegistryListener) it.next();
             try
             {
                 listener.afterConfigurationChange( registryMock, name, value );
@@ -87,5 +89,15 @@
                 e.printStackTrace();
             }
         }
+    }
+
+    public void addListener( ConfigurationListener listener )
+    {
+        configListeners.add(listener);
+    }
+
+    public void removeListener( ConfigurationListener listener )
+    {
+        configListeners.remove( listener );
     }
 }