HTML

Programozó Páternoszter

Ez a Programozó Páternoszter (PP) blogja, a programozásról szól. Aktualitása, hogy a Debreceni Egyetem Informatikai Kara Magasszintű programozási nyelvek 1-2, C++ esattanulmányok, Java esettanulmányok című kurzusainak blogja is egyben.

A vadászat

A Debreceni Egyetem Programozói Évkönyve: az UDPROG projekt. A szakmai fórumunk a Facebook-en. Az új előadások a prezin.
A régi előadások:
Prog1:
1. C bevezetés
2. C tárgyalás
3. C befejezés
4. C a gyakorlatban
5. C++ bevezetés
6. C++ tárgyalás
7. C++ befejezés
8. C++ a gyakorlatban
9. Java platform bevezetés
10. Kvantuminformatikai alg. bev.
Prog2:
1. Java bevezetés
2. Java tárgyalás
3. Java befejezés
4. Java a gyakorlatban
5. Software Engineering bev.
6. Java EE bevezetés
7. AspectJ bevezetés
8. BPMN-BPEL SOA programozás
9. C++ haladó
10. Tensorflow

Kövess engem!

Friss topikok

Linkblog

CORBA telefonkönyv

2011.04.23. 11:22 nb

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 .

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.
2. Felépítő fordít, futtat:

$ 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;
    }
}

 

Szólj hozzá!

Címkék: corba java idl omniorb namingcontextext namingcontext nameservice omninames

A bejegyzés trackback címe:

https://progpater.blog.hu/api/trackback/id/tr262849360

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása