Java utilise Python

Cet exemple illustre l'utilisation de l'interpréteur python au travers du code Java. Le but ici est d'utiliser le composant de recherche écrit en python dans du code Java. Le programme étant assez simple, voici un diagramme de classe:

find packages

Le package dont le rôle de contrôleur devrait faire l'interface entre les données, le graphique et l'interpréteur python, a été volontairement laissé de côté afin de réaliser un exemple court et fonctionnel. Il est à compléter.

Main

La classe Main représente juste le point de départ de l'application

FindGui

Le package contient la classe de l'interface graphique: une JFrame spécialisée. Elle recoit les évenements provenant de l'utilisateur, pilote l'interpréteur python, remplit le modèle de données, exécute ce qui doit l'être lors d'un double-clique (en somme GUI + contrôleur).

FindData

Le package contient la classe gérant les données issues de la recherche.

SwingAdapter

Le package contient les adaptations faites d'après Swing pour obtenir le rendu voulu. En particulier, la gestion du double-clique et la façon d'afficher chaque élément de la liste (en deux couleurs). Dans les autres exemples, tous ces services sont réalisés par du code Jython en utilisant la dérivation d'objets Java.

Le diagramme suivant représente l'organisation en terme de classes :

find classes

Utilisation de l'interpréteur

Pour utiliser le composant de recherche python défini dans le fichier (module) pyFind.py, et plus précisement la classe FileFind, il faut récupérer une instance de celle-ci.

Ceci se réalise par plusieurs étapes simples :

importation du module

La classe org.python.core.imp est utilisée pour réaliser l'importation du module

  PyObject findMod = imp.importName("pyFind", true); 
	
création d'une instance

Une instance est créée (par réflexion) de la classe FileFind. Elle est représentée par un PyObject (org.python.core). C'est sur cette instance qu'il faut invoquer des méthodes.

  PyObject findClass = findMod.__getattr__("FileFind");
  findInstance = findClass.__call__();
	
passage de paramètres, appel de méthodes

Il suffit d'invoquer une méthode (premier argument) sur l'instance précédemment créée en passant les bons paramètres. Les types de base sont définis dans le package org.python.core. Une chaine de caractères passée comme paramètre est un PyString. Un entier est un PyInteger, un entier long un PyLong, etc...

  PyObject res;
  
  // 	def setPath(self,p):
  res = findInstance.invoke("setPath",new PyString(whereText.getText()));

  //	def setExprFile(self,r,simplified)
  res = findInstance.invoke("setExprFile",new PyString(whatText.getText()));
  //	def process(self):
  res = findInstance.invoke("process");

	
récupération du résultat

Pour retrouver les différentes valeurs résultant de la recherche et stocker dans un tableau python, il suffit d'itérer sur cette liste et les insérer dans le modèle de données Java. Chaque élément est récupéré dans un PyObject, qui fournit la méthode toString.

  PyObject item;
  for (int i = 0; (item = res.__finditem__(i)) != null; i++) {
    dataModel.addElement(item.toString());
  }		
   

Distribution

Les fichiers sont regroupés dans des archives, format zip et tarball. Les sources sont sous licence GPL.

Le makefile fournit permet de compiler le code java et de lancer l'execution. Les possibilites sont compile,clean, exec. Le 'make' sans argument permet de tout enchainer.

 make compile
 make exec

 ou 

 make
  

V o i r a u s s i

Sources

Licence