## # # Copyright 2005-2006, Brian Szymanski # # This file is part of Cache::Static # # Cache::Static is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # For more information about Cache::Static, point a web browser at # http://chronicle.allafrica.com/scache/ or read the # documentation included with the Cache::Static distribution in the # doc/ directory # ## package Cache::Static::HTML_Mason_Util; use strict; use warnings; #TODO: store / pull this from Configuration.pm eval { require Cache::Static::HTML_Mason_Util::hmc; }; my $no_hmc = $@; my $hmc = $no_hmc ? undef : Cache::Static::HTML_Mason_Util::hmc->new; sub cache_it { my ($r, $m, $verbose, $deps) = @_; $deps = [] unless($deps); #Mason sometimes translates this to zero... my $args = $m->caller_args(0); Cache::Static::_log(4, "in cache_it"); unless($args->{_Cache_Static_final}) { Cache::Static::_log(4, "in cache_it : unless"); my $cc = $m->current_comp; my $uri = ( $m->dhandler_arg ? $cc->dir_path.'/'.$m->dhandler_arg : $cc->dir_path.'/'.$cc->name ); $uri =~ s/\/\//\//g; #find the file we're using, and add a file dependency my $file_dep; if($hmc) { if(($uri eq $r->uri) && !$m->dhandler_arg) { #a plain vanilla non-dhandler top level page $file_dep = $r->filename; } elsif($uri eq $r->uri) { #we have a dhandler, figure out which one... $file_dep = $uri; my $arg = $m->dhandler_arg; $file_dep =~ s/$arg$//; $file_dep = $r->document_root.$file_dep.$m->dhandler_name; } else { #a subcomponent $file_dep = $r->document_root.$cc->dir_path.'/'.$cc->name; } } my %deps; foreach my $d (@$deps) { $deps{$d} = 1; } if($hmc) { my $spec = "file|$file_dep"; my $hmc_depstring = ''; unless($deps{$spec}) { $hmc_depstring .= "$spec "; $deps{$spec} = 1; # Cache::Static::_log(3, "HTML_Mason_Util: added extra dep 1: $file_dep"); } #add file deps on any components we detect foreach my $i (@{$hmc->find_extra_deps($file_dep, r => $r, m => $m)}) { unless($deps{$i}) { $hmc_depstring .= "$i "; $deps{$i} = 1; } } $hmc_depstring =~ s/ $//; Cache::Static::_log(3, "HTML_Mason_Util: added extra deps: $hmc_depstring"); } #extract dependencies to arrayref my @t = keys %deps; $deps = \@t; my $friendly_key; $friendly_key = Cache::Static::make_friendly_key($uri, $args) if($verbose); my $key = Cache::Static::make_key($uri, $args); my $ret = Cache::Static::get_if_same($key, $deps); if(defined($ret)) { Cache::Static::_log(4, "in cache_it : then"); if($verbose) { if($verbose > 1) { $m->out("
serving cached component for $friendly_key ($key)
\n") } else { $m->out("\n") } } } else { Cache::Static::_log(4, "in cache_it : else"); if($verbose) { if($verbose > 1) { $m->out("(re)generating component for $friendly_key ($key)
\n") } else { $m->out("\n") } } my %newargs = %$args; $newargs{_Cache_Static_final} = 1; $ret = $m->scomp( $m->current_comp->path, %newargs ); Cache::Static::set($key, $ret, $deps); } $m->out($ret); return 1; } return 0; } 1;