Introduzione

Symantec Visual Cafe 2 si definisce come il primo tool visuale (RAD) progettato appositamente per il linguaggio Java attraverso il quale è possibile creare, in modo WYSIWYG (What You See Is What You Get), applicazioni ed applet. La novità, rispetto alla versione precedente del prodotto, è la completa compatibilità con il JDK1.1 (viene fornito il JDK1.1.3) e conseguentemente la gestione delle API per l'accesso ai Database (JDBC), la creazione dei file Jar e la creazione di componenti Bean. La versione a disposizione per questa prova è la Web Development e viene fornita con i seguenti manuali:

Getting Started: Installation and Tour User's Guide

Visual Page User's Guide

Visual Page Getting Started

che, con il ricco help in linea, permettono di avere tutto il necessario per acquisire padronanza con il tool, già di per sé molto intuitivo. Per questo test abbiamo usato una macchina con processore Pentium 166 e 64M di RAM. La configurazione minima per l'installazione prevede, comunque, la classica combinazione di processore 486DX con almeno 16M di RAM.

Installazione e Desktop

L'installazione del prodotto è molto semplice e consiste nella esecuzione del file di Setup. Nella parte conclusiva viene chiesto se aggiornare il file autoexec.bat in modo automatico o se provvedere manualmente. Consiglio la prima scelta in quanto vengono settate in modo automatico le variabili di ambiente CLASSPATH e PATH e viene comunque mantenuta una copia di backup relativa alla configurazione precedente. Terminata la fase di installazione, che richiede circa un paio di minuti, e dopo aver riavviato il computer, è possibile eseguire VisualCafe 2 cliccando sulla corrispondente icona nel menu delle applicazioni di Windows.

All'avvio, verrà visualizzata la barra degli strumenti con i bottoni raggruppati secondo le seguenti funzionalità:

  • gestione dei file
  • gestione del WorkSpace (permette di scegliere se siamo in editazione, debug o in altri contesti definibili successivamente)
  • gestione della visualizzazione delle varie Dialog
  • palette dei bean (componenti) disponibili
  • gestione dell'allineamento degli oggetti in fase di editing dell'interfaccia grafica
  • gestione dell'esecuzione o del debugging dell'applicazione o dell'applet.

La toolbar non si differenzia, quindi, di molto da quelle degli altri tool per Java.

Caratteristica di VisualCafe 2 è, invece, la ricchezza di finestre di dialogo, tutte utili, che permettono di agire in modo intuitivo sia sull'interfaccia grafica dell'applet o applicazione, che sul corrispondente codice. Per visualizzare ciascuna di queste dialog è sufficiente premere il relativo pulsante nella toolbar. Esse sono

ProjectWindow: VisualCafe 2 permette di editare contemporaneamente più project a ciascuno dei quali è associata una ProjectWindow . Essa implementa un CardLayout che permette di visualizzare nello stesso frame, il project, tutti i package disponibili e l'insieme delle classi (intese come file). Cliccando con il pulsante destro del mouse è possibile scegliere se aggiungere nuove classi o componenti o se gestire le interazioni tra essi attraverso l'InteractionWizard (che vedremo in seguito). Cosa molto utile è la visualizzazione delle classi visibili all'applicazione ovvero quelle comprese nel classpath. In questo modo è possibile verificare eventuali sovrapposizioni o mancanze di classi.

Form Designer: Permette di creare l'interfaccia grafica dell'applicazione o applet. È sufficiente scegliere il componente nella palette dei bean e posizionarlo , con il metodo point and click, sul frame. A questo punto l'oggetto verrà visualizzato e se ne potranno modificare, con il mouse, le dimensioni e la posizione. Una volta selezionato un componente sul Form Designer, verrà aggiornata la Property List che ne visualizzerà le proprietà, mentre con un doppio click verrà visualizzato il codice nella Source Window. È anche possibile aggiungere altre finestre di dialogo o frame attraverso l'opzione Insert del menu principale.

