Приложение на COBRA



Начало
Общи сведения за CORBA
OMG и архитектура на CORBA
Обектен модел на CORBA
Езикът IDL
Проект BioStandards
Използване на CORBA в разработки на EBI
Приложение на CORBA в пациентските регистри
Приложение на CORBA в телероботиката
 
 

Пример за употребата на CORBA IDL

За целите на настоящия пример ще приемем, че и клиента и сървъра са написани на C++, нещо повече - ще покажем един от многото начини за изпълнение на връзката със сървъра. За повече информация за C++ mapping (както и тези за други езици) можете да се обърнете към OMG документацията. Ще приемем също така, че интерфейсите на клиента и на сървъра към ORB са статични, което означава, че те са базирани на IDL спецификации и не са използвани DII и DSK.

Прост пример, илюстриращ интерфейсите на обектите с CORBA може да бъде конструиран както следва: Първо, програмистът трябва да напише OMG IDL спецификация на обектите и услугите, които се предполага ,че ще могат да изпълняват. IDL е много подобен на C++ с това че концепцията за клас приблизително отговаря на идеята за интерфейс. Една примерна спецификация може да изглежда по следния начин:

interface example_object{
  void operation_on_object(in long a, inout boolean b);
}

Тази спефцификация дефинира един обект, за който клиентът може да извика една операция, която не връща резултат, но използва два аргумента. В допълнение на типа, параметрите са описани с in/out/inout атрибути, които сигнализират дали стойността ще бъде подадена от клиента към сървъра, по обратния път или в двете посоки.

Тази IDL спецификация след това се пуска през IDL компилатор, който генерира клиентските stub-ове и сървърските skeleton-и на езиците, на които са написани клиента и сървъра.Тогава те се включват в клиентската програма и респективно в сървърската програма. В допълнение, спецификацията може да бъде включена да генерира вход в хранилищата на интерфейси и имплементации.

Свързващия код на клиента и сървъра трябва да отговаря на спецификациите на OMG за езиков mapping. Според OMG документацията интерфейсите могат да бъдат представени в C++ чрез наследяване. В този случай горната интерфейсна спецификация ще доведе до следната йерархия от класове:

class example_object: public virtual CORBA::Object{
  static example_object_Ref _bind(...);
  virtual void operation_on_object
	(CORBA::Long a, CORBA::Boolean& b);
}

Класът example_object се използва от клиентската страна. Функцията operation_on_object в класа представлява stub, а нейните имплементации ще построят параметри на заявката, ще инициират изпращането на заявката към сървъра (чрез извикването на някои специфични за ORB програми, за които компилатора знае) и ще изчакат за отговора. Функцията _bind ще свърже специфичните обекти от типа example_object с някоя определена негова характеристика (напр. име, адрес и т.н.)

class example_object_sk: public virtual example_object{
  virtual void operation_on_object
	(CORBA::Long a, CORBA::Boolean& b) = 0;
  static void call_operation_on_object( /* a stream */);
};

От страна на обектното изпълнение, up-call -а от Обектния адаптор ще бъде направен чрез скелетната функция call_operation_on_object. Неговата имплементация съдържа интерфейс към мрежата на сървърската част. След декомпозирането на параметрите, тази функция ще изпълни заявка към operation_on_object, която изпълнява услугата. За отбелязване е че този клас operation_on_object е чисто виртуална функция и като такъв, той трябва да бъде изпълнен в клас, наследен от example_object_sk.

class example_object_impl: public example_object_sk{
  void operation_on_object
	(CORBA::Long a, CORBA::Boolean& b);
};

Последният клас съдържа актуалната имплементация на обекта и трябва да бъде написан от програмиста.

В най-опростения случай главната програма на сървърската реализация съдържа инстанциране на реализираните обекти и обръщение към Главния Обектен Адаптор (Basic Object Adapter), което носи информация за това, че реализацията е завършена.

CORBA::BOA::impl_is_ready();

Тогава, клиентът може да получи обектна референция към сървъра чрез извикването на метода _bind, генериран за клиентския интерфейс и така получава управлението на обекта в неговото собствено адресно пространство. Тогава той (клиентът) може да извика заявки към сървъра все едно, че сървъра се намира в неговото адресно пространство.

example_object* x = 
	example_object::_bind("my_example_object", aglika.ivanova@gmail.com);
x->operation_on_object(4,0);
<<back