Getdown: Rationale
Top     Design     Rationale

Major design goals
Java Web Start, how dost thee spite me? Let me count the ways. To illustrate why we should take the pains to implement such a system instead of using Java Web Start, let us state its primary design goals:

  • To ensure the integrity and operability of the installed application at all costs and with zero effort required from the user. Every file will be checksummed and any checksum failure will result in automatic redownload of the corrupt file. Periodically or at the request of the deployed application, the installed files will be revalidated to ensure that they have not become corrupt while installed on the user's machine.

    I have seen Java Web Start fail unrecoverably in more ways than I have fingers to count them, frequently with the only recourse to the user to be totally uninstalling and reinstalling my application and/or Java.

  • To navigate the labrynthine mess that is the Internet in as robust a manner as possible. This means doing things in such a way as to avoid problems with caching proxies, web browser caches and any other sinister entity that insinuates itself between us and our user. Getdown will use files that never change. For versioned application deployment (used in production systems), once a file is deployed at a certain path, its contents do not change (to understand how Getdown knows when to download a new version see the design).

    Java Web Start frequently fails thanks to over agressive caching proxies, proxies that mangle response headers, proxies that do strange things to the request URI. 'But it's the proxies that are at fault!' you say. Tell that to the user whose application no longer works.

  • To scale to thousands or tens of thousands of users updating their application simultaneously. When we deploy an update to our massively-multiplayer game, everyone has to download it at the same time. There's no way around it. Getdown will use nothing but plain files which can be served using the simplest, most scalable HTTP server one can get their hands on.

    Java Web Start made questionable design choices in this regard by making use of a sophisticated protocol that requires a running servlet engine to service (for those who don't want to reimplement the complex protocol using a more lightweight mechanism). Hardly scalable and annoyingly fragile.

  • To do nothing other than what is necessary to download, update and invoke a single application.

    Java Web Start provides a plethora of marginally useful functionality in the form of an application manager, web browser integration, a security model, etc. etc. etc. While those things are lovely for Sun and maybe even useful to Bigcorp, we care only about getting our application to our users in as simple an robust a manner as possible, not the creation of a general purpose platform for application deployment and management.


Minor design goals
If not for the major design goals, we wouldn't be doing this. But since we are, let's take the opportunity to remedy some of the various annoyances presented by Java Web Start.

  • Getdown will store the entire application in a single directory (and its subdirectories) and that directory may reside anywhere on the file system. That directory will, by design, be made known to the application itself.

    Java Web Start annoyingly insists that data be placed across a vast swathe of directories, the locations of which are not knowable by the application without making unsupported, prone to future breakage, guesses. Moreover, without the user making use of the 'Advanced' tab of the Java Web Start management application, that directory cannot reside anywhere but the user's home directory; nor can different applications be made to reside in different places on the file system.

  • Getdown will allow any arguments to be passed to the underlying JVM, not just a particular set that have been declared acceptable by the application deployment system.

  • Getdown will work robustly with a private JVM installation.

    Java Web Start claims to support this option, but heaven forbid you actually use it and then try something like specifying a non-default heap size which will cause it to choke and die because it can't find the JVM to reinvoke with the new heap size when running your application.

  • Once your application is running, Getdown will not open windows and cause unavoidable deadlocks if you happen to run your application in full-screen mode. So-called desktop integration will be the responsibility of the application. Any application that cares two bits for its users will provide an installer and that installer will probably not be cross platform and will certainly be in a much better position to "integrate" your application with the desktop.





© Three Rings Design, Inc. 2001-2007. All rights reserved. Privacy