Bug 525840 - [9] java 9 jdk source not found when debugging
Change-Id: I32ad3134df3ab2a8eb191360aa12498fcd68d430
Signed-off-by: Jay Arthanareeswaran <jarthana@in.ibm.com>
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
index ea47cb0..0129511 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -54,36 +54,40 @@
IRuntimeClasspathEntry entry = entries[i];
switch (entry.getType()) {
case IRuntimeClasspathEntry.ARCHIVE:
- IPackageFragmentRoot root = getPackageFragmentRoot(entry);
- if (root == null) {
- String path = entry.getSourceAttachmentLocation();
- ISourceContainer container = null;
- if (path == null) {
- // use the archive itself
- path = entry.getLocation();
- }
- if (path != null) {
- // check if file or folder
- File file = new File(path);
- if (file.isDirectory()) {
- IResource resource = entry.getResource();
- if (resource instanceof IContainer) {
- container = new FolderSourceContainer((IContainer)resource, false);
- } else {
- container = new DirectorySourceContainer(file, false);
- }
- } else {
- container = new ExternalArchiveSourceContainer(path, true);
+ if (entry.getPath().lastSegment().equals("jrt-fs.jar")) { //$NON-NLS-1$
+ getPackageFragmentRootContainers(entry, containers);
+ } else {
+ IPackageFragmentRoot root = getPackageFragmentRoot(entry);
+ if (root == null) {
+ String path = entry.getSourceAttachmentLocation();
+ ISourceContainer container = null;
+ if (path == null) {
+ // use the archive itself
+ path = entry.getLocation();
}
+ if (path != null) {
+ // check if file or folder
+ File file = new File(path);
+ if (file.isDirectory()) {
+ IResource resource = entry.getResource();
+ if (resource instanceof IContainer) {
+ container = new FolderSourceContainer((IContainer) resource, false);
+ } else {
+ container = new DirectorySourceContainer(file, false);
+ }
+ } else {
+ container = new ExternalArchiveSourceContainer(path, true);
+ }
+ if (!containers.contains(container)) {
+ containers.add(container);
+ }
+ }
+ } else {
+ ISourceContainer container = new PackageFragmentRootSourceContainer(root);
if (!containers.contains(container)) {
containers.add(container);
}
}
- } else {
- ISourceContainer container = new PackageFragmentRootSourceContainer(root);
- if (!containers.contains(container)) {
- containers.add(container);
- }
}
break;
case IRuntimeClasspathEntry.PROJECT:
@@ -190,4 +194,42 @@
}
return null;
}
+
+
+ /**
+ * Determines the package fragment roots from the java model and adds corresponding PackageFragmentRootSourceContainer to the list of containers
+ * if their source attachment and path is same as the entry.
+ *
+ * @param entry
+ * archive runtime classpath entry for jrt-fs.jar
+ * @param containers
+ * container list to be updated
+ */
+
+ private static void getPackageFragmentRootContainers(IRuntimeClasspathEntry entry, List<ISourceContainer> containers) {
+ IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
+ IPath entryPath = entry.getPath();
+ try {
+ IJavaProject[] jps = model.getJavaProjects();
+ for (int i = 0; i < jps.length; i++) {
+ IJavaProject jp = jps[i];
+ IProject p = jp.getProject();
+ if (p.isOpen()) {
+ IPackageFragmentRoot[] allRoots = jp.getPackageFragmentRoots();
+ for (int j = 0; j < allRoots.length; j++) {
+ IPackageFragmentRoot root = allRoots[j];
+ if (root.getPath().equals(entryPath) && isSourceAttachmentEqual(root, entry)) {
+ PackageFragmentRootSourceContainer container = new PackageFragmentRootSourceContainer(root);
+ if (!containers.contains(container)) {
+ containers.add(container);
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (JavaModelException e) {
+ LaunchingPlugin.log(e);
+ }
+ }
}