带验证器的 Perl 工作流模块

2024-03-29

我正在尝试让 perl 工作流程模块工作 -http://search.cpan.org/~jonasbn/Workflow/ http://search.cpan.org/~jonasbn/Workflow/

我设法弄清楚它如何与工作流程、操作、条件等一起工作,但我无法让它将验证器类应用于操作。

我的验证器中的 _init 方法加载并打印出我放在那里进行测试的行,但验证方法从未被触发。另外,当从操作类转储 $self->get_validators() 时,我得到空列表。

我创建了一个简短的示例,因此请尝试一下,如果您发现问题,请提供帮助。嗯!

链接到代码 -https://github.com/vmcooper/perl_workflow_test https://github.com/vmcooper/perl_workflow_test

运行程序

程序开始于

Answer: London
If you answer right the action should change state to 'finished'. Try answering wrong first.
Capital city of England:

如果你回答“伯明翰”,它应该写

Your answer is being validated!

并再次提出问题。

当您回答“伦敦”时,应该

Correct! Current state of workflow is - finished

edit现在,无论您的答案是什么,它都会写出“正确!工作流程的当前状态已完成”。

工作流程测试.pl

use strict;
use Log::Log4perl     qw( get_logger );
use Workflow::Factory qw( FACTORY );

Log::Log4perl::init( 'log4perl.conf' );
system('clear');

# Stock the factory with the configurations; we can add more later if we want
FACTORY->add_config_from_file(
    workflow   => 'workflow.xml',
    action     => 'action.xml',
    persister  => 'persister.xml',
    validator  => 'validator.xml'
    );

my $workflow = FACTORY->create_workflow( "Workflow1" );
my $context = $workflow->context;

while ( $workflow->state eq "INITIAL" ) {
    print "If you answer right the action should change state to 'finished'. Try answering wrong first.\n";
    my $city = get_response( "Capital city of England: " );
    print "You answered - $city\n";
    $workflow->execute_action( 'action1' );

    if( $workflow->state eq "INITIAL" ) {
        print "Your answer is wrong! try again!\n\n";
    }
}

print "\nCorrect! Current state of workflow is - ".$workflow->state."\n\n";


# Generic routine to read a response from the command-line (defaults,
# etc.) Note that return value has whitespace at the end/beginning of
# the routine trimmed.

sub get_response {
    my ( $msg ) = @_;
    print $msg;
    my $response = <STDIN>;
    chomp $response;
    $response =~ s/^\s+//;
    $response =~ s/\s+$//;
    return $response;
}

工作流程.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>

操作.xml

<actions>
    <action name="action1" class="App::Action::Action1" >
        <validator name="validator1">
            <arg>$city</arg>
        </validator>
    </action>
</actions>

验证器.xml

<validators>
    <validator name="validator1" class="App::Validator::Validator1">
        <param name="answer" value="London" />
    </validator>
</validators>

应用程序::操作::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;

应用程序::验证器::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;

编辑: 如果我在创建之后和执行任何操作之前转储工作流对象,我会得到以下信息:

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' );

正如您所看到的,验证器就在这里,一切都已设置完毕,看起来一切正常,但验证器尚未应用。


看起来我们需要等待一段时间,或者我们可以参与一个项目来完成这个功能。

滚动到“get_validators”标题,您将看到一个“#TODO”标记。 我不确定这是否意味着需要完成文档或代码,但我确实稍微查看了代码,看起来需要为该功能完成代码。http://search.cpan.org/~jonasbn/Workflow-1.41/lib/Workflow/Factory.pm http://search.cpan.org/~jonasbn/Workflow-1.41/lib/Workflow/Factory.pm

如我错了请纠正我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带验证器的 Perl 工作流模块 的相关文章

