diff options
author | Roland Grunberg | 2019-10-24 22:37:11 +0000 |
---|---|---|
committer | Roland Grunberg | 2019-12-03 21:31:41 +0000 |
commit | 9c0cf52f3525e62dc2c7dbd9ccbcf3edd9f8ab89 (patch) | |
tree | a41ba44b744b50ab48ba347e35fe03919eef6a58 | |
parent | deea9fcf7ccba05989e3c83f7a23150a0aa61920 (diff) | |
download | eclipse.jdt.core-9c0cf52f3525e62dc2c7dbd9ccbcf3edd9f8ab89.tar.gz eclipse.jdt.core-9c0cf52f3525e62dc2c7dbd9ccbcf3edd9f8ab89.tar.xz eclipse.jdt.core-9c0cf52f3525e62dc2c7dbd9ccbcf3edd9f8ab89.zip |
Bug 515268 - Shared JDT Index folder among different workspaces.S4_14_0_RC2aS4_14_0_RC2R4_14I20191210-0610I20191204-1800I20191204-0600R4_14_maintenance
- Allow enablement of this feature using jdt.core.sharedIndexLocation
property
- Index entries not present in the common location will still cause the
index manager to fall back to creating the index in the normal workspace
location
Change-Id: I0a2d41a3abf23c64f98c8b3060c281dc71e48509
-rw-r--r-- | org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaIndexTests.java | 59 | ||||
-rw-r--r-- | org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClasspathEntry.java | 30 |
2 files changed, 87 insertions, 2 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaIndexTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaIndexTests.java index f29622ff8b..ddfaa7ac6e 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaIndexTests.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaIndexTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012 IBM Corporation and others. + * Copyright (c) 2012, 2019 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -16,6 +16,9 @@ package org.eclipse.jdt.core.tests.model; import java.io.File; import java.io.IOException; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.zip.CRC32; import junit.framework.Test; @@ -34,6 +37,7 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.index.*; import org.eclipse.jdt.core.search.SearchEngine; import org.eclipse.jdt.core.tests.util.Util; +import org.eclipse.jdt.internal.core.ClasspathEntry; import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.core.UserLibraryClasspathContainer; import org.osgi.service.prefs.BackingStoreException; @@ -50,6 +54,7 @@ public class JavaIndexTests extends AbstractJavaSearchTests { public static Test suite() { return buildModelTestSuite(JavaIndexTests.class); } + // Test that the index file is really generated. public void testGenerateIndex() throws IOException { String indexFilePath = getExternalResourcePath("Test.index"); @@ -866,4 +871,56 @@ public class JavaIndexTests extends AbstractJavaSearchTests { deleteProject("ForIndex"); } } + + // Test shared index location functionality + public void testSharedIndexLocation() throws CoreException, IOException { + // Create temporary testing folder + String sharedIndexDir = Files.createTempDirectory("shared_index").toFile().getCanonicalPath(); + // enable shared index + ClasspathEntry.setSharedIndexLocation(sharedIndexDir, getClass()); + // path of library must be platform neutral + String jarFilePath = Path.fromOSString(Paths.get(sharedIndexDir, "Test.jar").toString()).toPortableString(); + // compute index file + CRC32 checksumCalculator = new CRC32(); + checksumCalculator.update(jarFilePath.getBytes()); + String fileName = Long.toString(checksumCalculator.getValue()) + ".index"; + String indexFilePath = Paths.get(sharedIndexDir, fileName).toString(); + try { + createJar(new String[] { + "pkg/Test.java", + "package pkg;\n" + + "public class Test {\n" + + " protected Test(int i) {}\n" + + "}"}, jarFilePath); + + JavaIndexer.generateIndexForJar(jarFilePath, indexFilePath); + assertTrue(new File(indexFilePath).exists()); + long modified = new File(indexFilePath).lastModified(); + + IJavaProject p = createJavaProject("P"); + Path libPath = new Path(jarFilePath); + IClasspathEntry entry = JavaCore.newLibraryEntry(libPath, null, null, null, null, false); + setClasspath(p, new IClasspathEntry[] { entry }); + + waitUntilIndexesReady(); + + // Test that search works properly + search("Test", TYPE, DECLARATIONS, EXACT_RULE, + SearchEngine.createJavaSearchScope(new IJavaElement[] { p })); + assertSearchResults(Paths.get(sharedIndexDir, "Test.jar").toString() + " pkg.Test"); + + // Test that specified index file is really used + java.io.File indexFile = JavaModelManager.getIndexManager().getIndex(libPath, false, false).getIndexFile(); + assertEquals("Specified index file is not being used", indexFilePath, indexFile.toString()); + + // Ensure that the index file is not modified + assertEquals(modified, new File(indexFilePath).lastModified()); + } finally { + deleteProject("P"); + new File(indexFilePath).delete(); + new File(jarFilePath).delete(); + new File(sharedIndexDir).delete(); + ClasspathEntry.setSharedIndexLocation(null, getClass()); + } + } } diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClasspathEntry.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClasspathEntry.java index dc3de3704c..374d128034 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClasspathEntry.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClasspathEntry.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2018 IBM Corporation and others. + * Copyright (c) 2000, 2019 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -31,6 +31,7 @@ import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -38,6 +39,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.zip.CRC32; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -122,6 +124,9 @@ public class ClasspathEntry implements IClasspathEntry { public static final String TAG_DISCOURAGED = "discouraged"; //$NON-NLS-1$ public static final String TAG_IGNORE_IF_BETTER = "ignoreifbetter"; //$NON-NLS-1$ + // common index location for all workspaces + private static String SHARED_INDEX_LOCATION = System.getProperty("jdt.core.sharedIndexLocation"); //$NON-NLS-1$ + /** * Describes the kind of classpath entry - one of * CPE_PROJECT, CPE_LIBRARY, CPE_SOURCE, CPE_VARIABLE or CPE_CONTAINER @@ -1757,6 +1762,18 @@ public class ClasspathEntry implements IClasspathEntry { public URL getLibraryIndexLocation() { switch(getEntryKind()) { case IClasspathEntry.CPE_LIBRARY : + if (SHARED_INDEX_LOCATION != null) { + try { + String pathString = getPath().toPortableString(); + CRC32 checksumCalculator = new CRC32(); + checksumCalculator.update(pathString.getBytes()); + String fileName = Long.toString(checksumCalculator.getValue()) + ".index"; //$NON-NLS-1$ + return new URL("file", null, Paths.get(SHARED_INDEX_LOCATION, fileName).toString()); //$NON-NLS-1$ + } catch (MalformedURLException e1) { + Util.log(e1); // should not happen if protocol known (eg. 'file') + } + } + break; case IClasspathEntry.CPE_VARIABLE : break; default : @@ -2523,4 +2540,15 @@ public class ClasspathEntry implements IClasspathEntry { } return JavaModelStatus.VERIFIED_OK; } + + /* + * For testing shared index location in JavaIndexTests only + */ + public static void setSharedIndexLocation(String value, Class<?> clazz) throws IllegalArgumentException{ + if (clazz != null && "org.eclipse.jdt.core.tests.model.JavaIndexTests".equals(clazz.getName())) { //$NON-NLS-1$ + SHARED_INDEX_LOCATION = value; + } else { + throw new IllegalArgumentException("Cannot set index location for specified test class"); //$NON-NLS-1$ + } + } } |