Newsgroup: it.comp.java
Titolo: Problema per veri esperti (Locale e ResourceBundle)

Ciao,
utilizzo le classi Locale e ResourceBundle per accedere a risorse
localizzate (varie lingue) prelevandole da vari file di risorse.
Tutto ok, fino a quando, a fronte di file risorse modificati/aggiornati,
voglio fare il refresh delle stringhe a video, senza chiudere e riaprire
l'applicazione (warm update).
Dopo che ho distrutto e ricreato gli oggetti Locale e ResourceBundle,
richiedendo di nuovo tutte le stringhe, il sistema continua ad attingere a
quelle caricate la primissima volta, ignorando completamente i
nuovi/aggiornati file di risorse.
Osservando all'interno della classe ResourceBundle direi che c'è un problema
di caching che però, in questo caso, da molto fastidio.
Come aggirare/risolvere il problema?
Nota: l'applicazione svolge compiti critici e non può essere riavviata. Può,
però, necessitare un updating delle stringhe utilizzate, per fare il quale
l'utente/amministratore può modificare il file di risorsa relativo, premendo
poi un adeguato pulsante di "update", o simile.
Grazie in anticipo, ciao
Romano Signorelli

Hai provato ad usare la PropertyResourceBundle?
Infatti se usi dei file come appoggio ti conviene usare questa classe 
che ti permette di gestire le risorse salvate in file.


 senza chiudere e riaprire l'applicazione (warm update).
Non sono sicuro i ResourceBundle standard possano farlo. Se non ricordo
male, la cache non e' di valori, ma di oggetti bundle: quindi se puoi
"rinfrescare" l'oggetto bundle senza doverlo ricostruire, non dovrebbe
causare problemi. 
Una possibile via semplice e' costuire un duplicato di
PropertyResourceBundle o quant'altro usi (per dire,
"RefreshablePropertyResourceBundle" :) che esponga un metodo refresh()
che ricarichi i valori ex-novo. 
Ti rimane solo il problema di "quando" invocare questo metodo, ma da
quanto dici pare che tu sia in un punto del codice in cui l'applicazione
"sa" che i file di risorse sono cambiati, quindi non dovrebbe essere un
problema. 
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 ha scritto nel messaggio
news:Xns9174A058CB...@130.133.1.4...


 ha scritto nel messaggio
news:3C161581...@aesseitalia.com...


 messages = FileResourceBundle.getBundle("MyResource", currentLocale);
Si', poi su quanto ritornato (potenzialmente, l'oggetto in cache) devi
eseguire il tuo "reload()". 


 dichiarato "lookup" private e non protected. :-)
Pensavo di scrivere una nuova classe (FileResourceBundle?) partendo dal
sorgente (copiato dal JDK) di PropertyResourceBundle (e quindi non derivante
da essa bensì direttamente da ResourceBundle).
In questo caso, avrei pieno accesso a tutto.
Svantaggi: future versioni del JDK potrebbero disallinearsi con il mio
codice... vedrò se il rischio è limitato.

 da essa bensì direttamente da ResourceBundle).
Sei obbligato a sottoclassare ResourceBundle in quanto 
PropertyResourceBundle non può essere estesa.

 Pensavo di scrivere una nuova classe
Si' infatti - il mio "peccato" e' dovuto al fatto che se solo "lookup"
fosse protected in PropertyResourceBundle non avresti bisogno di
copiarla, ma solo di estenderla. 


Riflessione: alla luce di quanto detto qui, ha senso che scriva il tutto per
utilizzare Locale e ResourceBundle?
Non conviene, a questo punto, che le mie classi siano solo mie, facciano
getString(id), gestiscano il file, con refresh, punto e basta?
Che vantaggi avrei nell'appoggiarmi comunque a Locale e ResourceBundle? Mi
conviene?

Dipende.
Mi spiego meglio, se la tua applicazione ha bisogno di gestire 
l'internazionalizzazione l'uso di queste due classi è opportuno se non 
indispensabile.
Se, come mi sembra di aver capito, la tua applicazione non ha bisogno di 
essere "internazionale" allora puoi anche fare a meno di utilizzarle.
Se le risorse implicate nel tuo applicativo servono solo per leggere i 
dati e aggiornarli, la tua ultima proposta è fattibilissima.
