IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

CORBA Discussion :

Identité d'objets


Sujet :

CORBA

  1. #1
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut Identité d'objets
    Bonjour bonjour.

    J'ai un petit problème pour retrouver un objet dans une liste à partir de sa référence (xxx_ptr) .

    Dans les détails, côté serveur je propose les opérations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    interface ITruc {...};
    
    interface ILesTrucs {
        ...
       sequence<ITruc> getTrucs&#40;&#41;;
       void setTrucCourant&#40;in ITruc nouveauCourant&#41;;
    &#125;;
    Le client pouvant décider à tout moment de changer le TrucCourant dont il extrait la référence depuis la liste que je (seveur) lui retourne.

    De ce que j'ai lu, je pourrais faire un is_equivalent() pour tester l'équivalence des références manipulées. Seulement, je lis aussi que cela n'assure que l'équivalence de mes références et non celle de mes objets.

    La question, savez-vous si il y a des moyens de mettre en oeuvre simplement l'équivalence d'objets sans polluer l'interface de ITruc (j'aimerai ne pas avoir à rajouter un getID() dans l'interface).

    A la limite en supposant qu'un dynamic_cast<> soit faisable (je suis en C++), l'avoir en privé sur ma classe d'implémentation pourrait m'aller.
    Mais j'aimerai trouver une solution plus idiomatique à Corba dans la mesure du possible.

    Je soupçonne que c'est un problème classique, mais je n'ai pas trouvé grand chose dans mes recherche. Toute piste est la bienvenue.

    Merci d'avance
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  2. #2
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 66
    Points : 74
    Points
    74
    Par défaut
    effectivement

    is_equivalent() permet de savoir si deux references : montype_ptr reference le meme objet du cote serveur.

    je ne comprends pas bien pas ta question ?
    veux tu savoir si deux interfaces ITruc correspondent aux meme types (ItSousTruc par exemple )?


    dans ce cas, il suffit de faire un _narrow ("equivalent" du cast a prendre avec des pincettes sur les xxx_ptr )dessus et catcher l exception si il est pas du bon type.

    ou est ce que tu veux savoir si la reference montype_ptr est toujours valide ?

    que veux tu dire par equivalence d'objet de type xxx_ptr ?

    desoles pour les questions

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Mon problème est qu'en interne j'ai un vecteur de ITruc_i* est que je reçois un ITruc_ptr à partir duquel je veux être sûr de pouvoir retrouver mon object original stocké dans le vecteur.

    Je me renseigne sur les moyens de mettre en oeuvre l'équivalence d'objets. (d'un point de vu implémentation : étant en C++, les types de références corba sont des machins_ptr. Je précisais au cas où cela aurait été pertinent).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 66
    Points : 74
    Points
    74
    Par défaut
    le vecteur de truc_i* est forcement dans le serveur , c est l ensemble des objets servants


    les references xxx_ptr sont uiliser par le client

    ta question est de savoir si la reference que tu as recue ? correpond a un objet servant qui est dans ta liste de truc_i * ?

    moi j activerai mes objets servants avec un id , activate_object_id , methode presente sur le POA

    ensuite il suffira de gerer ces IDs , c est pas trop complique

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    C'est bien ma question.

    Cela s'active comment cet id ? Si tu as une piste...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 66
    Points : 74
    Points
    74
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     MaClasse_i  monObjetServant;
    
     // creation de l'object ID 
    
     PortableServer&#58;&#58;OjectId_var myid = PortableServer &#58;&#58; string_to_Object&#40;"MaClasse"&#41;;
    
      on active l objet servant sur le POA 
    
     poa->activate_object_with_id&#40;myid, &monObjetServant&#41;;

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Merci pour ces pistes.
    De fils en aiguilles je suis tombé sur d'autres choses que je vais tenter (j'ai plusieurs listes disjointes de servants et ne peux me contenter d'obtenir un pointeur vers celui qui m'intéresse)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void IChoses&#58;&#58;setTrucCourant&#40;ITruc_ptr truc&#41;
    &#123;
        SMART_VERIFY&#40; ! CORBA&#58;&#58;is_nil&#40;truc&#41; &#41;
            .error&#40;"&#91;IChoses&#58;&#58;setTrucCourant&#93; Invalid null truc"&#41;;
        
        // recherche du truc dans la liste de trucs
        &#58;&#58;PortableServer&#58;&#58;ObjectId id = * poa->reference_to_id&#40;truc&#41;;
        int i = 0; 
        for &#40;int N=m_trucs.size&#40;&#41;; i!=N; ++i&#41; &#123;
            if &#40;id == poa->servant_to_id&#40;m_trucs&#91;i&#93;&#41;&#41; &#123;
                break;
            &#125;
        &#125;
    
        SMART_VERIFY&#40; i != m_trucs.size&#40;&#41; &#41;
            .error&#40;"&#91;IChoses&#58;&#58;setTrucCourant&#93; truc not found"&#41;;
    
        // la MAJ réelle
        setTrucCourant_&#40;i&#41;;
    &#125;
    A moins qu'il soit plus propre de faire un reference_to_servant, puis un dynamic_cast pour comparer des pointeurs ....


    Autrement, le activate_object sert à forcer l'objet passé en paramètre à valoir le servant dont on connait l'id ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 66
    Points : 74
    Points
    74
    Par défaut
    question sur l activate :

    activate_object _with_id , sert a activer l un objet servant sur le bus en forcant l'ID avec ce que tu as choisi

    la methode activate :
    ca cree une entree avec une clef dans la map des objets servants actifs de ton POA.

    il faut que ton POA supporte le SYSTEM_ID

    dans tous les cas chaque fois que tu actives un objet , tu recupere un object ID

    PortableServer :: ObjectId_var id = poa->activate_object(objetServeur);

    et pour recuperer la reference pour un object ID defini plus haut

    CORBA::Object_var object = poa->id_to_reference(id);
    // ensuite il faut faire un narrow dessus pour recuperer le bon type

    a+

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Bon, j'ai enfin eu le temps de faire des essais. L'approche retenue étant utiliser un find_if sur les résultats de servant_to_id. Le serveur a l'air de retrouver ses petits. Les tests en situation réelle bientôt.

    Donc, merci beaucoup pour ces pistes!

    (Mes références sont liées à des servants activés automatiquement avec leServant->_this() dans des fonctions de l'IDL getListOfTotos() ; d'où que je ne comprenait pas ces références à activate_object()..)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir l'identité d'un objet vers sa valeur
    Par onh890 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 18/05/2012, 19h08
  2. [JavaScript] Carte d'identité d'un Objet
    Par vermine dans le forum Contribuez
    Réponses: 0
    Dernier message: 11/01/2010, 11h39
  3. Réponses: 5
    Dernier message: 20/08/2009, 11h02
  4. Identité des objets apres clonage
    Par Kylie - XX dans le forum Langage
    Réponses: 4
    Dernier message: 27/04/2008, 20h00
  5. Réponses: 6
    Dernier message: 09/08/2006, 22h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo