I am trying to get everything working with the perl Workflow module - http://search.cpan.org/~jonasbn/Workflow/
I managed to figure out how this works with workflows, actions, conditions, and everything, but I can't get it to apply the validator class to an action.
My _init method from the validator downloads and prints the line that I put there for testing, but the verification method never starts. Also, when dumping $ self-> get_validators () from the action class, I get an empty list.
I created a short example, so please try and help if you see a problem. Tnx!
link to the code - https://github.com/vmcooper/perl_workflow_test
Program launch
The program begins with
Answer: London If you answer right the action should change state to 'finished'. Try answering wrong first. Capital city of England:
if you answer Birmingham he should write
Your answer is being validated!
and ask the question again.
When you answer "London", he should
Correct! Current state of workflow is - finished
edit Now it writes “Correct! The current state of the workflow is completed” regardless of your answer.
workflow_test.pl
use strict; use Log::Log4perl qw( get_logger ); use Workflow::Factory qw( FACTORY ); Log::Log4perl::init( 'log4perl.conf' ); system('clear');
workflow.xml
<workflow> <type>Workflow1</type> <time_zone>local</time_zone> <description>This is my workflow.</description> <persister>Persister1</persister> <state name="INITIAL"> <action name="action1" resulting_state="finished"/> </state> <state name="finished" /> </workflow>
action.xml
<actions> <action name="action1" class="App::Action::Action1" > <validator name="validator1"> <arg>$city</arg> </validator> </action> </actions>
validator.xml
<validators> <validator name="validator1" class="App::Validator::Validator1"> <param name="answer" value="London" /> </validator> </validators>
App :: Action :: Action1.pm
package App::Action::Action1; use strict; use base qw( Workflow::Action ); use Workflow::Exception qw( validation_error configuration_error ); use Data::Dumper; sub new { my $class = shift; my $self = {}; bless ($self, $class); return $self; } sub execute { my $self = shift; my $wf = shift; print "App::Action::Action1::Execute\n"; print "Validators: ".Dumper($self->get_validators())."\n"; } 1;
App :: Validator :: Validator1.pm
package App::Validator::Validator1; use strict; use base qw( Workflow::Validator ); use Workflow::Exception qw( validation_error configuration_error ); use Data::Dumper; use Carp qw(carp); sub _init { my ( $self, $params ) = @_; unless ( $params->{answer} ) { configuration_error "You must define a value for 'answer' in ", "declaration of validator ", $self->name; } if ( ref $params->{answer} ) { configuration_error "The value for 'answer' must be a simple scalar in ", "declaration of validator ", $self->name; } print "Answer: ".$params->{answer}."\n"; $self->{ answer => $params->{answer} }; } sub validate { my ( $self, $wf, $city ) = @_; print "Your answer is being validated!\n"; print "Your answer is - ".$city."\n"; my $check; if ( $city eq $self->{answer} ){ $check = 1; } else { $check = 0; } unless ( $check ) { validation_error "Validation error!"; } } 1;
Edit: If I delete a work object immediately after creation and before any action is performed, I get the following:
Workflow: $VAR1 = bless( { '_states' => { 'INITIAL' => bless( { ..., '_actions' => { 'action1' => { 'resulting_state' => 'finished', 'name' => 'action1' } }, '_factory' => bless( { ..., '_action_config' => { 'default' => { 'action1' => { 'name' => 'action1', 'class' => 'App::Action::Action1', 'validator' => [ { 'arg' => [ '$city' ], 'name' => 'validator1' } ] } } }, '_validators' => { 'validator1' => bless( { 'name' => 'validator1', 'class' => 'App::Validator::Validator1', 'PARAMS' => {} }, 'App::Validator::Validator1' ) }, '_validator_config' => { 'validator1' => { 'answer' => 'London', 'name' => 'validator1', 'class' => 'App::Validator::Validator1' } }, ... }, 'Workflow::Factory' ), 'type' => 'Workflow1', 'PARAMS' => {} }, 'Workflow::State' ), 'finished' => $VAR1->{'_states'}{'INITIAL'}{'_factory'}{'_workflow_state'}{'Workflow1'}[1] }, ... }, 'Workflow' );
As you can see, the validator is here, and everything is configured and looks as if it is normal, but the validator is not applied.