mach        2003/12/10 14:45:19

  Modified:    lib/Apache/AxKit Tag: axkit-pipeline-2 Provider.pm
  Log:
  get_strref only called once on providers. Added get_xml_info
  method. Avoiding calling get_styles when not needed.
  
  Will be moving get_styles from here soon.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.18.2.1  +145 -83   xml-axkit/lib/Apache/AxKit/Provider.pm
  
  Index: Provider.pm
  ===================================================================
  RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Provider.pm,v
  retrieving revision 1.18
  retrieving revision 1.18.2.1
  diff -u -r1.18 -r1.18.2.1
  --- Provider.pm       3 Oct 2003 18:38:38 -0000       1.18
  +++ Provider.pm       10 Dec 2003 22:45:19 -0000      1.18.2.1
  @@ -5,6 +5,7 @@
   
   use Apache::AxKit::Exception;
   use Apache::Constants qw(OK DECLINED);
  +use AxKit;
   
   # use vars qw/$COUNT/;
   
  @@ -130,6 +131,7 @@
           );
   }
   
  +
   sub get_dom {
       my $self = shift;
       require Apache::AxKit::LibXMLSupport;
  @@ -142,21 +144,33 @@
             $XML::LibXML::read_cb, $XML::LibXML::close_cb);
       Apache::AxKit::LibXMLSupport->reset($parser);
       
  +    my $r = $self->apache_request();
  +    
       my $xml_doc;
  -    eval {
  -        my $fh = $self->get_fh();
  -        AxKit::Debug(8, "Provider::get_dom/parse_fh($fh, ", 
$self->{apache}->uri(), ")");
  -        $xml_doc = $parser->parse_fh($fh, $self->{apache}->uri());
  -    };
  -    if ($@) {
  -        use bytes;
  -        my $xmlstring = ${$self->get_strref()};
  -        AxKit::Debug(8, "Provider::get_dom/parse_string($xmlstring, ", 
$self->{apache}->uri(), ")");
  -        $xml_doc = $parser->parse_string($xmlstring, $self->{apache}->uri()) 
|| 
  +    my $str;
  +    if($str = $r->pnotes('xml_string')) {
  +     use bytes;
  +        AxKit::Debug(8, "Provider::get_dom/parse_string($str, ", 
$self->{apache}->uri(), ")");
  +        $xml_doc = $parser->parse_string($str, $self->{apache}->uri()) || 
               throw Apache::AxKit::Exception::Error(
                   -text => "XML::LibXML->parse_string returned nothing!"
                   );
  -    }
  +     } else {    
  +             eval {
  +                     my $fh = $self->get_fh();
  +                     AxKit::Debug(8, "Provider::get_dom/parse_fh($fh, ", 
$self->{apache}->uri(), ")");
  +                     $xml_doc = $parser->parse_fh($fh, 
$self->{apache}->uri());
  +             };
  +             if ($@) {
  +                     use bytes;
  +                     my $xmlstring = ${$self->get_strref()};
  +                     AxKit::Debug(8, 
"Provider::get_dom/parse_string($xmlstring, ", $self->{apache}->uri(), ")");
  +                     $xml_doc = $parser->parse_string($xmlstring, 
$self->{apache}->uri()) || 
  +                             throw Apache::AxKit::Exception::Error(
  +                                     -text => "XML::LibXML->parse_string 
returned nothing!"
  +                                     );
  +             }
  +     }               
       return $xml_doc;
   }
   
  @@ -228,9 +242,7 @@
           undef $pref_style;
       }
   
  -    my $xml_styles = [];
  -    my $vals = [];
  -
  +     my @styles;
       my $key = $self->key();
   
       # need to extract the following from the XML file:
  @@ -238,68 +250,32 @@
       #   DTD filename
       #   Root element name (including namespace)
       # use three element array @$vals
  +     if( $AxKit::Cfg->IfAxAddFooProcessors($media, $pref_style) || ! 
$AxKit::Cfg->IgnoreStylePI()) {
  +     
  +             my ($doctype, $dtd, $root, $xml_styles) = $self->get_xml_info( 
$media, $pref_style );
  +     
  +     foreach my $style (@$xml_styles) {
  +         $style->{title} ||= '#default';
  +     }
  +    
  +     # Let GetMatchingProcessors to process the @$styles array
  +     {
  +       local $^W; # suppress "Use of uninitialized value" warnings
  +       AxKit::Debug(4, "Calling GetMatchingProcessors with ($media, 
$pref_style, $doctype, $dtd, $root)");
  +     }
  +     @styles = $AxKit::Cfg->GetMatchingProcessors($media, $pref_style, 
$doctype, $dtd, $root, $xml_styles, $self);
  +    } else{
  +     {
  +       local $^W; # suppress "Use of uninitialized value" warnings
  +       AxKit::Debug(4, "No AxAdd*Processors detected, bypassing 
get_styles()");
  +       AxKit::Debug(4, "Calling GetMatchingProcessors with ($media, 
$pref_style).");
  +     }
   
  -    if (defined &Apache::AxKit::Provider::xs_get_styles_fh) {
  -        AxKit::Debug(2, "using XS get_styles (libxml2)");
  -        my ($xs_styles, $doctype, $dtd, $root) =
  -                $self->xs_get_styles($media, $pref_style);
  -        @$xml_styles = @$xs_styles unless $AxKit::Cfg->IgnoreStylePI();
  -        @$vals = ($doctype, $dtd, $root);
  -    }
  -    else {
  -        require XML::Parser;
  -
  -        AxKit::Debug(4, "get_styles: creating XML::Parser");
  -
  -        my $handlers = {
  -                    Start => \&parse_start,
  -                    Doctype => \&parse_dtd,
  -                    $AxKit::Cfg->IgnoreStylePI() ? () : (Proc => \&parse_pi),
  -                    };
  -
  -        my $xml_parser = XML::Parser->new(
  -                Namespaces => 1,
  -                ErrorContext => 2,
  -                Handlers => $handlers,
  -            );
  -
  -        my $to_parse;
  -        eval {
  -            $to_parse = $self->get_fh();
  -        };
  -        if ($@) {
  -            $to_parse = ${ $self->get_strref(); };
  -        }
  -        
  -        AxKit::Debug(4, "get_styles: calling XML::Parser->parse('$key')");
  -        $xml_parser->parse(
  -                $to_parse,
  -                XMLStyle_preferred => $pref_style,
  -                XMLStyle_media => $media,
  -                XMLStyle_style => $xml_styles,
  -                XMLStyle_vals => $vals,
  -                XMLStyle_style_screen => [],
  -                );
  -            
  -        AxKit::Debug(4, "get_styles: parse returned successfully");
  -    }
  -    
  -    foreach my $style (@$xml_styles) {
  -        $style->{title} ||= '#default';
  -    }
  +     @styles = $AxKit::Cfg->GetMatchingProcessors($media, $pref_style, 
undef, undef, undef, [], $self);
       
  -    # Let GetMatchingProcessors to process the @$styles array
  -    {
  -      local $^W; # suppress "Use of uninitialized value" warnings
  -      AxKit::Debug(4, "Calling GetMatchingProcessors with ($media, 
$pref_style, $vals->[0], $vals->[1], $vals->[2])");
       }
  -    my @styles = $AxKit::Cfg->GetMatchingProcessors($media,
  -             $pref_style, @$vals[0 .. 2], $xml_styles, $self);
  -    
       if ([EMAIL PROTECTED]) {
  -        throw Apache::AxKit::Exception::Declined(
  -                reason => "No styles defined for '$key'"
  -                );
  +        throw Apache::AxKit::Exception::Declined( reason => "No styles 
defined for '$key'" );
       }
       
       # get mime-type => module mapping
  @@ -331,20 +307,105 @@
       return [EMAIL PROTECTED];
   }
   
  +sub get_xml_info{
  +     my ($self, $media, $pref_style ) = @_;
  +     
  +     # This is where the sniffing of the xml content happens.
  +             
  +     my $r = $self->apache_request();
  +     my @ret;
  +     eval{
  +             my $fh = $self->get_fh();
  +             my $pos = eval { tell $fh; };
  +             if($@) {
  +                     # fh is not seekable, thus we must slurp file at this 
point.
  +                     undef $@;
  +                     local($/) = undef;
  +                     my $string = <$fh>;     
  +                     $r->pnotes('xml_string', $string);
  +                     @ret = parse_xml_info( $r, undef, \$string, $media, 
$pref_style);
  +             } else {
  +                     # seekable.
  +                     @ret = parse_xml_info( $r, $fh, undef, $media, 
$pref_style);
  +                     seek $fh, 0, $pos;
  +             }                       
  +     };
  +     if($@) {
  +             my $str_ref = $self->get_strref();
  +             $r->pnotes('xml_string', ${$str_ref});
  +             @ret = parse_xml_info( $r, undef, $str_ref, $media, 
$pref_style);
  +     }
  +     return @ret;            
  +}
  +
  +sub parse_xml_info{
  +    my ($r, $fh, $str_ref, $media, $pref_style) = @_;
  +
  +    if ($pref_style eq '#default') {
  +        undef $pref_style;
  +    }
  +
  +    my $xml_styles = [];
  +    my $vals = [];
  +     my @styles;
  +
  +     if (defined &Apache::AxKit::Provider::xs_get_styles_fh) {
  +             AxKit::Debug(2, "using XS get_styles (libxml2)");
  +             my ($xs_styles, $doctype, $dtd, $root) = xs_get_styles($r, $fh, 
$str_ref, $media, $pref_style);
  +             @$xml_styles = @$xs_styles unless $AxKit::Cfg->IgnoreStylePI();
  +             @$vals = ($doctype, $dtd, $root);
  +     }
  +     else {
  +             require XML::Parser;
  +
  +             AxKit::Debug(4, "get_styles: creating XML::Parser");
  +
  +             my $handlers = {
  +                     Start => \&parse_start,
  +                     Doctype => \&parse_dtd,
  +                     $AxKit::Cfg->IgnoreStylePI() ? () : (Proc => 
\&parse_pi),
  +             };
  +
  +             my $xml_parser = XML::Parser->new(
  +                     Namespaces => 1,
  +                     ErrorContext => 2,
  +                     Handlers => $handlers,
  +             );
  +
  +             my $to_parse = $fh || ${$str_ref};
  +             #eval {
  +             #       $to_parse = $provider->get_fh();
  +             #};
  +             #if ($@) {
  +             #       $to_parse = ${ $provider->get_strref(); };
  +             #}
  +             
  +             AxKit::Debug(4, "get_styles: calling XML::Parser->parse()");
  +             $xml_parser->parse(
  +                     $to_parse,
  +                     XMLStyle_preferred => $pref_style,
  +                     XMLStyle_media => $media,
  +                     XMLStyle_style => $xml_styles,
  +                     XMLStyle_vals => $vals,
  +                     XMLStyle_style_screen => [],
  +             );
  +                     
  +             AxKit::Debug(4, "get_styles: parse returned successfully");
  +     }
  +     
  +     return (@$vals, $xml_styles);
  +}
  +
   sub xs_get_styles {
  -    my $self = shift;
  -    my ($media, $pref_style) = @_;
  +    my ($r, $fh, $strref, $media, $pref_style) = @_;
       
       my $bits;
  -    eval {
  -        my $fh = $self->get_fh();
  +    if(defined($fh)) {
           AxKit::Debug(4, "calling xs_get_styles_fh()");
  -        $bits = xs_get_styles_fh($self->apache_request, $fh);
  -    };
  -    if ($@) {
  -        my $strref = $self->get_strref();
  +        $bits = xs_get_styles_fh($r, $fh);
  +    } else {
           AxKit::Debug(4, "calling xs_get_styles_str()");
  -        $bits = xs_get_styles_str($self->apache_request, $$strref);
  +        $bits = xs_get_styles_str($r, $$strref);
       }
       
       my @xml_stylesheet = @{$bits->[0]};
  @@ -366,7 +427,7 @@
           XMLStyle_style_screen => [],
           XMLStyle_preferred => $pref_style,
           XMLStyle_media => $media,
  -        };
  +    };
       
       foreach my $pi (@xml_stylesheet) {
           parse_pi($e, "xml-stylesheet", $pi);
  @@ -536,6 +597,7 @@
           }
       }
   }
  +
   
   1;
   __END__
  
  
  

Reply via email to