MokaByte 88 - 7mbre 2004 
Come rendere l'uso delle risorse testuali in Java facile e sicuro
di
Yury Fedorov

In questo articolo è descritto jResWrap, un tool creato per rendere l'uso delle risorse testuali in Java facile e sicuro. jResWrap genera le classi-involucri per risorse testuali dei file di tipo .properties. Quelle classi-involucri danno la possibilità allo sviluppatore di lavorare con le risorse in modo molto più comodo.

Per chi è l'articolo
In primo luogo questo articolo è rivolto a sviluppatori Java che stanno sviluppando i componenti con supporto di internalization. L'articolo sarà comunque utile per tutti coloro che lavorano con Java e stanno usando i file di risorse e le classi di tipo java.util.ResourceBundle e java.text.Format.

 

L'esempio è usato per proiezione
Come esempio sarà usata l'applicazione nel trial "Internationalization" della guida "The Java Tutorial" [1].
L'applicazione fa supporto per inglese, francese e tedesco. In particolare, tutti i messaggi testuali devono essere nella lingua locale dell'ambiente in cui si opera.

 

La soluzione di Sun
Sun in questo caso fa così:

  1. Crea un .properties file per ogni locale di supporto.
  2. Aggiunge a ognuno dei file la riga con la stessa chiave della risorsa. Ad esempio "greetings" con il testo nel propria lingua. Cioè, per la versione francese, il file sarà:

    ## MessagesBundle_fr_FR.properties
    greetings = Bonjour.
    farewell = Au revoir.
    inquiry = Comment allez-vous?

    E per la versione inglese:

    ## MessagesBundle_us_US.properties
    greetings = Hello.
    farewell = Goodbye.
    inquiry = How are you?

  3. Scrive il codice del tipo:

    // Inizializzazione del manager di risorse
    Locale currentLocale;
    ResourceBundle messages;
    currentLocale = new Locale(language, country);
    messages = ResourceBundle.getBundle("MessagesBundle",
    currentLocale);
    // Manipolazione delle risorse
    System.out.println(messages.getString("greetings"));
    System.out.println(messages.getString("inquiry"));
    System.out.println(messages.getString("farewell"));

Sembra che vada tutto bene, ma vediamo il codice più attentamente:

  1. Se si cambia la chiave della risorsa o si sbaglia la scrittura del nome in sorgente, il compilatore non darà nessun errore perché nel sorgente quel nome è scritto come una stringa.
  2. Spesso le risorse testuali sono modelli dei messaggi con alcuni parametri. Il fatto che i modelli siano dichiarati in altro file crea il rischio supplementare che il numero e la sequenza dei parametri, nel prossimo uso del modello, non saranno coordinati.

 

La soluzione offerta da jResWrap
Proprio per risolvere questi problemi era stato creato lo strumento jResWrap che genera le classi-involucri per risorse testuali dei file di tipo .properties. Le classi-involucri danno la possibilità allo sviluppatore di lavorare con le risorse in modo molto più comodo. Per il famoso esempio è abbastanza scrivere:

// Inizializzazione del manager di risorse
Locale currentLocale;
ResourceBundle messages;
currentLocale = new Locale(language, country);
messages = ResourceBundle.getBundle("MessagesBundle",
currentLocale);

// Creazione della classe-involucro
_MessagesBundle messagesBundle;
messagesBundle = new _MessagesBundle( messages );

// Manipolazione delle risorse
System.out.println( messagesBundle.greetings() );
System.out.println( messagesBundle.inquiry() );
System.out.println( messagesBundle.farewell() );

Se si osserva attentamente il codice si noterà che adesso le cose sono leggermente differenti. In particolare:

  1. Se la chiave sarà modificata ora siamo in sicurezza in quanto il compilatore darà un errore perché il classe-copertina non avrà il metodo greetings.
  2. Se cambiamo anche il numero di parametri nel modello testuale, non abbiamo nessun problema. Il compilatore di nuovo darà un errore perché la segnatura del metodo sarà cambiata.
  3. Facendo le modifiche ora è possibile vedere la guida per ogni parametro per essere sicuro che la sequenza è giusta.

Come creare l'involucro
jResWrap è lo strumento di linea di comando che è controllato con parametri. Tornando al nostro esempio vediamo che il nome di package del programma è di default (ROOT), i file del progetto sono nella cartella "esempio" ed i file delle risorse si chiamano "MessagesBundle*.properties". Allora per lanciare lo strumento è sufficiente digitare:
per Windows

%JRESWRAP%\bin\jreswrap.bat ROOT "esempio" "MessageBundle"

per Linux e Solaris

$JRESWRAP/bin/jreswrap.sh ROOT "esempio" "MessageBundle"

Quando lo strumento finirà di lavorare nella cartella dei sorgenti di progetto, sarà creato il file con il nome "_MessagesBundle.java" nel quale sarà definita la classe con stesso nome e nello stesso package di tutto il progetto.
Se per il build del tuo progetto usi ant è meglio aggiungere nello script qualcosa simile a:

<exec executable="${env.JRESWRAP}/bin/jreswrap" >
<arg value="ROOT"/>
<arg value="${dir.src}"/>
<arg value="MessageBundle"/>
</exec>

 

Che cosa c'è intorno
La classe generata contiene:

  1. Il costruttore nel quale si inizializza il campo privato di tipo java.util.ResourceBundle.
  2. I read-only campi statici con i nomi delle chiave del file di risorse.
  3. I metodi tornano i valori testuali delle risorse.

Se la risorsa testuale contiene parametri, la segnatura del metodo avrà lo stesso numero di parametri. Per ciascuno di loro sarà aggiunto anche un commentario. Inoltre dopo aver scaricato la risorsa dal file sarà richiamato il metodo java.text.Format.format, che prepara la versione finale del messaggio.

 

Conclusione
Allora, se hai deciso di usare lo strumento dovresti fare i seguenti passi:

  1. Aggiungere il richiamo dello strumento jResWrap allo script utilizzato per automatizzare il build del progetto.
  2. Ricompilare l progetto.
  3. Aggiungere il file dell'involucro alla lista dei file del progetto.
  4. Creare un oggetto della classe-involucro.
  5. Chiamare il proprio metodo per ritirare la risorsa testuale necessaria.

 

Bibliografia e risorse
[1] Dale Green - "Trail: Internationalization", The Java Tutorial, 2004
http://java.sun.com/docs/books/tutorial/i18n/intro/after.html

Il progetto Java Resource Wrapper si sta sviluppando come un strumento con sorgenti aperte(open source). Lo strumento è possibile scaricarlo gratuitamente nel seguente indirizzo: http://cvs.sourceforge.net/viewcvs.py/jreswrap/

Yury Fedorov laureato in Tecnologie Informatiche, lavora da più di 6 anni nel settore IT. Dal 1999 si occupa di Java ed in particolare dello sviluppo di applicazioni web J2EE. Dopo diverse esperienze di disegno e sviluppo ora si occupa in particolare di aspetti architetturali per progetti rivolti al mercato e-business. Ha numerosi certificati di Brainbench e in particolare Master Java, Internet Professional Web Developer Client-side e Internet Professional Web Developer Server-side.


MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it