[vassalengine-svn-trunk] [vassalengine-svn] SF.net SVN: vassalengine:[3936] VASSAL-src/trunk/src/VA
Brought to you by:
rodneykinney,
uckelman
From: <uck...@us...> - 2008-07-30 17:12:29
|
Revision: 3936 http://vassalengine.svn.sourceforge.net/vassalengine/?rev=3936&view=rev Author: uckelman Date: 2008-07-30 17:12:33 +0000 (Wed, 30 Jul 2008) Log Message: ----------- Added some javadoc. Moved java.exe path finder to WinRegUtils. Modified Paths: -------------- VASSAL-src/trunk/src/VASSAL/launch/AbstractLaunchAction.java VASSAL-src/trunk/src/VASSAL/tools/WinRegUtils.java Modified: VASSAL-src/trunk/src/VASSAL/launch/AbstractLaunchAction.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/launch/AbstractLaunchAction.java 2008-07-30 12:59:51 UTC (rev 3935) +++ VASSAL-src/trunk/src/VASSAL/launch/AbstractLaunchAction.java 2008-07-30 17:12:33 UTC (rev 3936) @@ -57,6 +57,7 @@ import VASSAL.tools.CommunicationErrorDialog; import VASSAL.tools.ErrorDialog; import VASSAL.tools.IOUtils; +import VASSAL.tools.WinRegUtils; import VASSAL.tools.filechooser.FileChooser; import VASSAL.tools.filechooser.ModuleFileFilter; @@ -238,7 +239,16 @@ // build the child process final ArrayList<String> al = new ArrayList<String>(); - al.add("java"); + + if (Info.isWindows()) { + // check the registry to find java.exe + final String java = WinRegUtils.getJavaPath(); + al.add(java == null ? "java" : java); + } + else { + al.add("java"); + } + al.add("-Xms" + initialHeap + "M"); al.add("-Xmx" + maximumHeap + "M"); al.add("-cp"); Modified: VASSAL-src/trunk/src/VASSAL/tools/WinRegUtils.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/tools/WinRegUtils.java 2008-07-30 12:59:51 UTC (rev 3935) +++ VASSAL-src/trunk/src/VASSAL/tools/WinRegUtils.java 2008-07-30 17:12:33 UTC (rev 3936) @@ -1,4 +1,21 @@ - +/* + * $Id$ + * + * Copyright (c) 2008 by Joel Uckelman + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License (LGPL) as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, copies are available + * at http://www.opensource.org. + */ package VASSAL.tools; import java.lang.reflect.InvocationTargetException; @@ -6,24 +23,42 @@ import VASSAL.Info; +/** + * A utility class for manipulating the Windows Registry. This class uses + * reflection to leverage existing methods in + * {@link java.util.prefs.WindowsPreferences} for reading and writing the + * Windows Registry. It's an ugly hack, but one abomination deserves another. + * Think hard about whether you <i>really</i> need to use the Windows Registry. + * For a description of the registry manipulation functions, see + * {@link http://msdn.microsoft.com/en-us/library/ms724875(VS.85).aspx}. + * + * @author Joel Uckelman + * @since 3.1.0 + */ public class WinRegUtils { - + // Handles to various registry hives public static final int HKEY_CLASSES_ROOT = 0x80000000; public static final int HKEY_CURRENT_USER = 0x80000001; public static final int HKEY_LOCAL_MACHINE = 0x80000002; - + + // Windows error codes public static final int ERROR_SUCCESS = 0; public static final int ERROR_FILE_NOT_FOUND = 2; public static final int ERROR_ACCESS_DENIED = 5; + // Constants used to interpret int[] returns public static final int NATIVE_HANDLE = 0; public static final int ERROR_CODE = 1; public static final int SUBKEYS_NUMBER = 0; public static final int VALUES_NUMBER = 2; public static final int MAX_KEY_LENGTH = 3; public static final int MAX_VALUE_NAME_LENGTH = 4; + public static final int DISPOSITION = 2; + public static final int REG_CREATED_NEW_KEY = 1; + public static final int REG_OPENED_EXISTING_KEY = 2; + public static final int NULL_NATIVE_HANDLE = 0; - // security masks for openKey + // Windows security masks public static final int DELETE = 0x10000; public static final int KEY_QUERY_VALUE = 1; public static final int KEY_SET_VALUE = 2; @@ -32,7 +67,8 @@ public static final int KEY_READ = 0x20019; public static final int KEY_WRITE = 0x20006; public static final int KEY_ALL_ACCESS = 0xF003F; - + + // Methods pulled from java.util.prefs.WindowsPreferences private Method windowsRegOpenKey; private Method windowsRegCloseKey; private Method windowsRegCreateKeyEx; @@ -50,6 +86,7 @@ private WinRegUtils() { if (!Info.isWindows()) throw new UnsupportedOperationException(); + // set up the methods from WindowsPreferences try { final Class<?> c = Class.forName("java.util.prefs.WindowsPreferences"); @@ -103,6 +140,15 @@ } } + /** + * Invokes a {@link Method} with the given arguments and returns its result. + * + * @param m the method to invoke + * @param ret the return type of the method + * @param args the arguments with which to invoke the method + * @return the result of the invoking the method + * @throws RegistryException if something goes wrong + */ private static <T> T invoker(Method m, Class<T> ret, Object... args) throws RegistryException { try { @@ -119,6 +165,7 @@ } } + public static int[] openKey(int hKey, String subKey, int securityMask) throws RegistryException { return invoker(instance.windowsRegOpenKey, @@ -149,9 +196,8 @@ public static String queryValueEx(int hKey, String valueName) throws RegistryException { - final byte[] ret = invoker(instance.windowsRegQueryValueEx, - byte[].class, hKey, toByteArray(valueName)); - return ret == null ? null : new String(ret).trim(); + return toString(invoker(instance.windowsRegQueryValueEx, + byte[].class, hKey, toByteArray(valueName))); } @@ -174,102 +220,112 @@ public static String enumKeyEx(int hKey, int subKeyIndex, int maxKeyLength) throws RegistryException { - final byte[] ret = invoker(instance.windowsRegEnumKeyEx, - byte[].class, hKey, subKeyIndex, maxKeyLength); - return ret == null ? null : new String(ret).trim(); + return toString(invoker(instance.windowsRegEnumKeyEx, + byte[].class, hKey, subKeyIndex, maxKeyLength)); } public static String enumValue(int hKey, int valueIndex, int maxValueNameLength) throws RegistryException{ - final byte[] ret = + return toString( invoker(instance.windowsRegEnumValue, - byte[].class, hKey, valueIndex, maxValueNameLength); - return ret == null ? null : new String(ret).trim(); + byte[].class, hKey, valueIndex, maxValueNameLength)); } - private static byte[] toByteArray(String s) { - final byte[] tmp = s.getBytes(); - final byte[] bytes = new byte[tmp.length+1]; - System.arraycopy(tmp, 0, bytes, 0, tmp.length); - bytes[tmp.length] = 0; - return bytes; - } + /** + * Returns the path to Sun's <code>java.exe</code>. JRE installations + * are checked first, and then JDK installations. + * + * @return the path to <code>java.exe</code>, or <code>null</code> if + * none can be found + */ + public static String getJavaPath() { + final String jreRoot = "SOFTWARE\\JavaSoft\\Java Runtime Environment"; + final String jdkRoot = "SOFTWARE\\JavaSoft\\Java Development Kit"; - public static class RegistryException extends Exception { - private static final long serialVersionUID = 1L; + String path = getJavaHome(jreRoot); + if (path != null) { + path += "\\bin\\java"; + } + else { + path = getJavaHome(jdkRoot); + if (path != null) { + path += "\\jre\\bin\\java"; + } + } - public RegistryException(Throwable t) { - super(t); - } + return path; } - public static void main(String[] args) throws RegistryException { - final String jreRoot = "SOFTWARE\\JavaSoft\\Java Runtime Environment"; - final String jdkRoot = "SOFTWARE\\JavaSoft\\Java Development Kit"; - - final String currentVersion = "CurrentVersion"; - final String javaHome = "JavaHome"; - + private static String getJavaHome(String root) { String path = null; int handle; int[] ret; - ret = WinRegUtils.openKey( - WinRegUtils.HKEY_LOCAL_MACHINE, - jreRoot, - WinRegUtils.KEY_READ - ); + try { + ret = openKey(HKEY_LOCAL_MACHINE, root, KEY_READ); + if (ret[ERROR_CODE] == ERROR_SUCCESS) { + handle = ret[NATIVE_HANDLE]; - if (ret[WinRegUtils.ERROR_CODE] == WinRegUtils.ERROR_SUCCESS) { - handle = ret[WinRegUtils.NATIVE_HANDLE]; + final String curVer = queryValueEx(handle, "CurrentVersion"); + closeKey(handle); - final String curVer = WinRegUtils.queryValueEx(handle, currentVersion); - WinRegUtils.closeKey(handle); + if (curVer != null) { + ret = openKey(HKEY_LOCAL_MACHINE, root + "\\" + curVer, KEY_READ); - if (curVer != null) { - ret = WinRegUtils.openKey( - WinRegUtils.HKEY_LOCAL_MACHINE, - jreRoot + "\\" + curVer, - WinRegUtils.KEY_READ); - - if (ret[WinRegUtils.ERROR_CODE] == WinRegUtils.ERROR_SUCCESS) { - handle = ret[WinRegUtils.NATIVE_HANDLE]; - path = WinRegUtils.queryValueEx(handle, javaHome); - WinRegUtils.closeKey(handle); + if (ret[ERROR_CODE] == ERROR_SUCCESS) { + handle = ret[NATIVE_HANDLE]; + path = queryValueEx(handle, "JavaHome"); + closeKey(handle); + } } } } + catch (RegistryException e) { + ErrorLog.log(e); + } - if (path == null) { - ret = WinRegUtils.openKey( - WinRegUtils.HKEY_LOCAL_MACHINE, - jdkRoot, - WinRegUtils.KEY_READ - ); + return path; + } - if (ret[WinRegUtils.ERROR_CODE] == WinRegUtils.ERROR_SUCCESS) { - handle = ret[WinRegUtils.NATIVE_HANDLE]; + /** + * Converts <code>String</code>s to null-terminated byte arrays. + * + * @param s the <code>String</code> to convert + * @return the string as a null-terminated byte array + */ + private static byte[] toByteArray(String s) { + final byte[] tmp = s.getBytes(); + final byte[] bytes = new byte[tmp.length+1]; + System.arraycopy(tmp, 0, bytes, 0, tmp.length); + bytes[tmp.length] = 0; + return bytes; + } - final String curVer = WinRegUtils.queryValueEx(handle, currentVersion); - WinRegUtils.closeKey(handle); + /** + * Converts a null-terminated byte array to a <code>String</code>. + * + * @param bytes the null-terminated byte array to convert + * @return the null-terminated byte array as a <code>String</code> + */ + private static String toString(byte[] bytes) { + if (bytes == null) return null; + + final String s = new String(bytes); + return s.charAt(s.length() - 1) == '\0' ? + s.substring(0, s.length() - 1) : s; + } - if (curVer != null) { - ret = WinRegUtils.openKey( - WinRegUtils.HKEY_LOCAL_MACHINE, - jdkRoot + "\\" + curVer, - WinRegUtils.KEY_READ); + public static class RegistryException extends Exception { + private static final long serialVersionUID = 1L; - if (ret[WinRegUtils.ERROR_CODE] == WinRegUtils.ERROR_SUCCESS) { - handle = ret[WinRegUtils.NATIVE_HANDLE]; - path = WinRegUtils.queryValueEx(handle, javaHome); - WinRegUtils.closeKey(handle); - } - } - } + public RegistryException(Throwable t) { + super(t); } + } - System.out.println(path); + public static void main(String[] args) throws RegistryException { + System.out.println(getJavaPath()); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ vassalengine-svn mailing list vas...@li... https://lists.sourceforge.net/lists/listinfo/vassalengine-svn |