Property List: Ogni componente che viene inserito attraverso il Form Designer rispetta le specifiche JavaBean. Un Bean, oltre che dagli eventi che può generare o gestire e dalle azioni che può eseguire, è caratterizzato dalle proprietà. Esse non sono altro che l'insieme dei parametri che permettono di distinguere un oggetto rispetto ad un altro dello stesso tipo. Esse sono elencate nella Property List la quale è divisa in due colonne: la prima contiene il nome della proprietà mentre la seconda contiene i tool di editazione che vanno dal semplice TextField per i valori di tipo String o numerici, a tool più complicati come ad esempio la palette per la scelta dei colori. Si noti come il tutto rispetta le specifiche JavaBeans secondo le quali ad ogni proprietà viene assegnato un nome ed un editor. Per modificare una proprietà dell'oggetto è sufficiente cliccare (dare il focus) sul valore da editare. La modifica fatta sarà notificata all'oggetto corrispondente qualora si confermi l'inserimento oppure si selezioni un'altra proprietà o oggetto. La Property List contiene anche, nella parte superiore, una choice che permette di scegliere l'oggetto da editare senza necessariamente evidenziarlo nel Form Designer.

Source Window: Visual Cafe 2 permette di lavorare contemporaneamente in modo visuale ed in modo tradizionale con la Source Window , che non è altro che un text editor in cui vengono evidenziate, con colore diverso, le parole chiave del linguaggio. Utile è il fatto che esiste, in ogni istante, perfetta corrispondenza tra la rappresentazione visuale (con PropertyList e FrameDesign) ed il codice generato. Se ad esempio, modifichiamo il nome di una variabile corrispondente ad un oggetto inserito nel FrameDesigner (proprietà Name nella PropertyList), otterremo immediatamente la stessa modifica nel codice. Analogamente se modifichiamo il nome della variabile nel codice, all'atto del building della classe (salvataggio e compilazione), il cambiamento sarà notificato alla PropertyList. Molto utile è anche la choice presente nella parte alta a destra nella Window che permette, selezionando uno dei metodi della classe parent, di farne l'overloading. Come conseguenza di una scelta verrà, infatti, visualizzato il codice relativo al metodo. La SourceWindow permette inoltre, con l'utilizzo del pulsante destro del mouse, di inserire i breakpoint utili nella fase di debugging.

HierarchyEditor: questa finestra di dialogo permette di visualizzare in maniera grafica, oltre alle classi ed alle interfacce del project, anche le relazioni tra esse. Le classi sono rappresentate da rettangoli grigi all'interno dei quali è scritto il loro nome. Le interfacce sono rappresentate allo stesso modo, solamente che la scritta è in corsivo. Una linea che congiunge i rettangoli può rappresentare una relazione di ereditarietà (tra classi o tra interfacce) oppure di implementazione (da una interfaccia ad una classe). Ovviamente due classi possono essere unite tra loro al più da un solo legame diretto, data l'ereditarietà singola di Java. I vantaggi di questo tool non sono soltanto quelli di visualizzazione, ma soprattutto quelli di supporto alla creazione di nuove classi o interfacce. Supponiamo di voler estendere una classe. Basterà cliccare sul rettangolo corrispondente e, tenendo premuto il pulsante del mouse, rilasciarlo in un punto libero della finestra. Apparirà quindi, il Class Wizard che permetterà di creare la nuova classe. I vantaggi sono maggiori nel caso in cui si voglia che una classe implementi una determinata interfaccia. Con il mouse non faremo altro che cliccare sulla interfaccia e, tenendo premuto il pulsante, rilasciarlo sulla classe. A questo punto è possibile verificare nella Source Window, che il codice relativo alle intestazioni dei metodi previsti dall'interfaccia, è stato aggiunto a quello della classe. Questo procedimento permette un notevole risparmio di tempo.

