@Nullable annotation added
[idea/community.git] / platform / platform-api / src / com / intellij / util / PathUtil.java
1 /*
2  * Copyright 2000-2011 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.util;
17
18 import com.intellij.openapi.application.PathManager;
19 import com.intellij.openapi.util.io.FileUtil;
20 import com.intellij.openapi.util.text.StringUtil;
21 import com.intellij.openapi.vfs.JarFileSystem;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import com.intellij.openapi.vfs.VirtualFileManager;
24 import org.jetbrains.annotations.NonNls;
25 import org.jetbrains.annotations.NotNull;
26 import org.jetbrains.annotations.Nullable;
27
28 import java.io.File;
29
30 public class PathUtil {
31   private PathUtil() {
32   }
33
34   @Nullable
35   public static String getLocalPath(@Nullable VirtualFile file) {
36     if (file == null || !file.isValid()) {
37       return null;
38     }
39     if (file.getFileSystem() instanceof JarFileSystem && file.getParent() != null) {
40       return null;
41     }
42     return getLocalPath(file.getPath());
43   }
44
45   @NotNull
46   public static String getLocalPath(@NotNull String path) {
47     return FileUtil.toSystemDependentName(StringUtil.trimEnd(path, JarFileSystem.JAR_SEPARATOR));
48   }
49
50   @NotNull
51   public static VirtualFile getLocalFile(@NotNull VirtualFile file) {
52     if (!file.isValid()) {
53       return file;
54     }
55     if (file.getFileSystem() instanceof JarFileSystem) {
56       final VirtualFile jarFile = JarFileSystem.getInstance().getVirtualFileForJar(file);
57       if (jarFile != null) {
58         return jarFile;
59       }
60     }
61     return file;
62   }
63
64   @NotNull
65   public static String getJarPathForClass(@NotNull Class aClass) {
66     String resourceRoot = PathManager.getResourceRoot(aClass, "/" + aClass.getName().replace('.', '/') + ".class");
67     return new File(resourceRoot).getAbsoluteFile().getAbsolutePath();
68   }
69
70   @NotNull
71   public static String toPresentableUrl(@NotNull String url) {
72     return getLocalPath(VirtualFileManager.extractPath(url));
73   }
74
75   public static String getCanonicalPath(@NonNls String path) {
76     return FileUtil.toCanonicalPath(path);
77   }
78
79   @NotNull
80   public static String getFileName(@NotNull String path) {
81     if (path.length() == 0) {
82       return "";
83     }
84     final char c = path.charAt(path.length() - 1);
85     int end = c == '/' || c == '\\' ? path.length() - 1 : path.length();
86     int start = Math.max(path.lastIndexOf('/', end - 1), path.lastIndexOf('\\', end - 1)) + 1;
87     return path.substring(start, end);
88   }
89
90   @NotNull
91   public static String getParentPath(@NotNull String path) {
92     if (path.length() == 0) {
93       return "";
94     }
95     int end = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\'));
96     if (end == path.length() - 1) {
97       end = Math.max(path.lastIndexOf('/', end - 1), path.lastIndexOf('\\', end - 1));
98     }
99     return end == -1 ? "" : path.substring(0, end);
100   }
101
102   @NotNull
103   public static String suggestFileName(@NotNull String text) {
104     StringBuilder result = new StringBuilder();
105     for (int i = 0; i < text.length(); i++) {
106       char c = text.charAt(i);
107       if (!isValidFileNameChar(c) || c == '.' || Character.isWhitespace(c)) {
108         result.append('_');
109       }
110       else {
111         result.append(c);
112       }
113     }
114     return result.toString();
115   }
116
117   public static boolean isValidFileName(@NotNull String fileName) {
118     for (int i = 0; i < fileName.length(); i++) {
119       if (!isValidFileNameChar(fileName.charAt(i))) {
120         return false;
121       }
122     }
123     return true;
124   }
125
126   private static boolean isValidFileNameChar(char c) {
127     return c != '/' && c != '\\' && c != '\t' && c != '\n' && c != '\r' && c != ':' && c != ';' && c != '*' && c != '?'
128         && c != '"' && c != '\'' && c != '<' && c != '>';
129   }
130 }