57a2a2b4ab77dcbb24a87ec75973ac88537fe379
[idea/community.git] / jps / model-api / src / org / jetbrains / jps / util / JpsPathUtil.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package org.jetbrains.jps.util;
3
4 import com.intellij.openapi.util.SystemInfo;
5 import com.intellij.openapi.util.io.FileUtilRt;
6 import com.intellij.openapi.util.text.StringUtil;
7 import org.jetbrains.annotations.Contract;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.annotations.Nullable;
10
11 import java.io.File;
12 import java.io.IOException;
13 import java.io.UncheckedIOException;
14 import java.nio.file.Files;
15 import java.nio.file.Path;
16 import java.util.Set;
17 import java.util.stream.Stream;
18
19 public class JpsPathUtil {
20
21   public static boolean isUnder(Set<File> ancestors, File file) {
22     if (ancestors.isEmpty()) {
23       return false; // optimization
24     }
25     File current = file;
26     while (current != null) {
27       if (ancestors.contains(current)) {
28         return true;
29       }
30       current = FileUtilRt.getParentFile(current);
31     }
32     return false;
33   }
34
35   public static File urlToFile(String url) {
36     return new File(urlToOsPath(url));
37   }
38
39   @NotNull
40   public static String urlToOsPath(@NotNull String url) {
41     return FileUtilRt.toSystemDependentName(urlToPath(url));
42   }
43
44   @Contract("null -> null; !null -> !null")
45   public static String urlToPath(@Nullable String url) {
46     if (url == null) {
47       return null;
48     }
49     if (url.startsWith("file://")) {
50       return url.substring("file://".length());
51     }
52     else if (url.startsWith("jar://")) {
53       url = url.substring("jar://".length());
54       url = StringUtil.trimEnd(url, "!/");
55     }
56     return url;
57   }
58
59   //todo[nik] copied from VfsUtil
60   @NotNull
61   public static String fixURLforIDEA(@NotNull String url) {
62     int idx = url.indexOf(":/");
63     if (idx >= 0 && idx + 2 < url.length() && url.charAt(idx + 2) != '/') {
64       String prefix = url.substring(0, idx);
65       String suffix = url.substring(idx + 2);
66
67       if (SystemInfo.isWindows) {
68         url = prefix + "://" + suffix;
69       }
70       else {
71         url = prefix + ":///" + suffix;
72       }
73     }
74     return url;
75   }
76
77   public static String pathToUrl(String path) {
78     return "file://" + path;
79   }
80
81   public static String getLibraryRootUrl(File file) {
82     String path = FileUtilRt.toSystemIndependentName(file.getAbsolutePath());
83     return file.isDirectory() ? "file://" + path : "jar://" + path + "!/";
84   }
85
86   public static boolean isJrtUrl(@NotNull String url) {
87     return url.startsWith("jrt://");
88   }
89
90   public static @Nullable String readProjectName(@NotNull Path projectDir) {
91     try (Stream<String> stream = Files.lines(projectDir.resolve(".name"))) {
92       return stream.findFirst().map(String::trim).orElse(null);
93     }
94     catch (IOException | UncheckedIOException e) {
95       return null;
96     }
97   }
98
99   public static final String UNNAMED_PROJECT = "<unnamed>";
100
101   public static @NotNull String getDefaultProjectName(@NotNull Path projectDir) {
102     Path parent = projectDir.getParent();
103     if (parent != null) {
104       Path name = parent.getFileName();  // `null` when parent is a Windows disk root
105       return name != null ? name.toString() : parent.toString();
106     }
107     else {
108       return UNNAMED_PROJECT;
109     }
110   }
111 }