Updating save mechanism
diff --git a/spring-registry/spring-registry-commons/src/main/java/org/apache/archiva/components/registry/commons/CommonsConfigurationRegistry.java b/spring-registry/spring-registry-commons/src/main/java/org/apache/archiva/components/registry/commons/CommonsConfigurationRegistry.java
index 10e5746..c99d2be 100644
--- a/spring-registry/spring-registry-commons/src/main/java/org/apache/archiva/components/registry/commons/CommonsConfigurationRegistry.java
+++ b/spring-registry/spring-registry-commons/src/main/java/org/apache/archiva/components/registry/commons/CommonsConfigurationRegistry.java
@@ -25,6 +25,7 @@
 import org.apache.commons.configuration2.CombinedConfiguration;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.FileBasedConfiguration;
+import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.SystemConfiguration;
 import org.apache.commons.configuration2.XMLConfiguration;
 import org.apache.commons.configuration2.builder.ConfigurationBuilder;
@@ -37,6 +38,7 @@
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.DefaultExpressionEngine;
 import org.apache.commons.configuration2.tree.DefaultExpressionEngineSymbols;
+import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.text.StringSubstitutor;
 import org.apache.commons.text.lookup.StringLookupFactory;
@@ -68,6 +70,15 @@
  * the format of an input to the Commons Configuration
  * <a href="http://commons.apache.org/commons/configuration/howto_configurationbuilder.html">configuration
  * builder</a>.
+ *
+ * If you initialize a <code>CombinedConfiguration</code>, which is the default, if you do not give a builder in the
+ * constructor or use the {@link #setInitialConfiguration(String)} or {@link #setInitialConfigurationFile(Path)} methods,
+ * then you should be careful with modifications and the {@link #save()} method.
+ * You should always change your configuration with a given section, which represents a concrete configuration source
+ * in the <code>CombinedConfiguration</code>. The section names correspond to the config-name attributes in the
+ * configuration definition.
+ *
+ *
  */
 @Service( "commons-configuration" )
 public class CommonsConfigurationRegistry
@@ -318,19 +329,17 @@
         return keys;
     }
 
+    /**
+     * Removes a given configuration node from the configuration. For a combined configuration, this
+     * may be only in memory and can not be persisted. The method runs the <code>clearProperty()</code>
+     * on the configuration instance.
+     *
+     * @param key the key to remove
+     */
     @Override
     public void remove( String key )
     {
-        if (configuration instanceof CombinedConfiguration) {
-            CombinedConfiguration config = (CombinedConfiguration) configuration;
-            Set<Configuration> source = config.getSources( key );
-            if (source != null) {
-
-            }
-        } else
-        {
-            configuration.clearProperty( key );
-        }
+        configuration.clearProperty( key );
     }
 
     @Override
@@ -403,6 +412,15 @@
         configuration.setProperty( key, Boolean.valueOf( value ) );
     }
 
+    /**
+     *
+     * Adds a new configuration source to the combined configuration.
+     *
+     * This is only possible with a combined configuration (which is the default).
+     *
+     * @param resource the location to load the configuration from
+     * @throws RegistryException if the configuration is not a <code>CombinedConfiguration</code>
+     */
     @Override
     public void addConfigurationFromResource( String resource )
         throws RegistryException
@@ -410,6 +428,16 @@
         addConfigurationFromResource( resource, null );
     }
 
+    /**
+     *
+     * Adds a new configuration source to the combined configuration.
+     *
+     * This is only possible with a combined configuration (which is the default).
+     *
+     * @param resource the location to load the configuration from
+     * @param prefix the prefix where the root of the given configuration is placed
+     * @throws RegistryException if the configuration is not a <code>CombinedConfiguration</code>
+     */
     @Override
     public void addConfigurationFromResource( String resource, String prefix )
         throws RegistryException
@@ -454,6 +482,15 @@
         }
     }
 
+    /**
+     *
+     * Adds a new configuration source to the combined configuration.
+     *
+     * This is only possible with a combined configuration (which is the default).
+     *
+     * @param file  the path where the configuration can be loaded
+     * @throws RegistryException if the configuration is not a <code>CombinedConfiguration</code>
+     */
     @Override
     public void addConfigurationFromFile( Path file )
         throws RegistryException
@@ -461,6 +498,16 @@
         addConfigurationFromFile( file, null );
     }
 
+    /**
+     *
+     * Adds a new configuration source to the combined configuration.
+     *
+     * This is only possible with a combined configuration (which is the default).
+     *
+     * @param file the path, where the configuration can be loaded
+     * @param prefix the prefix where the root of the given configuration is placed
+     * @throws RegistryException if the configuration is not a <code>CombinedConfiguration</code>
+     */
     @Override
     public void addConfigurationFromFile( Path file, String prefix )
         throws RegistryException
@@ -501,11 +548,23 @@
         }
     }
 