Class Browser: quando si programma scrivendo il codice direttamente nel Source Editor, si ha il problema di ricercare particolari variabili o metodi e di inquadrarli nel contesto globale di una classe o dell'intera applicazione. Questi obiettivi si ottengono con il ClassBrowser che permette di raggiungere e modificare, ciascuna singola proprietà o singolo metodo di una qualunque classe del project. Selezionando con il mouse una classe, verranno visualizzati tutti i suoi metodi e le sue proprietà. Selezionando una di queste, ne vedremo il codice corrispondente nella parte bassa della finestra e potremo modificarlo. Ovviamente la modifica sarà immediatamente notificata alla SourceWindow. Con l'utilizzo del pulsante destro del mouse è possibile inserire le dichiarazioni relative a nuove variabili oppure le firme relative a nuovi metodi. Ciascun metodo e variabile è rappresentato graficamente con un simbolo di forma diversa e di colore dipendente dal relativo modificatore. Per esempio, una variabile private viene rappresentata con un rombo rosso, mentre un metodo public con un triangolo blu.

Messages Dialog : in questa dialog vengono visualizzati i messaggi scritti sullo standard output. Uniche operazioni possibili in essa sono quelle di cut/copy & paste.

L'Insert Class Wizard

Symantec Visual Cafe 2.0 Web Development dispone dei seguenti Wizard:

  • Insert Class
  • Add Interaction

Il primo Wizard si invoca dal Class Browser attraverso il menu che si ottiene premendo il pulsante destro del mouse nel frame relativo alle classi. La prima parte del Wizard permette di scegliere se andremo a creare una classe oppure una interfaccia. Le successive scelte saranno conseguenza di questo primo passo. Se si sceglie di creare una classe, si dovranno specificare le informazioni relative alla sua dichiarazione ovvero il nome, la classe che estende, il package di appartenenza ed il modificatore di accesso (public, package ecc..). In questa fase è possibile specificare anche se si tratta di classi final o abstract. La seconda parte del Wizard permette, invece, di scegliere le eventuali interfacce che la classe dovrà implementare tra quelle elencate in una lista, mettendole in un ipotetico basket. L'ultima fase permette di specificare quali siano i metodi ereditati dalla classe parent sui quali fare l'overloading. Premendo il pulsante Fine si ha, quindi, la generazione del codice corrispondente e l'aggiunta della classe creata nella Project Window. Se dobbiamo creare una interfaccia il procedimento sarà analogo, solamente che sparisce la relazione di implementazione. Questo Wizard è lo stesso che viene visualizzato a partire dallo Hierarchy Editor solamente che, in quel caso, la classe da estendere o l'interfaccia da implementare, sono state decise con il primo clic del mouse.

L'Interaction Wizard

