MokaByte Numero  43  - Luglio Agosto 2000
Java Web Start
L’alternativa alle applet
di 
Giovanni Puliti
Presentata  un mese fa a  a S.Francisco durante la scorsa JavaOne 2000, la tecnologa Java Web Start promette di rinnovare il settore della programmazione Java lato client.

Dopo il reportage del mese scorso sulla manifestazione JavaOne questa volta parliamo di una delle novità presentate alla conference californiana.
A parte gli annunci relativi alle nuove release e consolidamenti delle tecnologie attualmente esistenti (vedi il caso di EJB 2.0), una delle novità più interessanti è rappresentata da Java Web Start. Non si tratta di una innovazione dalla importanza fondamentale, ma sicuramente rappresenta una interessante innovazione nel panorama Java Tech. La versione alla quale ci riferiamo in questo articolo è la Early Access 1.0, versione tutt’altro che essere prossima alla maturità, per cui è probabile che nei prossimi mesi quello che diremo in questo articolo essere non più completamente valido.

Inizialmente erano le applet
La tecnologia Java Web Start è stata rilasciata da Sun allo scopo di rilanciare la piattaforma client dato che da un po’ di tempo l’attenzione, sia del mondo Java-oriented ma non solo, si è spostata sul server.
Inizialmente come noto Java si è affermato come linguaggio di internet grazie alla possibilità che offriva  (e che offre tutt’ora) di realizzare applicazioni inserite direttamente dentro una pagina HTML ed eseguite dalla JVM  del browser.
Questi oggetti devono buona parte del loro successo anche alla semplicità con cui possono essere eseguite: se ci si pensa, la possibilità di eseguire una applicazione scaricata ed installata automaticamente al click su un link del mouse è sicuramente una feauture molto interessante.
Come però si è avuto più volte modo di osservare nelle pagine di MokaByte, più che le limitazioni tecnologiche,  l’errata valutazione che è stata fatta sulle reali possibilità delle applet ha di fatto relegato tali oggetti ad un ruolo secondario.
Resta il fatto che, nonostante i molti problemi legati alla esecuzione delle applet (tempi di download, compatibilità nei browser, limitazione al JDK 1.1 sono solo alcune delle attuali limitazioni di tali oggetti), il concetto di download ed installazione automatica  rimane tutt’ora un obiettivo molto interessante.

Java Web Start dovrebbe a tal proposito cercare di evitare di incorrere nei  problemi legati alle applet e contemporaneamente utilizzare il vantaggio del codice scaricato automaticamente dalla rete.
Java Web Start infatti è un plug-in per il browser, plug-in che permette il download e l’esecuzione automatica di una applicazione remota semplicemte tramite un click del mouse su un link ipertestuale di una pagina HTML.
La differenza fondamentale rispetto alle applet è che in questo caso il browser viene utilizzato semplicemente ed esclusivamente per il download dei file necessari alla applicazione per essere eseguita. 
L’esecuzione infatti avviene all’interno di una JVM esterna al browser, in maniera del tutto analoga ad una applicazione Java installata sulla macchina locale.
Java Web Start permette inoltre di salvare i file scaricati la prima volta in locale (cosa non permessa alle applet) in modo da evitare il download le volte successive: l’applicazione viene quindi installata a tutti gli effetti in locale, tanto che su Windows ad esempio è possibile aggiungere una icona sullo sfondo del desktop o nel menu avvio.
Al momento del download è possibile specificare tutti i parametri di esecuzione, fra cui anche la JVM da utilizzare: nel caso in cui non sia installata la versione indicata nel file di configurazione, ne verrà effettuato il download automaticamente.
Secondo le dichiarazioni di Sun, le varie versioni del JDK che finiscono per installarsi nella macchina client possono convivere tranquillamente, anche se tale assicurazione è tutta da verificare ed al momento mi lascia piuttosto perplesso.
Trattandosi di codice scaricato da remoto, sono state adottate, come al solito in Java,  elevate misure di sicurezza, tanto che l’applicazione viene eseguita con le stesse restrizioni delle applet; anche in questo caso l’utilizzo di archivi JAR firmati elettronicamente permette di superare le imposizioni tipiche del modello sandbox.
Nella figura che segue è mostrato il tipico ciclo di vita di una applicazione eseguita tramite  Java Web Start.
 



