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