Bivio::Biz::Action::Acknowledgement
# Copyright (c) 2005-2009 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::Biz::Action::Acknowledgement;
use strict;
use Bivio::Base 'Biz.Action';
use Bivio::IO::Trace;
my($_TI) = b_use('Agent.TaskId');
my($_T) = b_use('FacadeComponent.Text');
my($_HTML) = b_use('Bivio.HTML');
b_use('Agent.Task')->register(__PACKAGE__);
b_use('Agent.Request')->register_handler(__PACKAGE__);
our($_TRACE);
sub SAVE_LABEL_DEFAULT {
# IMPLICIT: save_label
return 0;
}
sub QUERY_KEY {
return 'ack';
}
sub execute {
shift->extract_label(@_);
return 0;
}
sub exists_in_facade {
my($proto, $req, $label) = @_;
return $_T->get_from_source($req)->unsafe_get_widget_value_by_name(
"acknowledgement." . $label);
}
sub extract_and_delete_label {
my($proto, $req) = @_;
my($label) = $proto->extract_label($req);
$proto->delete_from_req($req);
return $label;
}
sub extract_label {
my($proto, $req) = @_;
return _extract($proto, $req)
|| $req->unsafe_get_nested($proto->package_name, 'label');
}
sub handle_client_redirect {
my($proto, $named, $req) = @_;
return
if $named->{uri} =~ /\b@{[$proto->QUERY_KEY]}=/;
return
unless my $label = $proto->extract_and_delete_label($req);
if (my $t = $_TI->unsafe_from_name($label)) {
$label = $t->as_int;
}
$named->{uri} .= ($named->{uri} =~ /\?/ ? '&' : '?')
. $proto->QUERY_KEY
. '='
. $_HTML->escape_query($label);
return;
}
sub handle_pre_execute_task {
my($proto, $task, $req) = @_;
$proto->execute($req);
return;
}
sub handle_server_redirect {
my($proto, $named, $req) = @_;
return
if ($named->{query} ||= {})->{$proto->QUERY_KEY};
return
unless my $label = $proto->extract_and_delete_label($req);
($named->{query} ||= {})->{$proto->QUERY_KEY} = $label;
return;
}
sub save_label {
my($proto, $label, $req, $query) = @_ >= 3 ? @_ : (shift(@_), undef, @_);
unless ($label) {
return
unless $proto
->exists_in_facade($req, $req->get('task_id')->get_name);
$label = $req->get('task_id');
}
unless (ref($label)) {
if (my $t = $_TI->unsafe_from_name($label)) {
$label = $t;
}
}
$label = $label->as_int
if ref($label);
_trace($proto->QUERY_KEY, '=', $label) if $_TRACE;
if (ref($query) eq 'HASH') {
# Don't override if already set on passed in query
$query->{$proto->QUERY_KEY} ||= $label;
return $query;
}
my($x) = $req->unsafe_get('form_model');
$x &&= $x->unsafe_get_context;
foreach my $y ($x, $req) {
# Always override in context and request
($y->unsafe_get('query') || $y->put(query => {})->get('query'))
->{$proto->QUERY_KEY} = $label
if $y;
}
return;
}
sub save_label_and_execute {
my($proto, $label, $req) = @_;
$proto->save_label($label, $req);
$proto->execute($req);
return;
}
sub _extract {
my($proto, $req) = @_;
my($id) = delete(
($req->unsafe_get('query') || {})->{$proto->QUERY_KEY});
return undef
unless $id;
my($label);
if ($id =~ /^\d+$/) {
b_use('Bivio.Die')->catch_quietly(sub {
$label = $_TI->from_int($id)->get_name
});
}
else {
$label = $id;
}
$proto->new($req)->put_on_request($req)->put(label => $label)
if $label;
_trace($proto->QUERY_KEY, '=', $label) if $_TRACE;
return $label;
}
1;