[java] caching .jar's multi-release flag (IDEA-228768)

GitOrigin-RevId: 29a578ccdafca7b5b03642631e9a2ba050cb29e1
This commit is contained in:
Roman Shevchenko
2019-12-28 20:41:50 +00:00
committed by intellij-monorepo-bot
parent 98f2b7f38f
commit 8ddfc3cf52
@@ -3,6 +3,7 @@ package com.intellij.psi.impl.java.stubs.index;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiJavaModule;
import com.intellij.psi.impl.search.JavaSourceFilterScope;
@@ -10,6 +11,9 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.stubs.StringStubIndexExtension;
import com.intellij.psi.stubs.StubIndex;
import com.intellij.psi.stubs.StubIndexKey;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.util.CachedValueImpl;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -108,15 +112,24 @@ public class JavaModuleNameIndex extends StringStubIndexExtension<PsiJavaModule>
return results;
}
private static final Key<CachedValue<Boolean>> MULTI_RELEASE_KEY = Key.create("jar.multi.release.key");
private static boolean isMultiReleaseJar(VirtualFile root) {
VirtualFile manifest = root.findFileByRelativePath(JarFile.MANIFEST_NAME);
if (manifest != null) {
try (InputStream stream = manifest.getInputStream()) {
return Boolean.valueOf(new Manifest(stream).getMainAttributes().getValue(new Attributes.Name("Multi-Release")));
}
catch (IOException ignored) { }
if (manifest == null) return false;
CachedValue<Boolean> value = manifest.getUserData(MULTI_RELEASE_KEY);
if (value == null) {
manifest.putUserData(MULTI_RELEASE_KEY, value = new CachedValueImpl<>(() -> {
Boolean result = Boolean.FALSE;
try (InputStream stream = manifest.getInputStream()) {
result = Boolean.valueOf(new Manifest(stream).getMainAttributes().getValue(new Attributes.Name("Multi-Release")));
}
catch (IOException ignored) { }
return CachedValueProvider.Result.create(result, manifest);
}));
}
return false;
return value.getValue();
}
private static int version(VirtualFile dir) {