You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2009/04/22 11:11:55 UTC

svn commit: r767421 - in /felix/trunk/fileinstall/src: main/java/org/apache/felix/fileinstall/ConfigurationKey.java main/java/org/apache/felix/fileinstall/DirectoryWatcher.java test/java/org/apache/felix/fileinstall/DirectoryWatcherTest.java

Author: clement
Date: Wed Apr 22 09:11:54 2009
New Revision: 767421

URL: http://svn.apache.org/viewvc?rev=767421&view=rev
Log:
Commit the patch attached to the Felix-1036 issue (FileInstaller spawns multiple watchers for same directory)

Removed:
    felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/ConfigurationKey.java
Modified:
    felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
    felix/trunk/fileinstall/src/test/java/org/apache/felix/fileinstall/DirectoryWatcherTest.java

Modified: felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
URL: http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java?rev=767421&r1=767420&r2=767421&view=diff
==============================================================================
--- felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java (original)
+++ felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java Wed Apr 22 09:11:54 2009
@@ -54,7 +54,7 @@
  */
 public class DirectoryWatcher extends Thread
 {
-    final static String ALIAS_KEY = "_alias_factory_pid";
+	public final static String FILENAME = "felix.fileinstall.filename";
     public final static String POLL = "felix.fileinstall.poll";
     public final static String DIR = "felix.fileinstall.dir";
     public final static String DEBUG = "felix.fileinstall.debug";
@@ -66,6 +66,8 @@
     boolean startBundles = true; // by default, we start bundles.
     BundleContext context;
     boolean reported;
+    String originatingFileName;
+    
     Map/* <String, Jar> */ currentManagedBundles = new HashMap();
 
     // Represents jars that could not be installed
@@ -74,15 +76,14 @@
     // Represents jars that could not be installed
     Set/* <Bundle> */ startupFailures = new HashSet();
     
-    Map /*<ConfigurationKey, Configuration>*/ configurations = new HashMap();
-
     public DirectoryWatcher(Dictionary properties, BundleContext context)
     {
         super(properties.toString());
         this.context = context;
         poll = getLong(properties, POLL, poll);
         debug = getLong(properties, DEBUG, -1);
-
+        originatingFileName = ( String ) properties.get( FILENAME );
+        
         String dir = (String) properties.get(DIR);
         if (dir == null)
         {
@@ -229,6 +230,7 @@
         String pid[] = parsePid(f.getName());
         Hashtable ht = new Hashtable();
         ht.putAll(p);
+        ht.put(FILENAME, f.getName());
         Configuration config = getConfiguration(pid[0], pid[1]);
         if (config.getBundleLocation() != null)
         {
@@ -251,7 +253,6 @@
         String pid[] = parsePid(f.getName());
         Configuration config = getConfiguration(pid[0], pid[1]);
         config.delete();
-        configurations.remove(new ConfigurationKey(pid[0], pid[1]));
         return true;
     }
 
@@ -280,28 +281,45 @@
     Configuration getConfiguration(String pid, String factoryPid)
         throws Exception
     {
-    	ConfigurationKey ck = new ConfigurationKey(pid, factoryPid);
-    	if (configurations.containsKey(ck))
-    	{
-    		return (Configuration) configurations.get(ck);
-    	}
-    	else
-    	{
-    		ConfigurationAdmin cm = (ConfigurationAdmin) FileInstall.cmTracker.getService();
-    		Configuration newConfiguration = null;
-    		if (factoryPid!=null)
-    		{
-    			newConfiguration = cm.createFactoryConfiguration(pid, null);
-    		}
-    		else
-    		{
-    			newConfiguration = cm.getConfiguration(pid, null);
-    		}
-    		configurations.put(ck, newConfiguration);
-    		return newConfiguration;
-    	}
+	    Configuration oldConfiguration = findExistingConfiguration( pid, factoryPid );
+        if ( oldConfiguration != null )
+        {
+            log( "Updating configuration from " + pid + ( factoryPid == null ? "" : "-" + factoryPid ) + ".cfg", null );
+            return oldConfiguration;
+        }
+        else
+        {
+            ConfigurationAdmin cm = ( ConfigurationAdmin ) FileInstall.cmTracker.getService();
+            Configuration newConfiguration = null;
+            if ( factoryPid != null )
+            {
+                newConfiguration = cm.createFactoryConfiguration( pid, null );
+            }
+            else
+            {
+                newConfiguration = cm.getConfiguration( pid, null );
+            }
+            return newConfiguration;
+        }
     }
     
+    Configuration findExistingConfiguration( String pid, String factoryPid ) throws Exception
+    {
+        String suffix = factoryPid == null ? ".cfg" : "-" + factoryPid + ".cfg";
+
+        ConfigurationAdmin cm = ( ConfigurationAdmin ) FileInstall.cmTracker.getService();
+        String filter = "(" + FILENAME + "=" + pid + suffix + ")";
+        Configuration[] configurations = cm.listConfigurations( filter );
+        if ( configurations != null && configurations.length > 0 )
+        {
+            return configurations[0];
+        }
+        else
+        {
+            return null;
+        }
+    }
+
     /**
      * This is the core of this class.
      * Install bundles that were discovered, uninstall bundles that are gone

Modified: felix/trunk/fileinstall/src/test/java/org/apache/felix/fileinstall/DirectoryWatcherTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/test/java/org/apache/felix/fileinstall/DirectoryWatcherTest.java?rev=767421&r1=767420&r2=767421&view=diff
==============================================================================
--- felix/trunk/fileinstall/src/test/java/org/apache/felix/fileinstall/DirectoryWatcherTest.java (original)
+++ felix/trunk/fileinstall/src/test/java/org/apache/felix/fileinstall/DirectoryWatcherTest.java Wed Apr 22 09:11:54 2009
@@ -176,6 +176,9 @@
     public void testGetNewFactoryConfiguration() throws Exception
     {
         mockConfigurationControl.replay();
+        mockConfigurationAdmin.listConfigurations( null );
+        mockConfigurationAdminControl.setMatcher( MockControl.ALWAYS_MATCHER );
+        mockConfigurationAdminControl.setReturnValue( null );
         mockConfigurationAdmin.createFactoryConfiguration( "pid", null );
         mockConfigurationAdminControl.setReturnValue( mockConfiguration );
         mockConfigurationAdminControl.replay();
@@ -198,6 +201,9 @@
     public void testGetExistentFactoryConfiguration() throws Exception
     {
         mockConfigurationControl.replay();
+        mockConfigurationAdmin.listConfigurations( null );
+        mockConfigurationAdminControl.setMatcher( MockControl.ALWAYS_MATCHER );
+        mockConfigurationAdminControl.setReturnValue( null );
         mockConfigurationAdmin.createFactoryConfiguration( "pid", null );
         mockConfigurationAdminControl.setReturnValue( mockConfiguration );
         mockConfigurationAdminControl.replay();
@@ -220,6 +226,9 @@
     public void testGetExistentNoFactoryConfiguration() throws Exception
     {
         mockConfigurationControl.replay();
+        mockConfigurationAdmin.listConfigurations( null );
+        mockConfigurationAdminControl.setMatcher( MockControl.ALWAYS_MATCHER );
+        mockConfigurationAdminControl.setReturnValue( null );
         mockConfigurationAdmin.getConfiguration( "pid", null );
         mockConfigurationAdminControl.setReturnValue( mockConfiguration );
         mockConfigurationAdminControl.replay();
@@ -243,6 +252,9 @@
     {
         mockConfiguration.delete();
         mockConfigurationControl.replay();
+        mockConfigurationAdmin.listConfigurations( null );
+        mockConfigurationAdminControl.setMatcher( MockControl.ALWAYS_MATCHER );
+        mockConfigurationAdminControl.setReturnValue( null );
         mockConfigurationAdmin.getConfiguration( "pid", null );
         mockConfigurationAdminControl.setReturnValue( mockConfiguration );
         mockConfigurationAdminControl.replay();
@@ -281,6 +293,9 @@
             }
         } );
         mockConfigurationControl.replay();
+        mockConfigurationAdmin.listConfigurations( null );
+        mockConfigurationAdminControl.setMatcher( MockControl.ALWAYS_MATCHER );
+        mockConfigurationAdminControl.setReturnValue( null );
         mockConfigurationAdmin.getConfiguration( "firstcfg", null );
         mockConfigurationAdminControl.setReturnValue( mockConfiguration );
         mockConfigurationAdminControl.replay();