author | erikj |
Tue, 12 Sep 2017 19:03:39 +0200 | |
changeset 47216 | 71c04702a3d5 |
parent 35667 | jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java@ed476aba94de |
child 51152 | edd69f959190 |
permissions | -rw-r--r-- |
12047 | 1 |
/* |
14342
8435a30053c1
7197491: update copyright year to match last edit in jdk8 jdk repository
alanb
parents:
12559
diff
changeset
|
2 |
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
12047 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
7 |
* published by the Free Software Foundation. Oracle designates this |
|
8 |
* particular file as subject to the "Classpath" exception as provided |
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
|
10 |
* |
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
24 |
*/ |
|
25 |
||
26 |
package com.apple.eio; |
|
27 |
||
28 |
import java.io.*; |
|
29 |
||
30 |
/** |
|
31 |
* Provides functionality to query and modify Mac-specific file attributes. The methods in this class are based on Finder |
|
32 |
* attributes. These attributes in turn are dependent on HFS and HFS+ file systems. As such, it is important to recognize |
|
33 |
* their limitation when writing code that must function well across multiple platforms.<p> |
|
34 |
* |
|
35667 | 35 |
* In addition to file name suffixes, Mac OS X can use Finder attributes like file {@code type} and {@code creator} codes to |
36 |
* identify and handle files. These codes are unique 4-byte identifiers. The file {@code type} is a string that describes the |
|
37 |
* contents of a file. For example, the file type {@code APPL} identifies the file as an application and therefore |
|
38 |
* executable. A file type of {@code TEXT} means that the file contains raw text. Any application that can read raw |
|
39 |
* text can open a file of type {@code TEXT}. Applications that use proprietary file types might assign their files a proprietary |
|
40 |
* file {@code type} code. |
|
12047 | 41 |
* <p> |
35667 | 42 |
* To identify the application that can handle a document, the Finder can look at the {@code creator}. For example, if a user |
43 |
* double-clicks on a document with the {@code ttxt creator}, it opens up in Text Edit, the application registered |
|
44 |
* with the {@code ttxt creator} code. Note that the {@code creator} |
|
12047 | 45 |
* code can be set to any application, not necessarily the application that created it. For example, if you |
35667 | 46 |
* use an editor to create an HTML document, you might want to assign a browser's {@code creator} code for the file rather than |
47 |
* the HTML editor's {@code creator} code. Double-clicking on the document then opens the appropriate browser rather than the |
|
12047 | 48 |
*HTML editor. |
49 |
*<p> |
|
50 |
* If you plan to publicly distribute your application, you must register its creator and any proprietary file types with the Apple |
|
51 |
* Developer Connection to avoid collisions with codes used by other developers. You can register a codes online at the |
|
52 |
* <a target=_blank href=http://developer.apple.com/dev/cftype/>Creator Code Registration</a> site. |
|
53 |
* |
|
54 |
* @since 1.4 |
|
55 |
*/ |
|
56 |
public class FileManager { |
|
57 |
static { |
|
12559
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
12047
diff
changeset
|
58 |
java.security.AccessController.doPrivileged( |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
12047
diff
changeset
|
59 |
new java.security.PrivilegedAction<Void>() { |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
12047
diff
changeset
|
60 |
public Void run() { |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
12047
diff
changeset
|
61 |
System.loadLibrary("osx"); |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
12047
diff
changeset
|
62 |
return null; |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
12047
diff
changeset
|
63 |
} |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
12047
diff
changeset
|
64 |
}); |
12047 | 65 |
} |
66 |
||
67 |
/** |
|
68 |
* The default |
|
69 |
* @since Java for Mac OS X 10.5 - 1.5 |
|
70 |
* @since Java for Mac OS X 10.5 Update 1 - 1.6 |
|
71 |
*/ |
|
32865
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
31061
diff
changeset
|
72 |
public static final short kOnAppropriateDisk = -32767; |
12047 | 73 |
/** |
74 |
* Read-only system hierarchy. |
|
75 |
* @since Java for Mac OS X 10.5 - 1.5 |
|
76 |
* @since Java for Mac OS X 10.5 Update 1 - 1.6 |
|
77 |
*/ |
|
32865
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
31061
diff
changeset
|
78 |
public static final short kSystemDomain = -32766; |
12047 | 79 |
/** |
80 |
* All users of a single machine have access to these resources. |
|
81 |
* @since Java for Mac OS X 10.5 - 1.5 |
|
82 |
* @since Java for Mac OS X 10.5 Update 1 - 1.6 |
|
83 |
*/ |
|
32865
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
31061
diff
changeset
|
84 |
public static final short kLocalDomain = -32765; |
12047 | 85 |
/** |
86 |
* All users configured to use a common network server has access to these resources. |
|
87 |
* @since Java for Mac OS X 10.5 - 1.5 |
|
88 |
* @since Java for Mac OS X 10.5 Update 1 - 1.6 |
|
89 |
*/ |
|
32865
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
31061
diff
changeset
|
90 |
public static final short kNetworkDomain = -32764; |
12047 | 91 |
/** |
92 |
* Read/write. Resources that are private to the user. |
|
93 |
* @since Java for Mac OS X 10.5 - 1.5 |
|
94 |
* @since Java for Mac OS X 10.5 Update 1 - 1.6 |
|
95 |
*/ |
|
32865
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
31061
diff
changeset
|
96 |
public static final short kUserDomain = -32763; |
12047 | 97 |
|
98 |
||
99 |
/** |
|
31061 | 100 |
* Converts an OSType (e.g. "macs" |
101 |
* from {@literal <CarbonCore/Folders.h>}) into an int. |
|
12047 | 102 |
* |
103 |
* @param type the 4 character type to convert. |
|
104 |
* @return an int representing the 4 character value |
|
105 |
* |
|
106 |
* @since Java for Mac OS X 10.5 - 1.5 |
|
107 |
* @since Java for Mac OS X 10.5 Update 1 - 1.6 |
|
108 |
*/ |
|
109 |
@SuppressWarnings("deprecation") |
|
110 |
public static int OSTypeToInt(String type) { |
|
111 |
int result = 0; |
|
112 |
||
113 |
byte b[] = { (byte) 0, (byte) 0, (byte) 0, (byte) 0 }; |
|
114 |
int len = type.length(); |
|
115 |
if (len > 0) { |
|
116 |
if (len > 4) len = 4; |
|
117 |
type.getBytes(0, len, b, 4 - len); |
|
118 |
} |
|
119 |
||
120 |
for (int i = 0; i < len; i++) { |
|
121 |
if (i > 0) result <<= 8; |
|
122 |
result |= (b[i] & 0xff); |
|
123 |
} |
|
124 |
||
125 |
return result; |
|
126 |
} |
|
127 |
||
128 |
/** |
|
35667 | 129 |
* Sets the file {@code type} and {@code creator} codes for a file or folder. |
12047 | 130 |
* |
131 |
* @since 1.4 |
|
132 |
*/ |
|
133 |
public static void setFileTypeAndCreator(String filename, int type, int creator) throws IOException { |
|
134 |
SecurityManager security = System.getSecurityManager(); |
|
135 |
if (security != null) { |
|
136 |
security.checkWrite(filename); |
|
137 |
} |
|
138 |
_setFileTypeAndCreator(filename, type, creator); |
|
139 |
} |
|
140 |
private static native void _setFileTypeAndCreator(String filename, int type, int creator) throws IOException; |
|
141 |
||
142 |
/** |
|
35667 | 143 |
* Sets the file {@code type} code for a file or folder. |
12047 | 144 |
* |
145 |
* @since 1.4 |
|
146 |
*/ |
|
147 |
public static void setFileType(String filename, int type) throws IOException { |
|
148 |
SecurityManager security = System.getSecurityManager(); |
|
149 |
if (security != null) { |
|
150 |
security.checkWrite(filename); |
|
151 |
} |
|
152 |
_setFileType(filename, type); |
|
153 |
} |
|
154 |
private static native void _setFileType(String filename, int type) throws IOException; |
|
155 |
||
156 |
/** |
|
35667 | 157 |
* Sets the file {@code creator} code for a file or folder. |
12047 | 158 |
* |
159 |
* @since 1.4 |
|
160 |
*/ |
|
161 |
public static void setFileCreator(String filename, int creator) throws IOException { |
|
162 |
SecurityManager security = System.getSecurityManager(); |
|
163 |
if (security != null) { |
|
164 |
security.checkWrite(filename); |
|
165 |
} |
|
166 |
_setFileCreator(filename, creator); |
|
167 |
} |
|
168 |
private static native void _setFileCreator(String filename, int creator) throws IOException; |
|
169 |
||
170 |
/** |
|
35667 | 171 |
* Obtains the file {@code type} code for a file or folder. |
12047 | 172 |
* |
173 |
* @since 1.4 |
|
174 |
*/ |
|
175 |
public static int getFileType(String filename) throws IOException { |
|
176 |
SecurityManager security = System.getSecurityManager(); |
|
177 |
if (security != null) { |
|
178 |
security.checkRead(filename); |
|
179 |
} |
|
180 |
return _getFileType(filename); |
|
181 |
} |
|
182 |
private static native int _getFileType(String filename) throws IOException; |
|
183 |
||
184 |
/** |
|
35667 | 185 |
* Obtains the file {@code creator} code for a file or folder. |
12047 | 186 |
* |
187 |
* @since 1.4 |
|
188 |
*/ |
|
189 |
public static int getFileCreator(String filename) throws IOException { |
|
190 |
SecurityManager security = System.getSecurityManager(); |
|
191 |
if (security != null) { |
|
192 |
security.checkRead(filename); |
|
193 |
} |
|
194 |
return _getFileCreator(filename); |
|
195 |
} |
|
196 |
private static native int _getFileCreator(String filename) throws IOException; |
|
197 |
||
198 |
||
199 |
/** |
|
200 |
* Locates a folder of a particular type. Mac OS X recognizes certain specific folders that have distinct purposes. |
|
201 |
* For example, the user's desktop or temporary folder. These folders have corresponding codes. Given one of these codes, |
|
202 |
* this method returns the path to that particular folder. Certain folders of a given type may appear in more than |
|
35667 | 203 |
* one domain. For example, although there is only one {@code root} folder, there are multiple {@code pref} |
204 |
* folders. If this method is called to find the {@code pref} folder, it will return the first one it finds, |
|
205 |
* the user's preferences folder in {@code ~/Library/Preferences}. To explicitly locate a folder in a certain |
|
206 |
* domain use {@code findFolder(short domain, int folderType)} or |
|
207 |
* {@code findFolder(short domain, int folderType, boolean createIfNeeded)}. |
|
12047 | 208 |
* |
209 |
* @return the path to the folder searched for |
|
210 |
* |
|
211 |
* @since 1.4 |
|
212 |
*/ |
|
213 |
public static String findFolder(int folderType) throws FileNotFoundException { |
|
214 |
return findFolder(kOnAppropriateDisk, folderType); |
|
215 |
} |
|
216 |
||
217 |
/** |
|
35667 | 218 |
* Locates a folder of a particular type, within a given domain. Similar to {@code findFolder(int folderType)} |
219 |
* except that the domain to look in can be specified. Valid values for {@code domain} include: |
|
12047 | 220 |
* <dl> |
221 |
* <dt>user</dt> |
|
222 |
* <dd>The User domain contains resources specific to the user who is currently logged in</dd> |
|
223 |
* <dt>local</dt> |
|
224 |
* <dd>The Local domain contains resources shared by all users of the system but are not needed for the system |
|
225 |
* itself to run.</dd> |
|
226 |
* <dt>network</dt> |
|
227 |
* <dd>The Network domain contains resources shared by users of a local area network.</dd> |
|
228 |
* <dt>system</dt> |
|
229 |
* <dd>The System domain contains the operating system resources installed by Apple.</dd> |
|
230 |
* </dl> |
|
231 |
* |
|
232 |
* @return the path to the folder searched for |
|
233 |
* |
|
234 |
* @since 1.4 |
|
235 |
*/ |
|
236 |
public static String findFolder(short domain, int folderType) throws FileNotFoundException { |
|
237 |
return findFolder(domain, folderType, false); |
|
238 |
} |
|
239 |
||
240 |
/** |
|
241 |
* Locates a folder of a particular type within a given domain and optionally creating the folder if it does |
|
35667 | 242 |
* not exist. The behavior is similar to {@code findFolder(int folderType)} and |
243 |
* {@code findFolder(short domain, int folderType)} except that it can create the folder if it does not already exist. |
|
12047 | 244 |
* |
245 |
* @param createIfNeeded |
|
35667 | 246 |
* set to {@code true}, by setting to {@code false} the behavior will be the |
247 |
* same as {@code findFolder(short domain, int folderType, boolean createIfNeeded)} |
|
12047 | 248 |
* @return the path to the folder searched for |
249 |
* |
|
250 |
* @since 1.4 |
|
251 |
*/ |
|
252 |
public static String findFolder(short domain, int folderType, boolean createIfNeeded) throws FileNotFoundException { |
|
253 |
final SecurityManager security = System.getSecurityManager(); |
|
254 |
if (security != null) { |
|
255 |
security.checkPermission(new RuntimePermission("canExamineFileSystem")); |
|
256 |
} |
|
257 |
||
258 |
final String foundFolder = _findFolder(domain, folderType, createIfNeeded); |
|
259 |
if (foundFolder == null) throw new FileNotFoundException("Can't find folder: " + Integer.toHexString(folderType)); |
|
260 |
return foundFolder; |
|
261 |
} |
|
262 |
private static native String _findFolder(short domain, int folderType, boolean createIfNeeded); |
|
263 |
||
264 |
||
265 |
/** |
|
35667 | 266 |
* Opens the path specified by a URL in the appropriate application for that URL. HTTP URL's ({@code http://}) |
267 |
* open in the default browser as set in the Internet pane of System Preferences. File ({@code file://}) and |
|
268 |
* FTP URL's ({@code ftp://}) open in the Finder. Note that opening an FTP URL will prompt the user for where |
|
12047 | 269 |
* they want to save the downloaded file(s). |
270 |
* |
|
271 |
* @param url |
|
272 |
* the URL for the file you want to open, it can either be an HTTP, FTP, or file url |
|
273 |
* |
|
274 |
* @deprecated this functionality has been superseded by java.awt.Desktop.browse() and java.awt.Desktop.open() |
|
275 |
* |
|
276 |
* @since 1.4 |
|
277 |
*/ |
|
278 |
@Deprecated |
|
279 |
public static void openURL(String url) throws IOException { |
|
280 |
SecurityManager security = System.getSecurityManager(); |
|
281 |
if (security != null) { |
|
282 |
security.checkPermission(new RuntimePermission("canOpenURLs")); |
|
283 |
} |
|
284 |
_openURL(url); |
|
285 |
} |
|
286 |
private static native void _openURL(String url) throws IOException; |
|
287 |
||
288 |
/** |
|
289 |
* @return full pathname for the resource identified by a given name. |
|
290 |
* |
|
291 |
* @since 1.4 |
|
292 |
*/ |
|
293 |
public static String getResource(String resourceName) throws FileNotFoundException { |
|
294 |
return getResourceFromBundle(resourceName, null, null); |
|
295 |
} |
|
296 |
||
297 |
/** |
|
298 |
* @return full pathname for the resource identified by a given name and located in the specified bundle subdirectory. |
|
299 |
* |
|
300 |
* @since 1.4 |
|
301 |
*/ |
|
302 |
public static String getResource(String resourceName, String subDirName) throws FileNotFoundException { |
|
303 |
return getResourceFromBundle(resourceName, subDirName, null); |
|
304 |
} |
|
305 |
||
306 |
/** |
|
307 |
* Returns the full pathname for the resource identified by the given name and file extension |
|
308 |
* and located in the specified bundle subdirectory. |
|
309 |
* |
|
310 |
* If extension is an empty string or null, the returned pathname is the first one encountered where the |
|
311 |
* file name exactly matches name. |
|
312 |
* |
|
313 |
* If subpath is null, this method searches the top-level nonlocalized resource directory (typically Resources) |
|
314 |
* and the top-level of any language-specific directories. For example, suppose you have a modern bundle and |
|
315 |
* specify "Documentation" for the subpath parameter. This method would first look in the |
|
316 |
* Contents/Resources/Documentation directory of the bundle, followed by the Documentation subdirectories of |
|
317 |
* each language-specific .lproj directory. (The search order for the language-specific directories |
|
318 |
* corresponds to the user's preferences.) This method does not recurse through any other subdirectories at |
|
319 |
* any of these locations. For more details see the AppKit NSBundle documentation. |
|
320 |
* |
|
321 |
* @return full pathname for the resource identified by the given name and file extension and located in the specified bundle subdirectory. |
|
322 |
* |
|
323 |
* @since 1.4 |
|
324 |
*/ |
|
325 |
public static String getResource(String resourceName, String subDirName, String type) throws FileNotFoundException { |
|
326 |
return getResourceFromBundle(resourceName, subDirName, type); |
|
327 |
} |
|
328 |
||
329 |
private static native String getNativeResourceFromBundle(String resourceName, String subDirName, String type) throws FileNotFoundException; |
|
330 |
private static String getResourceFromBundle(String resourceName, String subDirName, String type) throws FileNotFoundException { |
|
331 |
final SecurityManager security = System.getSecurityManager(); |
|
332 |
if (security != null) security.checkPermission(new RuntimePermission("canReadBundle")); |
|
333 |
||
334 |
final String resourceFromBundle = getNativeResourceFromBundle(resourceName, subDirName, type); |
|
335 |
if (resourceFromBundle == null) throw new FileNotFoundException(resourceName); |
|
336 |
return resourceFromBundle; |
|
337 |
} |
|
338 |
||
339 |
/** |
|
340 |
* Obtains the path to the current application's NSBundle, may not |
|
341 |
* return a valid path if Java was launched from the command line. |
|
342 |
* |
|
343 |
* @return full pathname of the NSBundle of the current application executable. |
|
344 |
* |
|
345 |
* @since Java for Mac OS X 10.5 Update 1 - 1.6 |
|
346 |
* @since Java for Mac OS X 10.5 Update 2 - 1.5 |
|
347 |
*/ |
|
348 |
public static String getPathToApplicationBundle() { |
|
349 |
SecurityManager security = System.getSecurityManager(); |
|
350 |
if (security != null) security.checkPermission(new RuntimePermission("canReadBundle")); |
|
351 |
return getNativePathToApplicationBundle(); |
|
352 |
} |
|
353 |
||
354 |
private static native String getNativePathToApplicationBundle(); |
|
355 |
||
356 |
/** |
|
357 |
* Moves the specified file to the Trash |
|
358 |
* |
|
31061 | 359 |
* @param file the file |
12047 | 360 |
* @return returns true if the NSFileManager successfully moved the file to the Trash. |
361 |
* @throws FileNotFoundException |
|
362 |
* |
|
363 |
* @since Java for Mac OS X 10.6 Update 1 - 1.6 |
|
364 |
* @since Java for Mac OS X 10.5 Update 6 - 1.6, 1.5 |
|
365 |
*/ |
|
366 |
public static boolean moveToTrash(final File file) throws FileNotFoundException { |
|
367 |
if (file == null || !file.exists()) throw new FileNotFoundException(); |
|
368 |
final String fileName = file.getAbsolutePath(); |
|
369 |
||
370 |
final SecurityManager security = System.getSecurityManager(); |
|
371 |
if (security != null) security.checkWrite(fileName); |
|
372 |
||
373 |
return _moveToTrash(fileName); |
|
374 |
} |
|
375 |
||
376 |
private static native boolean _moveToTrash(String fileName); |
|
377 |
||
378 |
/** |
|
379 |
* Reveals the specified file in the Finder |
|
380 |
* |
|
381 |
* @param file |
|
382 |
* the file to reveal |
|
383 |
* @return returns true if the NSFileManager successfully revealed the file in the Finder. |
|
384 |
* @throws FileNotFoundException |
|
385 |
* |
|
386 |
* @since Java for Mac OS X 10.6 Update 1 - 1.6 |
|
387 |
* @since Java for Mac OS X 10.5 Update 6 - 1.6, 1.5 |
|
388 |
*/ |
|
389 |
public static boolean revealInFinder(final File file) throws FileNotFoundException { |
|
390 |
if (file == null || !file.exists()) throw new FileNotFoundException(); |
|
391 |
final String fileName = file.getAbsolutePath(); |
|
392 |
||
393 |
final SecurityManager security = System.getSecurityManager(); |
|
394 |
if (security != null) security.checkRead(fileName); |
|
395 |
||
396 |
return _revealInFinder(fileName); |
|
397 |
} |
|
398 |
||
399 |
private static native boolean _revealInFinder(String fileName); |
|
400 |
} |