Příklady webové služby týmové platformy

Zpět na předchozí stránku.

Přehled

Tyto příklady obsahují tři rozhraní služby, jejich implementace, továrnu rozhraní služby, klientský program pro provádění služeb a plugin.xml, který může služby registrovat.

Chcete-li je spustit na serveru, budete muset zajistit, abyste měli kompilovanou verzi souborů java (kromě ExampleClient) a plugin.xml dostupný z cesty ke třídě aktuálně spuštěného týmového servletu. ExampleClient se spouští jako klient.

IExampleService.java

package com.ibm.team.core.services.examples;

/**
 * Příklad služby RPC, který může provádět jednoduché celočíselné matematické operace.
 */
veřejné rozhraní 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);
}

ExampleService.java

package com.ibm.team.core.services.examples;

/**
 * Implementace služby IExampleService.
 */
veřejná třída ExampleService implementuje IExampleService {

	// implementuje metodu typickým způsobem
	
	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; }

}

IExampleContentService.java

package com.ibm.team.core.services.examples;

import com.ibm.team.core.services.ITeamContentService;

/**
 * Příklad služby obsahu.
 * Pamatujte, že obvykle nebudete přidávat k tomuto rozhraní žádné metody,
 * ačkoli možná sem budete chtít umístit některé sdílené konstanty.
 */
veřejné rozhraní IExampleContentService rozšiřuje ITeamContentService {
}

ExampleContentService.java

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;

/**
 * Implementace IExampleContentServer.
 */
veřejná třída ExampleContentService implementuje IExampleContentService {
	
	// spočítejte počet vyvolání této služby.
	static private int counter = 0;
	
	/**
	 * Tato metoda vrací obsah specifikovaný pomocí identifikátoru URI.  
	 * Používá se k přenosu dat ze serveru klientovi.
	 */
	veřejný TeamContent get(String uri) vyvolá IOException {
		
		// získejte instanci služby IExampleService
		IExampleService exampleService = (IExampleService) ITeamServiceContext.Current.getPeerService(IExampleService.class);
		
		// použijte tuto službu k aktualizaci počítadla
		counter = exampleService.add(counter, 1);
		
		// zkonstruujte nějaké HTML k odeslání zpět
		String page = "<p>Požadovali jste uri: <code>'" + uri + "'</code>.\n";
		page += "<p>Vyvolali jste tuto službu " + counter + " krát" + (counter == 1 ? "" : "s") + ".\n";
		
		byte[] pageBytes = page.getBytes("UTF-8");
		
		// sestavte náš objekt TeamContent, který bude vrácen
		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;
	}

	/**
	 * Tato metoda ukládá specifikovaný obsah.  
	 * Používá se k přenosu dat od klienta na server.
	 */
	veřejný void put(TeamContent teamContent) vyvolá IOException {
		// nedělá nic, takže neexistuje způsob, jak odeslat data
		// od klienta na server pomocí tohoto rozhraní
	}

}

IExampleRestService.java

package com.ibm.team.core.services.examples;

import com.ibm.team.core.services.ITeamRestService;

/**
 * Příklad služby REST.
 * Pamatujte, že obvykle nebudete přidávat k tomuto rozhraní žádné metody,
 * ačkoli možná sem budete chtít umístit některé sdílené konstanty.
 */
veřejné rozhraní IExampleRestService rozšiřuje ITeamRestService {
}

ExampleRestService.java

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;

/**
 * Implementace IExampleRestService.
 * Pamatujte, že tato třída rozšiřuje TeamRestService tím, že poskytuje způsob, jak zpracovat
 * specifické metody bez kontroly metody HTTP v metodě služby.
 */
veřejná třída ExampleRestService rozšiřuje TeamRestService implementuje IExampleRestService {

	// spočítejte počet vyvolání této služby.
	static private int counter = 0;
	
	/**
	 * Implementace metody GET.
	 */
	veřejný void perform_GET(String uri, ITeamServiceContext teamServiceContext) vyvolá IOException {
		
		// získejte instanci služby IExampleService
		IExampleService exampleService = (IExampleService) teamServiceContext.getPeerService(IExampleService.class);
		
		// použijte tuto službu k aktualizaci počítadla
		counter = exampleService.add(counter, 1);
		
		// získejte požadavek HTTP a odpověď od kontextu
		HttpServletRequest  request  = teamServiceContext.getHttpServletRequest();
		HttpServletResponse response = teamServiceContext.getHttpServletResponse();
		
		// získejte zapisovač na výstupním proudu
		Writer writer = response.getWriter();
		
		// zapište nějaké HTML
		response.setContentType("text/html");
		writer.write("<p>Požadovali jste: '" + uri + "'.\n");
		writer.write("<p>Řetězec dotazu byl: '" + request.getQueryString() + ".\n");
		writer.write("<p>Vyvolali jste tuto službu " + counter + " krát" + (counter == 1 ? "" : "s") + ".\n");
		writer.write("<p>Aktuální čas je " + new Date() + ".\n");
	}

}

