Merge branch 'master' of git@git.labs.intellij.net:idea/community
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / vfs / impl / win32 / Win32Kernel.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.vfs.impl.win32;
17
18 import com.intellij.util.ArrayUtil;
19
20 import java.io.FileNotFoundException;
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.Map;
24
25 /**
26  * @author Dmitry Avdeev
27  */
28 public class Win32Kernel {
29
30   public static final int FILE_ATTRIBUTE_DIRECTORY = 0x0010;
31   public static final int FILE_ATTRIBUTE_READONLY =  0x0001;
32
33   private IdeaWin32 myKernel = new IdeaWin32();
34
35   private Map<String, FileInfo> myCache = new HashMap<String, FileInfo>();
36
37   void clearCache() {
38     myCache.clear();
39   }
40
41   public String[] list(String absolutePath) {
42
43     FileInfo[] fileInfos = myKernel.listChildren(absolutePath.replace('/', '\\') + "\\*.*");
44     if (fileInfos == null) {
45       return ArrayUtil.EMPTY_STRING_ARRAY;
46     }
47     ArrayList<String> names = new ArrayList<String>(fileInfos.length);
48     for (int i = 0, fileInfosLength = fileInfos.length; i < fileInfosLength; i++) {
49       FileInfo info = fileInfos[i];
50       if (info.name.equals(".")) {
51         myCache.put(absolutePath, info);
52         continue;
53       }
54       else if (info.name.equals("..")) {
55         continue;
56       }
57       myCache.put(absolutePath + "/" + info.name, info);
58       names.add(info.name);
59     }
60
61     return ArrayUtil.toStringArray(names);
62   }
63
64   public boolean exists(String path) {
65     try {
66       getInfo(path);
67       return true;
68     }
69     catch (FileNotFoundException e) {
70       return myKernel.checkExist(path);
71     }
72   }
73
74   public boolean isDirectory(String path) throws FileNotFoundException {
75     FileInfo data = getInfo(path);
76     return (data.attributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
77   }
78
79   public boolean isWritable(String path) throws FileNotFoundException {
80     FileInfo fileInfo = getInfo(path);
81     myCache.remove(path);
82     return (fileInfo.attributes & FILE_ATTRIBUTE_READONLY) == 0;
83   }
84
85   public long getTimeStamp(String path) throws FileNotFoundException {
86     long timestamp = getInfo(path).timestamp;
87     return timestamp / 10000 - 11644473600000l;
88   }
89
90   private FileInfo getInfo(String path) throws FileNotFoundException {
91     FileInfo info = myCache.get(path);
92     if (info == null) {
93
94       info = myKernel.getInfo(path.replace('/', '\\'));
95       if (info == null) {
96         throw new FileNotFoundException(path);
97       }
98       myCache.put(path, info);
99     }
100     return info;
101   }
102 }