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