You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axkit-dev@xml.apache.org by ma...@apache.org on 2006/06/17 03:07:28 UTC

svn commit: r414976 - in /xml/axkit/trunk/lib: Apache/AxKit/Language/XSP.pm AxKit.pm

Author: matts
Date: Fri Jun 16 18:07:28 2006
New Revision: 414976

URL: http://svn.apache.org/viewvc?rev=414976&view=rev
Log:
Make XSP Cacheable (finally!)

Modified:
    xml/axkit/trunk/lib/Apache/AxKit/Language/XSP.pm
    xml/axkit/trunk/lib/AxKit.pm

Modified: xml/axkit/trunk/lib/Apache/AxKit/Language/XSP.pm
URL: http://svn.apache.org/viewvc/xml/axkit/trunk/lib/Apache/AxKit/Language/XSP.pm?rev=414976&r1=414975&r2=414976&view=diff
==============================================================================
--- xml/axkit/trunk/lib/Apache/AxKit/Language/XSP.pm (original)
+++ xml/axkit/trunk/lib/Apache/AxKit/Language/XSP.pm Fri Jun 16 18:07:28 2006
@@ -61,10 +61,51 @@
     my $class = shift;
     my ($r, $xml, undef, $last_in_chain) = @_;
 
-    _register_me_and_others();
-
 #    warn "XSP Parse: $xmlfile\n";
 
+    my $package = $class->compile($r, $xml);
+    
+    # make sure we use inheritance to get this
+    my $cv = $package->can('handler');
+
+    my $cgi = Apache::Request->instance($r);
+
+    # $r->no_cache();
+
+    my $xsp_cache = Apache::AxKit::Cache->new($r, $package, $package->cache_params($r, $cgi));
+
+    if (!$package->has_changed($xsp_cache->mtime(), $r) &&
+                !$xml->has_changed($xsp_cache->mtime())) {
+        AxKit::Debug(3, "XSP results cached");
+        $r->print($xsp_cache->read);
+        return;
+    }
+
+    my $dom = XML::LibXML::Document->createDocument("1.0", "UTF-8");
+    my $rc = eval { $package->$cv($r, $cgi, $dom); };
+    if ($@) {
+        die $@ if (ref($@));
+        # if ($to_eval) {
+#             my $line = 1;
+#             $to_eval =~ s/\n/"\n".++$line." "/eg;
+#             warn("Script:\n1 $to_eval\n");
+#         }
+        throw Apache::AxKit::Exception::Error(
+            -text => "Execution failed: $@"
+        );
+    }
+    $r->pnotes('dom_tree', $dom);
+    $r->print($dom->toString) if $last_in_chain;
+
+    $xsp_cache->write( $dom->toString );
+    return $rc;
+}
+
+sub compile {
+    my ($class, $r, $xml) = @_;
+    
+    _register_me_and_others();
+
     my $key = $xml->key();
 
     my $package = get_package_name($key);
@@ -199,42 +240,8 @@
         }
         AxKit::Debug(5, 'XSP Compilation finished');
     }
-
-    no strict 'refs';
-    # make sure we use inheritance to get this
-    my $cv = $package->can('handler');
-
-    my $cgi = Apache::Request->instance($r);
-
-    $r->no_cache(1);
-
-    my $xsp_cache = Apache::AxKit::Cache->new($r, $package, $package->cache_params($r, $cgi));
-
-    if (!$package->has_changed($xsp_cache->mtime(), $r) &&
-                !$xml->has_changed($xsp_cache->mtime())) {
-        AxKit::Debug(3, "XSP results cached");
-        $r->print($xsp_cache->read);
-        return;
-    }
-
-    my $dom = XML::LibXML::Document->createDocument("1.0", "UTF-8");
-    my $rc = eval { $package->$cv($r, $cgi, $dom); };
-    if ($@) {
-        die $@ if (ref($@));
-        if ($to_eval) {
-            my $line = 1;
-            $to_eval =~ s/\n/"\n".++$line." "/eg;
-            warn("Script:\n1 $to_eval\n");
-        }
-        throw Apache::AxKit::Exception::Error(
-            -text => "Execution failed: $@"
-        );
-    }
-    $r->pnotes('dom_tree', $dom);
-    $r->print($dom->toString) if $last_in_chain;
-
-    $xsp_cache->write( $dom->toString );
-    return $rc;
+    
+    return $package;
 }
 
 sub register {

Modified: xml/axkit/trunk/lib/AxKit.pm
URL: http://svn.apache.org/viewvc/xml/axkit/trunk/lib/AxKit.pm?rev=414976&r1=414975&r2=414976&view=diff
==============================================================================
--- xml/axkit/trunk/lib/AxKit.pm (original)
+++ xml/axkit/trunk/lib/AxKit.pm Fri Jun 16 18:07:28 2006
@@ -447,6 +447,11 @@
         $r->no_cache(1) if $cache->no_cache();
         $recreate++;
     }
+    
+    if (my $package = is_xsp($r, $provider, $styles)) {
+        AxKit::Debug(2, "Checking if XSP has changed");
+        $recreate = $package->has_changed($cache->mtime(), $r);
+    }
 
     if (!$recreate && $AxKit::Cfg->DependencyChecks()) {
         $recreate = check_dependencies($r, $provider, $cache);
@@ -504,7 +509,27 @@
     save_dependencies($r, $cache);
     
     return $return_code;
-        
+}
+
+sub is_xsp {
+    my ($r, $provider, $styles) = @_;
+    
+    foreach my $style (@$styles) {
+        my $mapto = $style->{module};
+
+        # if no module is give AxKit should use the default modules
+        # from the server config.
+        unless ( $mapto ) {
+            my $mapping = $AxKit::Cfg->StyleMap;
+            $mapto = $mapping->{$style->{type}};
+        }
+        if ($mapto =~ /::XSP$/) {
+            AxKit::load_module($mapto);
+            return $mapto->compile($r, $provider);
+        }
+    }
+    
+    return;
 }
 
 sub get_axkit_uri {