Estos ejemplos incluyen tres interfaces de servicio, sus implementaciones, una fábrica de interfaces de servicio, un programa cliente para ejecutar los servicios y un plugin.xml que puede registrar los servicios.
Para ejecutar esto en el servidor, será necesario contar con la versión compilada de los archivos Java (excepto ExampleClient) y disponer del plugin.xml de la vía de acceso de clases del servlet de equipo actualmente en ejecución. ExampleClient se ejecuta como un cliente.
package com.ibm.team.core.services.examples; /** * Servicio RPC de ejemplo que puede realizar operaciones matemáticas de integrales 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; /** * Implementación de IExampleService. */ la clase pública ExampleService implementa IExampleService { // implemente los métodos de la forma típica 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; /** * Servicio de contenido de ejemplo. * Tenga en cuenta que, generalmente, no se añadirán métodos a esta interfaz,, * aunque tal vez se desee colocar aquí algunas constantes compartidas. */ interfaz pública 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; /** * Implementación de IExampleContentServer. */ la clase pública ExampleContentService implementa IExampleContentService { // recuento del número de veces que se ha llamado a este servicio. static private int counter = 0; /** * Este método devuelve el contenido especificado por el URI. * Esto se utiliza para transferir datos del servidor al cliente. */ public TeamContent get(String uri) throws IOException { // obtenga una instancia de IExampleService IExampleService exampleService = (IExampleService) ITeamServiceContext.Current.getPeerService(IExampleService.class); // utilice ese servicio para actualizar el contador counter = exampleService.add(counter, 1); // consruya HTML para enviar como respuesta String page = "<p>El URI solicitado: <code>'" + uri + "'</code>.\n"; page += "<p>Ha llamado a este servicio " + counter + " time" + (counter == 1 ? "" : "s") + ".\n"; byte[] pageBytes = page.getBytes("UTF-8"); // compilar nuestro objeto TeamContent para devolver 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; } /** * Este método almacena el contenido especificado. * Esto se utiliza para transferir datos del cliente al servidor. */ public void put(TeamContent teamContent) throws IOException { // no hace nada, por lo que no hay forma de enviar datos del // cliente al servidor mediante esta interfaz. } }
package com.ibm.team.core.services.examples; import com.ibm.team.core.services.ITeamRestService; /** * Servicio de contenido REST. * Tenga en cuenta que, generalmente, no se añadirán métodos a esta interfaz,, * aunque tal vez se desee colocar aquí algunas constantes compartidas. */ 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; /** * Implementación de IExampleRestService. * Tenga en cuenta que esta clase amplía TeamRestService, lo que proporciona un modo de controlar * métodos específicos sin seleccionar el método HTTP en el método de servicio. */ public class ExampleRestService extends TeamRestService implements IExampleRestService { // recuento del número de veces que se ha llamado a este servicio. static private int counter = 0; /** * Implementación del método GET. */ public void perform_GET(String uri, ITeamServiceContext teamServiceContext) throws IOException { // obtenga una instancia de IExampleService IExampleService exampleService = (IExampleService) teamServiceContext.getPeerService(IExampleService.class); // utilice ese servicio para actualizar el contador counter = exampleService.add(counter, 1); // obtenga la solicitud HTTP y la respuesta del contexto HttpServletRequest request = teamServiceContext.getHttpServletRequest(); HttpServletResponse response = teamServiceContext.getHttpServletResponse(); // obtenga un Grabador en la corriente de salida Writer writer = response.getWriter(); // escriba código HTML response.setContentType("text/html"); writer.write("<p>Su URI solicitado: '" + uri + "'.\n"); writer.write("<p>La serie de consulta era: '" + request.getQueryString() + ".\n"); writer.write("<p>Ha llamado a este servicio " + counter + " time" + (counter == 1 ? "" : "s") + ".\n"); writer.write("<p>La hora actual es " + 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; /** * El método principal de esta clase llama a algunos servicios como cliente. */ public class ExampleClient { /** * Copie una corriente de entrada en 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étodo que realiza todas las llamadas de servicio. */ static public void main(String[] args) throws IOException { // crea una nueva configuración remota definiendo el URL RemoteTeamServerConfiguration config = new RemoteTeamServerConfiguration(); config.setURL("http://localhost:9080/jazz"); // cree el servidor de equipo remoto, añada algunos servicios RemoteTeamServer server = RemoteTeamServer.create(config); server.addService(IExampleService.class, null); server.addService(IExampleContentService.class, null); server.addService(IExampleRestService.class, null); // obtenga los objetos de implementación del servicio IExampleService rpcService = (IExampleService) server.getServiceImplementation(IExampleService.class); IExampleContentService contentService = (IExampleContentService) server.getServiceImplementation(IExampleContentService.class); // tenga en cuenta que, en este caso, la implementación NO implementa la interfaz; // los servicios REST difieren de este modo. ITeamRestServiceClient restService = (ITeamRestServiceClient) server.getServiceImplementation(IExampleRestService.class); // llame a un servicio RPC int result = rpcService.add(1, 2); System.out.println("\nTurns out, 1 + 2 = " + result + ", after all."); // llame a un servicio de contenido TeamContent teamContent = contentService.get("/something"); InputStream iStream = teamContent.getInputStream(); System.out.println("\nContenido del servicio de contenido :: /algo:"); pruebe { copyToSystemOut(iStream); } // asegúrese de que la corriente de entrada de TeamContent está cerrada o el // socket subyacente no se cerrará. finalmente { if (null != iStream) iStream.close(); } // llame a un servicio REST HttpMethod method = restService.getGetMethod("/algo_distinto"); pruebe { restService.executeMethod(method); System.out.println("\nContenido del servicio REST :: /algo_distinto:"); copyToSystemOut(method.getResponseBodyAsStream()); } // asegúrese de que el método llama a releaseConneciton() o el // socket subyacente no se cerrará. finalmente { method.releaseConnection(); } } }
package com.ibm.team.core.services.examples; import com.ibm.team.core.services.registry.ITeamServiceInterfaceFactory; /** * Una clase de fábrica utilizada durante el registro de servicios mediante los plugins * de eclipse para cargar instancias de sus clases de servicio. * Nada muy elaborado, solo necesitamos poder cargar una instancia * de Class con un nombre determinado, de la forma obvia. No es * necesario hacer nada más elaborado, aunque necesitará uno de estos * en cada uno de sus archivos jar de plugin de servidor. */ la clase pública TeamServiceInterfaceFactory implementa ITeamServiceInterfaceFactory { public Class getServiceInterface(String interfaceClassName) { pruebe { return Class.forName(interfaceClassName); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }
<?xml version="1.0" encoding="utf-8"?> <?eclipse version="3.0"?> <plugin 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 = "Example RPC Service" /> <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 = "Example Content Service" /> <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 = "Example REST Service" /> </extension> </plugin>