cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / platform / platform-api / src / com / intellij / ide / browsers / firefox / FirefoxUtil.java
1 // Copyright 2000-2020 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 com.intellij.ide.browsers.firefox;
3
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.openapi.util.SystemInfo;
6 import com.intellij.openapi.util.text.StringUtil;
7 import com.intellij.util.SmartList;
8 import com.intellij.util.SystemProperties;
9 import org.jetbrains.annotations.NonNls;
10 import org.jetbrains.annotations.NotNull;
11 import org.jetbrains.annotations.Nullable;
12
13 import java.io.BufferedReader;
14 import java.io.File;
15 import java.io.FileReader;
16 import java.io.IOException;
17 import java.util.Collections;
18 import java.util.List;
19
20 public final class FirefoxUtil {
21   private static final Logger LOG = Logger.getInstance(FirefoxUtil.class);
22   @NonNls public static final String PROFILES_INI_FILE = "profiles.ini";
23
24   private FirefoxUtil() {
25   }
26
27   @Nullable
28   public static File getDefaultProfileIniPath() {
29     File[] roots = getProfilesDirs();
30     for (File profilesDir : roots) {
31       File profilesFile = new File(profilesDir, PROFILES_INI_FILE);
32       if (profilesFile.isFile()) {
33         return profilesFile;
34       }
35     }
36     return null;
37   }
38
39   @Nullable
40   public static File getFirefoxExtensionsDir(FirefoxSettings settings) {
41     File profilesFile = settings.getProfilesIniFile();
42     if (profilesFile != null && profilesFile.exists()) {
43       List<FirefoxProfile> profiles = computeProfiles(profilesFile);
44       FirefoxProfile profile = findProfileByNameOrDefault(settings.getProfile(), profiles);
45       if (profile != null) {
46         File profileDir = profile.getProfileDirectory(profilesFile);
47         if (profileDir.isDirectory()) {
48           return new File(profileDir, "extensions");
49         }
50       }
51     }
52     return null;
53   }
54
55   @Nullable
56   public static FirefoxProfile findProfileByNameOrDefault(@Nullable String name, @NotNull List<? extends FirefoxProfile> profiles) {
57     for (FirefoxProfile profile : profiles) {
58       if (profile.getName().equals(name)) {
59         return profile;
60       }
61     }
62     return getDefaultProfile(profiles);
63   }
64
65   @Nullable
66   public static FirefoxProfile getDefaultProfile(List<? extends FirefoxProfile> profiles) {
67     if (profiles.isEmpty()) {
68       return null;
69     }
70
71     for (FirefoxProfile profile : profiles) {
72       if (profile.isDefault()) {
73         return profile;
74       }
75     }
76     return profiles.get(0);
77   }
78
79   @NotNull
80   public static List<FirefoxProfile> computeProfiles(@Nullable File profilesFile) {
81     if (profilesFile == null || !profilesFile.isFile()) {
82       return Collections.emptyList();
83     }
84
85       try (BufferedReader reader = new BufferedReader(new FileReader(profilesFile))) {
86         final List<FirefoxProfile> profiles = new SmartList<>();
87         boolean insideProfile = false;
88         String currentName = null;
89         String currentPath = null;
90         boolean isDefault = false;
91         boolean isRelative = false;
92         boolean eof = false;
93         while (!eof) {
94           String line = reader.readLine();
95           if (line == null) {
96             eof = true;
97             line = "[]";
98           }
99           else {
100             line = line.trim();
101           }
102
103           if (line.startsWith("[") && line.endsWith("]")) {
104             if (!StringUtil.isEmpty(currentPath) && !StringUtil.isEmpty(currentName)) {
105               profiles.add(new FirefoxProfile(currentName, currentPath, isDefault, isRelative));
106             }
107             currentName = null;
108             currentPath = null;
109             isDefault = false;
110             isRelative = false;
111             insideProfile = StringUtil.startsWithIgnoreCase(line, "[Profile");
112             continue;
113           }
114
115           final int i = line.indexOf('=');
116           if (i != -1 && insideProfile) {
117             String name = line.substring(0, i).trim();
118             String value = line.substring(i + 1).trim();
119             if (name.equalsIgnoreCase("path")) {
120               currentPath = value;
121             }
122             else if (name.equalsIgnoreCase("name")) {
123               currentName = value;
124             }
125             else if (name.equalsIgnoreCase("default") && value.equals("1")) {
126               isDefault = true;
127             }
128             else //noinspection SpellCheckingInspection
129               if (name.equalsIgnoreCase("isrelative") && value.equals("1")) {
130                 isRelative = true;
131               }
132           }
133         }
134         return profiles;
135       }
136     catch (IOException e) {
137       LOG.info(e);
138       return Collections.emptyList();
139     }
140   }
141
142   private static File[] getProfilesDirs() {
143     final String userHome = SystemProperties.getUserHome();
144     if (SystemInfo.isMac) {
145       return new File[] {
146         new File(userHome, "Library" + File.separator + "Mozilla" + File.separator + "Firefox"),
147         new File(userHome, "Library" + File.separator + "Application Support" + File.separator + "Firefox"),
148       };
149     }
150     if (SystemInfo.isUnix) {
151       return new File[] {new File(userHome, ".mozilla" + File.separator + "firefox")};
152     }
153
154     String localPath = "Mozilla" + File.separator + "Firefox";
155     return new File[] {
156       new File(System.getenv("APPDATA"), localPath),
157       new File(userHome, "AppData" + File.separator + "Roaming" + File.separator + localPath),
158       new File(userHome, "Application Data" + File.separator + localPath)
159     };
160   }
161 }