+
+    /**
+     * This method tries to read a combined configuration definition either from the string given
+     * by {@link #setInitialConfiguration(String)} or from the file given by {@link #setInitialConfigurationFile(Path)}
+     *
+     * The initialization assumes that override combiner is used and tries to find the first writable configuration
+     * source as save target.
+     *
+     * @throws RegistryException if the configuration initialization failed
+     */
     @Override
     @PostConstruct
     public void initialize( )
         throws RegistryException
     {
+
+
         synchronized (this)
         {
             try
@@ -552,6 +611,14 @@
 
                 }
 
+                HierarchicalConfiguration<?> defConfig = builder.getDefinitionBuilder( ).getConfiguration( );
+                logger.debug( "Node def children: {}", defConfig.getNodeModel( ).getInMemoryRepresentation( ).getChildren( ) );
+                for ( ImmutableNode child : defConfig.getNodeModel().getInMemoryRepresentation().getChildren()) {
+                    logger.debug( "Child: {}, Attributes: {}" , child.getNodeName( ), child.getAttributes( ));
+
+                }
+
+
 
                 this.configuration = configuration;
                 this.configurationBuilder = builder;
diff --git a/spring-registry/spring-registry-commons/src/main/resources/org/apache/commons/registry/default-config-definition.xml b/spring-registry/spring-registry-commons/src/main/resources/org/apache/commons/registry/default-config-definition.xml
index 17c01cd..369bace 100644
--- a/spring-registry/spring-registry-commons/src/main/resources/org/apache/commons/registry/default-config-definition.xml
+++ b/spring-registry/spring-registry-commons/src/main/resources/org/apache/commons/registry/default-config-definition.xml
@@ -1,3 +1,21 @@
+<!--
+  ~ 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.
+  -->
 <configuration>
     <system />
     <properties config-name="default-properties" config-optional="true" fileName="commons-registry-configuration.properties" />
diff --git a/spring-registry/spring-registry-commons/src/test/java/org/apache/archiva/components/registry/test/CommonsConfigurationRegistryTest.java b/spring-registry/spring-registry-commons/src/test/java/org/apache/archiva/components/registry/test/CommonsConfigurationRegistryTest.java
index 8bf51a8..c14a135 100644
--- a/spring-registry/spring-registry-commons/src/test/java/org/apache/archiva/components/registry/test/CommonsConfigurationRegistryTest.java
+++ b/spring-registry/spring-registry-commons/src/test/java/org/apache/archiva/components/registry/test/CommonsConfigurationRegistryTest.java
@@ -354,59 +354,23 @@
 
         registry = getRegistry( "test-save" );
 
-        Registry registry = this.registry.getSection( "org.codehaus.plexus.registry" );
-        assertEquals( "check list elements", Arrays.asList( new String[]{"1", "2", "3"} ),
-            registry.getList( "listElements.listElement" ) );
-
-        registry.remove( "listElements.listElement(1)" );
-        registry.save( );
-
         Configurations configurations = new Configurations( );
 
-        XMLConfiguration configuration = configurations.xml( dest );
-        assertEquals( Arrays.asList( new String[]{"1", "3"} ), configuration.getList( "listElements.listElement" ) );
+        // Testing removal does not make sense here, because commons configurations 2 has
+        // not the same parent nodes in the combined and source configuration. So the
+        // a node is only removed in the combined tree, but not in the source configuration.
 
-        // file in ${basedir}/target/conf/shared.xml
+
         Registry section = this.registry.getSection( "org.apache.maven.shared.app.user" );
         section.setString( "foo", "zloug" );
         section.save( );
 
-        configuration = configurations.xml( new File( "target/conf/shared.xml" ) );
+        XMLConfiguration configuration = configurations.xml( new File( "target/conf/shared.xml" ) );
         assertNotNull( configuration.getString( "foo" ) );
 
     }
 
-    @Test
-    public void testSave( )
-        throws Exception
-    {
-        File src = new File( "./src/test/resources/test-save.xml" );
-        File dest = new File( "./target/test-classes/test-save.xml" );
-        FileCopyUtils.copy( src, dest );
 
-        registry = getRegistry( "test-save" );
-
-        assertEquals( "check list elements", Arrays.asList( new String[]{"1", "2", "3"} ),
-            registry.getList( "org.codehaus.plexus.registry.listElements.listElement" ) );
-
-        registry.remove( "org.codehaus.plexus.registry.listElements.listElement(1)" );
-        registry.save( );
-
-        Configurations configurations = new Configurations( );
-
-        XMLConfiguration configuration = configurations.xml( dest );
-        assertEquals( Arrays.asList( new String[]{"1", "3"} ), configuration.getList( "listElements.listElement" ) );
-
-        // file in ${basedir}/target/conf/shared.xml
-        Registry section = this.registry.getSection( "org.apache.maven.shared.app.user" );
-        registry.setString( "org.apache.maven.shared.app.user.foo", "zloug" );
-        registry.save( );
-
-        configuration = configurations.xml( new File( "target/conf/shared.xml" ) );
-        assertNotNull( configuration.getString( "foo" ) );
-        assertEquals( "zloug", configuration.getString( "foo" ) );
-
-    }
 
 
     private static class MockChangeListener
diff --git a/spring-registry/spring-registry-commons/src/test/resources/test-save.xml b/spring-registry/spring-registry-commons/src/test/resources/test-save.xml
index 1083a2d..5af9ffb 100644
--- a/spring-registry/spring-registry-commons/src/test/resources/test-save.xml
+++ b/spring-registry/spring-registry-commons/src/test/resources/test-save.xml
@@ -20,4 +20,5 @@
         <listElement>2</listElement>
         <listElement>3</listElement>
     </listElements>
+    <singleElement>123</singleElement>
 </registry>