L’utilisation toujours plus importante de web services nous amène à devoir manipuler en RPG des données sous forme XML et JSON, pouvant représenter différents types de données, simples ou complexes.
Mais lorsqu’il s’agit de données binaires (image ou document pdf par exemple), ces informations doivent être converties en Base64 qui procure une représentation alphabétique de données binaires.
Voir la définition Wikipédia : https://fr.wikipedia.org/wiki/Base64
Afin de pouvoir encoder ou décoder ces valeurs depuis un programme RPG, nous devons nous appuyer sur des outils, chacun ayant ses avantages ou limitations :
- Les fonctions SQL SYSTOOLS.BASE64ENCODE et SYSTOOLS.BASE64DECODE sont limitées à 4Ko de données, bien souvent trop court
- Un projet de Scott Klement : http://www.scottklement.com/base64/
- Open Source ILE : https://github.com/RelicPackages/base64
- Fonctionnalité issue des différents langages supportés : PHP, Ruby, Node …
Nous proposons de voir ici une méthode avec Java, qui a la particularité de pouvoir être piloté directement par RPG.
Depuis Java 8, le runtime fournit les fonctions Base64 : https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html
Toutefois, cette classe utilise des classes internes Java (classe dans la classe), dont le prototypage n’est pas documenté pour le RPG.
Voici un exemple d’utilisation simple en Java :
Produit la sortie suivante :
Ici, Base64.Encoder et Base64.Decoder sont les classes internes.
Voir la définition Wikipédia : https://fr.wikipedia.org/wiki/Classe_interne
Voici un programme RPG qui implémente l’utilisation de ces mêmes classes :
Produit le résultat suivant :
En RPG, les classes Java internes se déclarent avec $ et ne sont utilisables que via la classe mère.
Pour utiliser cette fonctionnalité Base64, il vous suffit d’avoir une JVM 8 :
- vérifier la disponibilité sur votre système par GO LICPGM, produit JV1
- java *version en ligne de commande pour connaitre la JVM par défaut
- regarder la variable d’environnement JAVA_HOME si existante
L’utilisation de Java permet de dépasser la limite des 4Ko facilement. La nouvelle limite est maintenant la taille maximale d’une variable RPG (16Mo), qui s’avère suffisante dans les situations classiques.
Bon développement !