Un bean è caratterizzato, oltre che dalle proprietà e dai metodi, dagli eventi che è in grado di generare. Il modello ad eventi stabilito dalle specifiche JavaBean si chiama delegation model e prevede la definizione, per ogni evento, di oggetti sorgenti e di oggetti ascoltatori. Un oggetto sorgente è quello che genera l'evento, mentre l'oggetto ascoltatore è quello che esegue una determinata azione a seguito dello stesso. Secondo il modello per delega, solamente gli oggetti ascoltatori che si sono registrati come tali alla sorgente per un determinato evento, sono sensibili al suo verificarsi. La sorgente dovrà quindi richiamare un metodo degli oggetti ascoltatori dipendente dall'evento generato. Questo si ottiene attraverso l'utilizzo di interfacce che raccolgono l'insieme dei metodi che possono essere eseguiti in relazione ad un evento. È evidente che se un oggetto vuole essere un ascoltatore per quell'evento, deve implementare la relativa interfaccia. Supponiamo, però, di disporre di due componenti e di voler fare in modo che il primo divenga ascoltatore del secondo per un certo evento. Un metodo sarebbe quello di modificare il codice del primo componente in modo da registrarsi al secondo per quell'evento. La modifica del codice di un componente da parte di un tool non è certo figlia della filosofia per componenti secondo la quale ogni oggetto è utilizzato agendo solamente sul suo stato e sul modo di interagire con altri. Devono essere, allora, generate delle particolari classi, dette Adapter, che fungono da tramite. Se la classe A deve eseguire il metodo a() a seguito del verificarsi di un evento E generato da B, l'adapter implementerà l'interfaccia corrispondente ad E, si registrerà come ascoltatore di B e, come conseguenza del verificarsi dell'evento E, eseguirà il metodo a() di A. L'adapter sarà quindi ascoltatore rispetto alla sorgente e sorgente rispetto all'ascoltatore. L'Interaction Wizard permette di gestire gli eventi in modo molto semplice. Si seleziona l'oggetto sorgente dell'evento nella Project Window oppure nel Form Designer e, attraverso il menu ottenuto con il pulsante destro del mouse, si invoca il l'InteractionWizard. Esso può essere costituito da una o due pagine a seconda che il metodo da eseguire conseguentemente all'evento abbia o meno parametri. Comunque il primo passo consiste nello scegliere l'evento da gestire. A questo punto è possibile selezionare l'oggetto ascoltatore tra quelli presenti nel project. Verranno allora visualizzate tutte le possibili azioni che possono essere eseguite. Se l'azione prevede la specifica di parametri, il pulsante Fine diventerà Avanti e sarà quindi possibile selezionarli. Questa ultima possibilità può essere molto utile in quanto permette di gestire tipi di parametri diversi in modo appropriato. A seguito di un evento è possibile, per esempio, scegliere una azione che consiste nel visualizzare una immagine. Il metodo permetterà di scegliere l'immagine da visualizzare con la tipica opzione di browse. Le azioni associate ad un evento dal Wizard sono espresse in parole e non in termini di metodi. È possibile invocare l'Interaction Wizard anche in modo visuale premendo il relativo pulsante nella toolbar. Il puntatore del mouse cambierà forma e basterà cliccare sulla sorgente e, tenendo premuto il pulsante, rilasciarlo sull'oggetto destinatario. Apparirà quindi l'Interaction Wizard con alcune proprietà già settate.

Creazione di Bean

Per creare un nuovo componente Java basterà scegliere la relativa opzione in fase di creazione di un nuovo project. Saranno quindi create tre classi: una relativa al bean vero e proprio, una relativa alla classe JavaBean ed un applet che permette di verificarne il funzionamento. Se vogliamo editare gli eventi del bean utilizzando completamente le potenzialità dell'InteractionWizard (descrizione in parole delle possibili azioni conseguenti il verificarsi di un evento, scelta dei relativi parametri, ecc.) dovremo utilizzare le classi ConnectionDescriptor e SymantecBeanDescriptor del package symantec.itools.beans. Queste classi estendono rispettivamente le classi FeatureDescriptor e BeanInfo del package java.beans del JDK e permettono di fornire ulteriori informazioni che l'introspection specifica del tool permetterà di leggere. Attraverso la creazione di oggetti ConnectionDescriptor descriveremo ciascuna possibile connessione del bean con altri. Attraverso un oggetto di tipo SymantecBeanDescriptor, descriveremo a Visual Cafe 2, alcune caratteristiche del bean quali il nome relativo al bean nella toolbar, l'icona da affiancare al bean nel caso di drag nel FormDesigner, ecc. Un esempio di dichiarazione di una possibile azione conseguente ad un evento è la seguente:

connection=new ConnectionDescriptor("output", "String", "","%name%.getFrame()",

"Get the HTML Link Frame Name");

in cui si crea un oggetto symantec.itools.ConnectionDescriptor specificando:

  • se il parametro è di ingresso o di uscita
  • il tipo di parametro.

