diff --git a/src/main/java/com/threerings/getdown/data/Application.java b/src/main/java/com/threerings/getdown/data/Application.java
index 221b1bf..c2ea0ea 100644
--- a/src/main/java/com/threerings/getdown/data/Application.java
+++ b/src/main/java/com/threerings/getdown/data/Application.java
@@ -261,7 +261,7 @@ public class Application
try {
return createResource(CONFIG_FILE, false);
} catch (Exception e) {
- throw new RuntimeException("Invalid appbase '" + _vappbase + "'.");
+ throw new RuntimeException("Invalid appbase '" + _vappbase + "'.", e);
}
}
@@ -472,10 +472,10 @@ public class Application
}
/**
- * Instructs the application to parse its getdown.txt configuration and prepare
- * itself for operation. The application base URL will be parsed first so that if there are
- * errors discovered later, the caller can use the application base to download a new
- * config.txt file and try again.
+ * Instructs the application to parse its {@code getdown.txt} configuration and prepare itself
+ * for operation. The application base URL will be parsed first so that if there are errors
+ * discovered later, the caller can use the application base to download a new {@code
+ * getdown.txt} file and try again.
*
* @return a configured UpdateInterface instance that will be used to configure the update UI.
*
@@ -485,26 +485,36 @@ public class Application
public UpdateInterface init (boolean checkPlatform)
throws IOException
{
- // parse our configuration file
Map cdata = null;
+ File config = _config;
try {
- cdata = ConfigUtil.parseConfig(_config, checkPlatform);
- } catch (FileNotFoundException fnfe) {
- // thanks to funny windows bullshit, we have to do this backup file fiddling in case we
- // got screwed while updating our very critical getdown config file
- File cbackup = getLocalPath(CONFIG_FILE + "_old");
- if (cbackup.exists()) {
- cdata = ConfigUtil.parseConfig(cbackup, checkPlatform);
- } else {
- throw fnfe;
+ // if we have a configuration file, read the data from it
+ if (config.exists()) {
+ cdata = ConfigUtil.parseConfig(_config, checkPlatform);
}
+ // otherwise, try reading data from our backup config file; thanks to funny windows
+ // bullshit, we have to do this backup file fiddling in case we got screwed while
+ // updating getdown.txt during normal operation
+ else if ((config = getLocalPath(CONFIG_FILE + "_old")).exists()) {
+ cdata = ConfigUtil.parseConfig(config, checkPlatform);
+ }
+ } catch (Exception e) {
+ log.warning("Failure reading config file", "file", config, e);
+ }
+ // if we failed to read our config file, check for an appbase specified via a system
+ // property; we can use that to bootstrap ourselves back into operation
+ if (cdata == null) {
+ log.info("Found no getdown.txt file. Falling back to appbase system prop",
+ "appbase", SysProps.appBase());
+ cdata = new HashMap();
+ cdata.put("appbase", SysProps.appBase());
}
// first determine our application base, this way if anything goes wrong later in the
// process, our caller can use the appbase to download a new configuration file
_appbase = (String)cdata.get("appbase");
if (_appbase == null) {
- throw new IOException("m.missing_appbase");
+ throw new RuntimeException("m.missing_appbase");
}
// make sure there's a trailing slash
if (!_appbase.endsWith("/")) {
@@ -524,11 +534,7 @@ public class Application
// if we are a versioned deployment, create a versioned appbase
try {
- if (_version < 0) {
- _vappbase = new URL(_appbase);
- } else {
- _vappbase = createVAppBase(_version);
- }
+ _vappbase = (_version < 0) ? new URL(_appbase) : createVAppBase(_version);
} catch (MalformedURLException mue) {
String err = MessageUtil.tcompose("m.invalid_appbase", _appbase);
throw (IOException) new IOException(err).initCause(mue);
diff --git a/src/main/java/com/threerings/getdown/data/SysProps.java b/src/main/java/com/threerings/getdown/data/SysProps.java
index 858cc26..d229cf7 100644
--- a/src/main/java/com/threerings/getdown/data/SysProps.java
+++ b/src/main/java/com/threerings/getdown/data/SysProps.java
@@ -23,6 +23,12 @@ public class SysProps
return System.getProperty("appid");
}
+ /** Configures the appbase (in lieu of providing a skeleton getdown.txt, and as a last resort
+ * fallback). Usage: {@code -Dappbase=someurl}. */
+ public static String appBase () {
+ return System.getProperty("appbase");
+ }
+
/** If true, disables redirection of logging into {@code launcher.log}.
* Usage: {@code -Dno_log_redir}. */
public static boolean noLogRedir () {