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>