Merge
This commit is contained in:
commit
f28a61c6d9
@ -201,6 +201,8 @@ public abstract class ShellFolder extends File {
|
||||
|
||||
private static ShellFolderManager shellFolderManager;
|
||||
|
||||
private static Invoker invoker;
|
||||
|
||||
static {
|
||||
String managerClassName = (String)Toolkit.getDefaultToolkit().
|
||||
getDesktopProperty("Shell.shellFolderManager");
|
||||
@ -225,6 +227,8 @@ public abstract class ShellFolder extends File {
|
||||
throw new Error ("Could not access Shell Folder Manager: "
|
||||
+ managerClass.getName());
|
||||
}
|
||||
|
||||
invoker = shellFolderManager.createInvoker();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -486,21 +490,6 @@ public abstract class ShellFolder extends File {
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Invoker invoker;
|
||||
|
||||
/**
|
||||
* Provides the single access point to the {@link Invoker}. It is guaranteed that the value
|
||||
* returned by this method will be always the same.
|
||||
*
|
||||
* @return the singleton instance of {@link Invoker}
|
||||
*/
|
||||
public static Invoker getInvoker() {
|
||||
if (invoker == null) {
|
||||
invoker = shellFolderManager.createInvoker();
|
||||
}
|
||||
return invoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes the {@code task} which doesn't throw checked exceptions
|
||||
* from its {@code call} method. If invokation is interrupted then Thread.currentThread().isInterrupted() will
|
||||
@ -522,7 +511,7 @@ public abstract class ShellFolder extends File {
|
||||
public static <T, E extends Throwable> T invoke(Callable<T> task, Class<E> exceptionClass)
|
||||
throws InterruptedException, E {
|
||||
try {
|
||||
return getInvoker().invoke(task);
|
||||
return invoker.invoke(task);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof RuntimeException) {
|
||||
// Rethrow unchecked exceptions
|
||||
|
@ -693,29 +693,32 @@ final class Win32ShellFolder2 extends ShellFolder {
|
||||
ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
|
||||
long pEnumObjects = getEnumObjects(includeHiddenFiles);
|
||||
if (pEnumObjects != 0) {
|
||||
long childPIDL;
|
||||
int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
|
||||
do {
|
||||
childPIDL = getNextChild(pEnumObjects);
|
||||
boolean releasePIDL = true;
|
||||
if (childPIDL != 0 &&
|
||||
(getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
|
||||
Win32ShellFolder2 childFolder;
|
||||
if (Win32ShellFolder2.this.equals(desktop)
|
||||
&& personal != null
|
||||
&& pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
|
||||
childFolder = personal;
|
||||
} else {
|
||||
childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL);
|
||||
releasePIDL = false;
|
||||
try {
|
||||
long childPIDL;
|
||||
int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
|
||||
do {
|
||||
childPIDL = getNextChild(pEnumObjects);
|
||||
boolean releasePIDL = true;
|
||||
if (childPIDL != 0 &&
|
||||
(getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
|
||||
Win32ShellFolder2 childFolder;
|
||||
if (Win32ShellFolder2.this.equals(desktop)
|
||||
&& personal != null
|
||||
&& pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
|
||||
childFolder = personal;
|
||||
} else {
|
||||
childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL);
|
||||
releasePIDL = false;
|
||||
}
|
||||
list.add(childFolder);
|
||||
}
|
||||
list.add(childFolder);
|
||||
}
|
||||
if (releasePIDL) {
|
||||
releasePIDL(childPIDL);
|
||||
}
|
||||
} while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
|
||||
releaseEnumObjects(pEnumObjects);
|
||||
if (releasePIDL) {
|
||||
releasePIDL(childPIDL);
|
||||
}
|
||||
} while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
|
||||
} finally {
|
||||
releaseEnumObjects(pEnumObjects);
|
||||
}
|
||||
}
|
||||
return Thread.currentThread().isInterrupted()
|
||||
? new File[0]
|
||||
|
@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
|
||||
// Shouldn't happen but watch for it anyway
|
||||
throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found");
|
||||
}
|
||||
Win32ShellFolder2 folder = createShellFolderFromRelativePIDL(parent, pIDL);
|
||||
Win32ShellFolder2.releasePIDL(pIDL);
|
||||
return folder;
|
||||
|
||||
try {
|
||||
return createShellFolderFromRelativePIDL(parent, pIDL);
|
||||
} finally {
|
||||
Win32ShellFolder2.releasePIDL(pIDL);
|
||||
}
|
||||
}
|
||||
|
||||
static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL)
|
||||
|
@ -29,6 +29,7 @@
|
||||
*/
|
||||
|
||||
import sun.awt.shell.ShellFolder;
|
||||
import sun.awt.OSInfo;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
@ -43,6 +44,12 @@ public class bug6741890 {
|
||||
private static final int COUNT = 100000;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) {
|
||||
System.out.println("The test is applicable only for Windows. Skipped.");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
String tmpDir = System.getProperty("java.io.tmpdir");
|
||||
|
||||
if (tmpDir.length() == 0) { //'java.io.tmpdir' isn't guaranteed to be defined
|
||||
|
Loading…
Reference in New Issue
Block a user