Bug 221254 - Problems with dropins on second start
diff --git a/bundles/org.eclipse.equinox.p2.directorywatcher/src/org/eclipse/equinox/internal/p2/directorywatcher/ProvisioningListener.java b/bundles/org.eclipse.equinox.p2.directorywatcher/src/org/eclipse/equinox/internal/p2/directorywatcher/ProvisioningListener.java
index 51861c8..ebbd16a 100644
--- a/bundles/org.eclipse.equinox.p2.directorywatcher/src/org/eclipse/equinox/internal/p2/directorywatcher/ProvisioningListener.java
+++ b/bundles/org.eclipse.equinox.p2.directorywatcher/src/org/eclipse/equinox/internal/p2/directorywatcher/ProvisioningListener.java
@@ -134,8 +134,9 @@
 	}
 
 	private void generate() {
-		File directory = watcher.getDirectory();
-		IGeneratorInfo info = getProvider(new File[] {directory}, directory);
+		File[] directories = watcher.getDirectories();
+		// TODO this prob isn't right.
+		IGeneratorInfo info = getProvider(directories, directories[0]);
 		new Generator(info).generate();
 	}
 
diff --git a/bundles/org.eclipse.equinox.p2.directorywatcher/src/org/eclipse/equinox/internal/provisional/p2/directorywatcher/DirectoryWatcher.java b/bundles/org.eclipse.equinox.p2.directorywatcher/src/org/eclipse/equinox/internal/provisional/p2/directorywatcher/DirectoryWatcher.java
index 6efe2b8..c704d2c 100644
--- a/bundles/org.eclipse.equinox.p2.directorywatcher/src/org/eclipse/equinox/internal/provisional/p2/directorywatcher/DirectoryWatcher.java
+++ b/bundles/org.eclipse.equinox.p2.directorywatcher/src/org/eclipse/equinox/internal/provisional/p2/directorywatcher/DirectoryWatcher.java
@@ -57,7 +57,7 @@
 		System.err.println(string + ": " + e);
 	}
 
-	final File directory;
+	final File[] directories;
 
 	long poll = 2000;
 	private Set listeners = new HashSet();
@@ -73,14 +73,20 @@
 
 		File targetDirectory = new File(dir);
 		targetDirectory.mkdirs();
-		directory = targetDirectory;
+		directories = new File[] {targetDirectory};
 	}
 
 	public DirectoryWatcher(File directory) {
 		if (directory == null)
 			throw new IllegalArgumentException("Folder must not be null");
 
-		this.directory = directory;
+		this.directories = new File[] {directory};
+	}
+
+	public DirectoryWatcher(File[] directories) {
+		if (directories == null)
+			throw new IllegalArgumentException("Folder must not be null");
+		this.directories = directories;
 	}
 
 	public synchronized void addListener(DirectoryChangeListener listener) {
@@ -117,8 +123,8 @@
 		watcher = null;
 	}
 
