Bug 62803 - ExternalArchiveSourceContainer needs to handle multiple root paths
diff --git a/org.eclipse.jdt.debug.tests/testresources/source-test.zip b/org.eclipse.jdt.debug.tests/testresources/source-test.zip
new file mode 100644
index 0000000..4712ce7
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testresources/source-test.zip
Binary files differ
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ExternalArchiveSourceContainerTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ExternalArchiveSourceContainerTests.java
index 181c39e..2706733 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ExternalArchiveSourceContainerTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/ExternalArchiveSourceContainerTests.java
@@ -10,11 +10,15 @@
  *******************************************************************************/
 package org.eclipse.jdt.debug.tests.core;
 
+import java.io.File;
+
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.debug.core.sourcelookup.ISourceContainer;
 import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
 import org.eclipse.debug.core.sourcelookup.containers.ExternalArchiveSourceContainer;
 import org.eclipse.debug.core.sourcelookup.containers.ZipEntryStorage;
+import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
 import org.eclipse.jdt.debug.tests.AbstractDebugTest;
 import org.eclipse.jdt.internal.launching.JavaSourceLookupDirector;
 import org.eclipse.jdt.launching.JavaRuntime;
@@ -54,6 +58,21 @@
 	}
 	
 	/**
+	 * Returns the source archive at the specified path within this plug-in.
+	 */
+	protected ExternalArchiveSourceContainer getContainer(String path, boolean detect, boolean duplicates) throws Exception {
+		ISourceLookupDirector director = new JavaSourceLookupDirector();
+		director.initializeParticipants();
+		director.setFindDuplicates(duplicates);
+		IPath p = new Path(path);
+		File file = JavaTestPlugin.getDefault().getFileInPlugin(p);
+		assertTrue("file " + path +  " does not exist", file != null && file.exists());
+		ExternalArchiveSourceContainer container = new ExternalArchiveSourceContainer(file.getAbsolutePath(), detect);
+		director.setSourceContainers(new ISourceContainer[]{container});
+		return container;
+	}	
+	
+	/**
 	 * Tests creation and restoring from a memento.
 	 * 
 	 * @throws Exception
@@ -104,4 +123,32 @@
 		ZipEntryStorage storage = (ZipEntryStorage) objects[0];
 		assertEquals("Wrong file", "Object.java", storage.getName());
 	}	
+	
+	public void testAutoDetectUnqualifiedSourceLookupPositive() throws Exception {
+		ExternalArchiveSourceContainer container = getContainer(true, false);
+		// force detection
+		Object[] objects = container.findSourceElements("java/lang/Object.java");
+		// then search for unqualified file
+		objects = container.findSourceElements("Object.java");
+		assertEquals("Expected 1 result", 1, objects.length);
+		ZipEntryStorage storage = (ZipEntryStorage) objects[0];
+		assertEquals("Wrong file", "Object.java", storage.getName());
+	}
+	
+	public void testAutoDetectMultipleRoots() throws Exception {
+		ExternalArchiveSourceContainer container = getContainer("testresources/source-test.zip", true, false);
+		// find .java file
+		Object[] objects = container.findSourceElements("one/two/Three.java");
+		assertEquals("Expected 1 result", 1, objects.length);
+		ZipEntryStorage storage = (ZipEntryStorage) objects[0];
+		assertEquals("Wrong file", "Three.java", storage.getName());
+		// find .txt file
+		objects = container.findSourceElements("another/file-b.txt");
+		storage = (ZipEntryStorage) objects[0];
+		assertEquals("Wrong file", "file-b.txt", storage.getName());
+		// find another .txt file
+		objects = container.findSourceElements("folder/file-c.txt");
+		storage = (ZipEntryStorage) objects[0];
+		assertEquals("Wrong file", "file-c.txt", storage.getName());		
+	}		
 }