Team Platform webszolgáltatás példák

Vissza az előző oldalra.

Áttekintés

Ezek a példák három szolgáltatási felületet tartalmaznak, a megvalósításukat, egy szolgáltatási felület gyárat, egy ügyfélprogramot a szolgáltatások végrehajtásához és egy plugin.xml fájlt, amely regisztrálja a szolgáltatásokat.

Ennek a kiszolgálón való futtatásához szüksége lesz a java fájlok összeállított változatára (kivéve az ExampleClient fájlt) és a jelenleg futó csapat szervlet osztályútvonalában található plugin.xml fájlra. Az ExampleClient ügyfélként fut.

IExampleService.java

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

/**
 * Minta RPC szolgáltatás, amely egyszerű integrálszámítási matematikai műveleteket hajt végre.
 */
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);
}

IExampleService.java

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

/**
 * Az IExampleService megvalósítása.
 */
public class ExampleService implements IExampleService {

	// a metódusok megvalósítása a jellemző módon
	
	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élda tartalomszolgáltatás.
 * Vegye figyelembe, hogy általában nem kell metódusokat hozzáadni a felülethez,
 * de lehet, hogy el kíván majd helyezni néhány megosztott állandót.
 */
public interface IExampleContentService extends ITeamContentService {
}

IExampleContentService.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;

/**
 * Az IExampleContentServer megvalósítása.
 */
public class ExampleContentService implements IExampleContentService {
	
	// megszámolja a szolgáltatás hívásainak számát.
	static private int counter = 0;
	
	/**
	 * Ez a metódus az uri által meghatározott tartalmat adja vissza.  
	 * Ez a kiszolgálóról az ügyfélre való adatátvitelre használható.
	 */
	public TeamContent get(String uri) throws IOException {
		
		// az IExampleService egy példányának beszerzése
		IExampleService exampleService = (IExampleService) ITeamServiceContext.Current.getPeerService(IExampleService.class);
		
		// ezzel a szolgáltatással frissítse a számlálót
		counter = exampleService.add(counter, 1);
		
		// hozzon létre HTML-t a visszaküldéshez
		String page = "<p>Kért uri: <code>'" + uri + "'</code>.\n";
		page += "<p>A szolgáltatást  " + counter + " alkalommal hívta meg" + (számláló == 1 ? "" : "") + ".\n";
		
		byte[] pageBytes = page.getBytes("UTF-8");
		
		// építse össze a visszaadni kívánt TeamContent objektumot
		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;
	}

	/**
	 * Ez a metódus a megadott tartalmat tárolja.  
	 * Ez az ügyfélről a kiszolgálóra való adatátvitelre használható.
	 */
	public void put(TeamContent teamContent) throws IOException {
		// semmit nem csinál, így nem küldhető adat az
		// ügyfélről a kiszolgálóra ezzel a felülettel
	}

}

IExampleRestService.java

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

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

/**
 * Példa REST szolgáltatás.
 * Vegye figyelembe, hogy általában nem kell metódusokat hozzáadni a felülethez,
 * de lehet, hogy el kíván majd helyezni néhány megosztott állandót.
 */
public interface IExampleRestService extends 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;

/**
 * Az IExampleRestService megvalósítása.
 * Megjegyzés: ez az osztály kiterjeszti a TeamRestService szolgáltatást, ami lehetővé teszi
 * bizonyos metódusok kezelését anélkül, hogy ellenőrizné a HTTP metódust a szolgáltatás metódusban.
 */
public class ExampleRestService extends TeamRestService implements IExampleRestService {

	// megszámolja a szolgáltatás hívásainak számát.
	static private int counter = 0;
	