-	public File getDirectory() {
-		return directory;
+	public File[] getDirectories() {
+		return directories;
 	}
 
 	private void startPoll() {
@@ -130,25 +136,28 @@
 	}
 
 	private void scanDirectories() {
-		File list[] = directory.listFiles();
-		if (list == null)
-			return;
-		for (int i = 0; i < list.length; i++) {
-			File file = list[i];
-			// if this is a deletion marker then add to the list of pending deletions.
-			if (list[i].getPath().endsWith(".del")) {
-				File target = new File(file.getPath().substring(0, file.getPath().length() - 4));
-				removals.add(target);
-				pendingDeletions.add(target);
-			} else {
-				// else remember that we saw the file and remove it from this list of files to be 
-				// removed at the end.  Then notify all the listeners as needed.
-				scannedFiles.add(file);
-				removals.remove(file);
-				for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
-					DirectoryChangeListener listener = (DirectoryChangeListener) iterator.next();
-					if (isInterested(listener, file))
-						processFile(file, listener);
+		for (int index = 0; index < directories.length; index++) {
+			File directory = directories[index];
+			File list[] = directory.listFiles();
+			if (list == null)
+				return;
+			for (int i = 0; i < list.length; i++) {
+				File file = list[i];
+				// if this is a deletion marker then add to the list of pending deletions.
+				if (list[i].getPath().endsWith(".del")) {
+					File target = new File(file.getPath().substring(0, file.getPath().length() - 4));
+					removals.add(target);
+					pendingDeletions.add(target);
+				} else {
+					// else remember that we saw the file and remove it from this list of files to be 
+					// removed at the end.  Then notify all the listeners as needed.
+					scannedFiles.add(file);
+					removals.remove(file);
+					for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+						DirectoryChangeListener listener = (DirectoryChangeListener) iterator.next();
+						if (isInterested(listener, file))
+							processFile(file, listener);
+					}
 				}
 			}
 		}
diff --git a/bundles/org.eclipse.equinox.p2.reconciler.dropins/src/org/eclipse/equinox/internal/p2/reconciler/dropins/Activator.java b/bundles/org.eclipse.equinox.p2.reconciler.dropins/src/org/eclipse/equinox/internal/p2/reconciler/dropins/Activator.java
index 6515344..2f52b99 100644
--- a/bundles/org.eclipse.equinox.p2.reconciler.dropins/src/org/eclipse/equinox/internal/p2/reconciler/dropins/Activator.java
+++ b/bundles/org.eclipse.equinox.p2.reconciler.dropins/src/org/eclipse/equinox/internal/p2/reconciler/dropins/Activator.java
@@ -120,24 +120,19 @@
 		RepositoryListener listener = new RepositoryListener(Activator.getContext(), Integer.toString(folder.hashCode()));
 		listener.getArtifactRepository().setProperty(PROFILE_EXTENSION, profile.getProfileId());
 
-		DirectoryWatcher watcher = new DirectoryWatcher(folder);
+		List folders = new ArrayList();
+		folders.add(folder);
+		File eclipseFeatures = new File(folder, "eclipse/features");
+		if (eclipseFeatures.isDirectory())
+			folders.add(eclipseFeatures);
+		File eclipsePlugins = new File(folder, "eclipse/plugins");
+		if (eclipsePlugins.isDirectory())
+			folders.add(eclipsePlugins);
+
+		DirectoryWatcher watcher = new DirectoryWatcher((File[]) folders.toArray(new File[folders.size()]));
 		watcher.addListener(listener);
 		watcher.poll();
 
-		File eclipseFeatures = new File(folder, "eclipse/features");
-		if (eclipseFeatures.isDirectory()) {
-			DirectoryWatcher eclipsePluginsWatcher = new DirectoryWatcher(eclipseFeatures);
-			eclipsePluginsWatcher.addListener(listener);
-			eclipsePluginsWatcher.poll();
-		}
-
-		File eclipsePlugins = new File(folder, "eclipse/plugins");
-		if (eclipsePlugins.isDirectory()) {
-			DirectoryWatcher eclipsePluginsWatcher = new DirectoryWatcher(eclipsePlugins);
-			eclipsePluginsWatcher.addListener(listener);
-			eclipsePluginsWatcher.poll();
-		}
-
 		dropinRepository = listener.getMetadataRepository();
 	}
 
diff --git a/bundles/org.eclipse.equinox.p2.reconciler/src/org/eclipse/equinox/internal/p2/reconciler/dropins/Activator.java b/bundles/org.eclipse.equinox.p2.reconciler/src/org/eclipse/equinox/internal/p2/reconciler/dropins/Activator.java
index 6515344..2f52b99 100644
--- a/bundles/org.eclipse.equinox.p2.reconciler/src/org/eclipse/equinox/internal/p2/reconciler/dropins/Activator.java
+++ b/bundles/org.eclipse.equinox.p2.reconciler/src/org/eclipse/equinox/internal/p2/reconciler/dropins/Activator.java
@@ -120,24 +120,19 @@
 		RepositoryListener listener = new RepositoryListener(Activator.getContext(), Integer.toString(folder.hashCode()));
 		listener.getArtifactRepository().setProperty(PROFILE_EXTENSION, profile.getProfileId());
 
-		DirectoryWatcher watcher = new DirectoryWatcher(folder);
+		List folders = new ArrayList();
+		folders.add(folder);
+		File eclipseFeatures = new File(folder, "eclipse/features");
+		if (eclipseFeatures.isDirectory())
+			folders.add(eclipseFeatures);
+		File eclipsePlugins = new File(folder, "eclipse/plugins");
+		if (eclipsePlugins.isDirectory())
+			folders.add(eclipsePlugins);
+
+		DirectoryWatcher watcher = new DirectoryWatcher((File[]) folders.toArray(new File[folders.size()]));
 		watcher.addListener(listener);
 		watcher.poll();
 
-		File eclipseFeatures = new File(folder, "eclipse/features");
-		if (eclipseFeatures.isDirectory()) {
-			DirectoryWatcher eclipsePluginsWatcher = new DirectoryWatcher(eclipseFeatures);
-			eclipsePluginsWatcher.addListener(listener);
-			eclipsePluginsWatcher.poll();
-		}
-
-		File eclipsePlugins = new File(folder, "eclipse/plugins");
-		if (eclipsePlugins.isDirectory()) {
-			DirectoryWatcher eclipsePluginsWatcher = new DirectoryWatcher(eclipsePlugins);
-			eclipsePluginsWatcher.addListener(listener);
-			eclipsePluginsWatcher.poll();
-		}
-
 		dropinRepository = listener.getMetadataRepository();
 	}
 
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/directorywatcher/DirectoryWatcherTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/directorywatcher/DirectoryWatcherTest.java
index 6d69f35..f9da12a 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/directorywatcher/DirectoryWatcherTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/directorywatcher/DirectoryWatcherTest.java
@@ -27,7 +27,7 @@
 
 	public void testCreateDirectoryWatcherNullDirectory() throws Exception {
 		try {
-			new DirectoryWatcher(null);
+			new DirectoryWatcher((File) null);
 		} catch (IllegalArgumentException e) {
 			return;
 		}