2015-01-13 9 views
6

मैं चीजों पर्ल कार्यप्रवाह मॉड्यूल के साथ काम पाने के लिए कोशिश कर रहा हूँ के साथ पर्ल कार्यप्रवाह मॉड्यूल - http://search.cpan.org/~jonasbn/Workflow/सत्यापनकर्ता

मैं यह पता लगाने की कि यह कैसे कार्य प्रवाह, कार्यों, शर्तों और सभी के साथ काम करता कामयाब रहे, लेकिन मैं यह करने के लिए नहीं मिल सकता है कार्रवाई के लिए सत्यापनकर्ता वर्ग लागू करें।

सत्यापनकर्ता से मेरा _init विधि लोड करता है और उस पंक्ति को प्रिंट करता है जिसे मैंने परीक्षण के लिए रखा है लेकिन सत्यापन विधि कभी ट्रिगर नहीं होती है। साथ ही, जब कार्रवाई वर्ग से $ self-> get_validators() को डंप करते समय मुझे खाली सूची मिलती है।

मैंने एक छोटा सा उदाहरण बनाया है, इसलिए कृपया इसे आजमाएं और अगर आपको समस्या दिखाई दे तो मदद करें। Tnx!

कोड के लिए लिंक - 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! 

लिख सकते हैं और आप से पूछना चाहिए क्यू फिर से estion।

जब आप का जवाब "लंदन" यह

Correct! Current state of workflow is - finished 

संपादित अब इसे बाहर लिखते हैं चाहिए "सही कार्यप्रवाह की वर्तमान स्थिति है - समाप्त" जो कुछ भी अपने जवाब है।

workflow_test.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; 
} 

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> 

अनुप्रयोग :: कार्रवाई :: 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'); 

आप देख सकते हैं, सत्यापनकर्ता यहाँ है और सब कुछ सेट होने और लग रहा है यह ठीक है लेकिन सत्यापनकर्ता लागू नहीं किया जाता है।

+0

एचएम ... मैं इसे स्पष्ट और न्यूनतम के रूप में समझा सकता हूं: कार्रवाई निष्पादित होने से पहले सत्यापनकर्ता लागू नहीं किया गया है। उस के रूप में सरल। मैंने कोड और एक गिथब रेपो भी शामिल किया है, इसलिए मैं वास्तव में नहीं जानता कि कैसे और अधिक सटीक होना चाहिए। – Vedran

+0

कोड इतना आसान है क्योंकि यह हो सकता है क्योंकि मैं यह समझने की उम्मीद कर रहा हूं कि यह मॉड्यूल कैसे काम करता है। आप देख सकते हैं कि "प्रोग्राम चालू करना" के तहत क्या करना चाहिए। यह बोल्ड है। मैं आपको एक नोटिस देता हूं कि मैं यहां पर पर्ल मॉड्यूल का उपयोग कर रहा हूं, जिसे मैंने स्वयं नहीं लिखा था। सीपीएन के शीर्ष पर एक लिंक है जहां आप मॉड्यूल देख सकते हैं जिसके बारे में मैं बात कर रहा हूं। यही कारण है कि मैं पूछ रहा हूं कि कोई जानता है कि इसका उपयोग कैसे किया जाए और मैंने कॉन्फ़िगरेशन फ़ाइलों या कक्षाओं में क्या गलत किया? – Vedran

+0

क्षमा करें, बर्मिंघम उदाहरण के अतिरिक्त चूक गए। प्रश्न वास्तव में अब पूरा हो गया है, धन्यवाद। – ikegami

उत्तर

0

ऐसा लगता है कि हमें इसके लिए थोड़ा इंतजार करना होगा या हम इस कार्यप्रणाली को प्राप्त करने के लिए एक परियोजना में भाग ले सकते हैं।

"get_validators" शीर्षक पर स्क्रॉल करें और आप "#TODO" चिह्न को देखेंगे। मुझे यकीन नहीं है कि इसका मतलब है कि दस्तावेज को करने या कोड करने की आवश्यकता है, लेकिन मैंने कोड को थोड़ा सा देखा और ऐसा लगता है कि इस कार्यक्षमता के लिए कोड को करने की आवश्यकता है। http://search.cpan.org/~jonasbn/Workflow-1.41/lib/Workflow/Factory.pm

अगर मैं गलत हूं तो मुझे सही करें।

-1

मैंने आपके उदाहरण में कई मुद्दों को स्थित किया है।

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 execute { 
    my $self = shift; 
    my $wf = shift; 
    print "App::Action::Action1::Execute\n"; 
    print "Validators: ".Dumper($self->get_validators())."\n"; 
} 

1; 

मुख्य मुद्दा है कि आपके आवेदन उपयोगकर्ता से इनपुट प्राप्त इस प्रकार अपनी कार्रवाई वर्ग छोड़ने हटा दिया जाना चाहिए, लेकिन आप वर्कफ़्लो को कभी फ़ीड न करें। इस संदर्भ का उपयोग किया जा चुका है, इसलिए जैसे:

$context->param(answer => $city); 

सत्यापनकर्ता दिखता है इस प्रकार करना चाहिए:

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) = @_; 

    my $city = $wf->context->param('answer'); 

    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; 

और अपने मुख्य आवेदन सदृश चाहिए निम्नलिखित:

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

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"; 
    $context->param(answer => $city); 
    $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; 
} 

मैं समझता हूँ कि अपने भ्रम, क्योंकि दस्तावेज़ीकरण इस तथ्य को सही ढंग से प्रतिबिंबित नहीं करता है और इसे वितरण में उदाहरण अनुप्रयोग से नहीं पढ़ा जा सकता है। मैं तदनुसार दस्तावेज अद्यतन करेंगे।

+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/18067782) –

+0

मैंने आपके जीथब भंडार के लिए सभी फ़ाइलों के साथ [एक पीआर] (https://github.com/vmcooper/perl_workflow_test/pull/1) बनाया है , मुझे खेद है कि मैंने अपना खुद का निर्माण करने से पहले इसे अनदेखा कर दिया था और आपके प्रश्न में लापता फाइलें निश्चित रूप से भंडार में उपलब्ध थीं। मेरी अपनी प्रतिक्रिया में वैधता में किए गए परिवर्तनों की कमी है, मैं इसे अपडेट कर दूंगा। – jonasbn

+0

@ guillaume-darmont आपके लिए फिर से मेरे उत्तर की समीक्षा करना संभव होगा, मैंने इसे अपडेट किया है - और यदि मैं कोर्स का उत्तर देता हूं तो मैं -1 को संबोधित करना चाहता हूं - धन्यवाद – jonasbn

संबंधित मुद्दे