# $Id: Admin.pm,v 1.8 2007-12-13 17:09:03 mike Exp $ # This is the only module that needs to be explicitly "use"d by the # HTML::Mason components that make up the sites. It is responsible, # among other things, for "use"ing all the relevant sub-modules. package Keystone::Resolver::Admin; use strict; use warnings; use Keystone::Resolver; # PRIVATE to admin(), which implements a singleton my $_admin = undef; # Returns an object -- always the same one -- representing the # Keystone Resolver Admin complex-of-web-site as a whole, and through # which global functionality and objects (such as the database handle) # can be accessed. # sub admin { my $class = shift(); if (!defined $_admin) { $_admin = bless { resolver => undef, sites => {}, }, $class; } return $_admin; } sub resolver { my $this = shift(); if (!defined $this->{resolver}) { ### This should be a setting my $loglevel = ( # Keystone::Resolver::LogLevel::CHITCHAT | Keystone::Resolver::LogLevel::CACHECHECK | Keystone::Resolver::LogLevel::PARSEXSLT | Keystone::Resolver::LogLevel::DUMPDESCRIPTORS | Keystone::Resolver::LogLevel::DUMPREFERENT | Keystone::Resolver::LogLevel::SHOWGENRE | # Keystone::Resolver::LogLevel::DBLOOKUP | Keystone::Resolver::LogLevel::MKRESULT | # Keystone::Resolver::LogLevel::SQL | Keystone::Resolver::LogLevel::DEREFERENCE | Keystone::Resolver::LogLevel::DISSECT | Keystone::Resolver::LogLevel::RESOLVEID | Keystone::Resolver::LogLevel::CONVERT01 | Keystone::Resolver::LogLevel::HANDLE | Keystone::Resolver::LogLevel::WARNING | 0); $this->{resolver} = new Keystone::Resolver(logprefix => "admin", _rw => 1, loglevel => $loglevel); } return $this->{resolver}; } # Delegations to the associated resolver sub db { shift()->resolver()->db(@_) } # This method contains the algorithm for determining, based on the # hostname by which the web server is accessed, which if any of the # available sites should be used. # sub hostname2tag { my $this = shift(); my($hostname) = @_; $hostname =~ s/^x\.//; # Development versions begin with "x." $hostname =~ s/:\d+$//; # Discard any trailing port-number my $tag; if ($hostname eq "resolver.indexdata.com") { $tag = "id"; } else { $tag = $hostname; $tag =~ s/\..*//; } return $tag; } # Returns the site object associated in the admin-object with the # specified tag, creating it if necessary. # sub site { my $this = shift(); my($tag) = @_; if (!defined $this->{sites}->{$tag}) { $this->{sites}->{$tag} = $this->db()->site_by_tag($tag); } return $this->{sites}->{$tag}; } 1;