Создание и развертывание простого Web Services Resource в IBM Lotus Expeditor

Узнайте, как создать простой Web Services Resource и как развернуть его в IBM Lotus Expeditor. В данной статье рассматривается пакет инструментальных средств WSRF Tools, использующийся для генерирования серверных и клиентских компонентов, а также объясняется, как разработать клиентское приложение, которое можно использовать для тестирования WS-Resource.

Сиванантхан Перумал, старший инженер-программист, IBM

Сиванантхан Перумал (Sivananthan Perumal) работает старшим инженером-программистом в IBM Software Labs India. Занимается разработкой Web-служб и смежных технологий более трех лет. Связаться с ним можно по адресу siva.perumal@in.ibm.com.



10.04.2007

Спецификации WSRF (Web Services Resource Framework - интегрированная среда ресурсов Web-служб) стандартизируют механизм доступа к ресурсу с сохранением состояния через Web-службы. IBM Lotus Expeditor содержит WSRF как функциональную возможность, обеспечивая предоставление OSGi-служб (Open Service Gateway initiative) в виде ресурсов. В данной статье рассматриваются концепции, лежащие в основе WSRF, и действия, необходимые для моделирования и предоставления простого ресурса с сохранением состояния, реализованного в виде OSGi-пакета, при помощи Web-служб. Демонстрируются также методы доступа к этому ресурсу с использованием стандартного набора шаблонов обмена сообщениями, определенных в спецификациях WSRF. Пример кода, используемый в данной статье, разработан для исполняющей среды OSGi, предоставляемой в IBM Lotus Expeditor Client for Desktop V6.1.0.

В данной статье вы узнаете, как:

  • Смоделировать простой ресурс с сохранением состояния.
  • Использовать Lotus Expeditor Toolkit для реализации компонентов на стороне провайдера WS-Resource.
  • Использовать Lotus Expeditor Toolkit для создания компонентов на стороне клиента WS-Resource.
  • Развернуть WS-Resource в Lotus Expeditor Client.
  • Разработать приложение для работы с WS-Resource.

Предполагается наличие у вас опыта работы с Java и базовых знаний Web-служб, XML и OSGi. Также для запуска примера приложений необходимы следующие системы, установленные в операционной системе Windows/Linux:

  • Java 1.4.2
  • Lotus Expeditor Client V6.1.0 (с функциональностью Web Services Resource Framework 6.1.0.0)
  • Eclipse 3.2.0 и Web Tools Project (WTP) 1.5.1
  • Lotus Expeditor Toolkit (с функциональностью Mobile Web Services 6.1.0)

WS-Resource в Lotus Expeditor

WS-Resource представляет собой комбинацию ресурса и Web-службы, через которую можно получить доступ к ресурсу. Lotus Expeditor Client for Desktop использует следующие стереотипы компонентов для реализации WS-Resource:

  • Ресурс
    OSGi-пакет (bundle), инкапсулирующий один или несколько сохраняющих состояние объектов OSGi-служб, которые должны предоставляться как WS-Resource. Эти объекты служб могут быть представлением бизнес-сущности, например, ShoppingCart или PrintJob, либо программным фасадом для физического ресурса, например, Printer. От вас ожидается предоставление реализации объекта службы в виде OSGi-пакета.
  • Web-служба
    OSGi-пакет, выступающий в роли фасада Web-службы для WS-Resource. Этот компонент предоставляет стандартные типы портов WSRF и пользовательские типы портов, как описано в WSDL (Web Services Description Language) WS-Resource. Можно использовать генераторы Mobile Web Services для генерирования всего пакета Web-службы для заданного описания ресурса.
  • Адаптер
    OSGi-пакет, выступающий в роли моста между пакетом Web-служб и пакетом ресурсов. Он направляет входящие сообщения Web-службы (по обоим типам портов - стандартным для WSRF и пользовательским) в экземпляр ресурса, указанный отправителем. Все ответы из ресурса (в том числе, исключительные ситуации) перенаправляются обратно через адаптер и пакет Web-службы отправителю в виде нормальных ответов или сообщений об ошибках. При генерировании пакета Web-служб генератор Mobile Web Services создает также пакет адаптера с заполнителями. Вы должны предоставить реализации, связывающие адаптер с экземплярами ресурса.
  • Клиентские заглушки (stubs)
    Java-архив, который может использоваться приложением для доступа и работы с WS-Resource. Этот компонент на стороне клиента (также называемый клиентскими заглушками Web-службы) транслирует вызовы Java API в SOAP-сообщения, которые подписываются на WSDL-файл, опубликованный WS-Resource. Вы можете использовать генераторы для создания этих клиентских заглушек.

