home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _ad96c79e8e42b75f7ae771bf698af053 < prev    next >
Text File  |  2000-03-15  |  32KB  |  683 lines

  1. package PPM::SOAPServer;
  2.  
  3. ###############################################################################
  4. # Required inclusions.
  5. ###############################################################################
  6. use strict;                         # Activate compile-time syntax checking
  7. use XML::Parser;                    # Needed for parsing XML documents
  8. use XML::RepositorySummary;         # Needed for XML structure of repository
  9.  
  10. ###############################################################################
  11. # Get our version number out of the CVS revision number.
  12. ###############################################################################
  13. use vars qw( $VERSION );
  14. $VERSION = do { my @r = q$Revision: 1.1 $ =~ /\d+/g; sprintf '%d.'.'%02d'x$#r, @r };
  15.  
  16. ###############################################################################
  17. # Package-wide variables.
  18. ###############################################################################
  19.     ###########################################################################
  20.     # Specify the location of the XML file containing the listing of all of the
  21.     # packages in the repository.
  22.     ###########################################################################
  23. my $REPOSITORY_DATA = './package.lst';
  24.     ###########################################################################
  25.     # Pre-loaded copy of the repository information.
  26.     ###########################################################################
  27. my $REPOSITORY_INFO = undef;
  28.  
  29. ###############################################################################
  30. # Subroutine:   new ()
  31. ###############################################################################
  32. # Instantiates a new PPM::SOAPServer object, returning a reference to the newly
  33. # created object to the caller.  During instantiation, we also read in a full
  34. # copy of the information held within the repository so that we can run queries
  35. # against it later.
  36. ###############################################################################
  37. sub new ()
  38. {
  39.     my $class = shift;
  40.     my $self  = {};
  41.     bless $self, $class;
  42.  
  43.     ###########################################################################
  44.     # Load up the information about the contents of the repository.
  45.     ###########################################################################
  46.     _loadRepository();
  47.  
  48.     ###########################################################################
  49.     # All done, return a reference to the newly create object to the caller.
  50.     ###########################################################################
  51.     return $self;
  52. }
  53.  
  54. ###############################################################################
  55. # Subroutine:   handle_request ($hdrs, $body, $envelope)
  56. # Parameters:   $hdrs       - Listref of provided headers
  57. #               $body       - Hashref of body of response to send
  58. #               $envelope   - Reference to envelope maker to use to package up
  59. #                             the SOAP response
  60. ###############################################################################
  61. # Handles the complete request provided through the SOAP interface.  This
  62. # method determines which method is to be invoked and calls off to that method
  63. # to generate the response which is to be returned to the caller.  Once the
  64. # response has been generated, we stuff this back into the envelope so that it
  65. # can be returned via the SOAP server.
  66. ###############################################################################
  67. sub handle_request ($$$)
  68. {
  69.     my ($self, $hdrs, $body, $envelope) = @_;
  70.  
  71.     ###########################################################################
  72.     # Figure out which method to invoke, and whether or not we can actually
  73.     # invoke that type of method on ourselves.  If we can't invoke the
  74.     # requested method, throw an error back.
  75.     ###########################################################################
  76.     my $fcn_name = $body->{'soap_typename'};
  77.     my $function = $self->can( $fcn_name );
  78.  
  79.     if (!defined $function)
  80.     {
  81.         die "Method '$fcn_name' is not defined for this class.\n";
  82.     }
  83.  
  84.     ###########################################################################
  85.     # We now know that we actually can invoke the requested method on
  86.     # ourselves.  Call off to the method to get a hashref containing the return
  87.     # value, stick that into the body, and then send a response back to the
  88.     # client.
  89.     ###########################################################################
  90.     my $return;
  91.     $return = $self->$function( $body );
  92.     $body->{'return'} = $return;
  93.     $envelope->set_body( undef, $fcn_name, 0, $body );
  94. }
  95.  
  96. ###############################################################################
  97. # Subroutine:   version ()
  98. ###############################################################################
  99. # Returns to the caller the version number of the SOAP server that is running.
  100. ###############################################################################
  101. sub version ()
  102. {
  103.     my ($self) = @_;
  104.     return { 'num_results' => 1, 'result_1' => $VERSION };
  105. }
  106.  
  107. ###############################################################################
  108. # Subroutine:   searchAbstract ($params)
  109. # Parameters:   $params     - Hashref of parameters to search with
  110. # Returns:      $results    - Hashref of results
  111. ###############################################################################
  112. # Searches against the 'ABSTRACT' field within the packages held in the
  113. # repository.  Within the given parameters, a key of "search" should be
  114. # provided containing the term to search for (which can be a regex).  If no
  115. # "search" key is provided, a complete list of all of the packages are returned
  116. # to the caller.
  117. #
  118. # The return value provided from this method will be a reference to a hash
  119. # containing the result set.  A key named "num_results" will be provided,
  120. # stating the number of results to be found in the result set.  Each item in
  121. # the result set will be named "result_???" where '???' is the number of that
  122. # item in the result set.  For example, a search returning two results would
  123. # return a reference to a hash with keys of 'num_results', 'result_1', and
  124. # 'result_2'.
  125. ###############################################################################
  126. sub searchAbstract
  127. {
  128.     my ($self, $params) = @_;
  129.     my $field  = 'ABSTRACT';
  130.     my $search = $params->{'search'};
  131.     return $self->_search( $field, $search );
  132. }
  133.  
  134. ###############################################################################
  135. # Subroutine:   searchAuthor ($params)
  136. # Parameters:   $params     - Hashref of parameters to search with
  137. # Returns:      $results    - Hashref of results
  138. ###############################################################################
  139. # Searches against the 'AUTHOR' field within the packages held in the
  140. # repository.  Within the given parameters, a key of "search" should be
  141. # provided containing the term to search for (which can be a regex).  If no
  142. # "search" key is provided, a complete list of all of the packages are returned
  143. # to the caller.
  144. #
  145. # The return value provided from this method will be a reference to a hash
  146. # containing the result set.  A key named "num_results" will be provided,
  147. # stating the number of results to be found in the result set.  Each item in
  148. # the result set will be named "result_???" where '???' is the number of that
  149. # item in the result set.  For example, a search returning two results would
  150. # returns a reference to a hash with keys of 'num_results', 'result_1', and
  151. # 'result_2'.
  152. ###############################################################################
  153. sub searchAuthor
  154. {
  155.     my ($self, $params) = @_;
  156.     my $field  = 'AUTHOR';
  157.     my $search = $params->{'search'};
  158.     return $self->_search( $field, $search );
  159. }
  160.  
  161. ###############################################################################
  162. # Subroutine:   searchTitle ($params)
  163. # Parameters:   $params     - Hashref of parameters to search with
  164. # Returns:      $results    - Hashref of results
  165. ###############################################################################
  166. # Searches against the 'TITLE' field within the packages held in the
  167. # repository.  Within the given parameters, a key of "search" should be
  168. # provided containing the term to search for (which can be a regex).  If no
  169. # "search" key is provided, a complete list of all of the packages are returned
  170. # to the caller.
  171. #
  172. # The return value provided from this method will be a reference to a hash
  173. # containing the result set.  A key named "num_results" will be provided,
  174. # stating the number of results to be found in the result set.  Each item in
  175. # the result set will be named "result_???" where '???' is the number of that
  176. # item in the result set.  For example, a search returning two results would
  177. # returns a reference to a hash with keys of 'num_results', 'result_1', and
  178. # 'result_2'.
  179. ###############################################################################
  180. sub searchTitle
  181. {
  182.     my ($self, $params) = @_;
  183.     my $field  = 'TITLE';
  184.     my $search = $params->{'search'};
  185.     return $self->_search( $field, $search );
  186. }
  187.  
  188. ###############################################################################
  189. # Subroutine:   search ($params)
  190. # Parameters:   $params     - Hashref of parameters to search with
  191. # Returns:      $results    - Hashref of results
  192. ###############################################################################
  193. # Searches against _all_ of the fields within the packages held in the
  194. # repository.  Within the given parameters, a key of "search" should be
  195. # provided containing the term to search for (which can be a regex).  If no
  196. # "search" key is provided, a complete list of all of the packages are returned
  197. # to the caller.
  198. #
  199. # The return value provided from this method will be a reference to a hash
  200. # containing the result set.  A key named "num_results" will be provided,
  201. # stating the number of results to be found in the result set.  Each item in
  202. # the result set will be named "result_???" where '???' is the number of that
  203. # item in the result set.  For example, a search returning two results would
  204. # returns a reference to a hash with keys of 'num_results', 'result_1', and
  205. # 'result_2'.
  206. ###############################################################################
  207. sub search
  208. {
  209.     my ($self, $params) = @_;
  210.     my $search = $params->{'search'};
  211.     return $self->_search( undef, $search );
  212. }
  213.  
  214. ###############################################################################
  215. # Subroutine:   packages ()
  216. ###############################################################################
  217. # Generates a list of all of the packages currently available in the
  218. # repository.
  219. #
  220. # The return value provided from this method will be a reference to a hash
  221. # containing the result set.  A key named "num_results" will be provided,
  222. # stating the number of results to be found in the result set.  Each item in
  223. # the result set will be named "result_???" where '???' is the number of that
  224. # item in the result set.  For example, a repository with two packages in it
  225. # would return a reference to a hash with keys of 'num_results', 'result_1',
  226. # and 'result_2'.
  227. ###############################################################################
  228. sub packages ()
  229. {
  230.     my ($self) = @_;
  231.     my $results;
  232.     my $counter = 0;
  233.     my $root = $REPOSITORY_INFO;
  234.  
  235.     ###########################################################################
  236.     # Iterate through all of the packages within the repository, adding all of
  237.     # the names of the packages to our result set.
  238.     ###########################################################################
  239.     foreach my $pkg (@{$root->{'Kids'}})
  240.     {
  241.         if (exists $pkg->{'NAME'})
  242.         {
  243.             $counter ++;
  244.             my $key = 'result_' . $counter;
  245.             $results->{$key}{'NAME'} = $pkg->{'NAME'};
  246.         }
  247.     }
  248.  
  249.     ###########################################################################
  250.     # All done, add in the total number of items in the result set and return
  251.     # it to the caller.
  252.     ###########################################################################
  253.     $results->{'num_results'} = $counter;
  254.     return $results;
  255. }
  256.  
  257. ###############################################################################
  258. # Subroutine:   fetch_ppd ($params)
  259. ###############################################################################
  260. # Fetches the PPD from our package list for a specific package.  The parameters
  261. # provided should include a key named 'package', which is the name of the
  262. # package for which we wish to fetch the PPD for.  This method returns to the
  263. # caller a hash reference containing the matching results.  A key named
  264. # "num_results" will be present stating the number of matching results (either
  265. # 0 or 1).  If a PPD has been found for the requested package, a key of
  266. # "result_1" will also be present, whose value will be the full contents of the
  267. # PPD file (in XML format) as a scalar value.
  268. ###############################################################################
  269. sub fetch_ppd ($)
  270. {
  271.     my ($self, $params) = @_;
  272.     my $package = $params->{'package'};
  273.  
  274.     ###########################################################################
  275.     # Iterate through the package list to find the one we're looking for.
  276.     ###########################################################################
  277.     my $root = $REPOSITORY_INFO;
  278.     foreach my $pkg (@{$root->{'Kids'}})
  279.     {
  280.         if (exists $pkg->{'NAME'})
  281.         {
  282.             if ($pkg->{'NAME'} eq $package)
  283.             {
  284.                 my $ppd = $self->_xml_escape( $pkg->as_text() );
  285.                 return { 'num_results' => 1,
  286.                          'result_1'    => $ppd };
  287.             }
  288.         }
  289.     }
  290.  
  291.     ###########################################################################
  292.     # Didn't find the PPD that we were looking for, return an empty result set.
  293.     ###########################################################################
  294.     return { 'num_results' => 0 };
  295. }
  296.  
  297. ###############################################################################
  298. # Subroutine:   fetch_summary ()
  299. ###############################################################################
  300. # Fetches a summary of the entire contents of the repository.  This method
  301. # returns to the caller a reference to a hash containing the following keys:
  302. # 'num_results', 'result_1'.  The value of the 'result_1' key is the full
  303. # contents of the repository summary file (in XML format) as a scalar value.
  304. ###############################################################################
  305. sub fetch_summary ()
  306. {
  307.     my ($self) = @_;
  308.     my $root = $REPOSITORY_INFO;
  309.     my $content = $self->_xml_escape( $root->as_text() );
  310.     return { 'num_results' => 1, 'result_1' => $content };
  311. }
  312.  
  313. ###############################################################################
  314. # Subroutine:   _xml_escape ($val)
  315. # Parameters:   $val        - Value to escape
  316. # Returns:      $escaped    - Escaped version of '$val'
  317. ###############################################################################
  318. # INTERNAL METHOD.  Cheap little function to escape out most of the things in
  319. # the value we're passing back so that its at least "clean".  This should
  320. # really be using some sort of XML::Entities module to do the conversion,
  321. # though; I've just hacked this together because these are the things that I
  322. # encountered.
  323. ###############################################################################
  324. sub _xml_escape ($)
  325. {
  326.     my ($self, $val) = @_;
  327.     $val =~ s/&/&/go;
  328.     $val =~ s/</</go;
  329.     $val =~ s/>/>/go;
  330.     return $val;
  331. }
  332.  
  333. ###############################################################################
  334. # Subroutine:   _search ($field, $search)
  335. # Parameters:   $field      - Field within package description to search
  336. #               $search     - Term to search for
  337. # Returns:      $results    - Hashref of results
  338. ###############################################################################
  339. # INTERNAL METHOD.  Does a general search against the fields present for a
  340. # package within the repository, searching for a specific term (which could be
  341. # a regex).  If no '$field' value is provided, this method searches through
  342. # _all_ of the fields present for a given package.  If no '$search' value is
  343. # provided, '.*' is deemed to be the matching regex (everything).
  344. #
  345. # The return value provided from this method will be a reference to a hash
  346. # containing the result set.  A key named "num_results" will be provided,
  347. # stating the number of results to be found in the result set.  Each item in
  348. # the result set will be named "result_???" where '???' is the number of that
  349. # item in the result set.  For example, a search returning two results would
  350. # returns a reference to a hash with keys of 'num_results', 'result_1', and
  351. # 'result_2'.
  352. ###############################################################################
  353. sub _search ($$)
  354. {
  355.     my ($self, $field, $search) = @_;
  356.     my $results;
  357.     my $counter = 0;
  358.  
  359.     ###########################################################################
  360.     # If we weren't given field/search values, use defaults instead.
  361.     ###########################################################################
  362.     $field  = '.*' if ((!defined $field)  || ($field eq ''));
  363.     $search = '.*' if ((!defined $search) || ($search eq ''));
  364.  
  365.     ###########################################################################
  366.     # Get a handle to the root of the repositories XML information so that we
  367.     # can search against it.
  368.     ###########################################################################
  369.     my $root = $REPOSITORY_INFO;
  370.  
  371. # UNFINISHED -> Should facilitate "what if no packages in the repository?"
  372.  
  373.     ###########################################################################
  374.     # Iterate through all of the packages within the repository...
  375.     ###########################################################################
  376.    PKG:
  377.     foreach my $pkg (@{$root->{'Kids'}})
  378.     {
  379.        PKGFIELD:
  380.         foreach my $pkgfield (@{$pkg->{'Kids'}})
  381.         {
  382.             ###################################################################
  383.             # Skip this field if its not the field type we're searching.
  384.             ###################################################################
  385.             my $type = ref($pkgfield);
  386.             $type =~ s/.*:://go;
  387.             next PKGFIELD if ($type eq 'Characters');
  388.             next PKGFIELD if ($type !~ /$field/i);
  389. # UNFINISHED -> Doing a 'content()' on 'IMPLEMENTATION' elements blows up.
  390. #               Cause of problem should be identified and fixed prior to final
  391. #               release.
  392. next PKGFIELD if ($type eq 'IMPLEMENTATION');
  393.  
  394.             ###################################################################
  395.             # Skip this field if the content doesn't match the search term.
  396.             ###################################################################
  397.             my $val = $pkgfield->content();
  398.             next PKGFIELD if ($val !~ /$search/);
  399.  
  400.             ###################################################################
  401.             # Add this package to the result set and go onto the next package.
  402.             ###################################################################
  403.             $counter ++;
  404.             $results->{ "result_$counter" } = $self->_pkginfo( $pkg );
  405.             next PKG;
  406.         }
  407.     }
  408.  
  409.     ###########################################################################
  410.     # Add in the total number of results into the information we're returning,
  411.     # and return the info to the caller.
  412.     ###########################################################################
  413.     $results->{ 'num_results' } = $counter;
  414.     return $results;
  415. }
  416.  
  417. ###############################################################################
  418. # Subroutine:   _pkginfo ($package)
  419. # Parameters:   $package        - Hashref of XML package information
  420. # Returns:      $pkginfo        - Hashref of pertinent package info
  421. ###############################################################################
  422. # INTERNAL METHOD.  Takes the XML object representation of a package and turns
  423. # it into a single hash reference containing only select portions of the
  424. # package information.  This hash reference is then returned to the caller.
  425. ###############################################################################
  426. sub _pkginfo ($)
  427. {
  428.     my ($self, $package) = @_;
  429.     my $pkginfo;
  430.  
  431.     ###########################################################################
  432.     # Add in the name and version number of the package.
  433.     ###########################################################################
  434.     $pkginfo->{'NAME'}    = $package->{'NAME'};
  435.     $pkginfo->{'VERSION'} = $package->{'VERSION'};
  436.  
  437.     ###########################################################################
  438.     # Iterate through the various fields in the package, adding their
  439.     # information into the package info we're going to return.
  440.     ###########################################################################
  441.     foreach my $field (@{$package->{'Kids'}})
  442.     {
  443.         my $type = ref($field);
  444.         $type =~ s/.*:://go;
  445.  
  446.         $pkginfo->{'TITLE'}    = $field->content() if ($type eq 'TITLE');
  447.         $pkginfo->{'ABSTRACT'} = $field->content() if ($type eq 'ABSTRACT');
  448.         $pkginfo->{'AUTHOR'}   = $field->content() if ($type eq 'AUTHOR');
  449.     }
  450.  
  451.     ###########################################################################
  452.     # All done, return the hashref to the caller.
  453.     ###########################################################################
  454.     return $pkginfo;
  455. }
  456.  
  457. ###############################################################################
  458. # Subroutine:   _loadRepository ()
  459. ###############################################################################
  460. # INTERNAL METHOD.  Loads up information about the contents of the repository,
  461. # stuffing them into the global namespace.  If the repository has already been
  462. # loaded, this method simply returns without doing anything.  NOTE, that this
  463. # method is _NOT_ an instance method; it's a package method.
  464. ###############################################################################
  465. sub _loadRepository ()
  466. {
  467.     ###########################################################################
  468.     # If the repository has already been loaded, don't bother to do anything.
  469.     ###########################################################################
  470.     return if (defined $REPOSITORY_INFO);
  471.  
  472.     ###########################################################################
  473.     # Create a new XML parser to read in the repository summary
  474.     ###########################################################################
  475.     my $parser = new XML::Parser( 'Style' => 'Objects',
  476.                                   'Pkg'   => 'XML::RepositorySummary' );
  477.  
  478.     ###########################################################################
  479.     # Read in the entire repository.
  480.     ###########################################################################
  481.     my $rc   = $parser->parsefile( $REPOSITORY_DATA );
  482.     $REPOSITORY_INFO = $rc->[0];
  483. }
  484.  
  485. 1;
  486. __END__;
  487.  
  488. ###############################################################################
  489. # POD Documentation
  490. ###############################################################################
  491.  
  492. =head1 NAME
  493.  
  494. PPM::SOAPServer - SOAP server for PPM repository
  495.  
  496. =head1 SYNOPSIS
  497.  
  498.   use SOAP::Transport::HTTP::CGI;
  499.   my $safe_classes = {
  500.     'PPM::SOAPServer' => undef,
  501.     };
  502.   SOAP::Transport::HTTP::CGI->handler( $safe_classes );
  503.  
  504. =head1 DESCRIPTION
  505.  
  506. C<PPM::SOAPServer> is a module that provides an implementation of a SOAP
  507. server to hold the PPM repository.  Note that it is not required that you
  508. actually instantiate a copy of the server object yourself; the SOAP modules
  509. will take care of this for you when they instantiate the SOAP server.  All of
  510. the 'search*' methods that are provided by this module are made available
  511. through the SOAP interface and can be accessed through a SOAP client.
  512.  
  513. =head1 METHODS
  514.  
  515. =over 4
  516.  
  517. =item new ()
  518.  
  519. Instantiates a new PPM::SOAPServer object, returning a reference to the
  520. newly created object to the caller. During instantiation, we also read in a
  521. full copy of the information held within the repository so that we can run
  522. queries against it later. 
  523.  
  524. =item handle_request ($hdrs, $body, $envelope)
  525.  
  526. Handles the complete request provided through the SOAP interface. This
  527. method determines which method is to be invoked and calls off to that
  528. method to generate the response which is to be returned to the caller. Once
  529. the response has been generated, we stuff this back into the envelope so
  530. that it can be returned via the SOAP server. 
  531.  
  532. =item version ()
  533.  
  534. Returns to the caller the version number of the SOAP server that is
  535. running. 
  536.  
  537. =item searchAbstract ($params)
  538.  
  539. Searches against the 'C<ABSTRACT>' field within the packages held in the
  540. repository. Within the given parameters, a key of "search" should be
  541. provided containing the term to search for (which can be a regex). If no
  542. "search" key is provided, a complete list of all of the packages are
  543. returned to the caller. 
  544.  
  545. The return value provided from this method will be a reference to a hash
  546. containing the result set. A key named "num_results" will be provided,
  547. stating the number of results to be found in the result set. Each item in
  548. the result set will be named "result_???" where 'C<???>' is the number of
  549. that item in the result set. For example, a search returning two results
  550. would return a reference to a hash with keys of 'C<num_results>',
  551. 'C<result_1>', and 'C<result_2>'. 
  552.  
  553. =item searchAuthor ($params)
  554.  
  555. Searches against the 'C<AUTHOR>' field within the packages held in the
  556. repository. Within the given parameters, a key of "search" should be
  557. provided containing the term to search for (which can be a regex). If no
  558. "search" key is provided, a complete list of all of the packages are
  559. returned to the caller. 
  560.  
  561. The return value provided from this method will be a reference to a hash
  562. containing the result set. A key named "num_results" will be provided,
  563. stating the number of results to be found in the result set. Each item in
  564. the result set will be named "result_???" where 'C<???>' is the number of
  565. that item in the result set. For example, a search returning two results
  566. would returns a reference to a hash with keys of 'C<num_results>',
  567. 'C<result_1>', and 'C<result_2>'. 
  568.  
  569. =item searchTitle ($params)
  570.  
  571. Searches against the 'C<TITLE>' field within the packages held in the
  572. repository. Within the given parameters, a key of "search" should be
  573. provided containing the term to search for (which can be a regex). If no
  574. "search" key is provided, a complete list of all of the packages are
  575. returned to the caller. 
  576.  
  577. The return value provided from this method will be a reference to a hash
  578. containing the result set. A key named "num_results" will be provided,
  579. stating the number of results to be found in the result set. Each item in
  580. the result set will be named "result_???" where 'C<???>' is the number of
  581. that item in the result set. For example, a search returning two results
  582. would returns a reference to a hash with keys of 'C<num_results>',
  583. 'C<result_1>', and 'C<result_2>'. 
  584.  
  585. =item search ($params)
  586.  
  587. Searches against _all_ of the fields within the packages held in the
  588. repository. Within the given parameters, a key of "search" should be
  589. provided containing the term to search for (which can be a regex). If no
  590. "search" key is provided, a complete list of all of the packages are
  591. returned to the caller. 
  592.  
  593. The return value provided from this method will be a reference to a hash
  594. containing the result set. A key named "num_results" will be provided,
  595. stating the number of results to be found in the result set. Each item in
  596. the result set will be named "result_???" where 'C<???>' is the number of
  597. that item in the result set. For example, a search returning two results
  598. would returns a reference to a hash with keys of 'C<num_results>',
  599. 'C<result_1>', and 'C<result_2>'. 
  600.  
  601. =item packages ()
  602.  
  603. Generates a list of all of the packages currently available in the
  604. repository. 
  605.  
  606. The return value provided from this method will be a reference to a hash
  607. containing the result set. A key named "num_results" will be provided,
  608. stating the number of results to be found in the result set. Each item in
  609. the result set will be named "result_???" where 'C<???>' is the number of
  610. that item in the result set. For example, a repository with two packages in
  611. it would return a reference to a hash with keys of 'C<num_results>',
  612. 'C<result_1>', and 'C<result_2>'. 
  613.  
  614. =item fetch_ppd ($params)
  615.  
  616. Fetches the PPD from our package list for a specific package. The
  617. parameters provided should include a key named 'C<package>', which is the
  618. name of the package for which we wish to fetch the PPD for. This method
  619. returns to the caller a hash reference containing the matching results. A
  620. key named "num_results" will be present stating the number of matching
  621. results (either 0 or 1). If a PPD has been found for the requested package,
  622. a key of "result_1" will also be present, whose value will be the full
  623. contents of the PPD file (in XML format) as a scalar value. 
  624.  
  625. =item fetch_summary ()
  626.  
  627. Fetches a summary of the entire contents of the repository. This method
  628. returns to the caller a reference to a hash containing the following keys:
  629. 'C<num_results>', 'C<result_1>'. The value of the 'C<result_1>' key is the
  630. full contents of the repository summary file (in XML format) as a scalar
  631. value. 
  632.  
  633. =item _xml_escape ($val)
  634.  
  635. B<INTERNAL METHOD.> Cheap little function to escape out most of the things
  636. in the value we're passing back so that its at least "clean". This should
  637. really be using some sort of XML::Entities module to do the conversion,
  638. though; I've just hacked this together because these are the things that I
  639. encountered. 
  640.  
  641. =item _search ($field, $search)
  642.  
  643. B<INTERNAL METHOD.> Does a general search against the fields present for a
  644. package within the repository, searching for a specific term (which could
  645. be a regex). If no 'C<$field>' value is provided, this method searches
  646. through _all_ of the fields present for a given package. If no 'C<$search>'
  647. value is provided, 'C<.*>' is deemed to be the matching regex (everything). 
  648.  
  649. The return value provided from this method will be a reference to a hash
  650. containing the result set. A key named "num_results" will be provided,
  651. stating the number of results to be found in the result set. Each item in
  652. the result set will be named "result_???" where 'C<???>' is the number of
  653. that item in the result set. For example, a search returning two results
  654. would returns a reference to a hash with keys of 'C<num_results>',
  655. 'C<result_1>', and 'C<result_2>'. 
  656.  
  657. =item _pkginfo ($package)
  658.  
  659. B<INTERNAL METHOD.> Takes the XML object representation of a package and
  660. turns it into a single hash reference containing only select portions of
  661. the package information. This hash reference is then returned to the
  662. caller. 
  663.  
  664. =item _loadRepository ()
  665.  
  666. B<INTERNAL METHOD.> Loads up information about the contents of the
  667. repository, stuffing them into the global namespace. If the repository has
  668. already been loaded, this method simply returns without doing anything.
  669. NOTE, that this method is _NOT_ an instance method; it's a package method. 
  670.  
  671. =back
  672.  
  673. =head1 AUTHOR
  674.  
  675. Graham TerMarsch (gtermars@home.com)
  676.  
  677. =head1 SEE ALSO
  678.  
  679. L<PPM::SOAPClient>,
  680. L<SOAP>.
  681.  
  682. =cut
  683.