随机推荐

  • Akka 2:如何暂停消息处理?

    在我使用 Akka 掌握 Actor 模型的过程中 出现了很多问题 这是另一张 假设我们有一个 Actor 由于某些业务逻辑或可用资源 它必须在给定时间内停止处理消息 可能发生这种情况的情况可能是 节流 可能有一个发送电子邮件的 Actor
  • gcc 可以配置为不打印警告/错误消息中的完整路径吗?

    当 gcc 打印出警告或错误时 它会显示包含错误的文件的完整路径 是否有一个标志可以将输出缩短为仅文件名 这仅取决于您如何调用 gcc tmp c gcc Wall bad c bad c 1 warning return type def
  • 如何在 BigQuery 中通过每个用户的线性插值来填充不规则缺失的时间序列值?

    我有丢失的数据时间序列价值观不规律对于每个用户 我想使用 BigQuery 标准 SQL 通过线性插值以一定的间隔对其进行转换 name time value Jane 2020 11 14 09 01 00 3 Jane 2020 11
  • Django 无法加载模板标签

    我创建了一个templatetags我的应用程序内的文件夹和名为的文件内posts py 我写了以下代码 from django template import Library Node from advancedviews models
  • 如何检查 Jetpack Compose 中列表项的可见性

    FlatList of React Native有财产viewabilityConfigCallbackPairs您可以在其中设置 viewabilityConfig itemVisiblePercentThreshold 50 waitF
  • 从 csv 文件复制 cassandra 表

    我正在我的 Mac 带有 Oracle jdk1 7 0 55 的 Mac OS X Yosemite 上为 Cassandra Apache Spark 和 Flume 设置演示环境 该景观应作为新分析平台的概念证明 因此我需要在我的 c
  • SQL 计数(*) 性能

    我有一个包含超过 2000 万行的 SQL 表 BookChapters 它有一个聚集主键 bookChapterID 并且没有任何其他键或索引 运行以下查询需要几毫秒 if select count from BookChapters 0
  • 在 PHP 关联数组索引中使用空格是一种不好的做法吗?

    我必须使用关联数组传递一些参数 如下所示 blockGroup name products type complete 做了一些测试 我发现它有效 但这是一个不好的做法吗 是否有可能产生任何错误或意外行为 感谢您的任何建议 EDIT 1 我
  • FreeType“通用”与 c++/cx 关键字冲突

    我在将 c 和 c cx 放在一起时遇到问题 我需要使用 FreeType 库 但他们对某些变量使用 通用 名称 我还需要启用 VC 扩展 因为 WinRT 应用程序会导致名称冲突 通用是 c cx 中的关键字 1 gt freetype2
  • 如何查看eclipse“运行配置”使用的shell命令

    给定 Eclipse 中的 运行配置 我想打印出用于运行它的关联 shell 命令 例如 现在 在 Eclipse 中 如果我单击 播放 它将运行 mvn assembly directory Dmaven test skip true 我
  • 使用 SonarQube 进行多模块项目分析

    SonarQube Server 5 1 2 Sonar Runner 2 4 如提供的多模块项目 http docs sonarqube org display SONAR Analyzing with SonarQube Runner
  • 下划线充当分隔符 C# RTF Box

    我正在开发一个 Winforms 应用程序 并使用 RichTextBox 控件上的 Find 来查找要设置样式的特定关键字 由于某种原因 尽管指定了 WholeWord 标志 Find 似乎仍将其中带有下划线的单词视为 2 个单独的单词
  • Peewee MySQL 服务器消失了

    我用烧瓶和尿尿 有时 peewee 会抛出此错误 MySQL server has gone away error 32 Broken pipe Peewee 数据库连接 db PooledMySQLDatabase database pa
  • 对整数树求和 (Haskell)

    我正在尝试创建一个对非二叉整数树的值求和的函数 datastructures hs data Tree a Empty Node a Tree a deriving Eq Show myNums Num a gt Tree a myNums
  • 如何使基于列表的编辑器模板正确绑定到 POST 操作?

    我有一个模型 ApplicantBranchList 在更大的模型中用作属性 如下所示 Display Name Where would you want to work public ApplicantBranchList Prefere
  • 向 tm 结构添加一些间隔

    我有一个结构tm 我需要添加一些固定间隔 以xx年 xx月 xx天给出 到tm struct 有没有标准函数可以做到这一点 我使用的编译器是 Windows XP 上的 MSVC 2005 有两个转换时间格式的函数 mktime 哪个转换s
  • 组合选择器时,空格与没有空格的含义相同吗?

    在 CSS 中 选择器与空格的结合意味着后裔 http www w3 org TR CSS21 selector html descendant selectors 但在另一个答案中如何在CSS选择器中组合类和ID https stacko
  • phpStorm 与 php-cgi 的问题

    所以我最近换成了 ubuntu 我试图再次设置我的环境 我设法安装了 LAMP 和 phpmyadmin 和 phpstorm 但是我无法做的是从 phpStorm 运行 php 脚本 当我尝试运行该程序时 页面给我一个 502 Bad g
  • 从另一个页面链接到特定选项卡

    我有一个包含 3 个选项卡的表单 div class tabs ul class tabset li a class active span Shirts span a li li a href span Jeans span a li l
  • 带验证器的 Perl 工作流模块

    我正在尝试让 perl 工作流程模块工作 http search cpan org jonasbn Workflow http search cpan org jonasbn Workflow 我设法弄清楚它如何与工作流程 操作 条件等一起