This commit is contained in:
Alexander Potochkin 2009-11-06 22:33:40 +03:00
commit f28a61c6d9
4 changed files with 43 additions and 41 deletions

View File

@ -201,6 +201,8 @@ public abstract class ShellFolder extends File {
private static ShellFolderManager shellFolderManager; private static ShellFolderManager shellFolderManager;
private static Invoker invoker;
static { static {
String managerClassName = (String)Toolkit.getDefaultToolkit(). String managerClassName = (String)Toolkit.getDefaultToolkit().
getDesktopProperty("Shell.shellFolderManager"); getDesktopProperty("Shell.shellFolderManager");
@ -225,6 +227,8 @@ public abstract class ShellFolder extends File {
throw new Error ("Could not access Shell Folder Manager: " throw new Error ("Could not access Shell Folder Manager: "
+ managerClass.getName()); + managerClass.getName());
} }
invoker = shellFolderManager.createInvoker();
} }
/** /**
@ -486,21 +490,6 @@ public abstract class ShellFolder extends File {
return null; 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 * Invokes the {@code task} which doesn't throw checked exceptions
* from its {@code call} method. If invokation is interrupted then Thread.currentThread().isInterrupted() will * 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) public static <T, E extends Throwable> T invoke(Callable<T> task, Class<E> exceptionClass)
throws InterruptedException, E { throws InterruptedException, E {
try { try {
return getInvoker().invoke(task); return invoker.invoke(task);
} catch (Exception e) { } catch (Exception e) {
if (e instanceof RuntimeException) { if (e instanceof RuntimeException) {
// Rethrow unchecked exceptions // Rethrow unchecked exceptions

View File

@ -693,6 +693,7 @@ final class Win32ShellFolder2 extends ShellFolder {
ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>(); ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
long pEnumObjects = getEnumObjects(includeHiddenFiles); long pEnumObjects = getEnumObjects(includeHiddenFiles);
if (pEnumObjects != 0) { if (pEnumObjects != 0) {
try {
long childPIDL; long childPIDL;
int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
do { do {
@ -715,8 +716,10 @@ final class Win32ShellFolder2 extends ShellFolder {
releasePIDL(childPIDL); releasePIDL(childPIDL);
} }
} while (childPIDL != 0 && !Thread.currentThread().isInterrupted()); } while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
} finally {
releaseEnumObjects(pEnumObjects); releaseEnumObjects(pEnumObjects);
} }
}
return Thread.currentThread().isInterrupted() return Thread.currentThread().isInterrupted()
? new File[0] ? new File[0]
: list.toArray(new ShellFolder[list.size()]); : list.toArray(new ShellFolder[list.size()]);

View File

@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
// Shouldn't happen but watch for it anyway // Shouldn't happen but watch for it anyway
throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found"); throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found");
} }
Win32ShellFolder2 folder = createShellFolderFromRelativePIDL(parent, pIDL);
try {
return createShellFolderFromRelativePIDL(parent, pIDL);
} finally {
Win32ShellFolder2.releasePIDL(pIDL); Win32ShellFolder2.releasePIDL(pIDL);
return folder; }
} }
static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL) static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL)

View File

@ -29,6 +29,7 @@
*/ */
import sun.awt.shell.ShellFolder; import sun.awt.shell.ShellFolder;
import sun.awt.OSInfo;
import java.io.File; import java.io.File;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -43,6 +44,12 @@ public class bug6741890 {
private static final int COUNT = 100000; private static final int COUNT = 100000;
public static void main(String[] args) throws Exception { 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"); String tmpDir = System.getProperty("java.io.tmpdir");
if (tmpDir.length() == 0) { //'java.io.tmpdir' isn't guaranteed to be defined if (tmpDir.length() == 0) { //'java.io.tmpdir' isn't guaranteed to be defined