Дополнительная информация находится в разделе "Разработка приложений для Lotus Expeditor" справочной системы Lotus Expeditor.


Установка и проверка корректности работы среды разработки (Lotus Expeditor Toolkit)

В качестве платформы разработки и тестирования компонентов провайдера и клиента WS-Resource используется Lotus Expeditor Toolkit с функциональностью Mobile Web Services.

Выполните следующие действия для установки среды разработки:

  1. Установите Eclipse 3.2.0 с Web Tools Project (WTP) 1.5.1.
  2. Установите Lotus Expeditor Toolkit.
  3. Перезапустите Eclipse.

ПРИМЕЧАНИЕ: Функциональная возможность Mobile Web Services 6.1.0 устанавливается как часть Lotus Expeditor Toolkit. Дополнительная информация находится в справочной системе Lotus Expeditor Toolkit.

Выполните следующие действия для тестирования корректности установки среды разработки:

  1. Запустите Eclipse.
  2. Выберите File - New - Other.
  3. В окне Select a wizard разверните Mobile Web Services.
  4. Убедитесь, что WS-Resource Client и WS-Resource Provider появляются как дочерние элементы Mobile Web Services.

Создание примера WS-Resource

В данном разделе мы представим метод и инструментальные средства, использующиеся для разработки простого WS-Resource, и протестируем его при помощи Lotus Expeditor Toolkit. Ссылку на исходный код полностью разработанного примера WS-Resource можно найти в разделе "Загрузка" в конце статьи. Для разработки всех компонентов WS-Resource с нуля выполните следующие действия:

  • Создайте модель проекта для примера WS-Resource.
  • Реализуйте пакет ресурсов для WS-Resource.
  • Используйте программы-генераторы для создания серверных компонентов.
  • Реализуйте логику для связывания компонента адаптера с компонентом ресурса.
  • Используйте программы-генераторы для создания клиентских компонентов.
  • Разработайте и выполните тестовое приложение.

В последующих разделах данной статьи рассматриваются действия по пакетированию и развертыванию WS-Resource в Lotus Expeditor Client for Desktop и компонента клиентского приложения для WS-Resource. Разработка защищенного WS-Resource и методов доступа к нему выходят за рамки данной статьи.

Моделирование примера WS-Resource

Для того чтобы сконцентрироваться на методе и инструментальных средствах, используемых для разработки WS-Resource, мы будем использовать очень простой объект данных, например, Address, и смоделируем его как WS-Resource. К свойствам ресурса относятся eMailID, preference и personDetails (см. рисунок 1). Обратите внимание на то, что PersonDetails и ContactInfo спроектированы как ресурсные свойства ресурса Address. Также для создания (и работы) нескольких экземпляров Address WS-Resource мы включили в модель проекта класс AddressFactory.

Рисунок 1. Ресурс Address - модель проекта
Рисунок 1. Ресурс Address - модель проекта

ПРИМЕЧАНИЕ: При моделировании вашего собственного WS-Resource просмотрите список поддерживаемых типов данных в разделе "Разработка приложений для Lotus Expeditor" справочной системы Lotus Expeditor.

Разработка пакета ресурса

Рассмотренная в предыдущем разделе модель проекта должна быть реализована в виде OSGi-пакета с использованием Lotus Expeditor Toolkit. Пакет ресурса разрабатывается в виде подключаемого модуля Eclipse при помощи мастера разработки подключаемых модулей Eclipse SDK 3.2.0 (или старше). Для этого в данном мастере при создании нового проекта подключаемого модуля в качестве стандарта выбирается OSGi Framework.

