MokaByte
Numero 13 - Novembre 1997
|
|||
|
Glasgow I parte |
||
Daniela Ruggeri |
|||
Introduzione
Le principali novità di Glasgow (www.javasoft.com) si possono riassumere così:
In particolare :
Specifiche per il modello di composizione di componenti (container e componente).
Con queste nuove specifiche si pongono le basi astratte per un'architettura di un contenitore di componenti mediante il quale è possibile annidare più JavaBeans e fare in modo che questi possano ricevere informazioni sull'ambiente che li circonda, indipendentemente dal fatto che essi si trovino in un Web browser o in un'applicazione host e indipendentemente dal contenitore usato (si pensi ad un contenitore ActiveX che contenga un bean).
Questo permetterà di:
A tale scopo è stato elaborato il concetto di BeanContext che ha qui il significato di "Container" e permette di :
In figura 2. è sintetizzata l'architettura.
Come si può vedere dalla figura è possibile:
Analogamente
come un Container è estensione di un Component così un BeanContext
è estensione di un BeanContextChild:
public interface java.beans.BeanContext extends java.beans.BeanContextChild { public static String ADDED; public static String REMOVED; Object instantiateChild(String beanName) throws IOException, ClassNotFoundException; void addChildren (Object[] targetChildren) throws ChildVetoException; void removeChildren(Object[] targetChildren) throws ChildVetoException; Object[] getChildren(); boolean isChild(Object c); void addNestedStateListener(NestedStateListener l); void removeNestedStateListener(NestedStateListener l); void addBeanContextListener(BeanContextListener l); void removeBeanContextListener(BeanContextListener l); Aggregate getContextServices(); }La cosa che notiamo sono le nuove liste ascoltatrici di nuovi eventi:
public
class NestedStateEvent
extends ChildStateEvent
{
publicstatic NestedStateEvent childrenAdded(BeanContext
bc, Object[] children);
publicstatic NestedStateEvent childrenRemoved(BeanContext
bc, Object[] children);
public Object[] getChildren();
publicboolean isChild(Object child);
publicvoid setPropagatedFrom(BeanContext id);
public BeanContext getPropagatedFrom();
publicboolean isPropagated();
}
Una
volta che tutti i targetChildren (oggetti aggiunti o rimossi) sono stati
trattati, il BeanContext riceverà la notifica dell'evento java.beans.beancontext.NestedStateEvent
con lo stato di .ADDED (o REMOVED), e un array di riferimenti dei nuovi
oggetti aggiunti (o vecchi oggetti rimossi) to the newly added targetChildren,
e la propagherà a tutti gli oggetti registrati alla lista NestedStateListener.
Gli
oggetti che desiderano mantenere una traccia dei cambiamenti degli stati
annidati di un BeanContext, dovranno implementare l'interfaccia java.beans.beancontext.NestedStateListener.
I metodi per registrarsi come ascoltatori e rimuovere la registrazione
sono addNestedStateListener() e removeNestedStateListener().
Nel
caso di BeanContexts annidati, tali eventi possono propagarsi dalla foglia
alla radice della gerarchia. In questo caso un BeanContext della catena
propagherà l'evento al prossimo BeanContext con un riferimento a
se stesso, cosa che è possibile richiamando il metodo setPropagatedFrom().
Usando questa informazione (ricevuta tramite il metodo getPropagatedFrom()),
ogni BeanContext sarà in grado di conoscere il precedente BeanContext
propagatore oltre che la sorgente dell'evento.
Per finire usando i metodi isInstaceOf() e getInstanceOf() definiti dall'interfaccia java.util.Aggregate (vedere capitolo successivo sul modello di Aggregazione/Delega) restituita dal metodo restituiti getContextServices() del BeanContext, i JavaBeans possono interrogare circa l'esistenza di, e successivamente ottenere i riferimenti a; una varietà di servizi dinamici forniti dall'ambiente in cui esterno al BeanContext.
A questo punto affinché il nostro modello JavaBean assuma una struttura gerarchica per poter comunicare con l'ambiente esterno, basterà semplicemente che implementi l'interfaccia BeanContextChild definita di seguito:
public interface java.beans.BeanContextChild extends ChildStateListener { BeanContext getBeanContext(); }
Specifiche di supporto per i JavaBeans consistenti in Applet.
Una prima proposta riguarda l'overloading del metodo java.beans.Beans.instantiate() che oltre ad avere il compito di creare l'istanza del JavaBean, deve anche definire il suo contesto contenitore.
Il metodo proposto diviene quindi:
public static Object instantiate(ClassLoader cl, String beanName, BeanContext beanContext);
Questo metodo dovrebbe essere utilizzato da tutti i JavaBeans che non conoscono il loro BeanContext. E' chiaro quindi che per quelli che implementeranno la nuova interfaccia BeanContextChild che fornisce già questo tipo di informazione non sarà necessario l'utilizzo di questo metodo. Semplicemente basterà utilizzare il metodo addChildren() per trasmettere l'informazione al JavaBeans.
Per quanto riguarda i JavaBeans che in particolare sono Applet, ci sono delle proposte sul miglioramento della propagazione delle informazioni riguardanti le interfacce AppletContext e AppletStub.
Poiché il metodo instantiate() non fornisce abbastanza informazioni al fine di costruire un AppletContext e AppletStub dove far girare in maniera funzionale l'applet, per risolvere il problema è stato proposto un nuovo metodo instantiate():
public static Object instantiate(ClassLoader cl, String beanName, BeanContext bCtxt,
AppletInitializer ai);dove AppletInitializer è la nuova interfaccia proposta per l'inizializzazione dell'Applet:
public interface AppletInitializer { void initialize(Applet newApplet, BeanContext bCtxt); void activate(Applet newApplet); }Usando il metodo initialize() il bean che è un'Applet verrà passato all'interfaccia AppletInitializer che a questo punto dovrebbe incaricarsi di:
Se invece il JavaBeans non è un'Applet, allora l'interfaccia AppletInitializer sarà ignorata.
Specifiche per ulteriori interfacce di supporto.
Sono state fornite inoltre delle ulteriori interfacce di supporto riguardanti stati che possono essere propagati attraverso la lista java.beans.propertyChangeEvent con valori di propertyName opportuni e appropriati valori per oldValue e newValue, nel caso di cambiamenti della proprietà:
In
una logica di BeanContext dovendo però gestire la propagazione di
questo stato, è necessaria l'introduzione di una nuova interfaccia:
publicinterface
java.beans.VisibilityState {
boolean isOkToUseGui();
}
Attraverso
questa interfaccia il BeanContext può controllare la possibilità
che i suoi figli hanno di utilizzare un'interfaccia GUI.
Il
valore di propertyName da propagare è "okToUseGui".
Diamo
anche un accenno all'interfaccia java.beans.beancontext.BeanContextSupport
che
è una classe che fornisce una sorta di help, per la gestione di
tale complesso protocollo. Questa classe è stata disegnata per essere
sottoclassata o delegata da un altro oggetto e fornisce una facilitazione
nel reperire informazioni circa i protocolli da utilizzare.
Specifiche per il modello di Aggregazione/Delega
Quando un componente è contenuto in un altro e di conseguenza quando un Bean è composto da più componenti Bean si parla di aggregazione.
Il modello Glasgow fornisce degli stardard di comunicazione tra il Bean esterno e quelli interni sia come aggregazione (in questa fase dall'esterno avviene un'individuazione di un unico oggetto che eredita da tutti i componenti) sia come delega (cioè all'esterno si riesce a conoscere gli oggetti separati costituenti l'aggregazione)
Un'interfaccia di aggregazione definisce il meccanismo attraverso il quale un oggetto ottiene il riferimento ad un oggetto Delegato per un particolare tipo di interfaccia o classe da un Delegante:
L'interfaccia è la seguente:
public
interface AppletInitializer
{
void initialize(Applet newApplet, BeanContext
bCtxt);
void activate(Applet newApplet);
}
appartenente
al package java.util.
Il
modello ruota attorno alle seguenti definizioni:
Per quanto riguarda la persistenza dell'aggregazione abbiamo due casi:
Conclusione.
La
trattazione termina qui. Nel prossimo articolo affronteremo le specifiche
che permettono di utilizzare servizi stardard al fine di rappresentare
i dati nel formato richiesto. Per esempio se un browser ha ricevuto uno
stream di tipo MPEG, queste specifiche dovrebbero abilitare il browser
ad identificare giustamente il tipo di stream, e il browser potrebbe localizzare
e istanziare l'oggetto che possa manipolare o vedere quello stream.
|
||
|
||
MokaByte ricerca
nuovi collaboratori
|
||
|