Эти примеры включают в себя три интерфейса службы и их реализации: фабрика интерфейса службы, клиентская программа непрерывной диагностики служб и plugin.xml, который может регистрировать службы.
Для выполнения примеров на сервере необходимо иметь скомпилированную версию файлов java (за исключением ExampleClient) и plugin.xml, доступный через classpath выполняемого в данный момент сервлета team. ExampleClient выполняется как клиент.
package com.ibm.team.core.services.examples; /** * Пример службы RPC, которая может выполнять элементарные математические операции. */ 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; /** * Реализация IExampleService. */ public class ExampleService implements IExampleService { // реализация методов в типичном представлении 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; /** * Пример службы содержимого. * Следует обратить внимание, что обычно методы к данному интерфейсу не добавляются, * хотя здесь можно разместить некоторые общие константы. */ 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; /** * Реализация IExampleContentServer. */ public class ExampleContentService implements IExampleContentService { // Количество вызовов службы. static private int counter = 0; /** * Этот метод возвращает содержимое, указанное в uri. * Используется для передачи данных от сервера к клиенту. */ public TeamContent get(String uri) throws IOException { // получить экземпляр IExampleService IExampleService exampleService = (IExampleService) ITeamServiceContext.Current.getPeerService(IExampleService.class); // служба обновления счетчика counter = exampleService.add(counter, 1); // создает HTML для отправки обратно String page = "<p>Запрошенный uri: <code>'" + uri + "'</code>.\n"; page += "<p>Служба вызывалась " + counter + " раз" + (counter == 1 ? "" : "s") + ".\n"; byte[] pageBytes = page.getBytes("UTF-8"); // построение своего объекта TeamContent, который будет возвращен 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; } /** * Этот метод сохраняет указанное содержимое. * Используется для передачи данных от клиента к серверу. */ public void put(TeamContent teamContent) throws IOException { // ничего не выполняется, нет способа отправки данных от клиента // к серверу с помощью этого интерфейса } }
package com.ibm.team.core.services.examples; import com.ibm.team.core.services.ITeamRestService; /** * Пример службы REST. * Следует обратить внимание, что обычно методы к данному интерфейсу не добавляются, * хотя здесь можно разместить некоторые общие константы. */ 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; /** * Реализация IExampleRestService. * Следует заметить, что этот класс расширяет TeamRestService, предоставляя возможность * обработки конкретных методов без проверки метода HTTP в методе службы. */ public class ExampleRestService extends TeamRestService implements IExampleRestService { // Количество вызовов службы. static private int counter = 0; /** * Реализация метода GET. */ public void perform_GET(String uri, ITeamServiceContext teamServiceContext) throws IOException { // получить экземпляр IExampleService IExampleService exampleService = (IExampleService) teamServiceContext.getPeerService(IExampleService.class); // служба обновления счетчика counter = exampleService.add(counter, 1); // получение HTTP запроса и ответа HttpServletRequest request = teamServiceContext.getHttpServletRequest(); HttpServletResponse response = teamServiceContext.getHttpServletResponse(); // получение Writer для потока вывода Writer writer = response.getWriter(); // запись кода HTML response.setContentType("text/html"); writer.write("<p>Запрошено: '" + uri + "'.\n"); writer.write("<p>Строка запроса: '" + request.getQueryString() + ".\n"); writer.write("<p>Служба вызывалась " + counter + " раз" + (counter == 1 ? "" : "s") + ".\n"); writer.write("<p>Текущее время " + 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; /** * Основной метод этого класса. Вызывает некоторые службы как клиент. */ public class ExampleClient { /** * Копирование входного поток в 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------------------"); } /** * Метод, который вызывает все службы. */ static public void main(String[] args) throws IOException { // создает новую удаленную конфигурацию, задавая URL RemoteTeamServerConfiguration config = new RemoteTeamServerConfiguration(); config.setURL("http://localhost:9080/jazz"); // создает удаленный Team Server, добавляя некоторые службы RemoteTeamServer server = RemoteTeamServer.create(config); server.addService(IExampleService.class, null); server.addService(IExampleContentService.class, null); server.addService(IExampleRestService.class, null); // получение объектов реализации службы IExampleService rpcService = (IExampleService) server.getServiceImplementation(IExampleService.class); IExampleContentService contentService = (IExampleContentService) server.getServiceImplementation(IExampleContentService.class); // реализация в данном случае не реализует интерфейс; // службы REST различаются таким образом ITeamRestServiceClient restService = (ITeamRestServiceClient) server.getServiceImplementation(IExampleRestService.class); // вызов службы RPC int result = rpcService.add(1, 2); System.out.println("\nОказывается, что 1 + 2 = " + result + ", в результате."); // вызов службы содержимого TeamContent teamContent = contentService.get("/нечто"); InputStream iStream = teamContent.getInputStream(); System.out.println("\nСодержимое из службы содержимого :: /нечто:"); try { copyToSystemOut(iStream); } // необходимо убедиться, что поток ввода TeamContent закрыт, // иначе основной сокет не будет закрыт finally { if (null != iStream) iStream.close(); } // вызов службы REST HttpMethod method = restService.getGetMethod("/нечто-другое"); try { restService.executeMethod(method); System.out.println("\nСодержимое из службы REST :: /нечто-другое:"); copyToSystemOut(method.getResponseBodyAsStream()); } // необходимо вызвать releaseConneciton(), // иначе основной сокет не будет закрыт finally { method.releaseConnection(); } } }
package com.ibm.team.core.services.examples; import com.ibm.team.core.services.registry.ITeamServiceInterfaceFactory; /** * Класс фабрики используется при регистрации службы через модули * eclipse для загрузки экземпляров классов пользовательской службы. * Необходимо иметь возможность загрузить экземпляры класса с данным * именем. Нет необходимости делать что-либо более детально, * несмотря на то, что будет необходим один из них в каждом jar модуле * сервера. */ 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" 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 = "Пример службы 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 = "Пример службы содержимого" /> <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 = "Пример службы REST" /> </extension> </plugin>