Una espressione che rappresenta il codice che deve essere presente prima di creare quello relativo alla connessione (in questo caso nessuno).

Una espressione che definisce il codice da creare per la connessione. All'interno di questo parametro (di tipo String) è possibile utilizzare simboli del tipo %name%, %class% e %arg% che fanno riferimento rispettivamente al nome della classe/componente, al nome esteso della stessa oppure ad argomenti di metodi utilizzati per una connessione di output.

Una descrizione dell'azione relativa al metodo.

Il procedimento di creazione della classe BeanInfo di supporto, anche se leggermente macchinoso, è comunque molto semplice.

Una volta creato il Bean è possibile creare un file jar che lo contenga in ogni sua componente sia essa una classe, un suono o un'immagine. Visual Cafe 2 dispone di un piccolo tool per la creazione dei file jar che permette di scegliere l'insieme dei file da comprimere. Automaticamente genera il manifest file e, di seguito, il file jar. Una volta creato un bean è possibile aggiungerlo al menu dei componenti attraverso una semplice operazione di drag and drop. Il bean sarà visualizzato attraverso l'icona specificata nella classe SymantecBeanInfo.

Con Visual Cafe 2 è possibile, inoltre, aggiungere alla Component Library, un nuovo componente fornito da terzi attraverso l'opzione Insert Component into library. Una volta scelto il componente sotto forma di file .jar o .class verrà eseguita una operazione di instrospection che permetterà di ottenere l'icona rappresentativa dell'oggetto e di determinare le informazioni relative alle proprietà ed eventi dello stesso. A tale scopo saranno utilizzate le informazioni fornite esplicitamente attraverso l'oggetto BeanInfo (introspection esplicita) se presente, oppure saranno ricercati quei metodi o proprietà soddisfacenti le regole di design pattern (introspection implicita). Verranno quindi create le informazioni per la PropertyList e per l'InteractionWizard.

Debugging

Dopo aver provveduto al Building dell'applicazione o dell'applet, è possibile farne il debugging. Una tipica operazione di debugging con Visual Cafe 2 consiste nella visualizzazione del codice nella Source Window e nell'inserimento, nei punti cruciali del programma, dei breakpoint ovvero dei punti in cui l'esecuzione si dovrà bloccare. Questo viene fatto semplicemente scegliendo la relativa opzione nel menu visualizzato premendo il pulsante destro del mouse in corrispondenza della riga voluta. Basterà quindi eseguire il programma in modalità debug attraverso la corrispondente opzione nel menu Project. Il Workspace sarà automaticamente settato in debug ed il programma si bloccherà in corrispondenza dei breakpoint inseriti. A questo punto sono disponibili numerose finestre di dialogo che permettono di avere abbondanti informazioni sull'esecuzione del programma ovvero:

Variables Dialog: è possibile visualizzare, in corrispondenza ad ogni breakpoint, il valore di ciascuna variabile. Questo si rivela utile nel caso di errore del tipo IndexOfBoundException o nel caso di valori null.

Threads Dialog: visualizza tutti i thread esistenti e soprattutto il loro stato. Questa finestra è utile nel caso in cui si verifichino malfunzionamenti dovuti al blocco di thread, per esempio, in lettura su uno stream.

Breakpoints Dialog: permette di visualizzare le informazioni relative ai breakpoint inseriti in termini di nome del file e di riga nel testo. In questa finestra viene data la possibilità di ignorare determinati breakpoint inseriti in modo da verificare più casi senza dover riavviare il debugger.

Calls Dialog: permette di visualizzare quali metodi sono in esecuzione in quell'istante. Questa finestra è utile nel caso in cui si volesse conoscere il percorso di esecuzione del programma ovvero se determinati metodi sono invocati oppure no.