Figura 2: ciclo di vita di una applicazione web start


Il meccanismo di base che permette l’installazione automatica e la successiva esecuzione si basa sul cosiddetto Java Network Launcher Protocol (JNLP), un protocollo proprietario che si basa sull’utilizzo di un file di configurazione con estensione .jnp.
 
 
 

Configurazione ed installazione 
Il client non richiede particolari configurazioni, se non il supporto per la piattaforma Java 2  e la presenza di un  JRE 1.2.0 o successivi. 
Al momento JWS in versione Early Access  è disponibile per le piattaforme Windows 95/98/NT/2000, per Solaris (SPARC  ed Intel) e per Linux  (RH6.0/x86).
Sul server come prima cosa si deve configurare opportunamente il web server in modo da supportare il nuovo MIME relativo a JNLP. 
Infatti quando il browser del client riceve una risposta con mime type uguale a  application/jnlp, deve essere in grado di inoltrare tale  risposta al plug-in installato, invece di gestirlo direttamente.
La procedura per attivare questo nuovo MIME dipende dal web server utilizzato: nel caso di Apache ad esempio è necessario aggiungere  nel file .mime.types la riga 

application/jnlp JNLP
 

Fatto questo è necessario creare un archivio di tipo JAR all’interno del quale inserire tutti i file necessari per eseguire l’applicazione. Questo file .jar dovrà poi essere posizionato in una dir opportuna come specificato nel file JNLP.
Per la creazione di tale file, la cosa più semplice e consigliabile è quella di partire da uno già preparato e cambiare solamente le parti che interessano. La sintassi di un file .jnlp è piuttosto semplice, e la analizzeremo poco più avanti.
Nella pagina HTML che verrà inviata al client dovrà essere inserito il link che attiva tutto il meccanismo: ad esempio 

<a href="MyApp.jnlp">Launch My Application</a>

Per la configurazione fatta in precedenza, il web server, quando il client richiede un file con estensione jnlp, restituisce una MIME type application/jnlp.
Non sono necessarie ulteriori particolari configurazione da effettuare sul client e sul server.
 
 
 

Sviluppo di applicazioni JWS
Fondamentalmente la realizzazione di una applicazione basata su JWS non ha niente di differente dal caso in cui si tratti di una applicazione normale. Anche in questo casi si tratta di scrivere una serie di classi, una delle quali dovrà contenere al suo interno il metodo main.
Tuttavia si deve tener presente come prima cosa che l’applicazione deve essere composta di una serie di file contenuti all’interno di un file JAR; per questo motivo  tutte le risorse necessarie al funzionamento della applicazione stessa dovranno essere contenute all’interno del file .jar ed accedute per mezzo del metodo getResource().
Ad esempio se si deve ricavare una immagine per creare una icona, invece di aprire uno stream di input si dovrà scrivere una cosa del tipo

// Get current classloader 
ClassLoader cl = this.getClass().getClassLoader(); 
// Create icons 
Icon saveIcon  = new ImageIcon(cl.getResource("images/save.gif")); 
Icon cutIcon   = new ImageIcon(cl.getResource("images/cut.gif")); 
...
 

che permette di ricavare le due icone per la creazione di pulsanti “salva” e “taglia” corrispondenti ai file images/save.gif e images/cut.gif impachettati nell’archivio JAR con path relativo images/.
 
 
 

Sintassi del file JNLP
Il formato del file JNLP è attualmente in fase di evoluzione, per cui quello che vediamo in questo caso non è detto che resti completamente valido anche in futuro.
In questo caso faremo riferimento alla versione specificata nella release 1.0 del Public Draft Review del Java Network Launch Protocol and API; dato che una trattazione completa di tutti gli elementi che possono comporre un file JNLP  richiederebbe molto spazio, vedremo qui solamente quelli principali, rimandando alla documentazione ufficiale per una trattazione completa.

Il file JNLP rappresenta di fatto un documento XML. Ecco un esempio completo fornito con la documentazione Sun

