Ces exemples incluent trois interfaces de service, leurs implémentations, une fabrique d'interface de service, un programme client pour mettre en oeuvre les services et un fichier plugin.xml qui peut les enregistrer.
Pour une exécution sur le serveur, vous devez disposer de la version compilée des fichiers java (excepté ExampleClient) et le fichier plugin.xml doit être disponible dans le chemin de classe du servlet d'équipe en cours d'exécution. ExampleClient s'exécute en tant que client.
package com.ibm.team.core.services.examples; /** * Exemple de service RPC pouvant effectuer des opérations mathématiques intégrales simples. */ public interface IExampleService { public int add(int x, int y); public int sub(int x, int y); public int mul(int x, int y); public int div(int x, int y); }
package com.ibm.team.core.services.examples; /** * Implémentation de IExampleService. */ public class ExampleService implements IExampleService { // implémente les méthodes de manière standard public int add(int x, int y) { return x + y; } public int sub(int x, int y) { return x - y; } public int mul(int x, int y) { return x * y; } public int div(int x, int y) { return x / y; } }
package com.ibm.team.core.services.examples; import com.ibm.team.core.services.ITeamContentService; /** * Exemple de service de contenu. * Notez que normalement vous n'ajouterez pas de méthodes à cette interface, * bien que vous puissiez souhaiter y placer des constantes partagées. */ public interface IExampleContentService extends ITeamContentService { }
package com.ibm.team.core.services.examples; import java.io.ByteArrayInputStream; import java.io.IOException; import java.sql.Timestamp; import com.ibm.team.core.services.ITeamServiceContext; import com.ibm.team.core.services.TeamContent; /** * Implémentation de IExampleContentServer. */ public class ExampleContentService implements IExampleContentService { // compte le nombre de fois que le service a été appelé. static private int counter = 0; /** * Cette méthode renvoie le contenu indiqué par l'uri. * Elle est utilisée pour transférer des données du serveur au client. */ public TeamContent get(String uri) throws IOException { // obtient une instance de IExampleService IExampleService exampleService = (IExampleService) ITeamServiceContext.Current.getPeerService(IExampleService.class); // utilise le service pour mettre à jour le compteur counter = exampleService.add(counter, 1); // construit un contenu HTML à renvoyer String page = "<p>Vous avez demandé l'URI : <code>'" + uri + "'</code>.\n"; page += "<p>Vous avez appelé ce service " + counter + " time" + (counter == 1 ? "" : "s") + ".\n"; byte[] pageBytes = page.getBytes("UTF-8"); // générer l'objet TeamContent à renvoyer TeamContent teamContent = new TeamContent(); teamContent.setContentType("text/html;; charset=utf-8"); teamContent.setLastModified(new Timestamp(System.currentTimeMillis())); teamContent.setInputStream(new ByteArrayInputStream(pageBytes)); teamContent.setSize(pageBytes.length); return teamContent; } /** * Cette méthode stocke le contenu spécifié. * Elle est utilisée pour transférer des données du client au serveur. */ public void put(TeamContent teamContent) throws IOException { // ne fait rien, aussi n'y a-t-il aucun moyen d'envoyer les données du // client au serveur avec cette interface } }
package com.ibm.team.core.services.examples; import com.ibm.team.core.services.ITeamRestService; /** * Exemple de service REST. * Notez que normalement vous n'ajouterez pas de méthodes à cette interface, * bien que vous puissiez souhaiter y placer des constantes partagées. */ public interface IExampleRestService extends ITeamRestService { }
package com.ibm.team.core.services.examples; import java.util.Date; import java.io.IOException; import java.io.Writer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.ibm.team.core.services.ITeamServiceContext; import com.ibm.team.core.services.TeamRestService; /** * Implémentation de IExampleRestService. * Notez que cette classe étend TeamRestService, fournissant ainsi un moyen de gérer * des méthodes spécifiques sans vérifier la méthode HTTP dans la méthode de service. */ public class ExampleRestService extends TeamRestService implements IExampleRestService { // compte le nombre de fois que le service a été appelé. static private int counter = 0; /** * Implémentation de la méthode GET. */ public void perform_GET(String uri, ITeamServiceContext teamServiceContext) throws IOException { // obtient une instance de IExampleService IExampleService exampleService = (IExampleService) teamServiceContext.getPeerService(IExampleService.class); // utilise le service pour mettre à jour le compteur counter = exampleService.add(counter, 1); // obtient la demande HTTP et la réponse du contexte HttpServletRequest request = teamServiceContext.getHttpServletRequest(); HttpServletResponse response = teamServiceContext.getHttpServletResponse(); // obtient un programme d'écriture sur le flux de sortie Writer writer = response.getWriter(); // écrit un contenu HTML response.setContentType("text/html"); writer.write("<p>Vous avez demandé : '" + uri + "'.\n"); writer.write("<p>La chaîne de requête était : '" + request.getQueryString() + ".\n"); writer.write("<p>Vous avez appelé ce service " + counter + " time" + (counter == 1 ? "" : "s") + ".\n"); writer.write("<p>L'heure actuelle est " + new Date() + ".\n"); } }
package com.ibm.team.core.services.examples; import java.io.IOException; import java.io.InputStream; import org.apache.commons.httpclient.HttpMethod; import com.ibm.team.core.services.ITeamRestServiceClient; import com.ibm.team.core.services.RemoteTeamServer; import com.ibm.team.core.services.RemoteTeamServerConfiguration; import com.ibm.team.core.services.TeamContent; /** * La méthode main de cette classe appelle des services en tant que client. */ public class ExampleClient { /** * Copie un flux en entrée dans System.out */ static private void copyToSystemOut(InputStream iStream) throws IOException { System.out.println("------------------"); byte[] buffer = new byte[8192]; int read; while ((read=iStream.read(buffer)) > 0) { System.out.write(buffer,0,read); } System.out.println("\n------------------"); } /** * Méthode qui génère tous les appels de service. */ static public void main(String[] args) throws IOException { // crée une configuration distante, définissant l'URL RemoteTeamServerConfiguration config = new RemoteTeamServerConfiguration(); config.setURL("http://localhost:9080/jazz"); // crée le serveur d'équipe distant, ajoute des services RemoteTeamServer server = RemoteTeamServer.create(config); server.addService(IExampleService.class, null); server.addService(IExampleContentService.class, null); server.addService(IExampleRestService.class, null); // obtient les objets d'implémentation du service IExampleService rpcService = (IExampleService) server.getServiceImplementation(IExampleService.class); IExampleContentService contentService = (IExampleContentService) server.getServiceImplementation(IExampleContentService.class); // note l'implémentation, dans ce cas N'implémente PAS l'interface; // les services REST diffèrent de cette manière ITeamRestServiceClient restService = (ITeamRestServiceClient) server.getServiceImplementation(IExampleRestService.class); // appelle un service RPC int result = rpcService.add(1, 2); System.out.println("\nTurns out, 1 + 2 = " + result + ", after all."); // appelle un service de contenu TeamContent teamContent = contentService.get("/something"); InputStream iStream = teamContent.getInputStream(); System.out.println("\nContent from content service :: /something:"); try { copyToSystemOut(iStream); } // s'assure que le flot en entrée TeamContent est fermé ou // que le socket sous-jacent ne sera pas fermé finally { if (null != iStream) iStream.close(); } // appelle un service REST HttpMethod method = restService.getGetMethod("/something-else"); try { restService.executeMethod(method); System.out.println("\nContent from REST service :: /something-else:"); copyToSystemOut(method.getResponseBodyAsStream()); } // s'assure que la méthode appelle releaseConneciton() ou // que le socket sous-jacent ne sera pas fermé finally { method.releaseConnection(); } } }
package com.ibm.team.core.services.examples; import com.ibm.team.core.services.registry.ITeamServiceInterfaceFactory; /** * Classe de fabrique utilisée pendant l'enregistrement des services via les * plug-in eclipse pour charger des instances de vos classes de service. * Rien de particulier, il suffit simplement de pouvoir charger une instance * de classe avec un nom donné, de la manière habituelle. Il n'est pas nécessaire * de faire quelque chose de plus élaboré, mais vous aurez besoin de l'une d'elles * dans chacun des fichiers jar de plug-in de votre serveur. */ public class TeamServiceInterfaceFactory implements ITeamServiceInterfaceFactory { public Class getServiceInterface(String interfaceClassName) { try { return Class.forName(interfaceClassName); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }
<?xml version="1.0" encoding="utf-8"?> <?eclipse version="3.0"?> <plug-in id = "com.ibm.team.core.services.examples" name = "com.ibm.team.core.services.examples" version = "1.0.0" provider-name = "IBM"> <extension point="com.ibm.team.core.services.serviceProvider"> <service id = "com.ibm.team.core.services.examples.IExampleService" interfaceClass = "com.ibm.team.core.services.examples.IExampleService" implementationClass = "com.ibm.team.core.services.examples.ExampleService" interfaceFactoryClass = "com.ibm.team.core.services.examples.TeamServiceInterfaceFactory" name = "Exemple de service RPC" /> <service id = "com.ibm.team.core.services.examples.IExampleContentService" interfaceClass = "com.ibm.team.core.services.examples.IExampleContentService" implementationClass = "com.ibm.team.core.services.examples.ExampleContentService" interfaceFactoryClass = "com.ibm.team.core.services.examples.TeamServiceInterfaceFactory" name = "Exemple de service de contenu" /> <service id = "com.ibm.team.core.services.examples.IExampleRestService" interfaceClass = "com.ibm.team.core.services.examples.IExampleRestService" implementationClass = "com.ibm.team.core.services.examples.ExampleRestService" interfaceFactoryClass = "com.ibm.team.core.services.examples.TeamServiceInterfaceFactory" name = "Exemple de service REST" /> </extension> </plug-in>