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 2018/05/10 17:26:29 UTC

svn commit: r1831359 - /commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/CombinedConfigurationBuilder.java

Author: oheger
Date: Thu May 10 17:26:29 2018
New Revision: 1831359

URL: http://svn.apache.org/viewvc?rev=1831359&view=rev
Log:
CONFIGURATION-687: Creation of child builders is now lazy.

Creating the child configuration builders of a combined configuration
first breaks interpolation during evaluation of the definition
configuration. Therefore, the builders are now created when the
combined configuration is accessed for the first time, immediately
before their managed configuration is accessed.

Modified:
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/CombinedConfigurationBuilder.java

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/CombinedConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/CombinedConfigurationBuilder.java?rev=1831359&r1=1831358&r2=1831359&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/CombinedConfigurationBuilder.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/CombinedConfigurationBuilder.java Thu May 10 17:26:29 2018
@@ -799,15 +799,26 @@ public class CombinedConfigurationBuilde
         setUpParentInterpolator(currentConfiguration, config);
 
         ConfigurationSourceData data = getSourceData();
-        data.createAndAddConfigurations(result, data.getOverrideSources(),
-                data.overrideBuilders);
+        boolean createBuilders = data.getChildBuilders().isEmpty();
+        List<ConfigurationBuilder<? extends Configuration>> overrideBuilders =
+                data.createAndAddConfigurations(result,
+                        data.getOverrideSources(), data.overrideBuilders);
+        if (createBuilders)
+        {
+            data.overrideBuilders.addAll(overrideBuilders);
+        }
         if (!data.getUnionSources().isEmpty())
         {
             CombinedConfiguration addConfig = createAdditionalsConfiguration(result);
             result.addConfiguration(addConfig, ADDITIONAL_NAME);
             initNodeCombinerListNodes(addConfig, config, KEY_ADDITIONAL_LIST);
-            data.createAndAddConfigurations(addConfig, data.unionDeclarations,
-                    data.unionBuilders);
+            List<ConfigurationBuilder<? extends Configuration>> unionBuilders =
+                    data.createAndAddConfigurations(addConfig,
+                            data.unionDeclarations, data.unionBuilders);
+            if (createBuilders)
+            {
+                data.unionBuilders.addAll(unionBuilders);
+            }
         }
 
         result.isEmpty();  // this sets up the node structure
@@ -1429,36 +1440,44 @@ public class CombinedConfigurationBuilde
             overrideDeclarations.addAll(createDeclarations(fetchTopLevelOverrideConfigs(config)));
             overrideDeclarations.addAll(createDeclarations(config.childConfigurationsAt(KEY_OVERRIDE)));
             unionDeclarations.addAll(createDeclarations(config.childConfigurationsAt(KEY_UNION)));
-
-            for (ConfigurationDeclaration cd : overrideDeclarations)
-            {
-                overrideBuilders.add(createConfigurationBuilder(cd));
-            }
-            for (ConfigurationDeclaration cd : unionDeclarations)
-            {
-                unionBuilders.add(createConfigurationBuilder(cd));
-            }
         }
 
         /**
          * Processes the declaration of configuration builder providers, creates
-         * the corresponding builder, obtains configurations, and adds them to
-         * the specified result configuration.
+         * the corresponding builder if necessary, obtains configurations, and
+         * adds them to the specified result configuration.
          *
          * @param ccResult the result configuration
          * @param srcDecl the collection with the declarations of configuration
          *        sources to process
+         * @return a list with configuration builders
          * @throws ConfigurationException if an error occurs
          */
-        public void createAndAddConfigurations(CombinedConfiguration ccResult,
+        public List<ConfigurationBuilder<? extends Configuration>> createAndAddConfigurations(
+                CombinedConfiguration ccResult,
                 List<ConfigurationDeclaration> srcDecl,
                 List<ConfigurationBuilder<? extends Configuration>> builders)
                 throws ConfigurationException
         {
+            boolean createBuilders = builders.isEmpty();
+            List<ConfigurationBuilder<? extends Configuration>> newBuilders =
+                    createBuilders ? new ArrayList<>(srcDecl.size()) : builders;
             for (int i = 0; i < srcDecl.size(); i++)
             {
-                addChildConfiguration(ccResult, srcDecl.get(i), builders.get(i));
+                ConfigurationBuilder<? extends Configuration> b;
+                if (createBuilders)
+                {
+                    b = createConfigurationBuilder(srcDecl.get(i));
+                    newBuilders.add(b);
+                }
+                else
+                {
+                    b = builders.get(i);
+                }
+                addChildConfiguration(ccResult, srcDecl.get(i), b);
             }
+
+            return newBuilders;
         }
 
         /**