	/**
	 * A GET metódus megvalósítása.
	 */
	public void perform_GET(String uri, ITeamServiceContext teamServiceContext) throws IOException {
		
		// az IExampleService egy példányának beszerzése
		IExampleService exampleService = (IExampleService) teamServiceContext.getPeerService(IExampleService.class);
		
		// ezzel a szolgáltatással frissítse a számlálót
		counter = exampleService.add(counter, 1);
		
		// a HTTP kérelem és válasz beszerzése a kontextusból
		HttpServletRequest  request  = teamServiceContext.getHttpServletRequest();
		HttpServletResponse response = teamServiceContext.getHttpServletResponse();
		
		// Író elhelyezése a kimeneti folyamra
		Writer writer = response.getWriter();
		
		// írjon HTML-kódot
		response.setContentType("text/html");
		writer.write("<p>A következőt kérte: '" + uri + "'.\n");
		writer.write("<p>A lekérdezési karakterlánc a következő volt: '" + request.getQueryString() + ".\n");
		writer.write("<p>A szolgáltatást " + counter + " alkalommal hívta meg" + (counter == 1 ? "" : "") + ".\n");
		writer.write("<p>A jelenlegi idő: " + 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;

/**
 * Ennek az osztálynak a fő metódusa ügyfélprogramként hív egyes szolgáltatásokat.
 */
public class ExampleClient {

	/**
	 * Másoljon egy bemeneti folyamot a System.out helyre 
	 */
	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------------------");
	}
	
	/**
	 * Az a metódus, amely minden szolgáltatáshívást elvégez 
	 */
	static public void main(String[] args) throws IOException {
		
		// hozzon létre új távoli konfigurációt, URL cím beállítása
		RemoteTeamServerConfiguration config = new RemoteTeamServerConfiguration();
		config.setURL("http://localhost:9080/jazz");

		// hozza létre a távoli csapatkiszolgálót, adjon hozzá szolgáltatásokat
		RemoteTeamServer server = RemoteTeamServer.create(config);
		server.addService(IExampleService.class, null);
		server.addService(IExampleContentService.class, null);
		server.addService(IExampleRestService.class, null);
		
		// szerezze be a szolgáltatás-megvalósítási objektumokat
		IExampleService        rpcService     = (IExampleService)        server.getServiceImplementation(IExampleService.class);
		IExampleContentService contentService = (IExampleContentService) server.getServiceImplementation(IExampleContentService.class);
		
		// megjegyzés: a megvalósítás ebben az esetben a felületet NEM valósítja meg;
		// a REST szolgáltatások ebben a tekintetben eltérőek
		ITeamRestServiceClient restService    = (ITeamRestServiceClient) server.getServiceImplementation(IExampleRestService.class);
		
		// egy RPC szolgáltatás hívása
		int result = rpcService.add(1, 2);
		System.out.println("\nÚgy tűnik, 1 + 2 = " + result + ".");
		
		// tartalomszolgáltatás hívása
		TeamContent teamContent = contentService.get("/something");
		InputStream iStream     = teamContent.getInputStream();
		System.out.println("\nA tartalomszolgáltatás tartalma :: /something:");
		try {
			copyToSystemOut(iStream);
		}
		// győződjön meg róla, hogy a TeamContent bemeneti folyam zárva van, vagy az
		// alapjául szolgáló szoftvercsatorna nem lesz zárva
		finally {
			if (null != iStream) iStream.close();
		}
		
		// egy REST szolgáltatás hívása
		HttpMethod method = restService.getGetMethod("/something-else");
		
		try {
			restService.executeMethod(method);
			
			System.out.println("\nA REST szolgáltatás tartalma :: /something-else:");
			copyToSystemOut(method.getResponseBodyAsStream());
		}
		// győződjön meg róla, hogy a metódus a releaseConnection() szolgáltatást hívja, vagy az
		// alapjául szolgáló szoftvercsatorna nem lesz zárva
		finally {
			method.releaseConnection();
		}
		
	}
	
}

TeamServiceInterfaceFactory.java

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

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

/**
 * Gyári osztály, amelyet a rendszer a szolgáltatások eclipse
 * beépülő modulokkal való regisztrációja során a szolgáltatásosztályok betöltésére használ.
 * Semmi különös, csak be kell tudnunk tölteni egy osztálypéldányt
 * adott névvel, a nyilvánvaló módon. Nem szükséges
 * semmi bonyolultabbat csinálni, bár szüksége lesz egy ilyenre
 * minden kiszolgálói beépülő modul jar fájljában.
 */
public class TeamServiceInterfaceFactory implements 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élda RPC szolgáltatás"
		/>
		
		<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élda tartalomszolgáltatás"
		/>
		
		<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élda REST szolgáltatás"
		/>
		
	</extension>
	
</plugin>
Vissza az előző oldalra.