get rid of local pars_pk variable in the Pars hack. Fixes #45
[scpubgit/stemmaweb.git] / lib / stemmaweb / Controller / Stemweb.pm
index c808d9d..6962879 100644 (file)
@@ -25,11 +25,6 @@ has pars_path => (
        isa => 'Str',
        );
        
-has pars_pk => (
-       is => 'rw',
-       isa => 'Int',
-       );
-
 =head1 NAME
 
 stemmaweb::Controller::Stemweb - Client listener for Stemweb results
@@ -105,28 +100,25 @@ sub available :Local :Args(0) {
        my( $self, $c ) = @_;
        my $ua = LWP::UserAgent->new();
        my $resp = $ua->get( $self->stemweb_url . '/algorithms/available' );
+       my $parameters = [];
        if( $resp->is_success ) {
-               my $parameters = decode_json( $resp->content );
-               # Temporary hack: add Pars
-               if( $self->_has_pars ) {
-                       # Use the highest passed primary key + 1
-                       my $parspk = max( map { $_->{pk} } 
-                               grep { $_->{model} eq 'algorithms.algorithm' } @$parameters ) + 1;
-                       # Add Pars as an algorithm
-                       $self->pars_pk( $parspk );
-                       push( @$parameters, {
-                               pk => $parspk,
-                               model => 'algorithms.algorithm',
-                               fields => {
-                                       args => [],
-                                       name => 'Pars'
-                               }
-                       });
-               }
-               $c->stash->{'result'} = $parameters;
-       } else {
-               $c->stash->{'result'} = {};
+               $parameters = decode_json( $resp->content );
+       } # otherwise we have no available algorithms.
+       ## Temporary HACK: run Pars too
+       if( $self->_has_pars ) {
+               # Use 100 as the special pars key
+               # Add Pars as an algorithm
+               push( @$parameters, {
+                       pk => 100,
+                       model => 'algorithms.algorithm',
+                       fields => {
+                               args => [],
+                               name => 'Pars',
+                               desc => 'The program "pars", from the Phylip bio-statistical software package, produces a maximum-parsimony distance tree of the witnesses. More information on maximum parsimony can be found <a href="https://wiki.hiit.fi/display/stemmatology/Maximum+parsimony">here</a>. Please note that Phylip "pars" only supports a maximum of eight variants readings in any one variant location in the text. If your text displays more divergence than this at any point, please consider disregarding orthographic and spelling variation below, or use one of the other algorithms.'
+                       }
+               });
        }
+       $c->stash->{result} = $parameters;
        $c->forward('View::JSON');
 }
 
@@ -214,11 +206,14 @@ sub _process_stemweb_result {
                        }
                        $c->stash->{'result'} = { status => 'notfound' };
                }
-       } elsif( $answer->{status} == -1 ) {
+       } elsif( $answer->{status} == 1 || $answer->{status} == -1  ) {
+               # 1 means running, -1 means waiting to run. Either way, 'not ready'.
                $c->stash->{'result'} = { 'status' => 'running' };
        } else {
-               return _json_error( $c, 500,
-                       "Stemweb failure not handled: " . $answer->{result} );
+               # Failure. Clear the job ID so that the user can try again.
+               $tradition->_clear_stemweb_jobid;
+               $m->save( $tradition );
+               $c->stash->{'result'} = { 'status' => 'failed', 'message' => $answer->{result} };
        }
        $c->forward('View::JSON');
 }
@@ -249,7 +244,7 @@ sub request :Local :Args(0) {
        
        my $algorithm = delete $reqparams->{algorithm};
        my $mergetypes = delete $reqparams->{merge_reltypes};
-       if( $self->_has_pars && $algorithm == $self->pars_pk ) {
+       if( $self->_has_pars && $algorithm == 100 ) {
                my $start_time = scalar( gmtime( time() ) );
                $t->set_stemweb_jobid( 'local' );
                my $cdata = character_input( $t, { collapse => $mergetypes } );
@@ -274,7 +269,7 @@ sub request :Local :Args(0) {
        } else {
                # Form the request for Stemweb.
                my $return_uri = URI->new( $c->uri_for( '/stemweb/result' ) );
-               my $tsv_options = { noac => 1 };
+               my $tsv_options = { noac => 1, ascii => 1 };
                if( $mergetypes && @$mergetypes ) {
                        $tsv_options->{mergetypes} = $mergetypes;
                }
@@ -288,7 +283,7 @@ sub request :Local :Args(0) {
                
                # Call to the appropriate URL with the request parameters.
                my $ua = LWP::UserAgent->new();
-               $c->log->debug( 'Sending request to Stemweb: ' . to_json( $stemweb_request ) ); 
+               # $c->log->debug( 'Sending request to Stemweb: ' . to_json( $stemweb_request ) ); 
                my $resp = $ua->post( $self->stemweb_url . "/algorithms/process/$algorithm/",
                        'Content-Type' => 'application/json; charset=utf-8', 
                        'Content' => encode_json( $stemweb_request ) );