Ссылка на полный исходный код пакета ресурса указана в разделе "Загрузка". Обратите внимание на то, что ресурсные свойства ресурса Address были закодированы в виде методов get/set в AddressInterface:

Листинг 1. com.ibm.wsrf.sampleapp.address.service.AddressInterface

public interface AddressInterface {
public void setEmailId(String emailId);
public String getEmailId();
public boolean getStatus();
public void setStatus(boolean status);
public String getPreference();
public void setPreference(String pref) throws Exception;
public float getVersionNumber();
public void setVersionNumber(float VersionNumber);

public Date getValidUntil();
public void setValidUntil(Date ValidUntil);

public PersonDetails getPersonDetails();
public void setPersonDetails(PersonDetails pDetails);
public ContactInfo getContactInfo();

/*****************************************************
 * Методы службы 			  	 
*****************************************************/
public ContactDetails[] getContactDetails(int type) 
throws ContactDetailsNotFoundException, InvalidAddressTypeException;
public void addContactDetails(ContactDetails contactObj);
public void addDependents(String[] names);
}

Далее, при использовании генераторов Mobile Web Services, этот bean-подобный интерфейс используется для описания документа Resource Property WS-Resource.

AddressFactoryInterface используется компонентом адаптера либо для создания нового экземпляра ресурса Address, либо для поиска экземпляра Address:

Листинг 2. com.ibm.wsrf.sampleapp.address.service.AddressFactoryInterface

public interface AddressFactoryInterface {
	public String createAddress(String eMailId) throws Exception;
	public void deleteAddress(String eMailId) throws Exception;
	public AddressInterface getAddress(String eMailId) throws Exception;
}

Вы должны изменить сгенерированный активатор и включить в него методы start() и stop():

Листинг 3. com.ibm.wsrf.sampleapp.address.bundle.AddressActivator

public class AddressActivator implements BundleActivator {
    private ServiceRegistration serviceRegistration = null;
    public AddressActivator() {
    }
   public void start(BundleContext context) throws Exception {
       Hashtable properties = new Hashtable();
       serviceRegistration =  context.registerService
         (AddressFactoryInterface.class.getName(), new  AddressFactoryImpl(), properties);
   }
   public void stop(BundleContext context) throws Exception {
        serviceRegistration.unregister();
   }
}

Обратите внимание на то, что экземпляр AddressFactoryImpl зарегистрирован как реализация службы (а не AddressImpl). Это сделано для облегчения создания нескольких ресурсов Address и поиска и работы с нужным экземпляром ресурса Address.

Генерирование компонентов провайдера для пакета ресурса

Для генерирования пакетов адаптера ресурса и Web-службы WS-Resource можно использовать функциональность Mobile Web Services программы Lotus Expeditor Toolkit. Инструкции по использованию генераторов-помощников для создания компонентов на стороне провайдера можно найти в разделе "Разработка приложений для Lotus Expeditor" справочной системы Lotus Expeditor Toolkit.

При использовании мастера WS-Resource Provider укажите AddressFactoryInterface в качестве класса ресурса. Мастер анализирует Java-интерфейс на наличие bean-свойств и подсказывает их для предполагаемых ресурсных свойств. Можно либо выбрать эти ресурсные свойства, либо указать новые имена свойств. Данные свойства используются для формирования документа Resource Property.

В мастере WS-Resource Provider необходимо:

  • Выбрать свойства WS-Resource Lifetime и Expose Service Methods.
  • Не выбирать свойство Enable Security.
  • Выбрать все ресурсные свойства, перечисленные на панели Resource Property мастера.
  • Выбрать только те методы, которые указаны как методы службы в модели проекта ресурса Address (рисунок 1) на панели Service Methods мастера.
  • Изменить необходимые свойства подключаемого модуля и свойства проекта в мастере.

Связывание сгенерированного кода с пакетом ресурса

