Questi esempi includono tre interfacce di servizi, le loro implementazioni, una factory della interfaccia del servizio, un programma del client per le esercitazioni con i servizi e un plugin.xml che può registrare i servizi.
Per eseguire queste operazioni sul server, sarà necessario avere la versione compilata dei file java (ad eccezione di ExampleClient) e plugin.xml disponibile dal percorso classi del servlet team in esecuzione. ExampleClient viene eseguito come client.
package com.ibm.team.core.services.examples;
/**
* Servizio RPC di esempio che può eseguire delle semplici operazioni di matematica integrali.
*/
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;
/**
* Implementazione di IExampleService.
*/
public class ExampleService implements IExampleService {
// implementare i metodi nella modalità tipica
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;
/**
* Esempio di servizio del contenuto.
* Da notare che normalmente non si aggiungono metodi a questa interfaccia,
* tuttavia è consigliabile immettere qui delle costanti condivise.
*/
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;
/**
* Implementazione di IExampleContentServer.
*/
public class ExampleContentService implements IExampleContentService {
// contare le volte che questo servizio è stato chiamato.
static private int counter = 0;
/**
* Questo metodo restituisce il contenuto specificato dall'URI.
* Viene utilizzato per trasferire i dati dal server al client.
*/
public TeamContent get(String uri) throws IOException {
// ottenere un'istanza di IExampleService
IExampleService exampleService = (IExampleService) ITeamServiceContext.Current.getPeerService(IExampleService.class);
// utilizzare tale servizio per aggiornare il contatore
counter = exampleService.add(counter, 1);
// creare HTML da restituire
String page = "<p>È stato richiesto l'URI: <code>'" + uri + "'</code>.\n";
page += "<p>Questo servizio è stato chiamato " + counter + " time" + (counter == 1 ? "" : "s") + ".\n";
byte[] pageBytes = page.getBytes("UTF-8");
// creare l'oggetto TeamContent da restituire
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;
}
/**
* Questo metodo archivia il contenuto specificato.
* Viene utilizzato per trasferire i dati dal client al server.
*/
public void put(TeamContent teamContent) throws IOException {
// non esegue nulla, pertanto non vi è modo di inviare dati dal
// client al server con questa interfaccia
}
}
package com.ibm.team.core.services.examples;
import com.ibm.team.core.services.ITeamRestService;
/**
* Esempio di servizio REST.
* Da notare che normalmente non si aggiungono metodi a questa interfaccia,
* tuttavia è consigliabile immettere qui delle costanti condivise.
*/
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;
/**
* Implementazione di IExampleRestService.
* Da notare che questa classe estende TeamRestService che fornisce una modalità di gestione
* di metodi specifici senza controllare il metodo HTTP nel metodo del servizio.
*/
public class ExampleRestService extends TeamRestService implements IExampleRestService {
// contare le volte che questo servizio è stato chiamato.
static private int counter = 0;
/**
* Implementazione del metodo GET.
*/
public void perform_GET(String uri, ITeamServiceContext teamServiceContext) throws IOException {
// ottenere un'istanza di IExampleService
IExampleService exampleService = (IExampleService) teamServiceContext.getPeerService(IExampleService.class);
// utilizzare tale servizio per aggiornare il contatore
counter = exampleService.add(counter, 1);
// ottenere la richiesta e la risposta HTTP dal contesto
HttpServletRequest request = teamServiceContext.getHttpServletRequest();
HttpServletResponse response = teamServiceContext.getHttpServletResponse();
// ottenere un programma di utilità di scrittura sullo stream di output
Writer writer = response.getWriter();
// scrivere del codice HTML
response.setContentType("text/html");
writer.write("<p>È stato richiesto: '" + uri + "'.\n");
writer.write("<p>La stringa della query era: '" + request.getQueryString() + ".\n");
writer.write("<p>Questo servizio è stato chiamato " + counter + " time" + (counter == 1 ? "" : "s") + ".\n");
writer.write("<p>L'ora corrente è " + 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;
/**
* Il metodo principale di questa classe chiama alcuni servizi come client.
*/
public class ExampleClient {
/**
* Copiare uno stream di input in 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------------------");
}
/**
* Il metodo che esegue tutte le chiamate di servizio.
*/
static public void main(String[] args) throws IOException {
// creare una nuova configurazione remota, impostando l'URL
RemoteTeamServerConfiguration config = new RemoteTeamServerConfiguration();
config.setURL("http://localhost:9080/jazz");
// creare il server team remoto, aggiungere alcuni servizi
RemoteTeamServer server = RemoteTeamServer.create(config);
server.addService(IExampleService.class, null);
server.addService(IExampleContentService.class, null);
server.addService(IExampleRestService.class, null);
// ottenere gli oggetti di implementazione del servizio
IExampleService rpcService = (IExampleService) server.getServiceImplementation(IExampleService.class);
IExampleContentService contentService = (IExampleContentService) server.getServiceImplementation(IExampleContentService.class);
// Da notare che l'implementazione in questo caso NON implementa la interfaccia;
// I servizi REST differiscono nel seguente modo
ITeamRestServiceClient restService = (ITeamRestServiceClient) server.getServiceImplementation(IExampleRestService.class);
// chiamare un servizio RPC
int result = rpcService.add(1, 2);
System.out.println("\nTurns out, 1 + 2 = " + result + ", after all.");
// chiamare un servizio del contenuto
TeamContent teamContent = contentService.get("/something");
InputStream iStream = teamContent.getInputStream();
System.out.println("\nContenuto dal servizio del contenuto :: /something:");
try {
copyToSystemOut(iStream);
}
// assicurarsi che lo stream di input TeamContent sia chiuso, altrimenti
// il socket sottostante non verrà chiuso
finally {
if (null != iStream) iStream.close();
}
// chiamare un servizio REST
HttpMethod method = restService.getGetMethod("/something-else");
try {
restService.executeMethod(method);
System.out.println("\nContenuto dal servizio REST :: /something-else:");
copyToSystemOut(method.getResponseBodyAsStream());
}
// accertarsi che il metodo chiami releaseConneciton(), altrimenti
// il socket sottostante non verrà chiuso
finally {
method.releaseConnection();
}
}
}
package com.ibm.team.core.services.examples;
import com.ibm.team.core.services.registry.ITeamServiceInterfaceFactory;
/**
* Una classe factory utilizzata durante la registrazione dei servizi mediante i plug-in
* di eclipse per caricare le istanze delle classi di servizio.
* Niente di particolare qui, occorre semplicemente poter caricare un'istanza
* di Class con un dato nome, nella maniera ovvia. Non occorre
* eseguire nulla di più elaborato, tuttavia occorrerà una di queste classi
* in ognuno dei jar dei plug-in del server.
*/
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"?> <plugin id = "com.ibm.team.core.services.examples" nome = "com.ibm.team.core.services.examples" versione = "1.0.0" nome provider = "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" nome = "Servizio RPC di esempio" /> <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" nome = "Servizio del contenuto di esempio" /> <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" nome = "Servizio REST di esempio" /> </extension> </plugin>