<?xml version="1.0" encoding="utf-8"?> 
    <!-- JNLP File for SwingSet2 Demo Application --> 
    <jnlp 
      spec="0.1" 
      codebase="http://javaweb.eng.com/jaws/apps" 
      href="swingset2.jnlp"> 
      <information> 
        <title>SwingSet2 Demo Application</title> 
        <vendor>Sun Microsystems, Inc.</vendor> 
        <homepage href="docs/help.html"/> 
        <description>SwingSet2 Demo Application
        </description> 
        <description kind="short">
          A demo of the capabilities of the 
          Swing Graphical User Interface.
        </description> 
        <icon href="images/swingset2.jpg"/> 
        <offline/> 
      </information> 
      <security> 
          <unrestricted/> 
      </security> 
      <jre version="1.3"/> 
      <resources> 
        <jar href="lib/SwingSet2.jar"/> 
      </resources> 
      <application-desc main-class="SwingSet2"/> 
    </jnlp>
 

Ecco un elenco del significato dei vari elementi e dei relativi attributi 

JNLP Element

  • Spec: definisce la versione del JNLP. Per lavorare con la release attuale di JWS deve essere impostato a 0.1, mentre in futuro dovrà essere sarà 1.0.
  • Codebase:  tutti gli URL relativi rispetto a quello di riferimento specificato dall’attributo href.
  • Href: specifica il link al quale deve essere associata l’applicazione JNLP
  • Information Element: permette di specificare una serie di informazioni sulla applicazione
    • title: il nome della applicazione
    • vendor: il nome del vendor della applicazione
    • homepage: contiene un href all’URL della home page della applicazione dove sia possibile reperire maggiori informazioni sulla applicazione stessa.
    • description: una breve descrizione del funzionamento della applicazione stessa. Può essere specificato se debba essere on-line, short o tooltip.
    • icon l’icona da utilizzare 
    • offline: parametro opzionale che indica se la applicazione possa essere lanciata in modalità offline.


Security Element: nel caso in cui l’applet debba essere eseguita al di fuori del modello sandbox, qui si devono specificare le policy permesse. Si veda [1] per maggiori informazioni

JRE Element : indica la versione del JRE da utilizzare; attualmente le due versioni permesse sono quelle relative alla piattaforma Java 2 release 1.2 e 1.3, anche se in futuro si potrà specificare anche la minor version. Maggiori dettagli in [1].

Resource Element : serve per specificare il file o i file JAR contenenti le risorse necessarie alla applicazione.

Application-Desc Element : indica che il JNLP file sta lanciando una applicazione invece di una applet. Nel caso non sia chiaro è possibile specificare  il nome della classe che contiene il main.

Applet-Desc Element : questo tag permette di specificare che si stà facendo riferimento ad una applet. Tale opzione permette di effettuare le prime prove utilizzando direttamente una applet esistente, piuttosto che scrivere una applicazione ad hoc. Ha lo scopo di permettere una facile migrazione delle applicazione e non fa parte della specifica ufficiale, per cui in futuro verrà abbandonata.
La sintassi di questo elemento è molto simile a quella utilizzata per l’insertimento di una applet in una pagina HTML: ad esempio

<applet-desc 
          documentBase="http://..." 
          name="TimePilot" 
          code="TimePilot.TimePilotApp" 
          width="527" 
          height="428"> 
        <param name="key1" value="value1"/> 
        <param name="key2" value="value2"/> 
</applet-desc>
 
 

La JNLP API, alcuni esempi di applicazioni
Per permettere alla applicazione di avere  maggiori informazioni relative al proprio ambiente di esecuzione, è stata rilasciata una API apposita, la cosiddetta JNLP API, 
le cui funzionalità sono pittosto simili alla AppletContext disponibile per le applet.
L’esempio che segue mostra come aprire un URL utilizzando il browser di default grazie al metodo showURL.

import javax.jnlp.*; 
... 

