Server-Side C++ Mapping

Podobne dokumenty
Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Common Object Request Broker Architecture (CORBA)

Programowanie współbieżne i rozproszone

Standard CORBA. Oprogramowanie systemów równoległych i rozproszonych Wykład 8. Zalety (I) Model komunikacji. Dr inż. Tomasz Olas

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie Komputerów

RMI z IIOP POA (do współpracy z omniorb) Tomasz Kubik

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Obiektowe programowanie rozproszone specyfikacja CORBA. Krzysztof Banaś Systemy rozproszone 1

Kurs programowania. Wykład 9. Wojciech Macyna

Wprowadzenie CORBA ORB

Projektowanie klas c.d. Projektowanie klas przykład

Wywoływanie metod zdalnych

Obsługa wyjątków. Język C++ WW12

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Wywoływanie metod zdalnych

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Systemy Rozproszone - Ćwiczenie 6

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Wyjątki (exceptions)

Zaawansowane programowanie w C++ (PCP)

Składnia C++ Programowanie Obiektowe, część 3 Mateusz Cicheński

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Tworzenie aplikacji rozproszonej w Sun RPC

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

TEMAT : KLASY POLIMORFIZM

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Programowanie Obiektowe Ćwiczenie 4

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

Język C++ wykład VIII

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 5 Okna MDI i SDI, dziedziczenie

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Remote Method Invocation 17 listopada 2010

CORBA. Common Object Request Broker Architecture

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Podejście obiektowe do budowy systemów rozproszonych

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie 2. Język C++. Wykład 3.

Podstawy programowania w języku C++

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe

Efekty uboczne błędów

Klasy cd. Struktury Interfejsy Wyjątki

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Systemy Rozproszone Technologia ICE

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie 2. Język C++. Wykład 1.

PARADYGMATY PROGRAMOWANIA Wykład 3

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

C++ język nie dla ludzi o słabych nerwach. Małgorzata Bieńkowska

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Rodzina protokołów TCP/IP. Aplikacja: ipconfig.

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Plik klasy. h deklaracje klas

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Aplikacje RMI Lab4

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Języki programowania - podstawy

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Systemy rozproszone. Dr inż. L. Miękina. Department of Robotics and Mechatronics AGH University of Science and Technology 1/1

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Sieciowa komunikacja procesów - XDR i RPC

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Programowanie obiektowe w C++ Wykład 12

Platformy Programistyczne Podstawy języka Java

SOAP i alternatywy. 1. WSDL. 2. Protokoły tekstowe XML-RPC. JSON-RPC. SOAPjr. 3. Protokoły binarne Google Protocol Bufers. Apache Thrift.

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Programowanie w środowiskach graficznych. Wykład 3 Język C#

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Obiekty w plikach wykonywalnych, marshaling

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Signals + Threads: Qt vs. Boost

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Curiously recurring template pattern

I - Microsoft Visual Studio C++

Pobieranie argumentów wiersza polecenia

Interfejsy w Javie. Przykład zastosowania interfejsów:

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

11.1 Obsługa błędów i wyjątków Polecenia try, throw, catch CLI C++, klasa Exception... 9

Transkrypt:

Server-Side C++ Mapping

Streszczenie Pojęcia podstawowe Przekazywanie parametrów Zgłaszanie wyjątków Tie classes

ORB, POA i serwant request ORB POA Manager POA Servants

