MokaByte Numero 25  -  Dicembre 98
 
AS 400 Toolbox 
for Java 
di 
Mauro Molino
Vediamo come sia possibile ininteragire con il sistema AS 400 di IBM per mezzo del toolbox apposito

 



 
 
 
 
 
 

E’ ormai piu’ che evidente la scelta fatta da IBM di investire sulla tecnologia Java; ha rilasciato il JDK per tutte le sue piattaforme, dai PC ai Mainframe, il sito ufficiale e’ stracolmo di materiale, applets, tools e JavaBeans, e si vocifera di un JavaOS per piattaforma AS/400. In questo panorama si inserisce a pieno titolo l’ AS/400 Toolbox for Java, una raccolta di classi orientata allo sviluppo di applicativi in Java su AS/400, favorendo l’integrazione fra gli oggetti tipici del sistema OS400 (il sistema operativo), e lo sviluppo Java. In quest’articolo, che non pretende di essere esaustivo, vista la quantità di possibilità messe a disposizione dal toolbox, cercheremo di introdurre questo strumento dando un assaggio delle sue potenzialità. 


La prima cosa da sottolineare è che sull’ AS/400 coesistono due tipi di file-system: quello definito integrato, che è l’analogo dei file-system presenti su piattaforma PC, e quello nativo, che è invece individuato dalla gerarchia LIBRERIA/FILE/MEMBRO. Quest’ultimo è organizzato ad oggetti, per cui è oggetto ogni entità in esso contenuta. Non basta, gli attributi degli oggetti non sono solo i soliti di lettura, scrittura etc., ma ad esempio le librerie possono essere di test o di produzione, i file possono essere sorgenti, di dati, fisici, logici, di spool etc. Per ovviare a questo problema, il toolbox prevede classi apposite per l’accesso agli oggetti della macchina. In più esistono oggetti con i quali normalmente non si ha a che fare con altri sistemi operativi, come i lavori (job, un po’ diversi dai processi), code di dati, code di distribuzione etc., tutto supportato dal toolbox, così come risulta supportata la conversione dei dati dei parametri di input-output dei programmi(il toolbox permette di lanciare programmi residenti sull’ AS/400 scritti in altri linguaggi, come COBOL o RPG, ma esistono delle differenze fra i tipi di dato utilizzati dall’ AS/400 e quelli a cui siamo abituati, come stringhe, interi etc., per cui è necessaria una conversione di questi.).
Tutto questo potrebbe sembrare scoraggiante, ma il toolbox integra la possibilità di domare agevolmente tutte queste difficoltà.

I primi passi 

I servizi messi a disposizione dal toolbox sono i seguenti:

JDBC
Chiamata di comandi CL (control language)
Chiamata di programmi nativi
Controllo del file system integrato
Controllo dell’attività di stampa
Controllo delle code di dati
Accesso a livello record
Controllo dei lavori sul sistema
 
 

Diciamo subito che è possibile far girare la stessa applicazione sia in remoto che sulla VM dell’AS/400. Nel primo caso, l’applicazione si connette ad un servizio server dell’ AS/400 e la comunicazione avviene tramite socket. Si può scegliere di tenere le classi del toolbox su AS/400 ed accedervi dal client via browser, richiamando quindi un applet dal web-server dell’ AS400, oppure tenere il toolbox direttamente sul client e far partire l’applicazione da li. 
Vediamo comunque come utilizzare le principali classi messe a disposizione. La prima cosa da fare è creare un oggetto AS400 come segue :
 

AS400 sistema = new AS400( mioAS400, user, password );
dove mioAS400 è una stringa contenente il nome o l’indirizzo IP dell’AS/400 e user e password sono i dati di login . Se questi ultimi due non vengono specificati, all’atto della connessione comparirà un input box per inserirli. Se invece l’applicativo gira direttamente su AS/400, in mancanza dei dati di login vengono acquisiti quelli dell’utente che ha lanciato l’applicativo.
Si crea così una connessione attiva sull’AS/400 tramite la quale accedere ai vari servizi esposti, come vedremo in seguito. Può essere vantaggioso creare più oggetti AS/400 da utilizzare per i diversi servizi, aumentando cosi le prestazioni complessive. A questo punto si tratta di connettersi ad un servizio (jdbc, comando, file, coda di stampa etc.), utilizzando il metodo connectService del toolbox. Es.:
 sistema.connectService( AS400.FILE);
