MokaByte 85 - Maggio 2004 
Televisione Digitale Interattiva
Le Xlet - I parte

di
Emanuele
Brunelli
In questo secondo articolo sulla Televisione Digitale Interattiva iniziamo ad approfondire le API Java TV di Sun per capire come implementare le Xlet nello standard MHP(Multimedia Home Platform).

Introduzione
Dopo il primo articolo introduttivo al mondo della Televisione Digitale Terrestre[1] vediamo di approfondire come si costruiscono le applicazioni interattive nello standard MHP, le Xlet.
Una Xlet è una particolare applicazione Java concepita per essere scaricata ed eseguita su decoder interattivi nei quali un software specifico, l'Application Manager, è in grado di controllarne il ciclo di vita. Come vedremo le similitudini con le Applet, dove l'application manager è rappresentato dal browser sono molteplici.

 

Come costruire una Xlet
Per iniziare a costruire una Xlet occorre innanzitutto capire cosa viene fornito da Sun nelle API Java TV[3]. Infatti è proprio in queste librerie che vengono definite le due interfacce fondamentali da utilizzare:

  • javax.tv.xlet.Xlet che definisce i seguenti metodi:
    public void initXlet(XletContext ctx);
    public void startXlet();
    public void pauseXlet();
    public void destroyXlet(boolean unconditional);

  • javax.tv.xlet.XletContext che definisce i seguenti metodi:
    public void notifyDestroyed();
    public void notifyPaused();
    public java.lang.Object getXletProperty(java.lang.String key);
    public void resumeRequest();

Entrambe le interfacce servono per interagire con l'application manager in merito al ciclo di vita e al contesto in cui la Xlet viene eseguita.
La classe principale di ogni Xlet deve sempre implementare javax.tv.xlet.Xlet per poter essere eseguita sui decoder interattivi MHP.

 

Il ciclo di vita di una Xlet
Come mostrato in Figura 1 il ciclo di vita di una Xlet è caratterizzato da 4 stati:

  • Loaded: in questo stato la Xlet è stata creata ma non inizializzata, se durante questa fase viene rilevata un eccezione allora si passa direttamente nello stato Destroyed. Da notare che la Xlet si può trovare in questo stato solo una volta durante tutto il suo ciclo di vita.
  • Paused: la Xlet è inizializzata e può trovarsi in questo stato sia dopo che il metodo initXlet(XletContext) è ritornato con successo dallo stato Loaded oppure dopo che il metodo pauseXlet() è ritornato con successo dallo stato Active. In entrambi i casi in questo stato la Xlet dovrebbe limitare al massimo l'utilizzo delle risorse condivise e soprattutto non impegnare la GUI televisiva.
  • Active: in questo stato la Xlet è attiva e utilizza le risorse necessarie per fornire i suoi servizi, se dotata di GUI allora dovrebbe essere l'unica registrata per ricevere gli eventi del telecomando.
  • Destroyed: in questo stato la Xlet deve rilasciare tutte le risorse in uso per predisporsi alla terminazione.


Figura 1 - ciclo di vita di una Xlet

Una sequenza tipica di questo ciclo potrebbe essere:

  • L' application manager crea una nuova istanza di una Xlet chiamando il suo costruttore(stato LOADED).
  • La Xlet usa il context passatogli dall'application manager nel metodo initXlet(XletContext) e si inizializza(stato PAUSED).
  • L'application manager chiama il metodo startXlet() e la Xlet inizia ad utilizzare le risorse necessarie per fornire i servizi per cui è stata costruita(stato ACTIVE).
  • L'application manager chiama il metodo destroyXlet(true) e la Xlet rilascia le risorse, dopodichè viene terminata(stato DESTROYED).


Il primo esempio: HelloXlet.java

import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import javax.tv.xlet.XletStateChangeException;

public class HelloXlet implements Xlet{
  // L'XletContext è un oggetto usato dalla Xlet per accedere
  // alle properties del suo environment e per comunicare con
  // l'application manager che glielo ha passato nella fase
  // di inizializzazione.
  private XletContext context;

  private boolean alreadyActive = false;

  // Il costruttore tipicamente viene lasciato vuoto visto che tutte le
  // inizializzazioni dovrebbero stare nel metodo initXlet()
  public HelloXlet () {}

  // In questo metodo vengono fatte tutte le inizializzazioni,
  // se in questa fase qualcosa fallisse verrebbe lanciata un
  // eccezione.
  public void initXlet(XletContext context) throws XletStateChangeException{
    // si memorizza il context passato dall'Application Manager
    this.context = context;

    System.out.println(this.getClass().getName()+" : Inizializzazione avvenuta!");
  }

  // Con questo metodo la Xlet è avviata e vengono richieste
  // le risorse necessarie come ad esempio lo schermo TV o
  // gli eventi del telecomando
  public void startXlet() throws XletStateChangeException{
    // controlliamo se la Xlet era già stata messa in stato Active
    // precedentemente
    if (alreadyActive) {
      System.out.println(this.getClass().getName()+" : Hello Again TV World! ");
    }else {
      System.out.println(this.getClass().getName()+" : Hello TV World");
      alreadyActive = true;
    }
  }

  // Con questo metodo la Xlet viene messa in pausa e dovrebbe
  // rilasciare tutte le risorse utilizzate
  public void pauseXlet(){
    System.out.println(this.getClass().getName()+" : Xlet in pausa!");

    // notifichiamo al Context l'avvenuta pausa della Xlet
    context.notifyPaused();
  }  

  // Con questo metodo la Xlet viene terminata, tramite il
  // parametro boolean la Xlet ha la facoltà di accettare
  // tale richiesta; nel caso non accettasse di
  // terminare dovrebbe lanciare un eccezione.
  public void destroyXlet(boolean unconditional) throws XletStateChangeException {
    if (unconditional) {
      System.out.println(this.getClass().getName()+" : la Xlet è stata terminata!");
    }else {
      System.out.println(this.getClass().getName()+
                         " : la Xlet ha accettato di essere terminata!");
    }

    // notifichiamo al Context l'avvenuta terminazione della Xlet
    context.notifyDestroyed();
  }
}

Conclusioni
L'esempio proposto e quelli che seguiranno come tutte le vostre future Xlet possono essere eseguite su un ottimo software open source, XletView[4], che vi permette di emulare su PC un middleware MHP.
Nel prossimo articolo approfondiremo maggiormente le potenzialità delle Xlet, analizzando funzionalità più complesse come la gestione della grafica interattiva,gli eventi del telecomando e l'utilizzo del canale di ritorno.

 

Bibliografia e risorse
[1] E. Brunelli - "Televisione Digitale Interattiva: Lo standard MHP", Mokabyte, aprile 2004, http://www.mokabyte.it/2004/04/jtdi-1.htm
[2] Multimedia Home Platform - www.mhp.org
[3] Java TV - http://java.sun.com/products/javatv/
[4] XletView - http://sourceforge.net/projects/xletview/

 

Emanuele Brunelli è laureato in Scienze dell'Informazione all'Università di Bologna. Da circa 2 anni si occupa della progettazione e dello sviluppo di applicazioni Java per la Televisione Digitale Terrestre. Le sue conoscenze comprendono Analisi e Design con UML oltre che progettazione e sviluppo in ambiente Java.

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