XAO::Templates - templates caching and retrieving module


XAO-Web documentation Contained in the XAO-Web distribution.

Index


Code Index:

NAME

Top

XAO::Templates - templates caching and retrieving module

SYNOPSIS

Top

XXX

DESCRIPTION

Top

XXX

Templates retriever. Uses persistent cache to store once retrieved templates. Cache top level keys are site names, for system templates '/' is used as a site name.

Checks if given path (first argument) exists and returns template's filename if it does and 'undef' if there is no template. Optional second argument refers to a sitename (project name), by default the current active project name is used.

Deprecated method, do not use.

AUTHOR

Top

Copyright (c) 2005 Andrew Maltsev

Copyright (c) 2001-2004 Andrew Maltsev, XAO Inc.

<am@ejelta.com> -- http://ejelta.com/xao/


XAO-Web documentation Contained in the XAO-Web distribution.
###############################################################################
package XAO::Templates;
use strict;
use XAO::Base qw($homedir $projectsdir);
use XAO::Utils;
use XAO::Projects qw(get_current_project_name);

use vars qw($VERSION);
$VERSION=(0+sprintf('%u.%03u',(q$Id: Templates.pm,v 2.1 2005/01/14 01:39:56 am Exp $ =~ /\s(\d+)\.(\d+)\s/))) || die "Bad VERSION";

##
# Cache for templates.
#
use vars qw(%cache);

##
# Getting the text of given template.
#
sub get (%) {
    my %args=@_;
    my $path=$args{path};

    my $sitename=get_current_project_name();

    if($path =~ /\.\.\//) {
        eprint "Bad template path -- sitename=",$sitename,", path=$path";
        return undef;
    }

    ##
    # Checking in the memory cache. If there is a record, but it's
    # 'undef' then the template does not exist in that site's local
    # tree.
    #
    if(!defined $sitename) {
        return $cache{'/'}->{$path} if exists($cache{'/'}) && exists($cache{'/'}->{$path});
    }
    elsif(exists $cache{$sitename} && exists $cache{$sitename}->{$path}) {
        my $template=$cache{$sitename}->{$path};
        return $template if defined $template;

        ##
        # Otherwise we know we already tried, but failed and it's safe
        # to return the one from the system cache.
        #
        return $cache{'/'}->{$path} if exists($cache{'/'}) && exists($cache{'/'}->{$path});
    }

    ##
    # Retrieving from disk. We only get here if cache was a miss.
    #
    my $system;
    my $tpath;
    if(defined $sitename) {
        $tpath="$projectsdir/$sitename/templates/$path";
        $system=0;
    }
    if(! $tpath || ! -r $tpath) {
        $tpath="$homedir/templates/$path";
        $system=1;
    }
    local *F;
    my $text;
    if(open(F,$tpath)) {
        local $/;
        $text=<F>;
        close(F);
    }

    ##
    # Storing into cache.
    #
    if(!defined $text) {
        $cache{'/'}->{$path}=undef;
        $cache{$sitename}->{$path}=undef if defined $sitename;
    }
    elsif(length($text) < 100000) {
        if($system) {
            $cache{'/'}->{$path}=$text;
            $cache{$sitename}->{$path}=undef if defined $sitename;
        }
        else {
            $cache{$sitename}->{$path}=$text;
        }
    }

    return $text;
}

###############################################################################

sub filename ($;$) {
    my ($path,$sitename)=@_;

    $sitename||=get_current_project_name();

    if($path =~ /\.\.\//) {
        eprint "Bad template path -- sitename=",$sitename,", path=$path";
        return 0;
    }

    return undef if !defined($path) || $path eq '';

    if(defined $sitename) {
        my $tn="$projectsdir/$sitename/templates/$path";
        return $tn if -f $tn && -r _;
    }

    my $tn="$homedir/templates/$path";
    return $tn if -f $tn && -r _;

    return undef;
}

###############################################################################

sub check (%) {
    my %args=@_;
    dprint "XAO::Templates::check - deprecated, use filename() instead";
    return filename($args{path}) ? 1 : 0;
}

###############################################################################

# Complete list of all available templates in random order.
#
# Returns list in array context and array reference in scalar context.

sub list (%) {
    eprint "XAO::Templates::list - is not supported any more";
    my %args=@_;
    my $tpath;
    my $sitename=get_current_project_name();
    if(defined $sitename) {
        $tpath="$projectsdir/$sitename/templates/";
    }
    if(! $tpath || ! -r $tpath) {
        $tpath="$homedir/templates/";
    }
    if(! $tpath || ! -r $tpath) {
        eprint "Templates::list - can't get list";
        return wantarray ? () : undef;
    }
    local *F;
    if(!open(F,"/usr/bin/find $tpath -type f |")) {
        eprint "Templates::list - can't get list: $!\n";
        return wantarray ? () : undef;
    }
    my @list=map { chomp; s/^$tpath//; $_ } <F>;
    close(F);
    wantarray ? @list : (@list ? \@list : undef);
}

###############################################################################
1;
__END__