Ambrosia
view release on metacpan or search on metacpan
lib/Ambrosia/Context.pm view on Meta::CPAN
package Ambrosia::Context;
use strict;
use warnings;
use Ambrosia::Assert;
use Ambrosia::error::Exceptions;
use Ambrosia::DataProvider;
use Ambrosia::QL;
use Ambrosia::Utils::Container;
use Ambrosia::Utils::Queue;
use Ambrosia::Event qw/on_start on_abort on_finish/;
use Ambrosia::Meta;
class sealed {
extends => [qw/Exporter/],
public => [qw/repository mqueue response_type resource_type resource_id method proxy/],
private => [qw/__error __cgi/],
};
our $VERSION = 0.010;
our @EXPORT = qw/Context/;
sub new : Private
{
}
{
my $_CONTEXT;
sub instance
{
unless ( $_CONTEXT )
{
my $package = shift;
my %params = @_ == 1 ? %{$_[0]} : @_;
assert {$params{engine_name}} 'Context must instance before first call "Context" or you not set "engine_name" in params.';
#throw Ambrosia::error::Exception::BadUsage('Context must instance before first call "Context"') unless $params{engine_name};
my ($engine_name,$engine_params) = @params{qw/engine_name engine_params/};
delete @params{qw/engine_name engine_params/};
my $cgi = Ambrosia::core::ClassFactory::create_object(
'Ambrosia::CommonGatewayInterface::' . $engine_name, $engine_params);
$_CONTEXT = $package->SUPER::new(__cgi => $cgi, %params);
}
return $_CONTEXT;
}
sub destroy
{
undef $_CONTEXT;
}
sub Context
{
no warnings;
return __PACKAGE__->instance();
}
}
sub start_session
{
my $self = shift;
$self->repository = new Ambrosia::Utils::Container;
$self->mqueue = new Ambrosia::Utils::Queue;
$self->init_request_params;
$self->publicEvent('on_start');
}
sub abort_session
{
my $self = shift;
$self->repository = undef;
$self->mqueue = undef;
$self->__cgi->abort();
$self->publicEvent( on_abort => $self->error() );
}
sub finish_session
{
my $self = shift;
$self->repository = undef;
$self->mqueue = undef;
$self->__cgi->close();
$self->publicEvent( 'on_finish' );
}
sub print_response_header
{
print shift()->__cgi->output_data(@_);
}
sub redirect
{
my $self = shift;
$self->__cgi->SET_REDIRECT();
$self->__cgi->output_data(@_);
}
#TODO!!
sub handler
{
$_[0]->__cgi->handler();
}
sub is_complete
{
$_[0]->__cgi->IS_COMPLETE;
}
sub param
{
return shift()->__cgi->handler()->param(@_) || undef;
}
sub action
{
my $self = shift;
return $self->param('action') || '*' unless $self->resource_type;
if ( $self->method eq 'GET' || $self->method eq 'HEAD' )
{
return (defined $self->resource_id ? '/get/' : '/list/') . $self->resource_type
}
elsif ( $self->method eq 'POST' || $self->method eq 'DELETE' )
{
return '/save/' . $self->resource_type;
}
else
{
throw Ambrosia::error::Exception::BadUsage 'Unknown http method: "' . ($self->method || 'undefined' ) . '"';
}
}
sub init_request_params
{
my $self = shift;
my $scriptName = $ENV{SCRIPT_NAME} or return;
my $uri = $ENV{REQUEST_URI};
$uri =~ s/^$scriptName//;
my ($response_type, $resource_type, $resource_id) = ( $uri =~ m{/?(?:(html|xml|json|atom|rss)/)?([^?\\\/]*)(?:/([^?\\\/]+)?)?} );
$self->response_type = lc($response_type) || 'html';
$self->resource_type = $resource_type;
$self->resource_id = $resource_id;
$self->method = $ENV{REQUEST_METHOD};
}
sub script_path
{
return $ENV{SCRIPT_NAME} || $0;
}
sub host_name
{
$ENV{HTTP_HOST} ? (split /:/, $ENV{HTTP_HOST}, 2)[0] : chomp(my $hn = `hostname`)
}
sub host_path
{
my $self = shift;
my $scriptName = shift;
if ( $ENV{HTTP_HOST} )
{
return host_name() . ($ENV{SERVER_PORT} eq '80' ? '' : ':' . $ENV{SERVER_PORT});
}
else
{
return host_name();
}
}
sub full_script_path
{
my $self = shift;
if ( $ENV{HTTP_HOST} )
{
return 'http://' . $ENV{HTTP_HOST} . $ENV{SCRIPT_NAME};
}
else
{
return script_path();
}
}
sub data
{
my $self = shift;
( run in 1.501 second using v1.01-cache-2.11-cpan-ceb78f64989 )