La chiamata a questo metodo è però opzionale dato che comunque, nel momento in cui si tentasse di accedere ad un file, verrebbe automaticamente connesso il servizio corrispondente. E’ invece importante chiamare il metodo disconnectService( ) nel momento in cui non fosse più necessario, per liberare risorse sull’AS/400, dato che ogni servizio collegato equivale ad un job attivo sulla macchina. Vediamo ora degli esempi più concreti di utilizzo del toolbox.

Accesso ai dati dell’AS/400 tramite JDBC 

Una volta connessi al sistema i passi da fare per utilizzare il driver jdbc sono gli stessi richiesti per l’accesso a qualsiasi base di dati : registrazione del driver nel DriverManager, creazione di un oggetto Connection per connettersi al database, creazione di un oggetto Statement o PreparedStatement (per le query compilate) o CallableStatement (per le stored procedure), per inviare la propria query SQL al sistema e infine istanziazione di un oggetto ResultSet per ottenere i dati generati dalla query eseguita. 
Ad esempio  :

 

10 DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver()); 

20 Connection connection = DriverManager.getConnection ("jdbc:as400://" + nomeDelSistema); 

30 Statement select = connection.createStatement (); 

40 ResultSet rs = select.executeQuery ("SELECT * FROM " + nomeTabella);

La riga 10 si occupa di caricare il driver jdbc, mentre la 20 crea la connessione al database (nomeDelSistema è il nome o l’indirizzo IP dell’AS400). In questo caso non abbiamo fornito ne uno user id ne una password, per cui a run-time ci verrà mostrato un pannello per l’inserimento di queste informazioni. 
Alla riga 30 viene creato l’oggetto statement che conterrà la query vera e propria che alla riga 40 verrà chiamata, ponendo nel ResultSet il risultato della query stessa (nomeTabella rappresenta una tabella esistente su AS400).
E’ poi possibile istanziare oggetti DatabaseMetaData e ResultSetMetaData per ottenere informazioni rispettivamente sul database o tabelle di esso e sul ResultSet (numero di colonne, nome delle colonne etc.). Come e possibile vedere l’utilizzo del driver jdbc è pressoché identico a qualsiasi altro driver dello stesso tipo, per cui non è necessario soffermarvisi ulteriormente. Passiamo invece ad argomenti più peculiari del sistema AS/400.

Chiamata di comandi CL (control language).

Il CL è il linguaggio di controllo utilizzato sull’AS/400 per interagire con il sistema. Potremmo definirlo la “shell” del sistema operativo OS/400. Il toolbox permette di lanciare comandi non interattivi e di ricevere indietro errori ed eventuali messaggi risultanti dall’operazione. L’utilizzo è alquanto semplice; si crea un oggetto CommandCall e vi si applica il metodo run(). Il metodo ritorna false se si è verificato un errore durante l’esecuzione del comando. Eventuali messaggi sono disponibili in una lista di oggetti AS400Message. Vediamolo in pratica :

10AS400 sistema = new AS400(nomeDelSistema);

20CommandCall cmd = new CommandCall(sistema);

30cmd.run("CRTLIB LIBRERIA");

40AS400Message[] listaMessaggi = cmd.getMessageList();

50for (int i = 0; i < listaMessaggi.length; i++) {

60System.out.println(listaMessaggi[i].getText()); }

70sistema.disconnectService(AS400.COMMAND);

La creazione del comando avviene alla riga 20, mentre alla 30 viene eseguito il comando stesso. In questo caso viene lanciato un comando di creazione di una libreria di nome LIBRERIA. Alla riga 40 si ottiene dal CommandCall un elenco degli eventuali messaggi di ritorno (che in questo caso possono essere una conferma della avvenuta creazione della libreria o l'impossibilità di farlo per la già esistenza della stessa etc.)  , con la successiva stampa sullo standard output dei messaggi generati (righe 50-60, dove listaMessaggi.length ritorna il numero di messaggi disponibili).
Infine alla riga 70 ci si disconnette dal servizio COMMAND, liberando così la risorsa sull’AS/400.

Chiamata di programmi AS/400 nativi.

La classe ProgramCall permette di lanciare programmi AS/400 con passaggio di parametri da e verso il programma mediante l’utilizzo della classe ProgramParameter. Se il programma va a buon fine si avranno indietro come parametri i dati restituiti dal programma , in caso invece di fallimento, al solito avremo i messaggi in una lista di oggetti AS400Message. Ogni parametro di input/output è un array di byte. Il programma deve convertire i dati dal formato AS/400 a quello java, e per questo esistono apposite classi di conversione dei dati. Vediamo un esempio di utilizzo della classe ProgramCall, tralasciando le porzioni di codice comuni agli esempi già mostrati :

10 ProgramCall prog = new ProgramCall(sistema); 

20 prog.setProgram(QSYSObjectPathName.toPath("LIBRERIA", "PROGRAMMA", "PGM"),null); 

30 if (prog.run() != true) { 

40 AS400Message[] listaMessaggi = prog.getMessageList();

50 //…….…. Processa i messaggi 

60 }

70 sistema.disconnectService(AS400.COMMAND);

L’unica particolarità che necessiti di una spiegazione è l’utilizzo dell’oggetto QSYSObjectPathName alla riga 20. Questo oggetto serve per convertire il path del programma in modo che sia nel formato del sistema integrato di file, invece che in quello nativo AS/400, questo perché il metodo setProgram dell’oggetto ProgramCall richiede il path del programma appunto nel formato del sistema integrato. Il null sempre all riga 20 è tale perché in questo caso non era richiesto il passaggio di parametri al programma.

Sistema di file integrato

Il toolbox prevede la possibilità di accedere al sistema di file integrato, cioè quel file system presente su AS/400, del tutto analogo ai file system tipo UNIX; perciò è possibile creare e cancellare un file o una directory, cambiarne gli attributi, verificarne l’esistenza, aprire un file in lettura o scrittura etc. , il tutto utilizzando una sintassi dei path familiare. Alla base di tutto questo risiede la classe IFSFile, con le classi accessorie : IFSFileInputStream, IFSFileOutputStream, IFSRandomAccesFile per la lettura e scrittura del file.  L’oggetto IFSFile può rappresentare anche una directory. Ad esempio, una directory viene creata semplicemente così:

10 IFSFile directoryNuova = new IFSFile(sistema, "/directory1/directory2/nuovadirectory");

20 directoryNuova.mkdir();

mkdir() ritorna false se la creazioe fallisce, mentre la cancellazione di un file si può fare così:

10 IFSFile fileProva = new IFSFile(sistema, "/directory1/directory2/fileprova");

20 fileProva.delete();

che lancia una eccezione ExtendedIOException se la cancellazione fallisce. E’ presente una notevole quantità di metodi associati agli oggetti del file system integrato, e questo permette una grande flessibilità di utilizzo dello strumento.

Altri servizi

L’AS/400 Toolbox for Java mette a disposizione una serie di altri servizi estremamente utili nella scrittura di programmi per l’AS/400. Ad esempio, il supporto per la stampa, che consente di controllare code di stampa, file di stampa, programmi di scrittura, file in spool, stampanti e risorse di AFP ( Advanced Function Printing ). 
La super classe di tutto ciò è la PrintObject, ai metodi della quale gli oggetti figli aggiungono i propri metodi specifici.

Altro interessante servizio è quello basato sulla classe BaseDataQueue e derivate, attraverso le quali è possibile gestire le code di dati, che rappresentano un potente mezzo di interazione/sincronizzazione fra programmi su AS/400 per ciò che riguarda il passaggio di dati da un programma all’altro. Ancora, le classi Job, JobList e JobLog consentono di interagire con i lavori attivi nel sistema ed eventualmente monitorarne l’andamento, e così via.
 
 

Java Beans

Per semplificare il più possibile lo sviluppo di applicazioni Java su AS/400, IBM ha introdotto nel toolbox una serie di Java Beans utilizzabile negli IDE disponibili per Java. Abbiamo così beans corrispondenti a praticamente tutti gli oggetti visti finora, permettendo così di “disegnare” le relazioni e le interazioni fra i vari oggetti che andranno a comporre l’applicazione. E come se non bastasse è presente una serie di componenti GUI che va dal CommandCallButton fino a vari pannelli già completi di ListBox per la visualizzazione dei record presenti in un file, l’elenco degli utenti, delle stampanti di sistema, dei lavori attivi, o del risultato di una query, il tutto basato sulle classi grafiche Swing, e quindi con componenti leggeri.

Conclusioni

L’ AS/400 Toolbox for Java non mostra particolari problemi, e si rivela estremamente utile anche nelle attività di tutti i giorni. IBM afferma che più di 700.000 programmatori AS/400 abbiano abbracciato la tecnologia Java ; non sappiamo se le cifre siano esatte, ma questa tendenza è senza dubbio auspicabile, perché comunque rappresenta l’occasione per una tipologia di sistemi troppo a lungo legati a vecchie logiche, di proiettarsi verso il futuro, trovando una propria collocazione sempre più integrata con le nuove tecnologie. 


 
 
 


MokaByte Web  1998 - www.mokabyte.it 
MokaByte ricerca nuovi collaboratori. Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it