ExampleClient.java

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;

/**
 * Hlavní metoda této třídy volá některé služby jako klient.
 */
public class ExampleClient {

	/**
	 * Zkopírujte vstupní proud do System.out 
	 */
	statický soukromý void copyToSystemOut(InputStream iStream) vyvolá 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------------------");
	}
	
	/**
	 * Metoda, která provádí všechna volání služby. 
	 */
	statický veřejný void main(String[] args) vyvolá IOException {
		
		// vytvořte novou vzdálenou konfiguraci, nastavující adresu URL
		RemoteTeamServerConfiguration config = new RemoteTeamServerConfiguration();
		config.setURL("http://localhost:9080/jazz");

		// vytvořte vzdálený server týmu, přidejte některé služby
		RemoteTeamServer server = RemoteTeamServer.create(config);
		server.addService(IExampleService.class, null);
		server.addService(IExampleContentService.class, null);
		server.addService(IExampleRestService.class, null);
		
		// získejte objekty implementace služby
		IExampleService        rpcService     = (IExampleService)        server.getServiceImplementation(IExampleService.class);
		IExampleContentService contentService = (IExampleContentService) server.getServiceImplementation(IExampleContentService.class);
		
		// pamatujte, že implementace v tomto případě NEIMPLEMENTUJE rozhraní;
		// služby REST se tímto způsobem liší
		ITeamRestServiceClient restService    = (ITeamRestServiceClient) server.getServiceImplementation(IExampleRestService.class);
		
		// vyvolejte službu RPC
		int result = rpcService.add(1, 2);
		System.out.println("\nNakonec vychází 1 + 2 = " + result + ".");
		
		// vyvolejte službu obsahu
		TeamContent teamContent = contentService.get("/něco");
		InputStream iStream     = teamContent.getInputStream();
		System.out.println("\nObsah ze služby obsahu :: /něco:");
		try {
			copyToSystemOut(iStream);
		}
		// zkontrolujte, zda je vstupní proud TeamContent zavřený, nebo
		// nebude základní soket zavřen
		finally {
			if (null != iStream) iStream.close();
		}
		
		// vyvolejte službu REST
		HttpMethod method = restService.getGetMethod("/něco jiného");
		
		try {
			restService.executeMethod(method);
			
			System.out.println("\nObsah ze služby REST :: /něco jiného:");
			copyToSystemOut(method.getResponseBodyAsStream());
		}
		// zkontrolujte, zda metoda volá releaseConneciton(), nebo
		// nebude základní soket zavřen
		finally {
			method.releaseConnection();
		}
		
	}
	
}

TeamServiceInterfaceFactory.java

package com.ibm.team.core.services.examples;

import com.ibm.team.core.services.registry.ITeamServiceInterfaceFactory;

/**
 * Třída továrny použitá během registrace služeb prostřednictvím modulů plug-in
 * eclipse k načtení instancí vašich tříd služeb.
 * Není zde nic fantastického, prostě potřebujeme být schopni načíst instanci
 * třídy s daným názvem obvyklým způsobem. Není zapotřebí
 * dělat nic propracovanějšího, ačkoli budete potřebovat jednu z nich
 * v každém ze svých souborů jar modulu plug-in serveru.
 */
veřejná třída TeamServiceInterfaceFactory implementuje ITeamServiceInterfaceFactory {

	public Class getServiceInterface(String interfaceClassName) {
		try {
			return Class.forName(interfaceClassName);
		} 
		
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		return null;
	}

}

plugin.xml

<?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                  = "Příklad služby 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                  = "Příklad služby obsahu"
		/>
		
		<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                  = "Příklad služby REST"
		/>
		
	</extension>
	
</plugin>
Zpět na předchozí stránku.