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

Langage Perl Discussion :

passage d'objets en tant qu'arguments


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut passage d'objets en tant qu'arguments
    bonjour,
    je suis confronté au problème suivant:

    2 classes doivent se partager une connection à une base de donnée.

    Cette connection est créée par l'objet archive, et est stockée dans un objet eXist (eXist étant le nom d'une base de donnée, et c'est une classe que j'ai définit moi-même pour pouvoir communiquer aisément avec cette db)

    La classe archive créée à un instant donné un objet emission, qui sera la représentation d'une émission contenu dans ma base de données.

    J'aimerais que l'objet emission utilise le même objet eXist (connection à la DB) que la classe archive. Pour cela je passe la connection en paramètre lors de la création de l'objet emission:

    [dans la classe archives:]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub createEmission {
      ...
      $URL = "http://localhost:8080/exist";
     
      $self->{EXIST} = eXist($URL);
     
      $document = new emission($self->{EXIST});
    }


    [dans la classe emission:]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub new {
       ...
      $con = shift;  ## Ceci marche, en tout cas si je fait un print ça me donne la même valeur de HASH que si je fait un print en dehors de la classe...
      $self->{EXIST} = $con;
      ...
    }


    Le problème, c'est que lorsque j'appelle une méthode de mon objet connection, cette méthode marche, mais mon code plante car il ne trouve pas une méthode d'une classe que j'utilise dans la classe eXist...

    Donc je dois avoir fait une erreur dans mon passage d'objet comme argument d'une fonction...


    Je sais ça n'est pas très clair...


    Quelqu'un a-t-il déjà passé un objet comme argument d'une fonction...? Si oui comment fait-on pour que ça marche sans problème...?

  2. #2
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Euh, j'ai vraiment pas tout compris à ton problème là...
    Notamment avec la partie la méthode marche mais le code plante, ça reste totalement mystérieux pour moi

    Un code comme ceci marche très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sub main 
    {
    	my $obj = Classe->new(5);
    	fonc($obj);
    	print $obj->{"val"}; #affiche 3
    }
     
    sub fonc
    {
    	my ($obj) = @_;
    	$obj->{"val"} = 3;
    }
    mais je suppose que ce n'est pas ça que tu veux savoir
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    effectivement ça ça marche, j'ai fait des tas de tests du genre hier et l'objet est bien passé et je peux accéder à ses méthodes ainsi qu'à ses attributs

    En fait le problème c'est que dans une des méthodes de l'objet, j'utilise un autre module, et on dirait que la résolution de nom ne se fait pas correctement...

    il ne connais plus la méthode is_fault de l'objet $response qui a été créé juste avant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $response=$self->{CLIENT}->send_request($request);
    $self->{CLIENT} étant un objet représentant un client xmlrpc (http://www.xmlrpc.com) qui se connecte à une base de donnée XML native (eXist)

    après cette assignation je fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      if ($response->is_fault()) {
        die "*** eXist's class: An error occurred: " . $response->string . "***\n";
      }
    et il me retrourne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Can't locate object method "is_fault" via package "RPC::XML::Client::send_request: HTTP server error: %2Fexit%2Fxmlrpc+Not+Found" (perhaps you forgot to load "RPC::XML::Client::send_request: HTTP server error: %2Fexit%2Fxmlrpc+Not+Found"?) at eXist.pm line 361.
    La ligne 361 étant la ligne avec "if($response->is_fault()) {"

    Or send_request est une méthode de RPC::XML::Client qui renvoie normalement un objet structure XML::RPC sur lequel il est possible d'appeller la méthode is_fault()

    j'ai les use suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use RPC::XML;
    use RPC::XML::Client;

    Tout cela marche très bien tant que je ne passe pas mon objet connection comme argument d'une fonction!!

    Donc ce que j'en pense c'est que le fait de l'avoir passé comme paramètre a masqué les packages sous-jacents (RPC::XML et RPC::XML::Client) et qu'il n'arrive plus à faire la résolution de noms...

    Ca m'ennuie beaucoup car si je ne peux pas partager cet objet connection entre mes différentes classes, je suis partit pour ouvrir 4300 connections les unes à la suite des autres!!!! Au lieu d'une seule... !!!!


    Qq1 a une idée de ce qui se passe??

  4. #4
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bon, à tout hasard, as-tu inclus tes use dans une portée particulière qui ferait qu'ils ne seraient plus accessible dans la fonction à laquelle tu veux passerton objet en paramètre ?

    C'est vraiment bizzare comme erreur ça...
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    hum non, par portée tu entends namespace?

    en réalité j'ai trois modules (trois classes en fait):

    eXist.pm, archives.pm et emission.pm

    eXist.pm est ma classe de connection à la base de données eXist;
    use RPC::XML;
    use RPC::XML::Client;

    archives.pm est la classe pour représenter les archives contenues dans ma base de données, les archives contiennent des emissions;
    use eXist;
    use emission;

    emission.pm est la classe permettant de représenter une émission.
    use eXist; #que ce use soit là ou pas ne change rien à mon problème, mais ça me semble logique vu qu j'utilise une connexion et que ses méthodes sont déclarées dans eXist.pm

    archives.pm initialise une connection avec eXist, jusque là tout va bien
    lorsque je demande à archives.pm de sélectionner une émission, tout va bien.
    Le but est que archives.pm me crée un objet de type emission, qui partage la connection initialisée par archives.pm, et qui puisse faire des requêtes pour récupérer les infos ou mettre à jour une émission précise.

    Le problème survient au premier appel à XPR::XML::Client->send_request().

    stack d'appels:
    eXist->__process($query)
    emission->{EXIST}->execute($query)
    emission->__executeQuery($query)

    emission->{EXIST} est une référence à la connexion

    code de emission::new
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    sub new {
      my $class = shift;
      my $con = shift;
     
      my $self = {};
     
      $self->{EXIST} = $con;
     
      bless($self,$class);
      return $self;
    }

    code de emission->__executeQuery
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sub __executeQuery {
      my $self = shift;
      my $XQuery = shift;
     
      my $result_id = $self->{EXIST}->execute($XQuery);
      my @res = $self->{EXIST}->retrieve($result_id);
     
      return @res;
    }
    code eXist->execute:
    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
     
    sub execute {
      my $self = shift;
      my $xquery = shift;
     
      my $req = RPC::XML::request->new(
                  "executeQuery",
                  RPC::XML::base64->new($xquery),
                  "UTF-8",
                  $self->{OPTIONS}
                );
     
      my $response = $self->__process($req);
     
      my $result_id = $response->value;
     
      return $result_id;
    }

    et c'est dans eXist->__process que ça se passe!

    code de eXist->__process
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sub __process {
      my $self = shift;
      my $request = shift;
     
      my $response = $self->{CLIENT}->send_request($request);
      if ($response->is_fault()) {
        die "*** eXist's class: An error occurred: " . $response->string . "***\n";
      }
    $self->{CLIENT} est une référence à un objet de type RPC::XML::Client

    constructeur de eXist.pm:
    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
     
    sub new {
      my $class = shift;
      my $self = {};
     
      $self->{URL} = shift;
      # Connection au serveur XML-RPC de eXist:
      $self->{CLIENT} = new RPC::XML::Client ( $self->{URL} );
     
      $self->{OPTIONS} = RPC::XML::struct->new(
                      'indent' => 'yes',
    #                  'encoding' => 'ISO-8859-1'
                      'encoding' => 'UTF-8'
                    );
     
      bless ($self, $class);
      return $self;
    }

    L'erreur retournée est celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Can't locate object method "is_fault" via package "RPC::XML::Client::send_request: HTTP server error: %2Fexit%2Fxmlrpc+Not+Found" (perhaps you forgot to load "RPC::XML::Client::send_request: HTTP server error: %2Fexit%2Fxmlrpc+Not+Found"?) at eXist.pm line 360.
    hors RPC::XML::Client est une classe et send_request est une méthode de cette classe, et non pas une classe à part entière!

    Ca irait peut-être mieux si je mettais tout le code mais de toute façon il vous faudrait configurer un serveur eXist et mettre les données dedans comme je les ai mises... mais je ne peux pas vous fournir ces données...

    s'il faut le code complet des 3 classes dites-le, mais c'est assez long et j'ai donnée ici toutes les méthodes par où on passe...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    bon c'est surement plus simple à comprendre comme ceci:

    je met ici 3 fichiers:

    ma classe de connection à eXist (la db XML):

    ma classe qui représente une émission

    et un script pour tester ma classe émission

    à la fin, la sortie que je reçois après avoir lancé essai_emission.pl

    J'ai affiché les information de la connection en dehors et dans la classe emission,
    on voit bien que les HASH sont le même, mais on dirait qu'il ne sait pas trouver le package correspondant à la connexion (càd le package eXist) lorsque Perl se trouve dans le contexte de la classe emission.

    Pourquoi?

    P.S.: ces 3 fichiers sont en piece jointes, les fichiers eXist.pm et emission.pm ont été renommés en eXist.pm.pl et emission.pm.pl pour être autorisés par le forum.

    P.S.: Si vous exécutez ces scripts sans base de donnée eXist tournant en tant que serveur, vous aurez un message d'erreur semblable dans la forme, mais la raison sera qu'il n'arrive pas à se connecter à un serveur. Si quelqu'un a la patiente de lancer un serveur eXist (ça n'est pas si long en fait, je peux bien sur aider!), je pourrais lui passer un fichier exemple pour tester le problème plus en détail... merci


    eXist.pm
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
     
    package eXist;
     
    use strict;
     
    use Encode;
    use RPC::XML;
    use RPC::XML::Client;
     
    ###############################################################################
    ## Constructeur
    ###############################################################################
    sub new {
      my $class = shift;
      my $self = {};
     
      $self->{URL} = shift;
      # Connection au serveur XML-RPC de eXist:
      $self->{CLIENT} = new RPC::XML::Client ( $self->{URL} );
     
      $self->{OPTIONS} = RPC::XML::struct->new(
                      'indent' => 'yes',
    #                  'encoding' => 'ISO-8859-1'
                      'encoding' => 'UTF-8'
                    );
     
      bless ($self, $class);
      return $self;
    }
     
     
    ###############################################################################
    ## Méthodes de communication evec eXist: requêtes
    ###############################################################################
    sub execute {
      my $self = shift;
      my $xquery = shift;
     
      my $req = RPC::XML::request->new(
                  "executeQuery",
                  RPC::XML::base64->new($xquery),
                  "UTF-8",
                  $self->{OPTIONS}
                );
     
      my $response = $self->__process($req);
     
      my $result_id = $response->value;
     
      return $result_id;
    }
     
    ########################
    sub getHits {
      my $self = shift;
      my $result_id = shift;
     
      my $req = RPC::XML::request->new("getHits", $result_id);
      my $response = $self->__process($req);
      my $hits = $response->value;
     
      return $hits;
    }
     
    ########################
    sub retrieve {
      my $self = shift;
      my $result_id = shift;
      my $start = (@_) ? shift : 0;
      my $max = $self->getHits($result_id);
      my $end = (@_) ? shift : $max;
      if ($end > $max) { $end = $max; }
     
      my @res;
     
      for (my $i = $start; $i < $end; $i++) {
        my $req = RPC::XML::request->new(
                 "retrieve",
                 $result_id,
                 $i,
                 $self->{OPTIONS}
               );
        my $response = $self->__process($req);
     
        push @res, $response->value;
      }
     
      return @res;
    }
     
    ########################
    sub retrieveAll {
      my $self = shift;
      my $result_id = shift;
     
      my $req = RPC::XML::request->new(
                 "retrieveAll",
                 $result_id,
                 $self->{OPTIONS}
               );
      my $response = $self->__process($req);
     
      return $response->value;
    }
     
    ########################
    sub releaseQueryResult {
      my $self = shift;
      my $result_id = shift;
     
      my $req = RPC::XML::request->new("releaseQueryResult", $result_id);
      $self->__process($req);
    }
     
    ######################
    sub getXML {
      my $self = shift;
      my $xquery = shift;
      my $howmany = shift;
      my $start = shift;
     
      my $req = RPC::XML::request->new(
                  "query",
                  RPC::XML::base64->new($xquery),
                  $howmany,
                  $start,
                  $self->{OPTIONS}
                );
      my $response = $self->__process($req);
     
      return $response->value;
    }
     
    ###############################################################################
    ## Méthodes de communication evec eXist: gestion de documents et collections
    ###############################################################################
    sub createCollection {
      my $self = shift;
      my $name = shift;
     
      my $req = RPC::XML::request->new(
                  "createCollection",
                  $name,
                );
     
      my $response = $self->__process($req);
     
      return $response->value;
    }
     
    ######################
    sub removeCollection {
      my $self = shift;
      my $name = shift;
     
      my $req = RPC::XML::request->new(
                  "removeCollection",
                  $name
                );
     
      my $response = $self->__process($req);
     
      return $response->value;
    }
     
    ######################
    sub parseFile {
      my $self = shift;
      my $fileName = shift;
      my $docName;
      if (@_) { $docName = shift; }
      else { die "eXist module: method parseFile: YOU MUST SPECIFY A DOCUMENT NAME!!! (or eXist will totaly crash!)"; }
      my $overwrite = (@_) ? shift : 0;
     
      open (XMLFILE, "<:encoding(ISO-8859-1)", $fileName);
     
      my $XMLstring;
     
      <XMLFILE>; # to skip the encoding declaration...
      my $XMLstring .= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
     
      while (<XMLFILE>) {
        $XMLstring .= Encode::encode('utf8', $_);
      }
      #print $XMLstring;
     
      my $req = RPC::XML::request->new(
                  "parse",
                  $XMLstring,
                  $docName,
                  $overwrite
                );
     
      close(XMLFILE);
     
      my $response = $self->__process($req);
     
      return $response->value;
    }
     
    ###################
    sub getDocument {
      my $self = shift;
      my $name = shift;
     
      my $req = RPC::XML::request->new(
                  "getDocument",
                  $name,
                  $self->{OPTIONS}
                );
     
      my $response = $self->__process($req);
     
      return $response->value;
    }
     
    ###################
    sub removeDocument {
      my $self = shift;
      my $name = shift;
     
      my $req = RPC::XML::request->new(
                  "remove",
                  $name
                );
     
      my $response = $self->__process($req);
     
      return $response->value;
    }
     
    #####################
    sub listCollections {
      my $self = shift;
      my $resource = shift;
     
     
     
      my $req = RPC::XML::request->new(
                  "getCollectionDesc",
                  $resource
                );
     
      my $response = $self->__process($req);
      my @respCollections = @{$response->{collections}};
     
      # copy all the collections in an array:
      my @collections = ();
      foreach(@respCollections) {
        push(@collections, $_->value());
      }
     
      return @collections;
    }
     
    #####################
    sub listDocuments {
      my $self = shift;
      my $resource = shift;
     
      my $req = RPC::XML::request->new(
                  "getCollectionDesc",
                  $resource
                );
     
      my $response = $self->__process($req);
      my @respDocuments = @{$response->{documents}};
     
      # copy all the documents in an array:
      my @documents = ();
      foreach(@respDocuments) {
        my %doc = %{$_->value()};
        push(@documents, %doc->{name});
      }
     
      return @documents;
    }
     
    #####################
    sub listCollsAndDocs {
      my $self = shift;
      my $resource = shift;
     
      my $req = RPC::XML::request->new(
                  "getCollectionDesc",
                  $resource
                );
     
      my $response = $self->__process($req);
      my @respCollections = @{$response->{collections}};
      my @respDocuments = @{$response->{documents}};
     
      # copy all the collections in an array:
      my @collections = ();
      foreach(@respCollections) {
        push(@collections, $_->value());
      }
     
      # copy all the documents in an array:
      my @documents = ();
      foreach(@respDocuments) {
        my %doc = %{$_->value()};
        push(@documents, %doc->{name});
      }
     
      return (\@collections, \@documents);
    }
     
    #####################
    sub browse {
      my $self = shift;
      my $resource = shift;
     
     
      # if $resource is a doc, return this doc:
      if ($resource =~ /.*\.xml/) {
        return ($resource);
      }
     
      # browse the collection:
      my @documents;
      my @collections = ($resource);
     
      while (@collections) {
        my $current_coll = shift(@collections);
        my $ref_colls;
        my $ref_docs;
        ($ref_colls,$ref_docs) = $self->listCollsAndDocs($current_coll);
     
        foreach(@{$ref_colls}) {
          push(@collections, "$current_coll/$_");
        }
        foreach(@{$ref_docs}) {
          push(@documents, "$current_coll/$_");
        }
      }
     
      return @documents;
    }
     
    ###############################################################################
    ## Méthodes d'accès
    ###############################################################################
    sub url {
      my $self = shift;
      return $self->{URL};
    }
     
     
    ###############################################################################
    ## Méthodes privées
    ###############################################################################
    sub __process {
      my $self = shift;
      my $request = shift;
     
      #print "$request\n";
     
      my $response = $self->{CLIENT}->send_request($request);
      #print "$response\n";
      if ($response->is_fault()) {
        die "*** eXist's class: An error occurred: " . $response->string . "***\n";
      }
     
      return $response;
    }
     
    ###############################################################################
    1; ## Ainsi le 'require' ou le 'use' réussi !!

    emission.pm
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
     
    package emission;
     
    use strict;
    use eXist;
    use sequence;
     
    ###############################################################################
    ## Constructeur:
    ###############################################################################
    sub new {
      my $class = shift;
      my $con = shift;
     
      my $self = {};
     
      #$self->{EXIST} = new eXist("http://rtbf:rtbf\@localhost:8080/exist/xmlrpc");
      $self->{EXIST} = $con;
      print "$con\n";
      foreach (keys %{$con}) {
        print "$_ => " . $con->{$_} . "\n";
      }
     
      bless($self,$class);
      $self->__initialize();
     
      return $self;
    }
     
    ##################
    sub __initialize {
      my $self = shift;
     
    }
     
     
    ###############################################################################
    ## Méthodes publiques
    ###############################################################################
    sub parse {
      my $self = shift;
      my $document = (@_) ? shift : "";
     
      if ($document !~ /.*\.xml/) {
        die ("*** emission class: parse: You must specify an xml document. ***")
      }
     
      my $resource = "doc(\"$document\")/emission";
     
      $self->{REFERENCE} = $self->getReference($resource);
      $self->{CODEARCH} = $self->getCodeArch($resource);
      $self->{TITRE} = $self->getTitre($resource);
      $self->{SOUSTITRE} = $self->getSousTitre($resource);
      $self->{CENTREPRODUCTION} = $self->getCentreProduction($resource);
      $self->{DUREE} = $self->getDuree($resource);
      $self->{REFNETIA} = $self->getRefNetia($resource);
      $self->{DIFFUSION} = $self->getDiffusion($resource);
      $self->{HISTO} = $self->getHisto($resource);
      $self->{MEDIA} = $self->getMedia($resource);
      $self->{SEQUENCES} = $self->getSequences($resource);
     
      foreach (@{$self->{SEQUENCES}}) {
        print "$_\n";
        my $seq = new sequence();
        $seq->parse($document, $_);
      }
     
      $self->print();
    }
     
    ##############
    sub print {
      my $self = shift;
     
      foreach (keys %{$self}) {
        print "$_ => " . $self->{$_} . "\n";
      }
     
      my %dif = %{$self->{DIFFUSION}};
      print "DIFFUSION:\n";
      foreach (keys %dif) {
        print "  $_ => " . %dif->{$_} . "\n";
      }
     
      my %histo = %{$self->{HISTO}};
      print "HISTO:\n";
      foreach (keys %histo) {
        print "  $_ => " . %histo->{$_} . "\n";
      }
     
      my %media = %{$self->{MEDIA}};
      print "MEDIA:\n";
      foreach (keys %media) {
        print "  $_ => " . %media->{$_} . "\n";
      }
     
      my @sequences = @{$self->{SEQUENCES}};
      foreach (@sequences) {
        print "$_\n";
      }
    }
     
    ###################
    sub getReference {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
    let \$reference := 
      if (\$emission/reference and \$emission/reference ne "")
      then data(\$emission/reference)
      else "-NULL-"
    return \$reference
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      if (@res >= 1) {return $res[0];}
      else {return ""}
    }
     
    ###################
    sub getCodeArch {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
    let \$codearch := 
      if (\$emission/code-arch and \$emission/code-arch ne "")
      then data(\$emission/code-arch)
      else "-NULL-"
    return \$codearch
    END
     
      my @res = $self->__executeQuery($XQuery);
      if (@res >= 1) {return $res[0];}
      else {return ""}
    }
     
    ###################
    sub getTitre {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
    let \$titre := 
      if (\$emission/titre and \$emission/titre ne "")
      then data(\$emission/titre)
      else "-NULL-"
    return \$titre
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      if (@res >= 1) {return $res[0];}
      else {return ""}
    }
     
    ###################
    sub getSousTitre {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
    let \$soustitre := 
      if (\$emission/sous-titre and \$emission/sous-titre ne "")
      then data(\$emission/sous-titre)
      else "-NULL-"
    return \$soustitre
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      if (@res >= 1) {return $res[0];}
      else {return ""}
    }
     
    ###################
    sub getCentreProduction {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
    let \$centreprod := 
      if (\$emission/centre-production and \$emission/centre-production ne "")
      then data(\$emission/centre-production)
      else "-NULL-"
    return \$centreprod
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      if (@res >= 1) {return $res[0];}
      else {return ""}
    }
     
    ###################
    sub getDuree {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
    let \$duree := 
      if (\$emission/duree and \$emission/duree ne "")
      then data(\$emission/duree)
      else "-NULL-"
    return \$duree
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      if (@res >= 1) {return $res[0];}
      else {return ""}
    }
     
    ###################
    sub getRefNetia {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
    let \$refnetia := 
      if (\$emission/ref-netia and \$emission/ref-netia ne "")
      then data(\$emission/ref-netia)
      else "-NULL-"
    return \$refnetia
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      if (@res >= 1) {return $res[0];}
      else {return ""}
    }
     
    ###################
    sub getDiffusion {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
     
    let \$NULL := "-NULL-"
     
    let \$diffusion := \$emission/diffusion
     
    let \$chaine := 
      if (\$diffusion/chaine and \$diffusion/chaine ne "")
      then data(\$diffusion/chaine)
      else \$NULL
     
    let \$date := 
      if (\$diffusion/date and \$diffusion/date ne "")
      then data(\$diffusion/date)
      else \$NULL
     
    return 
      (\$chaine, \$date)
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      my $dif = {
                CHAINE => $res[0],
                DATE => $res[1]
                };
     
      return $dif;
    }
     
    ###################
    sub getHisto {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
     
    let \$NULL := "-NULL-"
     
    let \$histo := \$emission/diffusion
     
    let \$date := 
      if (\$histo/date and \$histo/date ne "")
      then data(\$histo/date)
      else \$NULL
     
    let \$qui := 
      if (\$histo/qui and \$histo/qui ne "")
      then data(\$histo/qui)
      else \$NULL
     
    let \$quoi := 
      if (\$histo/quoi and \$histo/quoi ne "")
      then data(\$histo/quoi)
      else \$NULL
     
    return 
      (\$date, \$qui, \$quoi)
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      my $histo = {
                DATE => $res[0],
                QUI => $res[1],
                QUOI => $res[1]
                };
     
      return $histo;
    }
     
    ###################
    sub getMedia {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$emission in $resource
     
    let \$NULL := "-NULL-"
     
    let \$media := \$emission/media
     
    let \$refson := 
      if (\$media/ref-son and \$media/ref-son ne "")
      then data(\$media/ref-son)
      else \$NULL
     
    let \$plage := 
      if (\$media/plage and \$media/plage ne "")
      then data(\$media/plage)
      else \$NULL
     
    return 
      (\$refson, \$plage)
    END
     
      my @res = $self->__executeQuery($XQuery);
     
      my $media = {
                REFSON => $res[0],
                PLAGE => $res[1]
                };
     
      return $media;
    }
     
    #################
    sub getSequences {
      my $self = shift;
      my $resource = (@_) ? shift : "";
     
      my $XQuery = <<END;
    for \$sequence in $resource//sequence
     
    let \$NULL := "-NULL-"
     
    let \$numero :=
      if (\$sequence/numero and \$sequence/numero ne "")
      then data(\$sequence/numero)
      else \$NULL
     
    return
      (\$numero)
    END
     
      my @sequences = $self->__executeQuery($XQuery);
     
      return \@sequences;
     
    }
     
    ###############################################################################
    ## Méthodes de vérification des différents champs:
    ###############################################################################
    sub checkReference {
      my $self = shift;
     
      if ($self->{REFERENCE} eq "-NULL-") {
        return 0;
      }
     
      my $date = "[0-9]{4}\/[0-9]{2}\/[0-9]{2}";
      my $time =  "[012][0-9][0-5][0-9]";
      my $codearch = "F$time";
      my $num = "[0-9]{4}";
     
      if ($self->{REFERENCE} !~ /$date-$time$codearch$num/) {
        return 0;
      }
     
      return 1;
    }
     
    ###############################################################################
    ## Méthodes privées
    ###############################################################################
    sub __executeQuery {
      my $self = shift;
      my $XQuery = shift;
     
      my $result_id = $self->{EXIST}->execute($XQuery);
      my @res = $self->{EXIST}->retrieve($result_id);
      $self->{EXIST}->releaseQueryResult($result_id);
     
      return @res;
    }
     
    ###############################################################################
    1;

    essai_emission.pl
    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
    21
     
    #!/usr/bin/env perl
     
    use strict;
    use eXist;
    use emission;
     
    my $URL = "http://rtbf:rtbf\@localhost:8080/exit/xmlrpc";
     
    my $con = new eXist($URL);
    print "$con\n";
    foreach (keys %{$con}) {
      print "$_ => " . $con->{$_} . "\n";
    }
     
    my $doc = new emission($con);
     
    my $ressource = "/db/rtbf/toParse/2004/03/8h00/03_10-0800F08000015.xml";
    print "$ressource\n";
    $doc->parse($ressource);
    print $doc->checkReference() . "\n";

    sortie de essai_emission.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    eXist=HASH(0x814bc28)
    URL => http://rtbf:rtbf@localhost:8080/exit/xmlrpc
    OPTIONS => RPC::XML::struct=HASH(0x8225308)
    CLIENT => RPC::XML::Client=HASH(0x846bdac)
    eXist=HASH(0x814bc28)
    URL => http://rtbf:rtbf@localhost:8080/exit/xmlrpc
    OPTIONS => RPC::XML::struct=HASH(0x8225308)
    CLIENT => RPC::XML::Client=HASH(0x846bdac)
    /db/rtbf/toParse/2004/03/8h00/03_10-0800F08000015.xml
    Can't locate object method "is_fault" via package "RPC::XML::Client::send_request:
    HTTP server error: %2Fexit%2Fxmlrpc+Not+Found" (perhaps you forgot to load
    "RPC::XML::Client::send_request: HTTP server error: 
    %2Fexit%2Fxmlrpc+Not+Found"?) at eXist.pm line 360.
    Fichiers attachés Fichiers attachés

  7. #7
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Erf, je suis à cours d'idée...

    Je suppose que tu as essayé d'appeler une autre méthode que is_fault() sur $response (méthode du package XML::RPC), et que ça ne passe pas ?

    par curiosité, que donne le module Data:: Dumper (sans espace, mais sinon le forum me met un smiley) sur ton objet $response ?
    En gros, avant d'appeler is_fault, essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print Dumper($response)."\n";
    En n'oubliant pas le use Data:: Dumper bien évidemment.
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut Merci !!
    Je ne connaissais pas le Dumper (ça fait seulement 3 semaines que je programme en Perl)

    en Dumpant ma variable response, je me suis rendu compte qu'en fait j'avais tout simplement fait une faute d'hortographe dans l'hyperlien dans essai_emission.pl.

    évidemment je n'aurais jamais penser à regarder là !! Merci encore

  9. #9
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut


    C'est quand j'attend le moins de trouver une réponse que je la trouve, je suis trop fort !

    En tout cas, pour un gars qui ne programme en Perl que depuis trois semaine, tu es bon.

    N'oublie pas le tag résolu
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

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

Discussions similaires

  1. passer un objet en tant qu'argument dans la ligne de commande
    Par skoobi dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2014, 22h42
  2. Passage d'objet en argument d'une procedure
    Par richton95 dans le forum Général VBA
    Réponses: 2
    Dernier message: 15/07/2010, 17h17
  3. passage d'objet en argument
    Par leprofmelo dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 06/06/2008, 16h19
  4. [POO] Calendrier et passage d' objet en parametre
    Par julienr dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/11/2007, 22h18
  5. [ JSP ][ Débutant ] Passage d'objet par un forward
    Par captainpouet dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/04/2004, 10h33

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