jwalt 2003/09/17 14:58:39
Modified: . Changes Makefile.PL lib/Apache/AxKit LibXMLSupport.pm Provider.pm lib/Apache/AxKit/Language XPathScript.pm lib/Apache/AxKit/Provider File.pm FileWrite.pm Log: - create pseudo-url registry - add changelog entries for recent modifications Revision Changes Path 1.15 +5 -0 xml-axkit/Changes Index: Changes =================================================================== RCS file: /home/cvs/xml-axkit/Changes,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- Changes 16 Jul 2003 15:06:19 -0000 1.14 +++ Changes 17 Sep 2003 21:58:38 -0000 1.15 @@ -1,4 +1,9 @@ AxKit Changes +x.x.x + - Extended SimpleTaglib with several new features + - Added pseudo-protocol registry + - fixed some bugs + 1.6.2 - Made processors added via AxAddDynamicProcessor appear in their proper order based on the order in which they appear in the config files 1.23 +6 -1 xml-axkit/Makefile.PL Index: Makefile.PL =================================================================== RCS file: /home/cvs/xml-axkit/Makefile.PL,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- Makefile.PL 17 Jul 2003 16:34:49 -0000 1.22 +++ Makefile.PL 17 Sep 2003 21:58:38 -0000 1.23 @@ -87,6 +87,11 @@ -default => 0, 'XML::LibXML' => '1.51', ], + "Optional modules required for some features of SimpleTaglib" => [ + -default => 0, + 'XML::Smart' => '1.3', + 'WeakRef' => '0', + ], "Optional module required for LibXSLT engine" => [ -default => 0, 'XML::LibXSLT' => '1.49', 1.4 +5 -33 xml-axkit/lib/Apache/AxKit/LibXMLSupport.pm Index: LibXMLSupport.pm =================================================================== RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/LibXMLSupport.pm,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- LibXMLSupport.pm 28 Jul 2003 22:53:20 -0000 1.3 +++ LibXMLSupport.pm 17 Sep 2003 21:58:38 -0000 1.4 @@ -7,8 +7,6 @@ use vars qw($provider_cb); -$provider_cb = \&get_provider; - sub reset { my $class = shift; $XML::LibXML::match_cb = \&match_uri; @@ -17,43 +15,17 @@ $XML::LibXML::open_cb = \&open_uri; } -# Default provider callback -sub get_provider { - my $r = shift; - my $provider = Apache::AxKit::Provider->new_content_provider($r); - return $provider; -} - sub match_uri { my $uri = shift; AxKit::Debug(8, "LibXSLT match_uri: $uri"); - return 1 if $uri =~ /^(axkit|xmldb):/; - return $uri !~ /^\w+:/; # only handle URI's without a scheme + return 0 if $uri =~ /^(https?|ftp|file):/; # don't handle URI's supported by libxml + return 1 if !($uri =~ /^([a-zA-Z0-9]+):/); + return Apache::AxKit::Provider::has_protocol($1); } sub open_uri { my $uri = shift || './'; - AxKit::Debug(8, "LibXSLT open_content_uri: $uri"); - - if ($uri =~ /^axkit:/) { - return AxKit::get_axkit_uri($uri); - } elsif ($uri =~ /^xmldb:/) { - return Apache::AxKit::Provider::XMLDB::get_xmldb_uri($uri); - } - - # create a subrequest, so we get the right AxKit::Cfg for the URI - my $apache = AxKit::Apache->request; - my $sub = $apache->lookup_uri(AxKit::FromUTF8($uri)); - local $AxKit::Cfg = Apache::AxKit::ConfigReader->new($sub); - - my $provider = $provider_cb->($sub); - my $str = $provider->get_strref; - - undef $provider; - undef $apache; - undef $sub; - - return $$str; + return Apache::AxKit::Provider::get_uri($uri,AxKit::Apache->request(),$provider_cb); } sub close_uri { 1.17 +64 -1 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.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- Provider.pm 4 Sep 2003 19:32:16 -0000 1.16 +++ Provider.pm 17 Sep 2003 21:58:38 -0000 1.17 @@ -8,6 +8,69 @@ # use vars qw/$COUNT/; +# protocol registry + +my %pseudo_protocols = + ( + 'axkit' => \&AxKit::get_axkit_uri, + ); + +sub register_protocol { + my ($protocol, $handler) = @_; + $pseudo_protocols{lc($protocol)} = $handler; +} + +sub has_protocol { + exists $pseudo_protocols{lc($_[0])}; +} + +# end of protocol registry + +sub get_provider { + my ($uri,$r,$provider_cb) = @_; + AxKit::Debug(8,"get_provider: $uri"); + my ($protocol) = ($uri =~ m/^([a-zA-Z0-9]+):/); + if ($protocol) { + throw Apache::AxKit::Exception::Error(-text => "this resource has no provider ($uri)") if !ref($pseudo_protocols{$protocol}); + return $pseudo_protocols{$protocol}->new_provider($r, uri => $uri); + } elsif (substr($uri,0,1) ne '/') { # resolve relative URIs -- FIXME: does $r->lookup_uri do this for us? + my $base = AxKit::ToUTF8($r->uri()); + $base =~ s{[^/]*$}{}; + $uri = $base.$uri; + $uri =~ s/\?.*$//; + $uri =~ s{/./}{/}g; + $uri =~ s{/[^/]+/+../}{/}g; + AxKit::Debug(8,"Absolute URI: ".$uri); + } + + # create a subrequest, so we get the right AxKit::Cfg for the URI + my $sub = $r->lookup_uri($uri); + local $AxKit::Cfg = Apache::AxKit::ConfigReader->new($sub); + + return ($provider_cb?$provider_cb->($sub):__PACKAGE__->new_content_provider($sub)); +} + +sub get_uri { + my ($uri,$r,$provider_cb) = @_; + my ($protocol) = ($uri =~ m/^([a-zA-Z0-9]+):/); + if ($protocol && ref($pseudo_protocols{$protocol})) { + return $pseudo_protocols{$protocol}->($uri,$r); + } + + my $str = get_provider(@_)->get_strref; + + return $$str; +} + +# end of protocol utilities + +sub new_provider { # make this just "new"? (would be logical, but probably breaks things...) + my ($self, $r, @args) = @_; + my $provider = bless { apache => $r }, $self; + $provider->init(@args); + return $provider; +} + sub new_style_provider { my $class = shift; my $apache = shift; 1.11 +10 -39 xml-axkit/lib/Apache/AxKit/Language/XPathScript.pm Index: XPathScript.pm =================================================================== RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Language/XPathScript.pm,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- XPathScript.pm 29 Jan 2003 01:35:50 -0000 1.10 +++ XPathScript.pm 17 Sep 2003 21:58:38 -0000 1.11 @@ -324,46 +324,17 @@ my $results = XML::XPath::NodeSet->new(); my $uri = $params[0]; my $newdoc; - if ($uri =~ /^axkit:/) { - $newdoc = $parser->parse( AxKit::get_axkit_uri($uri) ); - } elsif ($uri =~ /^xmldb:/) { - $newdoc = $parser->parse( Apache::AxKit::Provider::XMLDB::get_xmldb_uri($uri) ); - } - elsif ($uri =~ /^\w\w+:/) { # assume it's scheme://foo uri - eval { - # warn "Trying to parse $params[0]\n"; - $newdoc = $parser->parse( - $Apache::AxKit::Language::XPathScript::local_ent_handler->( - undef, undef, $uri - ) - ); - # warn "Parsed OK into $newdoc\n"; - }; - if (my $E = $@) { - if ($E->isa('Apache::AxKit::Exception::IO')) { - AxKit::Debug(2, $E); - } - else { - throw Apache::AxKit::Exception::Error(-text => "Parse of '$uri' failed: $E"); - }; + eval { + $newdoc = $parser->parse(Apache::AxKit::Provider::get_uri($uri)); + }; + if (my $E = $@) { + if ($E->isa('Apache::AxKit::Exception::IO')) { + AxKit::Debug(2, $E); } + else { + throw Apache::AxKit::Exception::Error(-text => "Parse of '$uri' failed: $E"); + }; } - else { - AxKit::Debug(3, "Parsing local: $uri\n"); - - # create a subrequest, so we get the right AxKit::Cfg for the URI - my $apache = AxKit::Apache->request; - my $sub = $apache->lookup_uri(AxKit::FromUTF8($uri)); - local $AxKit::Cfg = Apache::AxKit::ConfigReader->new($sub); - - my $provider = Apache::AxKit::Provider->new_content_provider($sub); - - $newdoc = get_source_tree($provider, $parser); - undef $provider; - undef $apache; - undef $sub; - } - $results->push($newdoc) if $newdoc; #AxKit::Debug(8, "XPathScript: document() returning"); return $results; 1.15 +2 -1 xml-axkit/lib/Apache/AxKit/Provider/File.pm Index: File.pm =================================================================== RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Provider/File.pm,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- File.pm 17 Feb 2003 10:47:00 -0000 1.14 +++ File.pm 17 Sep 2003 21:58:38 -0000 1.15 @@ -14,6 +14,7 @@ use File::Spec; use Fcntl qw(O_RDONLY LOCK_SH); +Apache::AxKit::Provider::register_protocol('file',__PACKAGE__); sub init { my $self = shift; 1.2 +3 -1 xml-axkit/lib/Apache/AxKit/Provider/FileWrite.pm Index: FileWrite.pm =================================================================== RCS file: /home/cvs/xml-axkit/lib/Apache/AxKit/Provider/FileWrite.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- FileWrite.pm 9 Jun 2002 22:47:36 -0000 1.1 +++ FileWrite.pm 17 Sep 2003 21:58:38 -0000 1.2 @@ -8,6 +8,8 @@ use Apache::AxKit::Exception; use Fcntl; +Apache::AxKit::Provider::register_protocol('file',__PACKAGE__); + sub get_fh { my $self = shift; if ($_[0] && !$self->_is_dir()) {