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
;
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
);
52 public static void rewriteVersion(final File file
, final int version
) throws IOException
{
53 final long prevLastModifiedValue
= file
.lastModified();
55 FileUtil
.delete(file
);
57 file
.getParentFile().mkdirs();
58 final DataOutputStream os
= new DataOutputStream(new FileOutputStream(file
));
64 ourIndexIdToCreationStamp
.clear();
66 file
.setLastModified(Math
.max(System
.currentTimeMillis(), prevLastModifiedValue
+ 1000));
70 public static long getIndexCreationStamp(ID
<?
, ?
> indexName
) {
71 long stamp
= ourIndexIdToCreationStamp
.get(indexName
);
73 stamp
= getVersionFile(indexName
).lastModified();
74 ourIndexIdToCreationStamp
.put(indexName
, stamp
);
79 public static boolean versionDiffers(final File versionFile
, final int currentIndexVersion
) {
81 final DataInputStream in
= new DataInputStream(new FileInputStream(versionFile
));
83 final int savedIndexVersion
= in
.readInt();
84 final int commonVersion
= in
.readInt();
85 return savedIndexVersion
!= currentIndexVersion
|| commonVersion
!= VERSION
;
91 catch (IOException e
) {
97 public static VirtualFile
findFileById(final PersistentFS fs
, final int id
) {
98 if (ourUnitTestMode
) {
99 final VirtualFile testFile
= findTestFile(id
);
100 if (testFile
!= null) {
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));
119 private static VirtualFile
findTestFile(final int id
) {
120 return DummyFileSystem
.getInstance().findById(id
);