Added LaunchUtil.updateVersionAndRelaunch() to give external Getdown users some

idea of how to actually do that. Widened. Changed logging to standard Java
style.
This commit is contained in:
Michael Bayne
2007-04-20 00:21:38 +00:00
parent a2eeb0e769
commit 1e4f8fdcab
2 changed files with 74 additions and 21 deletions
+8 -6
View File
@@ -20,19 +20,21 @@
package com.threerings.getdown;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A placeholder class that contains a reference to the log object used by
* the Getdown code.
* A placeholder class that contains a reference to the log object used by the Getdown code.
*/
public class Log
{
public static com.samskivert.util.Log log =
new com.samskivert.util.Log("getdown");
/** We dispatch our log messages through this logger. */
public static Logger log = Logger.getLogger("com.threerings.getdown");
/** Convenience function. */
public static void debug (String message)
{
log.debug(message);
log.fine(message);
}
/** Convenience function. */
@@ -50,6 +52,6 @@ public class Log
/** Convenience function. */
public static void logStackTrace (Throwable t)
{
log.logStackTrace(com.samskivert.util.Log.WARNING, t);
log.log(Level.WARNING, t.getMessage(), t);
}
}
@@ -24,9 +24,13 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.logging.Level;
import org.apache.commons.io.IOUtils;
import com.samskivert.util.StringUtil;
import com.threerings.getdown.Log;
/**
@@ -38,6 +42,58 @@ public class LaunchUtil
/** The directory into which a local VM installation should be unpacked. */
public static final String LOCAL_JAVA_DIR = "java_vm";
/**
* Writes a <code>version.txt</code> file into the specified application directory and
* attempts to relaunch Getdown in that directory which will cause it to upgrade to the newly
* specified version and relaunch the application.
*
* @param appdir the directory in which the application is installed.
* @param getdownJarName the name of the getdown jar file in the application directory. This is
* probably <code>getdown-pro.jar</code> or <code>getdown-retro-pro.jar</code> if you are using
* the results of the standard build.
* @param newVersion the new version to which Getdown will update when it is executed.
*
* @return true if the relaunch succeeded, false if we were unable to relaunch due to being on
* Windows 9x where we cannot launch subprocesses without waiting around for them to exit,
* reading their stdout and stderr all the while. If true is returned, the application may exit
* after making this call as it will be upgraded and restarted. If false is returned, the
* application should tell the user that they must restart the application manually.
*
* @exception IOException thrown if we were unable to create the <code>version.txt</code> file
* in the supplied application directory. If the version.txt file cannot be created, restarting
* Getdown will not cause the application to be upgraded, so the application will have to
* resort to telling the user that it is in a bad way.
*/
public static boolean updateVersionAndRelaunch (
File appdir, String getdownJarName, String newVersion)
throws IOException
{
// create the file that instructs Getdown to upgrade
File vfile = new File(appdir, "version.txt");
PrintStream ps = new PrintStream(new FileOutputStream(vfile));
ps.println(newVersion);
ps.close();
// make sure that we can find our getdown.jar file and can safely launch children
File pro = new File(appdir, getdownJarName);
if (mustMonitorChildren() || !pro.exists()) {
return false;
}
// do the deed
String[] args = new String[] {
getJVMPath(appdir), "-jar", pro.toString(), appdir.getPath()
};
Log.info("Running " + StringUtil.join(args, "\n "));
try {
Runtime.getRuntime().exec(args, null);
return true;
} catch (IOException ioe) {
Log.log.log(Level.WARNING, "Failed to run getdown", ioe);
return false;
}
}
/**
* Reconstructs the path to the JVM used to launch this process.
*/
@@ -72,20 +128,17 @@ public class LaunchUtil
}
/**
* Upgrades Getdown by moving an installation managed copy of the Getdown
* jar file over the non-managed copy (which would be used to run Getdown
* itself).
* Upgrades Getdown by moving an installation managed copy of the Getdown jar file over the
* non-managed copy (which would be used to run Getdown itself).
*
* <p> If the upgrade fails for a variety of reasons, warnings are logged
* but no other actions are taken. There's not much else one can do other
* than try again next time around.
* <p> If the upgrade fails for a variety of reasons, warnings are logged but no other actions
* are taken. There's not much else one can do other than try again next time around.
*/
public static void upgradeGetdown (File oldgd, File curgd, File newgd)
{
// we assume getdown's jar file size changes with every upgrade, this
// is not guaranteed, but in reality it will, and it allows us to avoid
// pointlessly upgrading getdown every time the client is updated which
// is unnecessarily flirting with danger
// we assume getdown's jar file size changes with every upgrade, this is not guaranteed,
// but in reality it will, and it allows us to avoid pointlessly upgrading getdown every
// time the client is updated which is unnecessarily flirting with danger
if (!newgd.exists() || newgd.length() == curgd.length()) {
return;
}
@@ -129,15 +182,13 @@ public class LaunchUtil
}
/**
* Returns true if, on this operating system, we have to stick around
* and read the stderr from our children processes to prevent them
* from filling their output buffers and hanging.
* Returns true if, on this operating system, we have to stick around and read the stderr from
* our children processes to prevent them from filling their output buffers and hanging.
*/
public static boolean mustMonitorChildren ()
{
String osname = System.getProperty("os.name").toLowerCase();
return (osname.indexOf("windows 98") != -1 ||
osname.indexOf("windows me") != -1);
return (osname.indexOf("windows 98") != -1 || osname.indexOf("windows me") != -1);
}
/**