Az előadáson a királyi úton jártunk: Javaból a org.omg.CosNaming.NamingContextExt osztályt, C++-ból a CosNaming::NamingContextExt osztályokat használtuk, ami azért volt királyi, mert nem kellett az első CORBA objektumunk (referenciájához) kötött CORBA nevet fáradtságosan névkomponensek sorozataként (leképezve tömbjeként) létrehozni, hanem nagyvonalúan a to_name és a resolve_str üzeneteket küldözgethettük...
Miről is beszélek? CORBA-ban is minden objektum, a névszolgáltató is, tehát őt is IDL nyelvű interfészén keresztül látjuk, ami a CosNaming.idl fájlban van leírva:
module CosNaming {
typedef string Istring;
struct NameComponent {
Istring id;
Istring kind;
};
typedef sequence<NameComponent> Name;
tehát itt olvashatjuk (pirossal) az IDL nyelven, hogy a név az névkomponensek sorozata. Ugyanitt, a CosNaming.idl-bennézzük meg az említett öröklődést interface NamingContextExt: NamingContext {
... Name to_name(in StringName sn) raises(InvalidName);
...
Object resolve_str(in StringName sn) raises(NotFound, CannotProceed, InvalidName,);
Részletek majd a 10. előadásban, most írunk egy progit, ami felépít egy fát a névszolgáltatóban, s egy másikat, ami lekérdezi azt. Mindkettőt Javában, a harmadik "fél" progit C++-ban. 3 trófea, ha úgy febejezed, hogy ugyanazt a fát épiti, mint amit a Java-s. Onnan tudod, hogy kész vagy, hogy a C++ sajátoddal felépíted (a Javás helyett) és a Javás lekérdező ugyanazt nyomja ki, mintha a Javás felépítővel toltad volna a fa építését. Nyugalom, bonyolultabb volt leírni, mint kiprószálni:
1. névszolgáltató start (mehetne a Java IDL-é is a JDK-ból, de nyomjuk most az omniORB-ét)
[norbi@sgu ~]$ omniNames -start 2011 -logdir .
2. Felépítő fordít, futtat:
Sat Apr 23 15:05:19 2011:
Starting omniNames for the first time.
Wrote initial log file.
Read log file successfully.
Root context is IOR:010000002b00000049444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000010000000000000070000000010102000e0000003139332e362e3133352e31353400db070b0000004e616d6553657276696365000300000000000000080000000100000000545441010000001c0000000100000001000100010000000100010509010100010000000901010003545441080000008fceb24d0100500b
Checkpointing Phase 1: Prepare.
Checkpointing Phase 2: Commit.
Checkpointing completed.
$ javac NevszolgEpito.java
$ java NevszolgEpito -ORBInitRef NameService=corbaloc::sgu:2011/NameService
3. Lekérdező fordít, futtat:
javac NevszolgKiiro.java
java NevszolgKiiro -ORBInitRef NameService=corbaloc::sgu:2011/NameService
IOR:00000000000000010000000000000001000000000000001f00010000000000047367750007db00000000000b4e616d6553657276696365
---Object: (Nehogy, obj)
IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000000000010000000000000074000102000000000e3139332e362e3133352e3135340007db0000000eff00e6d0b24d0100509c0000000100000000000300000000000000080000000041545400000000010000001c000000000001000100000001050100010001010900000001000101094154540300000008e6d0b24d0100509c
---Context: (PP, mappa)
IOR:00000000000000010000000000000001000000000000001f00010000000000047367750007db00000000000b4e616d6553657276696365
------Object: (C++, obj)
IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000000000010000000000000074000102000000000e3139332e362e3133352e3135340007db0000000eff00e6d0b24d0100509c0000000200000000000300000000000000080000000041545400000000010000001c000000000001000100000001050100010001010900000001000101094154540300000008e6d0b24d0100509c
------Context: (Java, mappa)
IOR:00000000000000010000000000000001000000000000001f00010000000000047367750007db00000000000b4e616d6553657276696365
---------Object: (EE, obj)
4. Névszolgáltató lelő, restart
5. C++ "félszerzet" programoz, fordít, futtat
$ g++ -I${OMNI_HOME}/include nevszolg_epito.cpp -o nevszolg_epito -L${OMNI_HOME}/lib -lomniORB4 -lomnithread -lomniDynamic4
$ ./nevszolg_epito -ORBInitRef NameService=corbaloc::sgu:2011/NameService
6. Lekérdező futtat:
java NevszolgKiiro -ORBInitRef NameService=corbaloc::sgu:2011/NameService
7. Ha ugyanazt a fát írja ki, mint amilyet a Javás felépített, kész vagy és 3 új trófea büszke tulajdonosa (de lásd még a "hegylakó szabályt" is)
8. goto 4.
Kattints a továbbra a hozzávalókért!
NevszolgEpito.java
/* [norbi@sgu csevego]$ javac NevszolgEpito.java [norbi@sgu csevego]$ java NevszolgEpito -ORBInitRef NameService=corbaloc::sgu:2011/NameService korte */ public class NevszolgEpito { public static void main(String[] args) { try { // Az ORB (a metódushívások közvetítőjének) inicializálása org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); // A névszolgáltató gyökerének, mint CORBA objektum // referenciájának megszerzése org.omg.CORBA.Object corbaObjektum = orb.resolve_initial_references("NameService"); org.omg.CosNaming.NamingContext névszolgáltatóGyökere = org.omg.CosNaming. NamingContextHelper.narrow(corbaObjektum); org.omg.CosNaming.NameComponent nehogyNc = new org.omg.CosNaming.NameComponent("Nehogy", "obj"); org.omg.CosNaming.NameComponent[] nehogyNcNev = {nehogyNc}; névszolgáltatóGyökere.rebind(nehogyNcNev, névszolgáltatóGyökere); org.omg.CosNaming.NameComponent ppNc = new org.omg.CosNaming.NameComponent("PP", "mappa"); org.omg.CosNaming.NameComponent[] ppNcNev = {ppNc}; org.omg.CosNaming.NamingContext ppGyoker = névszolgáltatóGyökere.bind_new_context(ppNcNev); org.omg.CosNaming.NameComponent cppNc = new org.omg.CosNaming.NameComponent("C++", "obj"); org.omg.CosNaming.NameComponent[] cppNcNev = {cppNc}; ppGyoker.rebind(cppNcNev, névszolgáltatóGyökere); org.omg.CosNaming.NameComponent javaNc = new org.omg.CosNaming.NameComponent("Java", "mappa"); org.omg.CosNaming.NameComponent[] javaNcNev = {javaNc}; org.omg.CosNaming.NamingContext javaGyoker = ppGyoker.bind_new_context(javaNcNev); org.omg.CosNaming.NameComponent eeNc = new org.omg.CosNaming.NameComponent("EE", "obj"); org.omg.CosNaming.NameComponent[] eeNcNev = {eeNc}; javaGyoker.rebind(eeNcNev, névszolgáltatóGyökere); } catch (Exception e) { e.printStackTrace(); } } }
NevszolgKiiro.java
/* [norbi@sgu csevego]$ javac NevszolgKiiro.java [norbi@sgu csevego]$ java NevszolgKiiro -ORBInitRef NameService=corbaloc::sgu:2011/NameService korte */ public class NevszolgKiiro { static int melyseg = 1; public static void egyKiir(org.omg.CORBA.ORB orb, org.omg.CosNaming.NamingContext névszolgáltatóGyökere, org.omg.CosNaming.Binding kotes) { try { org.omg.CORBA.Object corbaObjektum = névszolgáltatóGyökere.resolve(kotes.binding_name); String ior = orb.object_to_string(corbaObjektum); System.out.println(ior); int utolsoIdx = kotes.binding_name.length-1; for (int i=0; i < melyseg; ++i) System.out.print("---"); if (kotes.binding_type == org.omg.CosNaming.BindingType.ncontext) { System.out.println( "Context: (" + kotes.binding_name[utolsoIdx].id + ", " +kotes.binding_name[utolsoIdx].kind+")"); névszolgáltatóGyökere = org.omg.CosNaming. NamingContextHelper.narrow(névszolgáltatóGyökere.resolve(kotes.binding_name)); ++melyseg; kiir(orb, névszolgáltatóGyökere); --melyseg; } else { System.out.println("Object: (" + kotes.binding_name[utolsoIdx].id + ", "+ kotes.binding_name[utolsoIdx].kind+")"); } } catch (Exception e) { e.printStackTrace(); } } public static void kiir(org.omg.CORBA.ORB orb, org.omg.CosNaming.NamingContext névszolgáltatóGyökere) { try { org.omg.CosNaming.BindingListHolder blh = new org.omg.CosNaming.BindingListHolder(); org.omg.CosNaming.BindingIteratorHolder biterh= new org.omg.CosNaming.BindingIteratorHolder(); névszolgáltatóGyökere.list(10, blh, biterh); org.omg.CosNaming.Binding kotes[] = blh.value; for (int i=0; i < kotes.length; i++) egyKiir(orb, névszolgáltatóGyökere, kotes[i]); org.omg.CosNaming.BindingIterator biter = biterh.value; if (biter!=null) { org.omg.CosNaming.BindingHolder bh = new org.omg.CosNaming.BindingHolder(); while (biter.next_one(bh)) { org.omg.CosNaming.Binding egyKotes = bh.value; egyKiir(orb, névszolgáltatóGyökere, egyKotes); } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { try { // Az ORB (a metódushívások közvetítőjének) inicializálása org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); // A névszolgáltató gyökerének, mint CORBA objektum // referenciájának megszerzése org.omg.CORBA.Object corbaObjektum = orb.resolve_initial_references("NameService"); org.omg.CosNaming.NamingContext névszolgáltatóGyökere = org.omg.CosNaming. NamingContextHelper.narrow(corbaObjektum); kiir(orb, névszolgáltatóGyökere); } catch (Exception e) { e.printStackTrace(); } } }
nevszolg_epito.cpp
#include <iostream> #include <omniORB4/CORBA.h> /* g++ -I${OMNI_HOME}/include nevszolg_epito.cpp -o nevszolg_epito -L${OMNI_HOME}/lib -lomniORB4 -lomnithread -lomniDynamic4 ./nevszolg_epito -ORBInitRef NameService=corbaloc::sgu:2011/NameService */ int main (int argc, char *argv[]) { try { // Az ORB (a metódushívások közvetítőjének) inicializálása CORBA::ORB_var orb = CORBA::ORB_init (argc, argv); // A névszolgáltató gyökerének, mint CORBA objektum // referenciájának megszerzése CORBA::Object_var corbaObjektum = orb->resolve_initial_references("NameService"); // CORBA-s típuskényszerítés CosNaming::NamingContext_var nevszolgaltatoGyokere = CosNaming::NamingContext::_narrow(corbaObjektum); CosNaming::Name nehogyNcNev; nehogyNcNev.length(1); nehogyNcNev[0].id = (const char*) "Nehogy"; nehogyNcNev[0].kind = (const char*) "obj"; nevszolgaltatoGyokere->rebind(nehogyNcNev, nevszolgaltatoGyokere); CosNaming::Name ppNcNev; ppNcNev.length(1); ppNcNev[0].id = (const char*) "PP"; ppNcNev[0].kind = (const char*) "mappa"; CosNaming::NamingContext_var ppGyoker = nevszolgaltatoGyokere->bind_new_context(ppNcNev); CosNaming::Name cppNcNev; cppNcNev.length(1); cppNcNev[0].id = (const char*) "C++"; cppNcNev[0].kind = (const char*) "obj"; ppGyoker->rebind(cppNcNev, nevszolgaltatoGyokere); } catch (CORBA::Exception & e) { std::cout << "CORBA kivétel: (CORBA::Exception) " << e._name () << std::endl; } }