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 :

Utilisation des valuetype et de leur factory


Sujet :

CORBA

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Utilisation des valuetype et de leur factory
    Bonjour à tous, je suis nouveau en CORBA et je rencontre quelques problèmes quant à l'utilisation en IDL de valuetype (factory).
    J'utilise OpenORB. Disons que mon IDL se présente comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    module test{
       valuetype State{
         readonly attribute string getObjectReference;
         factory create(string ref);
       };
       interface Updateable{
         void setState(in State state);
       };					
    };
    Je génère sans problème les helper, holder et autres...
    Par contre lorsceque je récupère la référence à mon Object distant Updateable et que j'appel setState(state), j'ai une exception:
    "org.omg.CORBA.NO_IMPLEMENT: vmcid: 0x0 minor code: 0 completed: No"
    renvoyé par la classe Helper de State.
    Pourriez vous SVP m'indiquer toute la procédure d'utilisation des valuetype, j'entends par là la création de la classe d'implementation utilisé par la defaultFactory. et aussi après avoir récupéré la référence de mon objet distant, comment faire l'appel avec une instance de ce paramètre.
    Toute doc démontrant l'utilisation de ce mechanism est aussi la bien venue.

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 219
    Points : 302
    Points
    302
    Par défaut
    Bonjour,

    Premièrement, implémenter le valuetype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class StateImpl extends test.State {
       public StateImpl() {}
    }
    Note: les opérations correspondant aux attributs publiques sont générés dans la classe test.State, pas la peine de les ré-implémenter, contrairement à des attributs privés qui devront l'être.

    Deuxièmement, implémenter la Factory:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class StateFactoryImpl implements org.omg.CORBA.portable.ValueFactory {
       public StateFactoryImpl() {}
    
       public java.io.Serializable read_value(org.omg.CORBA_2_3.portable.InputStream is) {
            StateImpl result = new StateImpl();
            return is.read_value(result);
        }
    }
    Note: cette factory permet à l'ORB de démarshaller le valuetype de type State d'une requête entrante, via l'opération read_value(org.omg.CORBA_2_3.portable.InputStream).

    Troisièmement, pour que l'ORB puisse justement retrouver cette Factory, il faut l'enregistrer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // org.omg.CORBA.ORB orb = ...
    ((org.omg.CORBA_2_3.ORB)orb).register_value_factory(
       test.StateHelper.id(),
       new StateFactoryImpl());
    Cet enregistrement doit être fait pour tout les ORB susceptibles de recevoir un test.State via une requête CORBA. Dans ton cas, côté serveur, implémentant l'interface Updateable.
    Après, ça ne coute pas forcément plus cher de le faire partout par précaution...

    Enfin pour appeler l'opération setState:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    State myState = new StateImpl();
    myState.getObjectReference = ...
    myUpdateable.setState(myState);

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci pour cette réponse bien détaillée, je n'en attendais pas autant.
    En tout cas tout cela confirme le peu de document que j'avais trouvé sur le sujet (mais là c'est plus clair).
    Par contre j'ai une autre question concernant le register_value_factory.
    A quel moment faut il le faire? J'entends par là avant/après le orb.run.
    Je t'explique en détail:
    j'ai une classe JAVA ORBService.java qui enrobe toutes opérations sur l'ORB (Start/stop), donc dans mon appli pour démarrer l'ORB je fais juste ORBService.start()==>
    • ceci démarre mon NamingService
    • bind et active des Objets définis dans un fichier de conf
    • avant de faire le ORB.run()

    Tout cela est lancé dans un thread, ce qui me permet de reprendre la main notamment pour mes test.
    Ma question est donc "Dois je faire le register_value_factory forcément avant le orb.run() ou est ce que je peux le faire même après ?"
    En gros à quel moment mon ORB a besoin de la factory pour la première fois (lors de l'activation sur le POA? au premier appel distant?)

    Merci encore à toi
    En attendant je teste ça un peu partout (avant/après)

  4. #4
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 219
    Points : 302
    Points
    302
    Par défaut
    La spec CORBA indique que le moment où leregister_value_factory doit être appelé est dépendant du langage utilisé. Dans la spec IDL to Java, ce point n'est pas précisé.
    On peut donc en conclure que c'est laissé au libre choix de l'implémenteur d'ORB.

    Maintenant, la spec IDL to Java précise bien que les ValueTypeFactories sont stockées dans une map lors du register_value_factory, et que l'ORB va lire chercher dans cette map uniquement lorsqu'il en a besoin (i.e. pour démarshaller un valuetype arrivant).
    On peut donc raisonnablement espérer qu'une ValueTypeFactory peut être enregistré dans la map à n'importe quel moment, tant que c'est avant que l'ORB en aie besoin (i.e. la 1ere requête avec le valuetype).

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ok bien compris,
    Et encore merci pour tes réponses. Par mesure de précaution je l'ais intégré au processus de démarrage de mon ORB et ça marche.
    Bonne soirée

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/11/2012, 20h20
  2. [Fabrique] Besoin d'arguments pour utiliser des factories
    Par jm1974 dans le forum Design Patterns
    Réponses: 0
    Dernier message: 07/08/2009, 12h43
  3. Réponses: 2
    Dernier message: 14/12/2007, 01h47
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

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