430 likes | 1.16k Views
IBM Toolbox for Java. IBM? Toolbox for Java? rappresenta un insieme di packages che permettono a programmi Java di accedere ai dati/risorse su un servers iSeries?. Queste classi permettono di scrivere applicazioni client/server, servelt, applet. Inoltre, ? possibile eseguire in maniera nativa su iSe
E N D
1. Java e As400Introduzione all’uso della IBM Toolbox for Java Furlani Francesco
f.furlani@smsgroup.it
SMS GROUP srl - Pesaro
2. IBM Toolbox for Java IBM® Toolbox for Java™ rappresenta un insieme di packages che permettono a programmi Java di accedere ai dati/risorse su un servers iSeries™. Queste classi permettono di scrivere applicazioni client/server, servelt, applet. Inoltre, è possibile eseguire in maniera nativa su iSeries applicazioni Java utilizzando la iSeries Java virtual machine (JVM).
IBM Toolbox è disponibile nelle seguenti forme
Programma su licenza 5722-JC1 a versione V5R4 installabile
dalla versione V5R2
Comprende una versione ottimizzata per esecuzioni su
iSeries
Versione open source denominata JTOpen utilizzabile da un
client esterno
3. IBM Toolbox for Java L’IBM Toolbox for Java è formata da un insieme di jar files. Ciascun
jar è formato da classi che assolvono specifici compiti.
Requisiti per l’installazione su una workstation dell’IBM Toolbox for
Java
Installazione di una J2SE 1.4 o superiore
Copiare i jar files della toolbox necessari nel proprio
CLASSPATH
4. Package del IBM Toolbox Access classes
Permette di accedere e gestire alle risorse iSeries
HTML classes
Permette di creare forms HTML e tabelle
Micro classes
Permette di creare applicazioni java per dispositivi mobili per poter accedere ai dati e alle
risorse iSeries
ReportWriter classes
Permette di create documenti PDF da datasource XML
Resource classes
Fornisce un framework per accedere alle risorse iSeries
Security classes
Fornisce connessioni sicure al server iSeries
Servlet classes
Permette di repererire e formattare dati in una servlet
Utility classes
Funzioni di sistema e utilità
Vaccess classes
Permette, tramite Swing, di rappresentare le risorse iSeries
5. IBM Toolbox for Java Access package Permette di accedere alle risorse iSeries
Comandi,
Programmi,
Spool,
Code Dati,
ecc..
Utilizzabile da un programma standalone,
da una applet o da una servlet
6. IBM Toolbox for Java Access package
7. IBM Toolbox for Java Access package
8. IBM Toolbox for Java Access package
9. IBM Toolbox for Java Access package – Data Conversion
Data Conversion
Le classi adibite alla conversione dati permettono di convertire dati numerici e alfanumerici tra i formati iSeries e Java. La conversione di rende necessaria in quanto su iSeries è utilizzata la codifica EBCDIC.
Data Description
Queste classi sono costruite sulla “data conversion” permettono di convertire tutti i campi di un record con una singola chiamata ad un metodo. La classe RecordFormat permette di descrivere i dati che saranno gestiti, ossia permette di di specifare i dati che verranno passati in una coda dati, come parametro di un comando.
10. IBM Toolbox for Java Access package – Data Conversion AS400DataType
Rappresenta una interfaccia che definisce i metodi richiesti per la conversione dati.
Un programma java implementerà questa interfaccia quando ci sarà la necessità
di convertire singoli “pezzi” di dati. Esistono classi che convertono i seguenti tipi di dati:
Numerici
Testo
Es:
AS400Bin4
AS400Text
Ecc…
11. IBM Toolbox for Java Access package – Data Conversion Conversione specificando un formato record (RecordFormat)
Esistono delle classi che permettono di convertire i dati di un record in un colpo solo invece di convertire singolarmente i campi che formano il record. Per esempio, nel caso di un programma Java che legga dati da un coda dati la quale contiene un array di byte che potrebbe essere “formattato” utilizzando diversi tipi di dati iSeries. Il pgm Java potrebbe convertire il struttura letta campo per campo oppure potrebbe creare un RecordFormat che descrive la struttura dell’array. In questo caso la conversione potrebbe essere fatta direttamenta sul record.
La conversione per RecordFormat si usa principalmente quando si lavora con code dati, program call e accesso al db a livello di record.
12. IBM Toolbox for Java Access package – Data Conversion Esempio di conversione di un dato numerico
// Create a buffer to hold the server data type. Assume the buffer is filled with numeric
// data in the server format by data
// queues, program call, etc.
byte[] data = new byte[100];
// Create a converter for this server data type.
AS400Bin4 bin4Converter = new AS400Bin4();
// Convert from server type to Java object.
//The number starts at the beginning of the buffer.
Integer intObject = (Integer) bin4Converter.toObject(data,0);
// Extract the simple Java type from the Java object.
int i = intObject.intValue();
13. IBM Toolbox for Java Access package – Data Conversion Esempio di conversione di un testo
I dati vengono convertiti utilizzando la classe AS400Text
Questa classe si preoccupa di gestire la conversione da EBCDIC
Quando viene costruito l’oggetto AS400Text deve essere specificata la lunghezza della stringa da convertire.
14. IBM Toolbox for Java Access package – Data Conversion For example, assume that a DataQueueEntry object returns iSeries text in EBCDIC.
The following example converts this data to Unicode so that the Java program can use it:
// ... Assume the data queue work has already been done to retrieve the text from the iSeries and the data has been
// put in the following buffer.
int textLength = 100;
byte[] data = new byte[textLength];
// Create a converter for the iSeries data type. Note a default converter is being built. This converter assumes the iSeries
// EBCDIC code page matches the client's locale. If this is not true the Java program can explicitly specify the EBCDIC
// CCSID to use. However, it is recommended that you specify a CCSID whenever possible (see the Notes: below).
AS400Text textConverter = new AS400Text(textLength)
// Note: Optionally, you can create a converter for a specific CCSID. Use an AS400 object in case the program is running
// as a Toolbox for Java proxy client.
int ccsid = 37;
AS400 system = ...; // AS400 object
AS400Text textConverter = new AS400Text(textLength, ccsid, system);
// Note: You can also create a converter with just the AS400 object. This converter assumes the iSeries code page matches
// the CCSID returned by the AS400 object.
AS400Text textConverter = new AS400Text(textLength, system);
// Convert the data from EBCDIC to Unicode. If the length of the AS400Text object is longer than the number of
// converted characters, the resulting String will be blank-padded out to the specified length.
String javaText = (String) textConverter.toObject(data);
15. IBM Toolbox for Java Access package Per poter accedere all’iSeries è necessario identificarsi
Si utilizza la classe com.ibm.as400.access.AS400
Qualunque programma deve usare una istanza di questa classe per poter
accedere a qualunque risorsa
Funzionalità
Autenticazione tramite Utente/Password o Kerberos
Gestione dei default user ID
Cache passwords
Prompt per password
Cambio password
Reperimento versione e release del sistema operativo
La classe SecureAS400 permette di criptare la connessione ed evitare di
spedire in chiaro userID e password
AS400 sistema = new AS400( “192.168.x.x”, user, password );
16. IBM Toolbox for Java Access package L’oggetto AS400 creato contiene le connessioni ai jobs server su
iSeries.
Ogni connessione ad un server iSeries determinerà l’esecuzione di
opportuni jobs sul server. Un server fornisce l’accesso ai seguenti
servizi:
JDBC
Program call and command call
Integrated file system
Print
Data queue
Record-level access
17. IBM Toolbox for Java Access package – Command Call
18. IBM Toolbox for Java Access package - DataArea
La classe DataArea è una classe astratta che rappresenta l’oggetto iSeries Data Area. Questo classe ha quattro sottoclassi che supportano i seguenti tipi di dati:
character data,
decimal data,
logical data,
local data areas che contengono character data.
ESEMPIO:
AS400 system = new AS400("MyServer");
QSYSObjectPathName path = new QSYSObjectPathName("MYLIB", "MYDATA", "DTAARA");
DecimalDataArea dataArea = new DecimalDataArea(system, path.getPath());
dataArea.create();
dataArea.clear();
dataArea.write(new BigDecimal("1.2"));
BigDecimal data = dataArea.read();
dataArea.delete();
19. IBM Toolbox for Java Access package – Data Queues
20. IBM Toolbox for Java Access package – Data Queue
21. IBM Toolbox for Java Access package – Integrated file system
22. IBM Toolbox for Java Access package – Integrated file system
23. IBM Toolbox for Java Access package – Print
24. IBM Toolbox for Java Access package – ProgramCall
25. IBM Toolbox for Java Access package – ProgramCall
26. IBM Toolbox for Java Access package – ProgramCall
ProgramParameter
Si usa la classe ProgramParameter per passare i parametri da un programma Java ad un programma iSeries e viceversa. I dati di input vengono impostati utilizzando il metodo setInputData(). Dopo l’esecuzione del programma i dati di output possono essere reperiti utilizzando il metodo getOutputData().Ogni parametro viene passato come un array di byte. Il programma Java dovrà convertire questo array di byte.
Si utilizzeranno le classi di “data conversion” per convertire i dati tra formati Java e iSeries.
I Parametri vengono aggiunti alla ProgramCall come oggetti di una lista
27. IBM Toolbox for Java Access package – ProgramCall
28. Esempio //
// JSMServer.java
//
// SMS GROUP Pesaro
//
//
import java.net.*;
import java.io.*;
import com.ibm.as400.access.*;
public class JSMServer extends Thread {
protected Socket client;
static AS400 sys;
public JSMServer (Socket socket)
{
System.out.println("-->Connessione da:"+socket.getInetAddress().getHostName()+ " - "+socket.getInetAddress().getHostAddress());
client=socket;
}
public void run()
{
try {
InputStream is=client.getInputStream();
OutputStream os=client.getOutputStream();
29. Esempio PrintStream p=new PrintStream(os);
int x;
ByteArrayOutputStream command=new ByteArrayOutputStream();
String prezzoCommand=new String("PREZZO");
String quitCommand=new String("QUIT");
while ((x=is.read())!=-1)
{
if (x==64)
{
if (!quitCommand.equalsIgnoreCase(command.toString()))
{
os.write(prezzo(command.toString()).getBytes());
} else {
p.println("terminazione!");
try {
Thread.sleep(100);
sys.disconnectService(AS400.COMMAND);
} finally {
break;
}
}
command.reset();
} else if (x!=10) /*Carriage return */
command.write(x);
}
}
30. Esempio catch (IOException ex)
{
ex.printStackTrace();
} finally {
System.out.println("Connessione chiusa "+client.getInetAddress());
try {
client.close();
} catch (IOException ex)
{
ex.printStackTrace();
}
}
}
public static void main(String args[]) throws IOException
{
int port=0;
Socket client;
if (args.length == 0)
{
System.out.println("Uso: java JSMServer numero-porta");
} else
{
if (args.length >= 1)
port = Integer.parseInt(args[0]);
System.out.println("Server in avvio sulla porta:"+port);
ServerSocket server = new ServerSocket(port,100);
System.out.println("Server avviato sulla porta:"+server.getLocalPort());
System.out.println("Connessione iSeries in avvio");
31. Esempio try {
sys = new AS400(“as400",“USER",“PASSWORD");
System.out.println("Connessione iSeries avviata");
}
catch (Exception ex)
{
ex.printStackTrace();
}
System.out.println("Ready..");
while (true)
{
System.out.println("In attesa di connessione...");
client=server.accept();
System.out.println("Richiesta connessione da:"+client.getInetAddress().getHostName());
(new JSMServer(client)).start();
}
}
}
private String prezzo(String CodArt)
{
String tmpPrezzo="";
try {
// Definizione parametri
ProgramParameter[] parmList = new ProgramParameter[4];
// Data
String Data="20041215";
AS400Text txt8 = new AS400Text(8);
parmList[0] = new ProgramParameter(txt8.toBytes(Data),8);
32. Esempio // Cliente
String CodiceCliente="000001";
AS400Text txt6 = new AS400Text(6);
parmList[1] = new ProgramParameter(txt6.toBytes(CodiceCliente),6);
// Articolo
String CodiceArticolo=CodArt;
AS400Text txt15 = new AS400Text(15);
parmList[2] = new ProgramParameter(txt15.toBytes(CodiceArticolo),15);
// Prezzo: valore di ritorno
String prezzo="";
AS400Text txt13 = new AS400Text(13);
parmList[3] = new ProgramParameter(txt13.toBytes(prezzo),13);
ProgramCall pgm = new ProgramCall(sys,"/QSYS.LIB/SMS_OBJSTD.LIB/C0699C.PGM",parmList);
// Run the program.
if (pgm.run() != true)
{ AS400Message[] messageList = pgm.getMessageList(); }
else
{ tmpPrezzo= (String)txt13.toObject( parmList[3].getOutputData()); }
// Disconnect since I am done running programs}
catch (Exception ex)
{ ex.printStackTrace(); }
return tmpPrezzo;
}
}
33. IBM Toolbox for Java Access package – JDBC
34. IBM Toolbox for Java Access package – JDBC
35. IBM Toolbox for Java Access package – JDBC Proprietà specificate nella connessione
driver
utente
password,
lista delle Librerie,
transaction isolation,
formato data e ora
ottimizzazione delle query,, ….
ecc..
36. IBM Toolbox for Java Access package – JDBC AS400JDBCConnection class
La classe AS400JDBCConnection fornisce una connessione JDBC
verso uno specifico database DB2 UDB for iSeries.
Per creare una istanza di questo oggetto è sufficiente richiamare il
metodo getConnection.
Es:
DriverManager.getConnection()
37. IBM Toolbox for Java Access package – JDBC Usando la classe AS400JDBCConnection è possibile eseguire le seguenti operazioni:
Creare uno Statement (Statement, PreparedStatement)
Gestire i Commit e Rollbacksul database e rilasciare i lock sulle tabelle del database
Chiudere la connessione terminando automaticamente le connessioni alle risorse utilizzate
Impostare il livello di “transaction isolation”
Avere le informazioni sulle tabelle utilizzando i metadata
Impostare l’autocommit in on o off
Ottenere il job identifier corrispondente al lavoro su sistema
38. IBM Toolbox for Java Access package – JDBC //Load the IBM ToolBox for Java JDBC driver
DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());
// Connect to the server.
Connection c = DriverManager.getConnection("jdbc:as400://mySystem");
// Create a Statement object.
Statement s = c.createStatement();
// Run an SQL statement that creates a table in the database.
s.executeUpdate("CREATE TABLE MYLIBRARY.MYTABLE (NAME VARCHAR(20), ID INTEGER)");
// Run an SQL statement that inserts a record into the table.
s.executeUpdate("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES ('DAVE', 123)");
// Run an SQL statement that inserts a record into the table.
s.executeUpdate("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES ('CINDY', 456)");
// Run an SQL query on the table.
ResultSet rs = s.executeQuery("SELECT * FROM MYLIBRARY.MYTABLE");
// Close the Statement and the Connection.
s.close();
c.close();
39. IBM Toolbox for Java Access package – JDBC Nell’esempio è stato necessario specificare la libreria che contiene la tabella nella forma <nome_libreria>.<nome_tabella>
Se la connessione fosse stata fatta
Connection c = DriverManager.getConnection("jdbc:as400://mySystem/MYLIBRARY");
non sarebbe stato necessario specificare la libreria negli SQL
40. Tips & Tricks Tabelle sotto giornale
Comando CRTSQLPKG per creare la libreria che contiene le tabelle
Comando STRJRNPF per mettere sotto giornale le tabelle
Parametri sulla connessione (transaction isolation)
L’istruzione SQL ALTER TABLE DROP COLUMN potrebbe non funzionare!
aggiungere il messaggio CPA32B2 alle risposte di sistema
ADDRPYLE SEQNBR(3001) MSGID(CPA32B2) RPY('I')
impostare nella JOBD associata all'utente QUSER il valore
INQMSGRPY(*SYSRPYL)
41. Gestione dei membri di una tabella
Alternative:
Utilizzare il comando OVRDBF
Utilizzare l’istruzione SQL “CREATE ALIAS”