Watch Dialog: permette di specificare un determinato oggetto di cui si vuole tenere traccia visualizzandone lo stato in ogni istante. L'utilità è quella di raccogliere in una unica finestra tutte le informazioni relative agli oggetti di cui si è interessati senza doverli cercare nella Variables Dialog.

Quando si è bloccati su un breakpoint è possibile proseguire in vari modi premendo il relativo pulsante nella toolbar:

  • Step Into: si prosegue con l'istruzione successiva del codice.

Step Over: se la riga del breakpoint è relativa ad un metodo, si passa all'istruzione successiva senza entrare nel codice a meno che non ci siano altri breakpoint.

Step Out: prosegue l'esecuzione fino al termine dello scopo.

Il debugger di Visual Cafe 2 è molto semplice da utilizzare e si può considerare un ottimo strumento.

Codice generato e compatibilità

Visual Cafe 2.0 Web Development si basa sulle API del JDK1.1 e quindi gli applet creati potrebbero avere dei problemi con determinati browser non aggiornati all'ultima versione. Per esempio Netscape Communicator, benché disponga della JVM della versione 1.1 ha problemi relativamente all'AWT (Abstract Window Toolkit) ed alla gestione degli eventi che è basilare nella programmazione dei bean. Il codice generato è comunque di ottima qualità sia rispetto ai nomi scelti nella rappresentazione delle variabili corrispondenti ad oggetti inseriti (per i metodi si utilizzano addirittura le regole del design pattern) sia per quello che riguarda la sua leggibilità (indentazione del codice, spazio per i commenti, ecc.). Per quello che riguarda il compilatore, Visual Cafe 2 permette di scegliere se utilizzare quello standard del JDK oppure quello della Symantec con velocità di compilazione sicuramente superiore. È sufficiente scegliere la relativa opzione nelle Options del project. Questo può servire per utilizzare gli strumenti di programmazione di Visual Cafe 2 anche con il JDK 1.0.2. Ovviamente bisognerà rinunciare ad utilizzare l'Interaction Wizard o i template forniti automaticamente in fase di scelta del project, che si basano su concetti legati al delegation model. La versione Web Development non contiene nessuno strumento per la gestione dei database oltre alle normali API JDBC fornite con il JDK1.1. A tale scopo è disponibile il prodotto dbAnyware che prevede l'aggiunta di nuovi componenti per l'accesso ai database e per la loro gestione, ma non è presente nella confezione Web Development. L'attributo Web Development è dovuto al fatto che con il CD-Rom viene fornito il tool Visual Page, per l'editazione di pagine Web.

Conclusioni

In questo articolo abbiamo visto le caratteristiche principali di Visual Cafe 2.0 Web Development cercando di descrivere al meglio gli strumenti che il tool offre a supporto della programmazione in Java. Il prodotto, aggiornato al JDK1.1, è ricco di tool che semplificano le fasi di digitazione del codice, ma può sembrare povero di Wizard, in quanto contiene solamente quello per la creazione di classi e per la gestione degli eventi secondo il delegation model. Conseguentemente, Visual Cafe 2 non è adatto a coloro che desiderano realizzare applicazioni o applet Java senza scrivere righe di codice, ma a programmatori che conoscono abbastanza bene il linguaggio nella sua ultima versione. Come visto, per creare un bean è necessario, per esempio, conoscere le specifiche JavaBeans per poter utilizzare le classi della Symantec. Altro punto a favore di Visual Cafe 2 è una distinzione netta tra i componenti caratteristici del tool e quelli standard. In questo modo è possibile scegliere di utilizzare solamente quelli definiti nel JDK ed avere vantaggi nel caso di scaricamento di un applet. Vantaggioso è il fatto che componenti creati possano essere aggiunti a quelli già disponibili con un semplice drag and drop.

Massimo Carli, laureato in Ingegneria Elettronica presso l'Università di Padova, si occupa di Java da circa due anni e sviluppa, presso una azienda vicentina, applicazioni per Internet ed Intranet completamente in Java.