-
Notifications
You must be signed in to change notification settings - Fork 0
/
DirectoryConfig.java
148 lines (114 loc) · 5.55 KB
/
DirectoryConfig.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package dev.pp.basics.utilities.directory;
import java.nio.file.Path;
import dev.pp.basics.annotations.NotNull;
import dev.pp.basics.annotations.Nullable;
import dev.pp.basics.utilities.os.OSDirectories;
import dev.pp.basics.utilities.os.OSName;
public class DirectoryConfig {
/* see:
https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
$XDG_DATA_HOME base directory for user-specific data. Default: $HOME/.local/share
$XDG_CONFIG_HOME base directory for user-specific config files. Default: $HOME/.config
https://github.com/harawata/appdirs
common paths used to store application specific user data:
On Windows >= 7 : C:\Users\<Account>\AppData\<AppAuthor>\<AppName>
On Unix/Linux : /home/<account>/.local/share/<AppName>
On Mac OS X : /Users/<Account>/Library/Application Support/<AppName>
On Windows XP : C:\Documents and Settings\<Account>\Application Data\Local Settings\<AppAuthor>\<AppName>
Windows 7 (username = ave)
User data dir (roaming): C:\Users\ave\AppData\Roaming\harawata\myapp\1.2.3
User config dir (roaming): C:\Users\ave\AppData\Roaming\harawata\myapp\1.2.3
Linux (username = ave, with no XDG environment variables defined)
User data dir (roaming): /home/ave/.local/share/myapp/1.2.3
User config dir (roaming): /home/ave/.config/myapp/1.2.3
Mac OS X (username = ave)
User data dir (roaming): /Users/ave/Library/Application Support/myapp/1.2.3
User config dir (roaming): /Users/ave/Library/Preferences/myapp/1.2.3
AppDirs respects XDG Base Directory Specification if variables are defined.
Returns XDG_DATA_HOME for user data directory.
Returns XDG_CONFIG_HOME for user config directory.
roaming parameter has no effect on Unix/Linux.
*/
public static @NotNull Path userDataDirectoryForApplication (
@Nullable String applicationVendor,
@NotNull String applicationName,
@Nullable Integer applicationMajorVersionNumber,
@Nullable Integer applicationMinorVersionNumber ) {
return userDirectoryForApplication ( userDataDirectory(),
applicationVendor, applicationName, applicationMajorVersionNumber, applicationMinorVersionNumber );
}
public static @NotNull Path userConfigDirectoryForApplication (
@Nullable String applicationVendor,
@NotNull String applicationName,
@Nullable Integer applicationMajorVersionNumber,
@Nullable Integer applicationMinorVersionNumber ) {
return userDirectoryForApplication ( userConfigDirectory(),
applicationVendor, applicationName, applicationMajorVersionNumber, applicationMinorVersionNumber );
}
private static @NotNull Path userDirectoryForApplication (
@NotNull Path rootDirectory,
@Nullable String applicationVendor,
@NotNull String applicationName,
@Nullable Integer applicationMajorVersionNumber,
@Nullable Integer applicationMinorVersionNumber ) {
StringBuilder path = new StringBuilder ();
path.append ( rootDirectory );
path.append ( OSDirectories.DIRECTORY_SEPARATOR );
if ( applicationVendor != null ) {
path.append ( rootDirectory );
path.append ( OSDirectories.DIRECTORY_SEPARATOR );
}
path.append ( applicationName );
// if ( applicationMajorVersionNumber >= 1 ) {
if ( applicationMajorVersionNumber != null ) {
path.append ( OSDirectories.DIRECTORY_SEPARATOR );
path.append ( applicationMajorVersionNumber );
}
if ( applicationMinorVersionNumber != null ) {
path.append ( "_" );
path.append ( applicationMinorVersionNumber );
}
return Path.of ( path.toString() );
}
public static @NotNull Path userDataDirectory() {
String path;
if ( OSName.isWindowsOS() ) {
path = System.getenv ( "APPDATA" );
if ( path == null ) {
path = OSDirectories.USER_HOME_DIRECTORY + "\\AppData\\Roaming";
}
} else if ( OSName.isUnixOS() ) {
path = System.getenv ( "XDG_DATA_HOME" );
if ( path == null ) {
path = OSDirectories.USER_HOME_DIRECTORY + "/.local/share";
}
} else if ( OSName.isMacOS() ) {
path = System.getenv ( "XDG_DATA_HOME" );
if ( path == null ) {
path = OSDirectories.USER_HOME_DIRECTORY + "/Library/Application Support";
}
} else {
throw new RuntimeException ( "Unexpected OS " + OSName.name () );
}
return Path.of ( path );
}
public static @NotNull Path userConfigDirectory() {
String path;
if ( OSName.isWindowsOS() ) {
return userDataDirectory();
} else if ( OSName.isUnixOS() ) {
path = System.getenv ( "XDG_CONFIG_HOME" );
if ( path == null ) {
path = OSDirectories.USER_HOME_DIRECTORY + "/.config";
}
} else if ( OSName.isMacOS() ) {
path = System.getenv ( "XDG_CONFIG_HOME" );
if ( path == null ) {
path = OSDirectories.USER_HOME_DIRECTORY + "/Library/Preferences";
}
} else {
throw new RuntimeException ( "Unexpected OS " + OSName.name () );
}
return Path.of ( path );
}
}