Accueil > Les langages de scripting > Prenez contrôle de votre Mac avec AppleScript et Java

Prenez contrôle de votre Mac avec AppleScript et Java

Par Scott D.W. Rankin le 25/02/2003

Traduit par Olivier, le 28/03/2003

Note de l’éditeur — Bien qu’il n’y ait pas beaucoup de support de Java dans AppleScript, vous pouvez exécuter des AppleScripts depuis java. Pourquoi voudriez-vous faire une telle chose ? Simplement parce qu’en combinant les deux technologies, vous pouvez facilement contrôler votre Mac à distance. Ce qui suit vous montre comment le faire.

Avec l’introduction de Mac OS X, Apple a fait de Java un langage de premier rang dans le monde du developpement pour Mac. Le framework Cocoa est livré par défaut avec des ponts pour Objective-C (un langage très bien conçu, qui à fait ses débuts dans le monde NeXT) et Java. Les développeurs qui souhaitent écrire une application native pour OS X peuvent utiliser l’un ou l’autre et elles auront le même aspect.

Apple offre aux développeurs Java un accès total aux librairies et aux frameworks. Cela signifie que les développeurs Java ne sont plus limités aux API définies par Sun pour interagir avec le système d’exploitation ; Apple nous a ouvert la porte sur un nouveau monde de fonctionnalités.

Un autre outil incroyablement puissant dans l’arsenal de Mac OS X est AppleScript. Pratiquement toutes les applications créées par Apple, y compris le Finder, sont contrôlables par AppleScript. iTunes, iPhoto, Mail : toutes sont scriptables. Mais AppleScript, qui est fantastique pour exécuter des scripts en local, n’a que peu de fonctionnalités pour faire d’autres choses, comme gérer des sockets ou servir des pages web. C’est là qu’entrent en jeu Cocoa et Java.

Cocoa possède une classe, NSAppleScript, qui permet aux applications Cocoa d’interagir avec les applications scriptables. Maintenant nous pouvons combiner la puissance de Java avec la puissance d’AppleScript pour créer un centre de contrôle à distance pour toute application scriptable sur notre ordinateur. Dans cette article, nous examinerons les classes Cocoa qui gèrent l’AppleScript, et ensuite nous créerons une simple application web qui nous permettra de contrôler iTunes depuis n’importe quel ordinateur du réseau.

NSAppleScript — Exécuter un Script depuis Java

Il existe deux classes Cocoa/Java principales que nous utiliserons pour interagir avec AppleScript : NSAppleScript et NSAppleEventDescriptor. Pour interfacer des AppleScripts qui n’envoient pas de résultat, NSAppleScript est tout ce qu’il vous faut. Utiliser NSAppleScript est extrêment simple : dans son constructeur, il accepte une String contenant le texte de l’AppleScript que vous voulez exécuter. Vous invoquez ensuite la méthode execute() et AppleScript s’exécute.

Avant d’exécuter un script depuis Java, il est souvent utile de tester en premier le script dans ScriptEditor. L’application ScriptEditor se trouve dans /Applications/AppleScript/ScriptEditor ; lancez la et vous obtiendrez une fenêtre qui ressemble à cela :


L’application ScriptEditor d’Apple.

Vous pouvez taper l’AppleScript dans la partie du haut et les résultats s’afficheront dans la partie basse. Voici un AppleScript simple qui crée un nouveau dossier sur votre bureau :

tell application "Finder"
make new folder at desktop
end tell

Tapez ce texte dans ScriptEditor, et cliquez sur Run. Vous devriez voir apparaitre une nouveau dossier intitulé “untitled folder” apparaitre sur votre bureau :


Le résultat de ce premier script : un nouveau dossier.

Maintenant, voyons comment faire cela en Java. La première chose à faire est de créer un squelette de classe. Ouvrez votre éditeur de texte favori. Si vous utilisez TextEdit d’Apple, assurez vous d’aller dans le menu Format et choisissez “Make Plain Text” (format texte pure) sinon il vous sera impossible de sauvegarder le fichier avec une extension .java. Voici le squelette de la classe :

import com.apple.cocoa.foundation.*;
public class AppleScriptTest
{
    public static void main(String[] args)
    {
        // Nous taperons notre code ici
        System.out.println("Yay AppleScript!");
    }
}