Мастер WS-Resource Provider генерирует два проекта в рабочем пространстве Eclipse, по одному на каждый пакет, устанавливаемый на стороне провайдера, а именно: пакет адаптера и пакет Web-служб. Пакет Web-служб не должен меняться и может быть развернут таким, как есть; однако пакет адаптера необходимо изменить и связать с пакетом ресурса.

При просмотре сгенерированного кода для пакета адаптера вы, вероятно, заметили следующие Java-классы, которые имеют заместители (placeholders) с выражениями TODO:

<Address>LifeTimeManager.java
<Address>PropertyManager.java

В классе AddressLifeTimeManager необходимо реализовать операции createResource(), destroyResource() и getResource(). Эти операции связаны с соответствующими службами, предлагаемыми AddressFactoryImpl в пакете ресурса Address, и используются ими.

Связывание операции createResource()

Когда клиентское приложение хочет создать новый ресурс Address, оно посылает сообщение createResource() провайдеру WS-Resource. WSRF направляет это сообщение в класс AddressLifeTimeManager компонента адаптера. Параметры инициализации для createResource() передаются в виде XML-документа в параметр ConfigInfo. Этот XML-документ доступен в операции createResource() класса AddressLifeTimeManager как объект ResourceConfiguration.

Обратите внимание на то, что этот параметр инициализации извлекается из ResourceConfiguration и передается с сообщением createAddress() в AddressFactoryImpl:

Листинг 4. Фрагмент кода createResource

public ResourceConfiguration createResource(Element configInfo) 
				_throws ResourceUnavailableFault, ResourceUnknownFault, Exception {
		Element ele = (Element)configInfo.getElementsByTagName("eMailID").item(0);
		System.out.println(ele.getFirstChild().getNodeValue());
		String emailIdfromClient = ele.getFirstChild().getNodeValue();

		String eMailIdValue = getAddressFactory().createAddress(emailIdfromClient);
		
		ResourceConfiguration resourceConfiguration = new ResourceConfiguration();
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document document = db.newDocument();
		Text text = document.createTextNode(eMailIdValue);
		resourceConfiguration.addConfigurationInfo(emailIdQName, text);	
		
		return resourceConfiguration;
	}

После создания ресурса с использованием AddressFactory, операция createResource класса LifeTimeManager формирует ответ клиентскому приложению с объектом ResourceConfiguration, который используется в будущем для идентификации экземпляра Address. Информация ResourceConfiguration инкапсулируется в ReferenceParameter объекта EndPointReference, который возвращается клиентскому приложению.

Связывание операции getResource()

Аналогичным образом, если клиентское приложение хочет обратиться к ресурсу для работы с его документом Resource Property (для удаления WS-Resource или для активизации метода службы в WS-Resource), WSRF сначала пытается получить экземпляр ресурса Address, используя операцию getResource() в AddressLifeTimeManager. Информация ResourceConfiguration опять используется для уникальной идентификации экземпляра ресурса Address при помощи AddressFactoryImpl. Обратите внимание на то, что операция getResource() активизирует метод getAddress() класса AddressFactoryImpl для поиска объекта Address:

Листинг 5. Фрагмент кода getResource

public Object getResource(ResourceConfiguration resourceConfiguration) 
        
        throws ResourceUnavailableFault, Exception {
		Node emailIdValue = resourceConfiguration.getConfigurationInfo(emailIdQName);
		System.out.println(emailIdValue);
		Text textInfo = (Text) emailIdValue;
		System.out.println(textInfo);
		String eid = textInfo.getNodeValue();
		System.out.println("ID from getResource::AddressLifeTimeManager :"+eid);
		Object addressObj = getAddressFactory().getAddress(eid);
		if(addressObj == null){
			throw new ResourceUnavailableFault("Resource Not Available !!", new Exception());
		}else{
			return addressObj;
		}
	}

Связывание операции destroyResource()

Ресурс Address уничтожается либо методом destroy() из клиентского приложения, либо при наступлении времени TerminationTime. При уничтожении ресурса интегрированная среда активизирует метод destroyResource() в классе AddressLifeTimeManager компонента адаптера. Информация ResourceConfiguration используется для уникальной идентификации экземпляра ресурса Address:

Листинг 6. Фрагмент кода destroyResource

