index update now does not require old content for the file (mapOld() removed)
[fedora-idea.git] / platform / lang-impl / src / com / intellij / util / indexing / IndexInfrastructure.java
blob4895a78a2a17551f79a1e22ba1169008b383cdc8
1 /*
2 * @author max
3 */
4 package com.intellij.util.indexing;
6 import com.intellij.openapi.application.ApplicationManager;
7 import com.intellij.openapi.application.PathManager;
8 import com.intellij.openapi.util.io.FileUtil;
9 import com.intellij.openapi.vfs.VirtualFile;
10 import com.intellij.openapi.vfs.ex.dummy.DummyFileSystem;
11 import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS;
12 import com.intellij.psi.stubs.StubIndexKey;
13 import com.intellij.psi.stubs.StubUpdatingIndex;
14 import gnu.trove.TObjectLongHashMap;
15 import org.jetbrains.annotations.Nullable;
17 import java.io.*;
18 import java.util.Locale;
20 @SuppressWarnings({"HardCodedStringLiteral"})
21 public class IndexInfrastructure {
22 private static final int VERSION = 8;
23 private static final TObjectLongHashMap<ID<?, ?>> ourIndexIdToCreationStamp = new TObjectLongHashMap<ID<?, ?>>();
24 private static final boolean ourUnitTestMode = ApplicationManager.getApplication().isUnitTestMode();
26 private IndexInfrastructure() {
29 public static File getVersionFile(final ID<?, ?> indexName) {
30 return new File(getIndexRootDir(indexName), indexName + ".ver");
33 public static File getStorageFile(final ID<?, ?> indexName) {
34 return new File(getIndexRootDir(indexName), indexName.toString());
37 public static File getInputIndexStorageFile(final ID<?, ?> indexName) {
38 return new File(getIndexRootDir(indexName), indexName.toString()+"_inputs");
41 public static File getIndexRootDir(final ID<?, ?> indexName) {
42 final String dirName = indexName.toString().toLowerCase(Locale.US);
43 // store StubIndices under StubUpdating index' root to ensure they are deleted
44 // when StubUpdatingIndex version is changed
45 final File indexDir = indexName instanceof StubIndexKey ?
46 new File(getIndexRootDir(StubUpdatingIndex.INDEX_ID), dirName) :
47 new File(PathManager.getIndexRoot(), dirName);
48 indexDir.mkdirs();
49 return indexDir;
52 public static void rewriteVersion(final File file, final int version) throws IOException {
53 final long prevLastModifiedValue = file.lastModified();
54 if (file.exists()) {
55 FileUtil.delete(file);
57 file.getParentFile().mkdirs();
58 final DataOutputStream os = new DataOutputStream(new FileOutputStream(file));
59 try {
60 os.writeInt(version);
61 os.writeInt(VERSION);
63 finally {
64 ourIndexIdToCreationStamp.clear();
65 os.close();
66 file.setLastModified(Math.max(System.currentTimeMillis(), prevLastModifiedValue + 1000));
70 public static long getIndexCreationStamp(ID<?, ?> indexName) {
71 long stamp = ourIndexIdToCreationStamp.get(indexName);
72 if (stamp <= 0) {
73 stamp = getVersionFile(indexName).lastModified();
74 ourIndexIdToCreationStamp.put(indexName, stamp);
76 return stamp;
79 public static boolean versionDiffers(final File versionFile, final int currentIndexVersion) {
80 try {
81 final DataInputStream in = new DataInputStream(new FileInputStream(versionFile));
82 try {
83 final int savedIndexVersion = in.readInt();
84 final int commonVersion = in.readInt();
85 return savedIndexVersion != currentIndexVersion || commonVersion != VERSION;
87 finally {
88 in.close();
91 catch (IOException e) {
92 return true;
96 @Nullable
97 public static VirtualFile findFileById(final PersistentFS fs, final int id) {
98 if (ourUnitTestMode) {
99 final VirtualFile testFile = findTestFile(id);
100 if (testFile != null) {
101 return testFile;
105 return fs.findFileById(id);
109 final boolean isDirectory = fs.isDirectory(id);
110 final DirectoryInfo directoryInfo = isDirectory ? dirIndex.getInfoForDirectoryId(id) : dirIndex.getInfoForDirectoryId(fs.getParent(id));
111 if (directoryInfo != null && (directoryInfo.contentRoot != null || directoryInfo.sourceRoot != null || directoryInfo.libraryClassRoot != null)) {
112 return isDirectory? directoryInfo.directory : directoryInfo.directory.findChild(fs.getName(id));
114 return null;
118 @Nullable
119 private static VirtualFile findTestFile(final int id) {
120 return DummyFileSystem.getInstance().findById(id);