Copiez ou tapez ce code dans votre fichier, et sauvegardez-le sous le nom AppleScriptTest.java. Ensuite nous devons compiler et exécuter notre squelette. Faites-le en ouvrant Terminal (si vous utilisez Terminal pour éditer le texte, appuyer sur Command-N pour ouvrir une nouvelle fenêtre de Terminal) et positionner vous dans le répertoire où vous avez sauvegardé AppleScriptTest.java. Tapez la commande suivante à l’invite (en une seule ligne) :

% javac -classpath /System/Library/Java:. AppleScriptTest.java

La classe sera compilée. Pour la faire exécuter, taper la commande suivante :

% java -classpath /System/Library/Java:. AppleScriptTest

Il devrait s’afficher à l’écran “Yay AppleScript!”.


Voici ce que vous devriez voir s’afficher sur la fenêtre du Terminal.

Maintenant vous devez ajouter le code pour exécuter l’AppleScript que nous avons écrit plus haut. En utilisant des AppleScripts en Java, vous devrez vous rappeler qu’AppleScript a besoin de guillemets et de retour à la ligne pour comprendre le script. Nous devons donc utiliser le caractère d’échappement de Java pour les guillemets (\”) et les nouvelles lignes (\n) pour nous assurer que le script soit correctement interprété. Voici le code à insérer qui exécutera l’AppleScript :

String script = "tell application \"Finder\" \n"
  + " make new folder at desktop \n"
  + "end tell";

// Ceci crée un nouvel objet AppleScript
// pour exécuter le script
NSAppleScript myScript = new NSAppleScript(script);

// Le dictionnaire contient toute erreur
//qui pourrait survenir lors de l'exécution du script
NSMutableDictionary errors =  new NSMutableDictionary();

// Execute le script !
myScript.execute(errors);

Vous devez de nouveau compiler et exécuter votre code en utilisant les commandes javac et java vues plus haut. Non seulement vous voyez s’afficher “Yay AppleScript!” dans le Terminal, mais si vous regardez votre bureau, vous y verrez également un nouveau dossier.


Le script a été exécuté, et a créé un second nouveau dossier, cette fois depuis Java.

Maintenant nous allons voir comment lire les résultats issus d’AppleScript.

NSAppleEventDescriptor : A l’Ecoute des Résultats

Dans le code que nous venons d’écrire, nous avons exécuté un script qui effectue une action. L’invocation de execute() a en fait retourné un résultat, mais nous l’avons ignoré parce qu’il n’avait aucune importance pour notre script.

Maintenant nous souhaitons exécuter des scripts et prendre en compte leur résultat. Les résultats qui sont les plus simples à gérer sont ceux qui consistent en une seule ligne de caractères. Par exemple, si vous tapez ce script dans ScriptEditor et l’exécutez, vous obtiendrez le nom du premier élément de votre bureau :

tell application "Finder"
    get the name of the first item in the desktop
end tell

Pour moi, il a retourné “Greater Scott”.


Le script lit et retourne le nom du premier élément de votre bureau.

Maintenant, faisons la même chose en Java. Nous pouvons utiliser le même fichier avec quelques petites modifications. Modifiez la chaîne de caractères du script par :

String script = "tell application \"Finder\" \n"
    + " get the name of the first item "
    + " in the desktop \n" + "end tell";

Afin d’obtenir la valeur de retour, nous devons assigner la valeur retournée par execute() à une variable. La ligne avec execute() devrait être comme ceci :

NSAppleEventDescriptor results = myScript.execute(errors);

Ceci récupérera le résultat de l’AppleScript, et nous permettra d’y accéder par Java. Ajoutez ces lignes après l’appel de execute() :

String resultString = results.stringValue();
System.out.println("The first item is:"
                   + resultString);

Compilez et exécutez votre application, et vous devriez voir s’afficher le nom du premier élément de votre bureau. Félicitations ! Votre Mac parle et vous l’entendez !

Résultats Multiples