public void destroyResource(ResourceConfiguration resourceConfiguration)
        
     throws ResourceUnavailableFault, ResourceNotDestroyedFault,Exception {
		Node emailIdValue = resourceConfiguration.getConfigurationInfo(emailIdQName);
		Text textInfo = (Text) emailIdValue;
		String eid = textInfo.getNodeValue();
		System.out.println("ID from destroyResource::AddressLifeTimeManager :"+eid);
		getAddressFactory().deleteAddress(eid);
	}

Связывание операций PropertyManager

Значения ресурсных свойств документа Resource Property всегда хранятся в экземпляре ресурса. Интегрированная среда не кэширует эти значения; однако, она поддерживает список всех корректных имен ресурсных свойств в документе Resource Property для любого конкретного экземпляра WS-Resource. Все сообщения WSRF, которые изменяют документ Resource Property WS-Resource, обрабатываются классом PropertyManager адаптера. Можно выбрать вариант поглощения сообщения или перенаправления его в пакет ресурса.

В классе AddressPropertyManager сгенерированный код содержит заместители операций get/update/delete/insert для всех свойств. Как уже рассматривалось ранее, можно предоставить реализацию для перенаправления сообщения get или update в ресурс Address. Аналогично, есть вариант перенаправления сообщения об удалении и вставке в экземпляр ресурса Address.

В данном примере обратите внимание на то, что: (a) операция update для выбранного свойства передается экземпляру ресурса Address как сообщение setPreference(), (b) операция get передается ресурсу Address как сообщение getPreference, (c) операция insert передается экземпляру ресурса Address как сообщение setPreference(), (d) операция delete не имеет дополнительной реализации:

Листинг 7. Фрагмент кода AddressPropertyManager

