[FELIX-2763] disableConfigSave actually enables configuration save

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1301388 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/ConfigInstaller.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/ConfigInstaller.java
index 1e27b9a..26a4c70 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/ConfigInstaller.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/ConfigInstaller.java
@@ -98,11 +98,7 @@
     {
         // Check if writing back configurations has been disabled.
         {
-            Object obj = this.context.getProperty( DirectoryWatcher.DISABLE_CONFIG_SAVE );
-            if (obj instanceof String) {
-                obj = new Boolean((String) obj );
-            }
-            if( Boolean.FALSE.equals( obj ) )
+            if (shouldSaveConfig())
             {
                 return;
             }
@@ -170,6 +166,32 @@
         }
     }
 
+    boolean shouldSaveConfig()
+    {
+        Object obj = this.context.getProperty( DirectoryWatcher.ENABLE_CONFIG_SAVE );
+        if (obj instanceof String)
+        {
+            obj = Boolean.valueOf((String) obj);
+        }
+        if (Boolean.FALSE.equals( obj ))
+        {
+            return false;
+        }
+        else if ( !Boolean.TRUE.equals( obj ))
+        {
+            obj = this.context.getProperty( DirectoryWatcher.DISABLE_CONFIG_SAVE );
+            if (obj instanceof String)
+            {
+                obj = Boolean.valueOf((String) obj);
+            }
+            if( Boolean.FALSE.equals( obj ) )
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
     ConfigurationAdmin getConfigurationAdmin()
     {
         return configAdmin;
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
index 0b55e48..eb0d1cd 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
@@ -92,6 +92,7 @@
     public final static String USE_START_ACTIVATION_POLICY = "felix.fileinstall.bundles.startActivationPolicy";
     public final static String NO_INITIAL_DELAY = "felix.fileinstall.noInitialDelay";
     public final static String DISABLE_CONFIG_SAVE = "felix.fileinstall.disableConfigSave";
+    public final static String ENABLE_CONFIG_SAVE = "felix.fileinstall.enableConfigSave";
     public final static String START_LEVEL = "felix.fileinstall.start.level";
     public final static String ACTIVE_LEVEL = "felix.fileinstall.active.level";
 
diff --git a/fileinstall/src/test/java/org/apache/felix/fileinstall/internal/ConfigInstallerTest.java b/fileinstall/src/test/java/org/apache/felix/fileinstall/internal/ConfigInstallerTest.java
index eb3737d..9a6edb8 100644
--- a/fileinstall/src/test/java/org/apache/felix/fileinstall/internal/ConfigInstallerTest.java
+++ b/fileinstall/src/test/java/org/apache/felix/fileinstall/internal/ConfigInstallerTest.java
@@ -21,9 +21,11 @@
 import java.io.File;
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.concurrent.atomic.AtomicReference;
 
 import junit.framework.TestCase;
 import org.easymock.EasyMock;
+import org.easymock.IAnswer;
 import org.easymock.IArgumentMatcher;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -163,6 +165,67 @@
 
         EasyMock.verify(new Object[]{mockConfiguration, mockConfigurationAdmin, mockBundleContext});
     }
+    
+    public void testShouldSaveConfig() 
+    {
+        final AtomicReference<Boolean> disable = new AtomicReference<Boolean>();
+        final AtomicReference<Boolean> enable = new AtomicReference<Boolean>();
+        
+        EasyMock.expect(mockBundleContext.getProperty(DirectoryWatcher.DISABLE_CONFIG_SAVE)).andAnswer(
+                new IAnswer<String>() {
+                    public String answer() throws Throwable {
+                        return disable.get() != null ? disable.get().toString() : null;
+                    }
+                }
+        ).anyTimes();
+        EasyMock.expect(mockBundleContext.getProperty(DirectoryWatcher.ENABLE_CONFIG_SAVE)).andAnswer(
+                new IAnswer<String>() {
+                    public String answer() throws Throwable {
+                        return enable.get() != null ? enable.get().toString() : null;
+                    }
+                }
+        ).anyTimes();
+        EasyMock.replay(new Object[]{mockConfiguration, mockConfigurationAdmin, mockBundleContext});
 
+        ConfigInstaller ci = new ConfigInstaller( mockBundleContext, mockConfigurationAdmin, new FileInstall() );
+
+        disable.set(null);
+        enable.set(null);
+        assertTrue( ci.shouldSaveConfig() );
+
+        disable.set(false);
+        enable.set(null);
+        assertFalse( ci.shouldSaveConfig() );
+
+        disable.set(true);
+        enable.set(null);
+        assertTrue( ci.shouldSaveConfig() );
+
+        disable.set(null);
+        enable.set(false);
+        assertFalse( ci.shouldSaveConfig() );
+
+        disable.set(false);
+        enable.set(false);
+        assertFalse( ci.shouldSaveConfig() );
+
+        disable.set(true);
+        enable.set(false);
+        assertFalse( ci.shouldSaveConfig() );
+
+        disable.set(null);
+        enable.set(true);
+        assertTrue( ci.shouldSaveConfig() );
+
+        disable.set(false);
+        enable.set(true);
+        assertTrue( ci.shouldSaveConfig() );
+
+        disable.set(true);
+        enable.set(true);
+        assertTrue( ci.shouldSaveConfig() );
+
+        EasyMock.verify(new Object[]{mockConfiguration, mockConfigurationAdmin, mockBundleContext});
+    }
 
 }