Actuellement, nous pouvons demander à AppleScript de retourner une valeur, et nous pouvons la lire. Mais c’est assez limité. AppleScript offre le concept de listes, donc cela peut paraître logique de vouloir récupérer une liste de choses depuis un AppleScript. Continuant notre interaction avec le Finder, nous allons maintenant obtenir une liste de tous les fichiers présents sur notre bureau.

Dans ScriptEditor, nous tapons le code suivant :

tell application "Finder"
    get the name of every item in the desktop
end tell

Ceci devrait vous renvoyer la liste de tout (disques, fichiers, dossiers, …etc…) ce qui se trouve sur votre bureau. Voyons maintenant comme analyser cette réponse en Java.

La classe NSAppleEventDescriptor est une classe qui offre une interface qui permet de voir comment sont représentés les AppleEvents en interne. Ils peuvent contenir une multitude de types différents : énumérations, listes, chaînes de caractères, nombres, …etc…. Il existe plusieurs méthodes de la classe NSAppleEventDescriptor vous permettant de déterminer le type du descripteur ; pour le moment, nous allons considérer qu’il peut s’agir soit d’une liste, soit d’une chaîne de caractères.

Editer votre fichier AppleScriptTest.java, et modifier la variable script de la façon suivante :

String script = "tell application \"Finder\" \n"
    + " get the name of every item "
    + " in the desktop \n" + "end tell";

Editer les lignes après la méthode execute(). Nous ne sommes plus intéressés par la valeur du descripteur. Au lieu de cela, nous voulons accéder aux sous-descripteurs. Ils sont accessibles par la méthode descriptorAtIndex(). Vous pouvez déterminer le nombre de sous-descripteurs en utilisant numberOfItems(). Notez que les descripteurs sont indexés en commençant par 1, et non pas 0 comme les programmeurs Java en ont l’habitude. En utilisant ces deux méthodes, nous pouvons itérer tous les sous-descripteurs et afficher la liste de tous les éléments du bureau. Votre méthode main au complet devrait maintenant ressembler à :

String script = "tell application \"Finder\" \n"
    + " get the name of every item "
    + " in the desktop \n" + "end tell";

// Ceci crée un nouvel objet AppleScript
// pour exécuter le script
NSAppleScript myScript = new NSAppleScript(script);

// Le dictionnaire contient toute erreur
//qui pourrait survenir lors de l'exécution du script
NSMutableDictionary errors =  new NSMutableDictionary();

// Execute le script !
NSAppleEventDescriptor results =  myScript.execute(errors);

// Affiche tout ce qui se trouve sur votre bureau
System.out.println("Starting list of items "
                   + "on the desktop: ");

int numberOfDesktopItems = results.numberOfItems();
for(int i = 1; i <= numberOfDesktopItems; i++)
{
    NSAppleEventDescriptor subDescriptor = results.descriptorAtIndex(i);
    System.out.println("    " +
                      subDescriptor.stringValue());
}

System.out.println("Yay AppleScript!");

Voici les résultats pour mon bureau :


Le programme énumère tous les éléments de mon bureau.

Comme vous pouvez le voir, pour les scripts retournant une liste d’éléments, ces éléments sont contenus dans des sous-descripteurs appartenant au descripteur du résultat. En fonction de la complexité du script, les descripteurs peuvent se retrouver sur plusieurs sous-niveaux.

Maintenant vous devriez pouvoir apprécier le potentiel de la combinaison AppleScript et Java. AppleScript vous offre la possibilité fantastique de pouvoir interagir avec vos applications d’une manière inimaginable en utilisant seulement Java, et Java vous donne toute la puissance d’un langage de programmation complet.

Utilisés ensemble, vous pouvez faire de votre Mac une sorte de centre de commande, et utiliser Java pour y accéder depuis n’importe où. Pensez comment vous pourriez éditer votre agenda iCal depuis votre bureau, ou contrôler iTunes depuis une autre pièce de votre maison. Pratiquement tout ce que vous pouvez faire sur votre Mac, vous pouvez maintenant le faire depuis n’importe où.

Textes originaux en anglais sur O’Reilly : Controlling Your Mac with AppleScript and Java par Scott D.W. Rankin

opoppon Les langages de scripting , ,

  1. Pas encore de commentaire
  1. Pas encore de trackbacks
Vous devez être identifié pour poster un commentaire