(a)	public void updatePreference(Object resource, Object value)
		throws ResourceUnavailableFault,
		UnableToModifyResourcePropertyFault,
		UpdateResourcePropertiesRequestFailedFault,
		InvalidModificationFault,
		BaseFault, Exception {

		com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef = 
	(com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
		java.lang.String inValue = (java.lang.String)value;
		resourceRef.setPreference(inValue);
	}

(b)	public Object getPreference(Object resource)
		throws ResourceUnavailableFault, Exception {

		com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef = 
	(com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
		java.lang.String retValue = resourceRef.getPreference();
		return retValue;
	}

(c)	public void insertPreference(Object resource, Object value)
		throws ResourceUnavailableFault,
		UnableToModifyResourcePropertyFault,
		InsertResourcePropertiesRequestFailedFault,
		InvalidModificationFault,
		BaseFault, Exception {

		com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef = 
	(com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
		java.lang.String inValue = (java.lang.String)value;
		resourceRef.setPreference(inValue);
	}

(d)	public void deletePreference(Object resource)
		throws ResourceUnavailableFault,
		DeleteResourcePropertiesRequestFailedFault, Exception {

		com.ibm.wsrf.sampleapp.address.service.AddressInterface resourceRef = 
	(com.ibm.wsrf.sampleapp.address.service.AddressInterface) resource;
	}

Если клиентское приложение хочет получить значение ресурсного свойства Address, на которое указывает EndPointReference, оно передает сообщение getResourceProperty с QName ресурсного свойства в качестве параметра. Интегрированная среда направляет это сообщение компоненту адаптера для первого получения экземпляра ресурса Address. Операция AddressLifeTimeManager getResource() получает экземпляр ресурса Address. Позднее интегрированная среда активизирует операцию getPreference() в AddressPropertyManager. Операция getPreference() класса AddressPropertyManager направляет это сообщение в соответствующую операцию ресурса Address.

Необходимо обеспечить аналогичные реализации для остальных ресурсных свойств.

СОВЕТ: Если ресурсное свойство смоделировано как свойство с типом доступа только по чтению, можно либо поглощать сообщения update и insert, не предоставляя какой-либо дополнительной информации для этих операций, либо сгенерировать исключительную ситуацию (например, InvalidModificationFault) в реализациях операций update и insert. Если ресурсное свойство смоделировано как обязательное свойство, можно генерировать исключительную ситуацию DeleteResourcePropertiesRequestFailedFault в реализации операции delete.

Связывание операций менеджера службы

Пользовательские типы портов WS-Resource (называемые также служебными методами) генерируются как часть AddressServiceManager компонента адаптера. Генератор кода по умолчанию создает код, связывающий эти операции с соответствующими методами ресурса Address. В этом смысле вам не нужно вносить какие-либо изменения в сгенерированный код.

Генерирование компонентов на стороне клиента для примера WS-Resource

После завершения разработки всех компонентов на стороне провайдера (пакет ресурса, пакет адаптера и пакет Web-службы) развернем эти компоненты провайдера WS-Resource в Lotus Expeditor Toolkit как WS-Resource. Дополнительная информация по запуску Client Services Server с пакетами провайдера WS-Resource приводится в разделе "Разработка приложений для Lotus Expeditor" справочной системы Lotus Expeditor.

Для определения готовности WS-Resource к использованию введите в браузер URL: http://localhost/ws/pid/Address?wsdl, где значением pid WS-Resource является Address. Браузер должен отобразить WSDL-файл, описывающий ресурс Address.

Теперь можно использовать программу Mobile Web Services для генерирования клиентских компонентов. Для генерирования кода заглушек клиентской программы используется мастер WS-Resource Client (из набора инструментальных программ Mobile Web Services). Инструкции по использованию мастеров для генерирования компонентов на стороне клиента приведены в разделе "Разработка приложений для Lotus Expeditor" справочной системы Lotus Expeditor.

Нет необходимости вносить какие-либо изменения в сгенерированный код.

Разработка простого тестового клиентского приложения для WS-Resource

Для тестирования WS-Resource необходимо разработать тестовое приложение. Это тестовое приложение использует компоненты на стороне клиента для:

  • Создания нового экземпляра WS-Resource (Address).
  • Передачи стандартного WSRF-сообщения.
  • Активизации операции из пользовательского portType.

Метод main() тестового клиентского приложения показан ниже:

Листинг 8. Фрагмент кода клиентского приложения

public static void main(String[] args) {
		String resourceUniqueId = "wsrf_support@ibm.com";
		TestClient tc = new TestClient();
		EndpointReference resEPR = null;
		/**
		 * Создать WS-Resource с заданной конфигурацией ресурса и 
		 * возвратить EPR для дальнейшего взаимодействия с WS-Resource.
		 */
		try {
			resEPR = tc.createResource(resourceUniqueId);
			if (resEPR != null)System.out.println("Resource created !! \n");
		} catch (Exception e) {
			e.printStackTrace();
		}

		OperationContext opContextObj = new OperationContext(); 
		opContextObj.setToEPR(resEPR);  
		AddressSoap_Stub stubObj = new AddressSoap_Stub();
		stubObj.setCurrentOperationContext(opContextObj);

		boolean updateResult = tc.testUpdateResourceProperty();
		if(updateResult == true)System.out.println("Update Resource Property :: SUCCESS");
		else System.out.println("Update Resource Property :: FAILED");

		boolean addResult = tc.testAddDependants();
		if(addResult == true)System.out.println("Add Dependants :: SUCCESS");
		else System.out.println("Add Dependants :: FAILED");
	}
}

Обратите внимание на то, что приведенный выше код выполняет следующие действия:

  1. Создает новый ресурс Address и получает EndPointReference (EPR).
  2. Устанавливает OperationContext.
  3. Тестирует стандартную WSRF-операцию, а именно updateResourceProperties, для выбранного ресурсного свойства.
  4. Тестирует служебный метод, а именно addDependents ресурса Address, добавляя одну зависимость.

Ссылка на полный исходный код приведена в разделе "Загрузка".

Также в предыдущем фрагменте кода для установки коммуникационного канала между клиентским приложением и WS-Resource использовался OperationContext. OperationContext хранит отправителя сообщения (в fromEPR) и адресат сообщения (в toEPR). Необходимо убедиться в том, что OperationContext хранит корректный toEPR. Перед активизацией какой-либо операции в WS-Resource устанавливается текущий контекст OperationContext путем активизации операции setCurrentOperationContext(opContextObj) объекта-заглушки.

Как уже рассматривалось ранее, для создания нового ресурса Address необходимо передать параметр инициализации как XML-документ в параметр ConfigInfo и начальное значение для свойства TerminationTime. Поскольку для синтаксического анализа следующего XML-документа ResourceConfiguration был реализован AddressLifeTimeManager, XML-документ ConfigInfo имеет аналогичную структуру:

Листинг 9. XML-документ ConfigInfo

<ConfigInfo>
          <AddressResource/>
          <eMailID>
wsrf_support@ibm.com
          </eMailID>
</ConfigInfo>

Код для создания WS-Resource показан ниже:

Листинг 10. Фрагмент кода тестового клиентского приложения createResourcein

public EndpointReference createResource(String uniqueId)
			throws Exception {

		String hostName = "localhost"; // Имя хоста WebService  
		String serviceName = "Address"; // Имя службы Resource  
		String uriString = "http://" + hostName + "/ws/pid/" + serviceName+ "?wsdl";

		WSAddressingService addressingObj = new WSAddressingServiceImpl();
		// создание EPR resourceFactory
		EndpointReference resourceFactoryEPR = addressingObj.createEndpointReference(uriString);
		
		// подготовка параметра configInfo для createResource()
		Node[] configInfo = getConfigInfo(uniqueId); 
		
		// подготовка параметра initTerminationTime для createResource()
		Calendar initTermTime = Calendar.getInstance();
		int curr = initTermTime.get(Calendar.HOUR);
		initTermTime.set(Calendar.HOUR, curr + 1);

		// Подготовка канала для взаимодействия с Resource Factory
		OperationContext opContextObj = new OperationContext(); 
		opContextObj.setToEPR(resourceFactoryEPR); // Установка resourceFactoryEPR как toEPR 
		stubObj.setCurrentOperationContext(opContextObj);// Установка текущего OperationContext

		// Передача сообщения createResource() в resourceFactory
		EndpointReference resourceEPR = stubObj.createWSResource(configInfo, initTermTime); 

		return resourceEPR;
	}

В листинге 10 обратите внимание на следующее:

  • Для фабрики ресурсов создается объект EndpointPointReference. В этом случае URL-адрес для EndPointReference аналогичен URL самого ресурса Address.
  • Между клиентским приложением и фабрикой ресурсов создается коммуникационный канал. Создается объект OperationContext, и EndPointReference фабрики ресурсов устанавливается в toEPR.
  • Для передачи сообщения createResource() в фабрику ресурсов используется объект-заглушка ресурса Address.
  • Фабрика ресурсов формирует ответ с EndPointReference только что созданного объекта ресурса Address.

Наконец, при выполнении тестового приложения отображаются следующие результаты:

Листинг 11. Результаты работы тестового клиентского приложения

Start Of Program !!
	 Resource created !!
	 Update Resource Property :: SUCCESS
	 Add Dependants :: SUCCESS
End Of Program !!

Настройка среды времени исполнения (Lotus Expeditor Client V6.1.0)

Lotus Expeditor Client for Desktop - это среда времени исполнения, используемая для развертывания ресурса Address. В данном разделе мы представим последовательность действий, которые нужно выполнить для настройки среды времени исполнения на запуск примера WS-Resource.

Инструкции по установке Lotus Expeditor Client V6.1.0 на Windows/Linux и функциональности WSRF V6.1.0.0 в Lotus Expeditor Client приведены в справочной системе Lotus Expeditor.

Для проверки успешности установки среды времени исполнения выполните следующие действия:

  1. Запустите Lotus Expeditor Client, используя параметр -console.
  2. В окне консоли введите ss для просмотра состояния всех установленных подключаемых модулей.
  3. Убедитесь в том, что в списке подключаемых модулей модуль com.ibm.pvcws.osgi_6.1.0 и все подключаемые модули WSRF находятся в активном состоянии. В противном случае запустите эти модули.

Развертывание примера WS-Resource в Lotus Expeditor

После настройки и запуска Lotus Expeditor Client for Desktop выполните действия, описанные ниже, для развертывания компонентов провайдера WS-Resource Address. Инструкции по развертыванию предварительно скомпонованного пакета AddressResource приведены в файле README.txt, ссылка на который приведена в разделе "Загрузка".

Подготовка функциональности WS-Resource Address для развертывания

Для установки WS-Resource Address в Lotus Expeditor Client for Desktop необходимо спакетировать WS-Resource как функциональность (feature). Выполните следующие действия для создания функциональности:

  1. Создайте новый проект функциональности в Lotus Expeditor Toolkit, выбрав File - New - AddressFeature (для примера).
  2. Выберите подключаемые модули AddressResource, AddressAdapter и AddressWebservice в окне Referenced Plug-ins and Fragments.
  3. Нажмите кнопку Finish.
  4. Нажмите правой кнопкой мыши на только что созданный проект функциональности и затем выберите Export из меню.
  5. В окне Export выберите вариант Deployable features и нажмите кнопку Next.
  6. Введите каталог и нажмите кнопку Finish.

Развертывание WS-Resource как функциональности

Для развертывания WS-Resource как функциональности выполните следующие действия:

  1. В Lotus Expeditor Client выберите File - Applications - Install.
  2. Выберите "Search for new features to install" и нажмите кнопку Next.
  3. Нажмите Add Folder Location, выберите месторасположение, в которое экспортировали функциональность на шаге 5 ранее, и нажмите кнопку Finish.
  4. Перезапустите Lotus Expeditor Client для активизации развертывания.

Проверка корректности развертывания WS-Resource

После запуска Lotus Expeditor Client (с параметром -console) проверьте в окне консоли, что установленные подключаемые модули были запущены.

Можете проверить, что WSDL для ресурса Address опубликован корректно, введя следующий URL в браузер: http://HostAddress:Port/ws/pid/ResourcePID?wsdl, где HostAddress - это IP-адрес узла, на котором работает Lotus Expeditor Client, Port - это порт, на котором выполняется Web-служба, а ResourcePID - это имя ресурса.

Например, URL-адрес может быть таким: http://localhost/ws/pid/Address?wsdl, если предположить, что Web-контейнер Lotus Expeditor Client V6.1.0 настроен на работу с портом 80 и на прием со всех IP-адресов.


Выполнение примера клиентского приложения

После развертывания ресурса Address в Lotus Expeditor Client for Desktop можно выполнить пример клиентского приложения, предоставляемый с данной статьей. Это приложение является основанной на SWT (Standard Widget Toolkit) Java-программой, позволяющей передавать различные стандартные WSRF-сообщения и пользовательские сообщения, определенные ресурсом Address.

Клиентское приложение было разработано для демонстрации всех функций API WSRF для Lotus Expeditor Client. Эти функции можно исследовать при помощи пунктов меню WSRF Standard Operations и WSRF Custom Operations. В меню WSRF Custom Operations можно поэкспериментировать с методами фабрики и службы (см. рисунок 2).

Рисунок 2. Меню WSRF Custom Operations
Рисунок 2. Меню WSRF Custom Operations

В меню WSRF Standard Operations можно поэкспериментировать со всеми операциями ресурсных свойств WSRF и операциями жизненного цикла WSRF (см. рисунок 3).

Рисунок 3. Меню WSRF Standard Operations
Рисунок 3. Меню WSRF Standard Operations

Резюме

Вы узнали, как создать простой WS-Resource и как развернуть его в Lotus Expeditor Client for Desktop. Вы узнали также об инструментальных средствах, используемых для генерирования компонентов на стороне провайдера и клиента, а также о том, как развернуть тестовое клиентское приложение для работы с примером WS-Resource, разработанным в данной статье.


Загрузка

ОписаниеИмяРазмер
Пример файлов WS-ResourceWSRF_AddressResourceSample.zip287 KB

Ресурсы

Научиться

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus, SOA и web-сервисы
ArticleID=208457
ArticleTitle=Создание и развертывание простого Web Services Resource в IBM Lotus Expeditor
publish-date=04102007