Пример за употребата на 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);