package RWDE::Web::CommandProxy;
use strict;
use warnings;
# Proxy object for getting the specific functionality of a particular object
use Error qw(:try);
use RWDE::Exceptions;
use RWDE::AbstractFactory;
use RWDE::Web::Helper;
use RWDE::Web::TemplateAdapter;
use RWDE::Configuration;
use base qw(RWDE::Proxy);
sub execute {
my ($self, $params) = @_;
my $req = $$params{req}
or throw RWDE::DevelException({ info => 'No request to process specified' });
# create auxiliary object to facilitate passing of the data between layers
my $helper = new RWDE::Web::Helper;
# The commands might need the request object for logging/redirection purposes
$helper->set_stash({ req => $req });
# put elements in the helper for easy access by Command layer
my $formdata = $req->get_formdata();
$helper->set_stash({ formdata => $formdata });
# get the params from the request that will decide on method invocation and params
# the uri (the part after the host name) will determine the class called
my $uri = $req->get_uri();
$helper->set_stash({ uri => $uri });
$helper->set_stash({ ServerName => $req->get_req->server_name });
# store the current state of the https connection in the stash
if ($req->is_https()) {
$helper->set_stash({ https => 1 });
$helper->set_stash({ FullServiceAddress => RWDE::Configuration->ServiceSSLAddress });
}
else {
$helper->set_stash({ FullServiceAddress => RWDE::Configuration->ServiceAddress });
}
#every possible page controller and template should be able to identify which host they are running on
#and if they are currently in debug mode - we shouldn't have to do this for each default controller
$helper->set_stash({ Debug => RWDE::Configuration->Debug });
$helper->set_stash({ ServiceHost => RWDE::Configuration->ServiceHost });
# The template need to insert ServiceAddress for SSL protected forms
$helper->set_stash({ ServiceAddress => RWDE::Configuration->ServiceAddress });
$helper->set_stash({ ServiceSSLAddress => RWDE::Configuration->ServiceSSLAddress });
my $class = $req->get_class({ helper => $helper });
try {
my $command = RWDE::AbstractFactory->instantiate({ class => $class, helper => $helper });
if (not defined $req->{forward}) {
$command->execute($formdata);
}
if (not defined $req->{header}) {
$req->print_header({ pagetype => $helper->get_pagetype()});
}
# we have to check again for forward, as $command->execute might have issued a forward
if (not defined $req->{forward}) {
RWDE::Web::TemplateAdapter->render({ helper => $helper });
}
}
catch Error with {
my $ex = shift;
warn $ex;
$helper->set_stash({ info => $ex });
# Set the appropriate error page (devel or customer)
$self->invoke({ class => 'Command::default', function => 'execute', helper => $helper });
RWDE::PostMaster->send_report_message(
{
info => $ex,
record => $req->get_record() . "\nReferrer: " . $req->get_referer(), #both the request and the referrer
formdata => $formdata,
uri => $uri,
class => $class,
session => $helper->get_session,
}
);
if (not defined $req->{header}) {
$req->print_header({ pagetype => $helper->get_pagetype()});
}
RWDE::Web::TemplateAdapter->render({ helper => $helper });
};
return ();
}
1;