You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2014/05/24 15:51:11 UTC

svn commit: r1597286 - in /commons/proper/configuration/trunk/src: main/java/org/apache/commons/configuration/builder/ test/java/org/apache/commons/configuration/builder/

Author: oheger
Date: Sat May 24 13:51:10 2014
New Revision: 1597286

URL: http://svn.apache.org/r1597286
Log:
Added new event type CONFIGURATION_REQUEST.

Events of this type are generated each time a builder's getConfiguration()
method is called. A use case is that a listener might invalidate the
managed configuration based on some conditions before it is actually
accessed.

Modified:
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/ConfigurationBuilderEvent.java
    commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilderEvents.java

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java?rev=1597286&r1=1597285&r2=1597286&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java Sat May 24 13:51:10 2014
@@ -346,6 +346,9 @@ public class BasicConfigurationBuilder<T
     @Override
     public T getConfiguration() throws ConfigurationException
     {
+        eventListeners.fire(new ConfigurationBuilderEvent(this,
+                ConfigurationBuilderEvent.CONFIGURATION_REQUEST));
+
         T resObj = result;
         if (resObj == null)
         {

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/ConfigurationBuilderEvent.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/ConfigurationBuilderEvent.java?rev=1597286&r1=1597285&r2=1597286&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/ConfigurationBuilderEvent.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/ConfigurationBuilderEvent.java Sat May 24 13:51:10 2014
@@ -47,6 +47,22 @@ public class ConfigurationBuilderEvent e
             new EventType<ConfigurationBuilderEvent>(ANY, "RESET");
 
     /**
+     * The specific event type for configuration request events. Events of this
+     * type are generated each time the builder's {@code getConfiguration()}
+     * method is called (before the managed configuration is actually accessed
+     * and the lock is acquired). This gives listeners the opportunity to
+     * perform some checks which may invalidate the configuration, e.g. trigger
+     * a reload check. <strong>Note:</strong> A listener must not call the
+     * builder's {@code getConfiguration()} method - this will cause an
+     * infinite loop!
+     *
+     * @see ConfigurationBuilder#getConfiguration()
+     */
+    public static final EventType<ConfigurationBuilderEvent> CONFIGURATION_REQUEST =
+            new EventType<ConfigurationBuilderEvent>(ANY,
+                    "CONFIGURATION_REQUEST");
+
+    /**
      * Creates a new instance of {@code ConfigurationBuilderEvent} and sets
      * basic properties.
      *

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilderEvents.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilderEvents.java?rev=1597286&r1=1597285&r2=1597286&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilderEvents.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilderEvents.java Sat May 24 13:51:10 2014
@@ -17,11 +17,14 @@
 package org.apache.commons.configuration.builder;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
 
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.commons.configuration.event.Event;
+import org.apache.commons.configuration.event.EventListener;
 import org.apache.commons.configuration.event.EventType;
+import org.apache.commons.configuration.ex.ConfigurationException;
 import org.junit.Test;
 
 /**
@@ -96,4 +99,68 @@ public class TestBasicConfigurationBuild
         listener.nextEvent(ConfigurationBuilderEvent.RESET);
         listener.assertNoMoreEvents();
     }
+
+    /**
+     * Tests whether the configuration request event type is correctly
+     * configured.
+     */
+    @Test
+    public void testConfigurationRequestEventType()
+    {
+        EventType<ConfigurationBuilderEvent> eventType =
+                ConfigurationBuilderEvent.CONFIGURATION_REQUEST;
+        assertEquals("Wrong super type", ConfigurationBuilderEvent.ANY,
+                eventType.getSuperType());
+    }
+
+    /**
+     * Tests whether a configuration request event is generated.
+     */
+    @Test
+    public void testConfigurationRequestEvent() throws ConfigurationException
+    {
+        BasicConfigurationBuilder<PropertiesConfiguration> builder =
+                new BasicConfigurationBuilder<PropertiesConfiguration>(
+                        PropertiesConfiguration.class);
+        builder.getConfiguration();
+        BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
+        builder.addEventListener(ConfigurationBuilderEvent.ANY, listener);
+
+        builder.getConfiguration();
+        ConfigurationBuilderEvent event =
+                listener.nextEvent(ConfigurationBuilderEvent.CONFIGURATION_REQUEST);
+        assertSame("Wrong builder", builder, event.getSource());
+        listener.assertNoMoreEvents();
+    }
+
+    /**
+     * Tests the use case that a listener on the request event triggers a reset
+     * of the builder.
+     */
+    @Test
+    public void testResetOnConfigurationRequestEvent()
+            throws ConfigurationException
+    {
+        final BasicConfigurationBuilder<PropertiesConfiguration> builder =
+                new BasicConfigurationBuilder<PropertiesConfiguration>(
+                        PropertiesConfiguration.class);
+        PropertiesConfiguration configuration = builder.getConfiguration();
+        BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
+        builder.addEventListener(ConfigurationBuilderEvent.RESET, listener);
+        builder.addEventListener(
+                ConfigurationBuilderEvent.CONFIGURATION_REQUEST,
+                new EventListener<ConfigurationBuilderEvent>()
+                {
+                    @Override
+                    public void onEvent(ConfigurationBuilderEvent event)
+                    {
+                        builder.resetResult();
+                    }
+                });
+
+        PropertiesConfiguration configuration2 = builder.getConfiguration();
+        assertNotSame("Configuration not reset", configuration, configuration2);
+        listener.nextEvent(ConfigurationBuilderEvent.RESET);
+        listener.assertNoMoreEvents();
+    }
 }