package JCRList;
# --------------------------------------------------------------------
# The copyright and all other proprietary rights in this Database
# (including software - SEE LICENSING AGREEMENT) are the sole and
# exclusive property of the Institute for Scientific Information
# (ISI). This Database and source code, or any derivative works
# thereof, are confidential and proprietary to ISI . Therefore,
# duplication, reuse, redistribution, reverse assembling, reverse
# compiling, or translation of the Database, source code, or any
# portion thereof IS NOT PERMITTED. Consult Licensing Agreement.
# --------------------------------------------------------------------
# $Id: JCRList.pm,v 1.39 2008/09/16 16:17:31 ssidanal Exp $
use strict;
use Data::Dumper;
use ISIBench;
use JCRErrorList;
use Log::Log4perl qw(get_logger);
use VCRControl;
use URL;
use Util;
use base qq(JCRPage);
sub build_page {
ISIBench::start();
my $logger = get_logger("JCRList");
my $self = shift;
my $args = (ref $_[0] eq 'HASH') ? shift : { @_ };
my $request = $self->{request};
my $session = $self->{session};
my $year = $self->{session}->get('value' => 'year');
# Save required query params
$self->_save_params();
my($sort_box_type,$help_tag);
if ( $request->{RQ} =~ /LIST_SUMMARY_JOURNAL/i || $request->{RQ} =~ /SELECT_ALL/i || $request->{RQ} =~ /LIST_MARKED/i ) {
$sort_box_type = 'journal';
} elsif ( $request->{RQ} =~ /LIST_SUMMARY_CATEGORY/i ) {
$sort_box_type = 'category';
}
# Have the limits been changed?
if ($request->{change_limits} eq 'true') {
JCRUtil::purge_marked_list(
'session' => $self->{session},
'db' => $self->{db},
);
}
# Get the query list
my $query = $self->_get_query();
unless (defined $query && (ref($query) =~ /hash/i)) {
$logger->error("Could not build query!");
ISIBench::stop();
return $query;
}
$logger->debug("Returned query is: ", sub{Dumper($query)});
# Process any page button bar (such as mark page) requests
$self->_process_button_clicks( 'query' => $query );
# Execute the query based upon the request
my $data = $self->_execute_query( 'query' => $query );
my $count = $self->_execute_count( 'query' => $query );
if (((ref($count) =~ /hash/i) && ($count->{count}>0)) || ($request->{RQ} =~ /LIST_MARKED/i)) {
$logger->debug("Execute Query Count Returned: ", sub{Dumper($count);});
$logger->debug("Execute Query Returned: ", sub{Dumper($data);});
# Build the JCRSelection page template
my $vcr = VCRControl->new(
'lines_per_page' => $CF::recs_per_summary,
'num_page_links' => 10,
'total_lines' => $count->{count},
'url_target' => $CF::app_path,
'url_params' => 'RQ=' . $request->{RQ},
'images_url' => $CF::image_path,
'cursor' => $self->{summary_cursor},
);
unless (defined($vcr) && (ref($vcr) =~ /vcrcontrol/i)) {
$logger->error("Could not create VCRControl Object! (#$vcr)");
ISIBench::stop();
return $vcr;
}
# Get the journal start and end count
my $record_count = $vcr->range();
# Get the marked list buttons for this page
my $ml_buttons = $self->_get_buttons();
$logger->debug("Loading Summary List template");
my $ret = $self->_set_template();
if ($ret) {
ISIBench::stop();
return $ret;
}
# Set the page title
if ( $request->{RQ} =~ /LIST_SUMMARY_JOURNAL/i || $request->{RQ} =~ /SELECT_ALL/i ) {
$self->set_title( 'title' => 'Journal Summary List' );
$help_tag = qq{2.7};
} elsif ( $request->{RQ} =~ /LIST_MARKED/i ) {
$self->set_title( 'title' => 'Marked List' );
$help_tag = qq{2.11};
} elsif ( $request->{RQ} =~ /LIST_SUMMARY_CATEGORY/i ) {
$self->set_title( 'title' => 'Category Summary List' );
$help_tag = qq{2.13};
}
# Add the toolbar
my $toolbar = $self->build_toolbar( 'help' => $help_tag );
unless (defined($toolbar) && (ref($toolbar) =~ /toolbar/i)) {
ISIBench::stop();
return $toolbar;
}
if ( $request->{RQ} =~ /LIST_SUMMARY_JOURNAL/i || $request->{RQ} =~ /SELECT_ALL/i || $request->{RQ} =~ /LIST_MARKED/i ) {
my $marked = (ref($request->{mark}) =~ /array/i) ? $request->{mark} : [$request->{mark}];
$logger->debug("Marked Records on Page are: ", sub{Dumper($marked)});
my $num_marked_recs = scalar(@{$marked});
if ( $num_marked_recs == 1 ) {
if ( !defined($marked->[0]) ) {
$num_marked_recs=0;
}
}
# Set other template vars
if ( ($num_marked_recs == 0) && ($self->{mode} =~ /save/i || $self->{mode} =~ /print/i && ( $count->{count} <= $CF::recs_per_summary )) ) {
$self->set(
'name' => 'error_msg',
'value' => 'NOTICE
None of the journals on the list are marked for output.
Please select at least one journal below.',
);
}
}
$self->set(
'name' => 'selection',
'value' => $query->{display},
);
$self->set(
'name' => 'query_type',
'value' => $query->{type},
);
$self->set(
'name' => 'records',
'value' => $data,
);
$self->set(
'name' => 'sorted_by',
'value' => JCRUtil::map_sort_names('sort' => $self->{summary_sort}),
);
if ( $request->{RQ} =~ /LIST_SUMMARY_JOURNAL/i || $request->{RQ} =~ /SELECT_ALL/i || $request->{RQ} =~ /LIST_MARKED/i ) {
$self->set(
'name' => 'sort_j20',
'value' => ($self->{summary_sort} =~ /(?:journal|title)/) ? 'class=sorted' : '',
);
$self->set(
'name' => 'sort_cites',
'value' => ($self->{summary_sort} eq 'cites_all') ? 'class=sorted' : '',
);
$self->set(
'name' => 'sort_impact',
'value' => ($self->{summary_sort} eq 'impact_current') ? 'class=sorted' : '',
);
$self->set(
'name' => 'sort_immediacy',
'value' => ($self->{summary_sort} eq 'immediacy') ? 'class=sorted' : '',
);
$self->set(
'name' => 'sort_articles',
'value' => ($self->{summary_sort} eq 'source_current') ? 'class=sorted' : '',
);
$self->set(
'name' => 'sort_hlife',
'value' => ($self->{summary_sort} eq 'cited_hlife') ? 'class=sorted' : '',
);
$self->set(
'name' => 'sort_eigen',
'value' => ($self->{summary_sort} eq 'eigen_factor') ? 'class=sorted' : '',
);
$self->set(
'name' => 'sort_article_influence',
'value' => ($self->{summary_sort} eq 'article_influence') ? 'class=sorted' : '',
);
$self->set(
'name' => 'sort_5yr_impact',
'value' => ($self->{summary_sort} eq 'impact_5year') ? 'class=sorted' : '',
);
#Added For Eigen Fator, Article Influence and Five Year Impact factor.
$self->set(
'name' => 'show_eigen_five_yr_impact',
'value' => ($year->{year} >= $CF::data_eigen_impact_start) ? 1 : 0,
);
$self->set(
'name' => 'show_subject_category_summary_link',
'value' => ($year->{year} >= $CF::data_subject_category_start) ? 1 : 0,
);
}
elsif ( $request->{RQ} =~ /LIST_SUMMARY_CATEGORY/i ){
$self->set(
'name' => 'sort_cat',
'value' => ($self->{summary_sort} =~ /(?:category|cat_title)/) ? 'class=sortedcat' : '',
);
$self->set(
'name' => 'sort_cites',
'value' => ($self->{summary_sort} eq 'journal_cites') ? 'class=sortedcat' : '',
);
$self->set(
'name' => 'sort_median_if',
'value' => ($self->{summary_sort} eq 'median_if') ? 'class=sortedcat' : '',
);
$self->set(
'name' => 'sort_aggregate_if',
'value' => ($self->{summary_sort} eq 'aggregate_if') ? 'class=sortedcat' : '',
);
$self->set(
'name' => 'sort_aggregate_immed_index',
'value' => ($self->{summary_sort} eq 'aggregate_immed_index') ? 'class=sortedcat' : '',
);
$self->set(
'name' => 'sort_aggregate_cited_hlife',
'value' => ($self->{summary_sort} eq 'cited_hlife') ? 'class=sortedcat' : '',
);
$self->set(
'name' => 'sort_num_journals',
'value' => ($self->{summary_sort} eq 'journal_count') ? 'class=sortedcat' : '',
);
$self->set(
'name' => 'sort_num_articles',
'value' => ($self->{summary_sort} eq 'articles_count') ? 'class=sortedcat' : '',
);
}
$self->set(
'name' => 'record_start',
'value' => $self->{summary_cursor},
);
my $sort_select_box = JCRUtil::build_sort_box({'selected' => $self->{summary_sort},
'sort_box_type' => $sort_box_type,
'year'=> $year->{year},});
$self->set(
'name' => 'sort_select_box',
'value' => $sort_select_box->{html},
);
$self->set(
'name' => 'recs_per_page',
'value' => $CF::recs_per_summary,
);
# Vars for the VCR control
$self->set(
'name' => 'vcr_control',
'value' => $vcr->draw(),
);
$self->set(
'name' => 'journal_start',
'value' => $record_count->{start},
);
$self->set(
'name' => 'journal_end',
'value' => $record_count->{end},
);
$self->set(
'name' => 'journal_total',
'value' => $count->{count},
);
$self->set(
'name' => 'page_current',
'value' => $vcr->get_page(),
);
$self->set(
'name' => 'page_total',
'value' => $vcr->{_total_pages},
);
$self->set(
'name' => 'error',
'value' => $self->{ERROR},
);
# End VCR Control vars
if ( $request->{RQ} =~ /LIST_SUMMARY_JOURNAL/i || $request->{RQ} =~ /SELECT_ALL/i ) {
# Vars for the marked list buttons
$self->set(
'name' => 'markedlist_buttons',
'value' => $ml_buttons->{html},
);
# Check records that are marked
unless ($request->{RQ} =~ /list_marked/i) {
my $marked_records = $self->_get_marked_list();
$logger->debug("Got Marked List: ", sub{Dumper($marked_records)});
$self->set(
'name' => 'marked_records',
'value' => $marked_records,
);
}
}
} else {
# Redisplay the Search page because of error
$logger->debug("Loading jcr_search.html template");
my $ret = $self->set_template( 'template' => "jcr_search.html" );
if ($ret) {
ISIBench::stop();
return $ret;
}
my $errorlist = JCRErrorList->new();
if ( $request->{RQ} =~ /LIST_SUMMARY_JOURNAL/i ) {
$data = 3206 if (ref($data) =~ /(?:hash|array)/i);
} elsif ( $request->{RQ} =~ /LIST_SUMMARY_CATEGORY/i ) {
$data = 3006 if (ref($data) =~ /(?:hash|array)/i);
}
$data = 3206 if (ref($data) =~ /(?:hash|array)/i);
my $error = $errorlist->map( 'error' => $data );
$self->set(
'name' => 'error',
'value' => qq|***** $error->{error} *****|,
);
# Set the page title
$self->set_title( 'title' => 'Search' );
my $search_select_box = JCRUtil::build_search_box('selected' => $request->{search_type});
$self->set(
'name' => 'search_select_box',
'value' => $search_select_box->{html},
);
$self->set(
'name' => 'search_term',
'value' => Util::encode_html('html' => $request->{search_term}),
);
# Add the toolbar
my $toolbar = $self->build_toolbar( 'help' => '2.5' );
unless (defined($toolbar) && (ref($toolbar) =~ /toolbar/i)) {
ISIBench::stop();
return $toolbar;
}
}
if (($request->{RQ} =~ /SELECT_ALL/i) && (defined $request->{'Submit.x'})) {
my $edition = $session->get( 'value' => 'edition' );
my $log_edition = $edition->{'edition'};
my $data_string = qq{$log_edition};
# Log the View All Journals
$session->log_event(
'event' => 'event_query',
'data' => {
'limits' => $data_string,
},
);
# error checking
my $error_string = $session->getError();
if ( length($error_string) > 1 ) {
$logger->error("WURS Event not logged: $error_string");
}
}
ISIBench::stop();
return 0;
}
sub _update_marked_list {
ISIBench::start();
my $logger = get_logger("JCRList");
my $self = shift;
my $args = (ref $_[0] eq 'HASH') ? shift : { @_ };
my $request = $self->{request};
my $session = $self->{session};
# Create the new MarkedList object
my $edition = $session->get( 'value' => 'edition' );
my $year = $session->get( 'value' => 'year' );
my $marked_list = JCR::MarkedList->new(
'session' => $session,
'max_marked' => $CF::marked_list_max,
'db' => $self->{db},
'edition' => $edition->{edition},
'year' => $year->{year},
);
unless (defined($marked_list) && (ref($marked_list) =~ /markedlist/i)) {
$logger->debug("Could not create Marked List Object");
ISIBench::stop();
return $marked_list;
}
my @records = split /,/, $request->{page_records};
$logger->debug("Records on Page are: ", sub{Dumper(\@records)});
my $marked = (ref($request->{mark}) =~ /array/i) ? $request->{mark} : [$request->{mark}];
$logger->debug("Marked Records on Page are: ", sub{Dumper($marked)});
my %update;
tie %update, "Tie::IxHash";
foreach my $record (@records){
$logger->debug("Current Record is : $record:");
my $temp_record = $record;
$temp_record =~ s/\+/\\\+/;
$update{$record} = (grep(/^$temp_record$/i, @{$marked})) ? 'checked' : '';
}
$logger->debug("Update Marked List Hash: ", sub{Dumper(\%update)});
# Send the updated marked list to the DB
my $ret = $marked_list->update_marked_list( 'journals' => \%update );
$logger->debug("Marking records return value is: $ret");
if ($ret > 0) {
my $errorlist = JCRErrorList->new();
my $error = $errorlist->map( 'error' => $ret );
$self->{ERROR} = $error->{error};
}
ISIBench::stop();
return $ret;
}
1;