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();
+ }
}