Mapping dla interfejsów IDL: Interface MyObject { long get_value( ); Plik nagłówkowy klasy skeleton: class POA_MyObject : public virtual PortableServer::ServantBase { public: virtual CORBA::Long get_value( ) = 0; Nazwa klasy skeleton to nazwa interfejsu z przedrostkiem POA_. MyObject -> POA_MyObject Mod::MyObject -> POA_Mod::MyObject

Klasa serwantu class MyObject_impl : public virtual POA_MyObject { public : MyObject_impl(CORBA::Long init_val) : m_value(init_val) { virtual CORBA::Long get_value() throw(corba::systemexception); private: CORBA::Long m_value; MyObject_impl(const MyObject_impl &); void operator=(const MyObject_imple &);

Klasa serwantu (cd.) CORBA::Long MyObject_impl::get_value() throw(corba::systemexception) { return m_value;

Ucieleśnienie obiektu // First create a servant instance MyObject_impl servant(42); //Next, create a new CORBA object and use our new servant //to incarnate it MyObject_var object = servant._this(); Wywołanie _this() powoduje: Stworzenie nowego obiektu CORBA pod Root POA. Zarejestrowanie serwantu w Root POA jako implementacji nowego obiektu Stworzenie referencji do nowego obiektu Zwrócenie nowej referencji

Ucieleśnienie obiektu (cd.) class POA_MyObject : public virtual PortableServer::ServantBase { public: virtual CORBA::Long get_value( ) = 0; MyObject_ptr _this( );

Funkcja main int main(int argc, char *argv[]) { CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); CORBA::Object_var obj = orb->resolve_initial_references( RootPOA ); PortableServer::POA_var poa = PortableServer::POA::_narrow(obj); PortableServer::POAManager_var mgr = poa->the_poamanager(); mgr->activate(); MyObject_impl servant(42); MyObject_var object = servant._this(); CORBA::String_var str = orb->object_to_string(object); cout << str << endl; orb->run(); return 0;

Przekazywanie parametrów Niezależność od lokalizacji klient i obiekt docelowy w jednym procesie lub zdalnie Wydajność szczególnie istotna w przypadku wspólnej lokalizacji klienta i serwera

Przekazywanie parametrów typy proste interface Foo { long long_op( in long l_in, inout long l_inout, out long l_out); CORBA::Long Foo_impl::Long_op( CORBA::Long l_in, CORBA::Long & l_inout, CORBA::Long_out l_out){ l_inout = l_in * 2; l_out = l_in / 2; return 99;

Przekazywanie parametrów typy złożone o stałej długości struct Fls { long l_mem; double d_mem; interface Foo { Fls fls_op( in Fls fls_in, inout Fls fls_inout, out Fls fls_out ); Fls Foo_impl:: fls_op( const Fls & fls_in, Fls & fls_inout, Fls_out fls_out ) throw(corba::systemexception) { fun1(fls_in.l_mem); fun2(fls_in.d_mem); fls_inout.l_mem *=2; fls_inout.d_mem /=2; fls_out.l_mem=1234; fls_out.d_mem = 5.67e8; Fls result = { 1234,-.87e6 return result;

Przekazywanie parametrów tablice elementów o stałej długości typedef double Darr[3]; interface Foo { Darr darr_op( in Darr darr_in, inout Darr darr_inout, out Darr darr_out); Darr_slice * Foo_impl::darr_op( const Darr darr_in, Darr darr_inout, Darr_out darr_out) throw(corba::systemexception){ // Get the length of the array const in len = sizeof(darr)/sizeof(*darr); int i; for (i = 0,i<len;i++) darr_inout[i] *= i; for (i = 0,i<len;i++) darr_out[i] = i * 3.14; Darr_slice * result = Darr_alloc(); for (i = 0,i<len;i++) result[i] = i * i; return result;

Przekazywanie parametrów łańcuchy interface Foo { string string_op( in string s_in, inout string s_inout, out string s_out ); char * Foo_impl::string_op( const char * s_i, char * & s_inout, CORBA::String_out s_out) throw(corba::systemexception){ // Use s_in and s_inout (not shown) const char *s = outgoing string ; if(strlen(s_inout)<strlen(s)){ CORBA::string_free(s_inout); s_inout = CORBA::string_dup(s); else{ strcpy(s_inout, s); s_out = CORBA::string_dup(s); return CORBA::string_dup(s);

Przekazywanie parametrów typy złożone zmiennej dlugości i typ any struct Vls { long l_mem; string s_mem; interface Foo { Vls vls_op( in Vls vls_in, inout Vls vls_inout, out Vls vls_out ); Vls * Foo_impl::vls_op throw(corba::systemexception)( const vls & vls_in, Vls & vls_inout, Vls_out vls_out){ vls_inout.l_mem *= 2; vls.inout.s_mem = vls_in.s_mem; vls_out = new Vls; vls_out->l_mem = 1234; vls_out->s_mem = CORBA::string_dup( output string ); Vls *result = new Vls; result->l_mem = vls_in.l_mem; result->s_mem = CORBA::string_dup( return string ); return result;

Przekazywanie parametrów sekwencje typedef sequence<long> LongSeq; interface Foo { LongSeq seq_op(); LongSeq * Foo_impl::seq_op() throw(corba::systemexception) { LongSeq * result = new LongSeq; result->length(2); result[0]=1234; // wrong result[1]=5678; // wrong return result; LongSeq * Foo_impl::seq_op() throw(corba::systemexception) { LongSeq * result = new LongSeq; result->length(2); (*result)[0]=1234; // correct (*result)[1]=5678; // correct return result; LongSeq * Foo_impl::seq_op() throw(corba::systemexception){ LongSeq_var result = new LongSeq; result->length(2); result[0]=1234; // correct result[1]=5678; // correct return result._retn();

Przekazywanie parametrów tablice z elementami o zm. długości struct Vls { long number; string name; typedef Vls varr[3]; interface Foo { Varr varr_op( in Varr varr_in, inout Varr varr_inout, out Varr varr_out); Varr_slice * Foo_impl::varr_op( const Varr varr_in, Varr_slice * varr_inout, Varr_out varr_out) throw(corba::systemexception){ const int len = sizeof(varr)/sizeof(*varr); int i; varr_inout[0]=varr_in[0]; varr_out = Varr_alloc(); const char * brothers[] = { John, Jim, Rich for ( i = 0; i < len; i++){ varr_out[i].number = i+1; varr_out[i].name = brothers[i]; Varr_slice * result = Varr_alloc(); for ( i = 0; i < len; i++){ result[i].number = i; result[i].name = brothers[i]; return result;

Przekazywanie parametrów referencje do obiektów interface Foo { Foo ref_op( in Foo ref_in, inout Foo ref_inout, out Foo ref_out); void say_hello(); Foo_ptr Foo_impl::ref_op( Foo_ptr ref_in, Foo_ptr & ref_inout, Foo_out ref_out) throw(corba::systemexception) { if(!corba::is_nil(ref_in)) ref_in->say_hello(); if(!corba::is_nil(ref_inout)) ref_inout->say_hello(); CORBA::release(ref_inout); ref_inout = _this(); // Ensure the servant is allocated in the heap! Foo_impl * new_servant = new Foo_impl; ref_out = new_servant->_this(); return Foo::_nil();

Wyjątki - IDL pragma prefix "acme.com" module CCS { typedef short TempType; interface Thermometer {/* */ interface Thermostat : Thermometer { struct BtData { TempType requested; TempType min_permitted; TempType max_permitted; string error_msg; exception BadTemp { BtData details; TempType get_nominal(); TempType set_nominal(in TempType new_temp)raises(badtemp);

Wyjątki nagłówek klasy namespace POA_CCS{ class Thermostat: public virtual Thermometer { public: //... virtual CCS::TempType set_nominal(ccs::temptype new_temp) = 0; //... // note that all exceptions can be thrown

Wyjątki implementacja CCS::TempType Thermostat_impl::set_nominal(CCS::TempType new_temp) throw(corba::systemexception, CCS::Thermostat::BadTemp) { const CCS::TempType MIN_TEMP =50, MAX_TEMP =90; if(new_temp < MIN_TEMP new_temp > MAX_TEMP){ BtData bt; bt.requested = new_temp; bt.min_permitted = MIN_TEMP; bt.max_permitted = MAX_TEMP; bt.error_msg = CORBA::string_dup("temperature out of range"); throw CCS::Thermostat::BadTemp(bt); //...

Specyfikacja wyjątków ORB i skeleton otaczają wywołanie metod serwanta blokiem try... catch wyłapującym wszystkie wyjątki Jeśli dodamy specyfikacje wyjątków w C++, to zgłoszenie wyjątku spoza tej specyfikacji spowoduje zakończenie programu serwera Wszystkie wyjątki niezgodne ze specyfikacją w IDL są zamieniane na CORBA::UNKNOWN

Zgłaszanie wyjątków systemowych Utrudnia uruchamianie aplikacji nie wiadomo: problem z ORB czy problem z implementacją serwanta Wyjątki CORBA::NO_MEMORY CORBA::OBJECT_NOT_EXIST

Zarządzanie pamięcią Po wystąpieniu wyjątku ORB zwalnia pamięć zaalokowaną dla parametrów in i inout ignoruje parametry out i wartości zwracane przekazuje wyjątek do klienta

Zarządzanie pamięcią (cd.) exception SomeException { interface SomeObject { string string_op() raises(someexception); struct Vls { long l_mem; string s_mem; interface Foo { Vls op(in SomeObject obj, out Vls vls_out) raises(someexception);

Zarządzanie pamięcią (cd.) Vls* Foo_impl::op(SomeObject_ptr obj, Vls_out vls_out) throw(corba::systemexception, SomeException) { vls_out = 0; Vls * result = 0; try { vls_out = new Vls; vls_out->l_mem = 1234; vls_out->s_mem = obj->string_op(); result = new Vls; result->l_mem = 5678; result->s_mem = obj->string_op(); catch (...) { delete vls_out.ptr(); delete result; throw; return result;

Zarządzanie pamięcią (cd.) Vls* Foo_impl::op(SomeObject_ptr obj, Vls_out vls_out) throw(corba::systemexception, SomeException) { Vls_var temp_out = new Vls; temp_out->l_mem = 1234; temp_out->s_mem = obj->string_op(); Vls_var result = new Vls; result->l_mem = 5678; result->s_mem = obj->string_op(); // no exception occured return vls_out = temp_out._retn(); return result._retn();

Tie Servants // Create a C++ class instance to be out tied object // Assume MyLegacyClass also supports the get_value method MyLegacy Class * tied_object = new MyLegacyClass; // Create aninstance of the tie class template, using // MyLegacyClass as the template parameter. Pass our tied_object // pointer to set the tied object. The release parameter defalults to true, // so the tie_servant adopts the tied object POA_MyObject_tie<MyLegacyClass> tie_servant(tied_object); // Create our object and register out tie_servant as its servant MyObject_var my_object = tie_servant._this(); // adaptation of legacy class by template specialization class MyLegacyClass { public: unsigned short counter_value(); //... template <> CORBA::Long POA_MyObject_tie<MyLegacyClass>:: get_value() throw(corba::systemexception) { return _tied_object()->counter_value();

Klasa RefCountServantBase namespace PortableServer { class RefCountServantBase : public virtual ServantBase { public: RefCountServantBase() : m_ref_count(1) { virtual void _add_ref(); virtual void _remove_ref(); private: CORBA::ULong m_ref_count; //... class Echo_i : public POA_Echo, public PortableServer::RefCountServantBase { /*... */ Echo_i* myecho = new Echo_i(); obj = myecho->_this(); myecho->_remove_ref(); W bieżącej wersji standardu klasa RefCountServantBase jest pusta, zachowana dla wstecznej kompatybilności, a jej funkcjonalność jest zawarta w klasie skeletonu

OMG Naming Service module CosNaming { typedef string Istring; struct NameComponent { Istring id; Istring kind; typedef sequence<namecomponent> Name; interface NamingContext { NamingContext new_context(); NamingContext bind_new_context(in Name n) raises( NotFound, CannotProceed, InvalidName, AlreadyBound); void destroy() raises(notempty); void bind(in Name n, in Object obj) raises( NotFound, CannotProceed, InvalidName, AlreadyBound); void bind_context(in Name n, in NamingContext nc) raises( NotFound, CannotProceed, InvalidName, AlreadyBound); void rebind(in Name n, in Object obj) raises( NotFound, CannotProceed, InvalidName, AlreadyBound); void rebind_context(in Name n, in NamingContext nc) raises( NotFound, CannotProceed, InvalidName, AlreadyBound); Object resolve(in Name n) raises( NotFound, CannotProceed, InvalidName, AlreadyBound); Initial Naming Context devices obj1 cd app2 app2 collections cd