// Metodo per mostrare un URL 
boolean showURL(URL url) { 
  try { 
    // esegue una lookup dell’oggetto
    // javax.jnlp.BasicService object 
    BasicService bs;
    bs =(BasicService)ServiceManager.lookup(
         "javax.jnlp.BasicService"); 

     // invoca il metodo showDocument 
     return bs.showDocument(url); 
   }
   catch(UnavailableServiceException ue) { 
     // Service is not supported 
     return false; 
  } 
}
 

In questo esempio si può osservare come la prima cosa da fare sia l’importazione  del package javax.jnlp che, dopo il download dal sito della Sun, deve essere aggiunto al classpath.
Un altro metodo utile messo a disposizione dal package è il importFile, che permette di importare un file nella applicazione. La sua invocazione causa l’apertura di una dialog box per la scelta del file (dato che l’applicazione gira in un sandbox, non può accedere direttamente alle risorse del file system).

import javax.jnlp.*; 
       ... 

void importFile() { 
  try { 
    // Lookup the javax.jnlp.FileOpenService object 
    FileOpenService bs;
    bs =(FileOpenService)ServiceManager.lookup(
         "javax.jnlp.FileOpenService"); 
    // Show the File Open Dialog using default path and
    //default set of extensions 
    FileContents result = bs.openFileDialog(null, null); 
    if (result != null) { 
      // User selected file 
      handleFile(result.getName(), result.getContents()); 
    }
    else { 
      // User pressed cancel button 
      return; 
    } 
  }
  catch(IOException ioe) { 
    // Could not read selected file 
    ... 
  }
  catch(UnavailableExcetion ue) { 
    // Service not supported 
    ... 
  } 
}
 

Analogamente l’esportazione di un file per mezzo del metodo  exportFile permette di salvare file anche se di fatto l’applicazione non ha i diritti di scrittura sul file system. Ecco un altro semplice esempio
 

import javax.jnlp.*; 
       ... 

  void exportFile(String name, InputStream contents) { 
    try { 
      // Lookup the javax.jnlp.FileSaveService object 
      FileOpenService bs;
      bs = (FileSaveService)ServiceManager.lookup(
            "javax.jnlp.FileSaveService"); 
      // Show the File Save Dialog using default 
      // path and default set of extensions 
      boolean result = bs.saveFileDialog(null, null, new 
                        FileContents(name,contents)); 
      if (result) { 
        // User saved file 
        ... 
      }
      else { 
       // User pressed cancel button 
        ... 
      } 
   }
   catch(IOException ioe) { 
    // Could not read selected file 
    ... 
   }
   catch(UnavailableExcetion ue) { 
     // Service not supported 
     ... 
    } 
}
 
 
 

Conclusioni
Al solito, al termine di una presentazione di una nuova tecnologia si richiede al bravo articolista di turno di esprimere un commento in merito alla novità esaminata.
In  questo caso, benché si tratti di una soluzione ancora troppo giovane per poter fare una valutazione circa la stabilità, e le performance, credo che si possa senz’altro affermare che si tratta di una innovazione senza dubbio molto interessante.
La possibilità di installare applicazioni da remoto è una delle caratteristiche più interessanti che internet e Java hanno da sempre promesso. Se si escludono casi molto particolari come agenti mobili o factory di oggetti, fino ad oggi in Java questo significava essenzialmente utilizzare  le applet. Le molte difficoltà incontrate per realizzare applicazioni di un certo livello utilizzando il modello delle applet possono far intuire le potenzialità di Web Start.
Forse è ancora un po’ presto per poter capire quali possano essere le reali possibilità di un oggetto come questo, ma allo stato attuale credo di poter affermare che si tratti di una innovazione veramente molto interessante.
Non resta che attendere ancora qualche mese per capire quali potranno essere le evoluzioni di Java Web Start.
 
 
 

Bibliografia

[1] Developer's Guide Java Web Start Version 0.4 Early Access Release
http://java.sun.com/products/javawebstart/docs/developersguide.html

[2] Home page di Java Web Start 
http://java.sun.com/products/javawebstart/

[3] FAQ su Java Web Start
http://java.sun.com/products/javawebstart/faq.html

[4] Java Web Start Press release
http://java.sun.com/pr/2000/06/pr000606-03.html
 

Chi volesse mettersi in contatto con la redazione può farlo scrivendo a mokainfo@mokabyte.it