- String mrjVersion = System.getProperty("mrj.version");
- String majorMRJVersion = mrjVersion.substring(0, 3);
-
- try
- {
- double version = Double.valueOf(majorMRJVersion).doubleValue();
-
- if (version == 2)
- {
- jvm = MRJ_2_0;
- }
- else if ((version >= 2.1) && (version < 3))
- {
- // Assume that all 2.x versions of MRJ work the same. MRJ 2.1 actually
- // works via Runtime.exec() and 2.2 supports that but has an openURL()
- // method
- // as well that we currently ignore.
- jvm = MRJ_2_1;
- }
- else if (version == 3.0)
- {
- jvm = MRJ_3_0;
- }
- else if (version >= 3.1)
- {
- // Assume that all 3.1 and later versions of MRJ work the same.
- jvm = MRJ_3_1;
- }
- else
- {
- loadedWithoutErrors = false;
- errorMessage = "Unsupported MRJ version: " + version;
- }
- } catch (NumberFormatException nfe)
- {
- loadedWithoutErrors = false;
- errorMessage = "Invalid MRJ version: " + mrjVersion;
- }
- }
- else if (osName.startsWith("Windows"))
- {
- if (osName.indexOf("9") != -1)
- {
- jvm = WINDOWS_9x;
- }
- else
- {
- jvm = WINDOWS_NT;
- }
- }
- else
- {
- jvm = OTHER;
- }
-
- if (loadedWithoutErrors)
- { // if we haven't hit any errors yet
- loadedWithoutErrors = loadClasses();
- }
- }
-
- /**
- * This class should be never be instantiated; this just ensures so.
- */
- private BrowserLauncher()
- {
- }
-
- /**
- * Called by a static initializer to load any classes, fields, and methods
- * required at runtime to locate the user's web browser.
- *
- * @return <code>true</code> if all intialization succeeded
- * <code>false</code> if any portion of the initialization failed
- */
- private static boolean loadClasses()
- {
- switch (jvm)
- {
- case MRJ_2_0:
-
- try
- {
- Class aeTargetClass = Class.forName("com.apple.MacOS.AETarget");
- Class osUtilsClass = Class.forName("com.apple.MacOS.OSUtils");
- Class appleEventClass = Class.forName("com.apple.MacOS.AppleEvent");
- Class aeClass = Class.forName("com.apple.MacOS.ae");
- aeDescClass = Class.forName("com.apple.MacOS.AEDesc");
-
- aeTargetConstructor = aeTargetClass
- .getDeclaredConstructor(new Class[]
- { int.class });
- appleEventConstructor = appleEventClass
- .getDeclaredConstructor(new Class[]
- { int.class, int.class, aeTargetClass, int.class, int.class });
- aeDescConstructor = aeDescClass.getDeclaredConstructor(new Class[]
- { String.class });
-
- makeOSType = osUtilsClass.getDeclaredMethod("makeOSType",
- new Class[]
- { String.class });
- putParameter = appleEventClass.getDeclaredMethod("putParameter",
- new Class[]
- { int.class, aeDescClass });
- sendNoReply = appleEventClass.getDeclaredMethod("sendNoReply",
- new Class[]
- {});
-
- Field keyDirectObjectField = aeClass
- .getDeclaredField("keyDirectObject");
- keyDirectObject = (Integer) keyDirectObjectField.get(null);
-
- Field autoGenerateReturnIDField = appleEventClass
- .getDeclaredField("kAutoGenerateReturnID");
- kAutoGenerateReturnID = (Integer) autoGenerateReturnIDField
- .get(null);
-
- Field anyTransactionIDField = appleEventClass
- .getDeclaredField("kAnyTransactionID");
- kAnyTransactionID = (Integer) anyTransactionIDField.get(null);
- } catch (ClassNotFoundException cnfe)
- {
- errorMessage = cnfe.getMessage();
-
- return false;
- } catch (NoSuchMethodException nsme)
- {
- errorMessage = nsme.getMessage();
-
- return false;
- } catch (NoSuchFieldException nsfe)
- {
- errorMessage = nsfe.getMessage();
-
- return false;
- } catch (IllegalAccessException iae)
- {
- errorMessage = iae.getMessage();
-
- return false;
- }
-
- break;
-
- case MRJ_2_1:
-
- try
- {
- mrjFileUtilsClass = Class.forName("com.apple.mrj.MRJFileUtils");
- mrjOSTypeClass = Class.forName("com.apple.mrj.MRJOSType");
-
- Field systemFolderField = mrjFileUtilsClass
- .getDeclaredField("kSystemFolderType");
- kSystemFolderType = systemFolderField.get(null);
- findFolder = mrjFileUtilsClass.getDeclaredMethod("findFolder",
- new Class[]
- { mrjOSTypeClass });
- getFileCreator = mrjFileUtilsClass.getDeclaredMethod(
- "getFileCreator", new Class[]
- { File.class });
- getFileType = mrjFileUtilsClass.getDeclaredMethod("getFileType",
- new Class[]
- { File.class });
- } catch (ClassNotFoundException cnfe)
- {
- errorMessage = cnfe.getMessage();
-
- return false;
- } catch (NoSuchFieldException nsfe)
- {
- errorMessage = nsfe.getMessage();
-
- return false;
- } catch (NoSuchMethodException nsme)
- {
- errorMessage = nsme.getMessage();
-
- return false;
- } catch (SecurityException se)
- {
- errorMessage = se.getMessage();
-
- return false;
- } catch (IllegalAccessException iae)
- {
- errorMessage = iae.getMessage();
-
- return false;
- }
-
- break;
-
- case MRJ_3_0:
-
- try
- {
- Class linker = Class.forName("com.apple.mrj.jdirect.Linker");
- Constructor constructor = linker.getConstructor(new Class[]
- { Class.class });
- linkage = constructor.newInstance(new Object[]
- { BrowserLauncher.class });
- } catch (ClassNotFoundException cnfe)
- {
- errorMessage = cnfe.getMessage();
-
- return false;
- } catch (NoSuchMethodException nsme)
- {
- errorMessage = nsme.getMessage();
-
- return false;
- } catch (InvocationTargetException ite)
- {
- errorMessage = ite.getMessage();
-
- return false;
- } catch (InstantiationException ie)
- {
- errorMessage = ie.getMessage();
-
- return false;
- } catch (IllegalAccessException iae)
- {
- errorMessage = iae.getMessage();
-
- return false;
- }
-
- break;
-
- case MRJ_3_1:
-
- try
- {
- mrjFileUtilsClass = Class.forName("com.apple.mrj.MRJFileUtils");
- openURL = mrjFileUtilsClass.getDeclaredMethod("openURL",
- new Class[]
- { String.class });
- } catch (ClassNotFoundException cnfe)
- {
- errorMessage = cnfe.getMessage();
-
- return false;
- } catch (NoSuchMethodException nsme)
- {
- errorMessage = nsme.getMessage();
-
- return false;
- }
-
- break;
-
- default:
- break;