Raw content of BioMart::FormatterI # $Id: FormatterI.pm,v 1.4 2008/04/09 12:52:33 syed Exp $ # # BioMart module for BioMart::FormatterI # # You may distribute this module under the same terms as perl # itself. # POD documentation - main docs before the code. =head1 NAME BioMart::FormatterI =head1 SYNOPSIS TODO: Synopsis here. =head1 DESCRIPTION An abstract class for Formatters =head1 AUTHOR - Arek Kasprzyk, Syed Haider, Richard Holland, Damian Smedley, Gudmundur Arni Thorisson =head1 CONTACT This module is part of the BioMart project http://www.biomart.org Questions can be posted to the mart-dev mailing list: mart-dev@ebi.ac.uk =head1 METHODS =cut package BioMart::FormatterI; use strict; use warnings; # Extends BioMart::Root use base qw(BioMart::Root); use BioMart::Web::SiteDefs; sub _new { my ($self) = @_; $self->SUPER::_new(); $self->attr('query',undef); $self->attr('original_attributes',undef); $self->attr('result_table',undef); $self->attr('attribute_positions',undef);# for hyperlink processing $self->attr('attribute_url_positions',undef);# for hyperlink processing $self->attr('attribute_url',undef);# for hyperlink processing $self->attr('dataset1_end',undef);#for result table color highlighting } # must be implemented for every formatter implementation sub processQuery { my $self = shift; $self->unimplemented_method(); } # must be implemented for every formatter implementation sub nextRow { my $self = shift; $self->unimplemented_method(); } # must be implemented for every formatter implementation sub getDisplayNames { my $self = shift; $self->unimplemented_method(); } # can be implemented in formatter implementations sub getFooterText { return undef; } sub resultTable { my ($self,$result_table) = @_; if ($result_table){ $self->set('result_table',$result_table); } return $self->get('result_table'); } sub getTextDisplayNames { my ($self,$separator) = @_; my $original_attributes = $self->get('original_attributes'); my $final_dataset_order = $self->get('query')->finalDatasetOrder; my @attribute_display_names; my @original_dataset_attributes; foreach my $dataset(reverse @$final_dataset_order){ foreach (@{$original_attributes}){ push @original_dataset_attributes,$_ if ($_->dataSetName eq $dataset); } } foreach my $original_attribute(@original_dataset_attributes){ push @attribute_display_names, $original_attribute->displayName; } return @attribute_display_names; } sub setHTMLAttributes { my ($self, $query) = @_; # add extra url attributes on query if required (eg) for HTML, XLS if($query->getAllAttributes()) { my $registry = $query->getRegistry; my $attributes = [@{$query->getAllAttributes()}]; foreach my $attribute (@$attributes){ if ($attribute->link){ my @link = split(/\|/,$attribute->link); if (@link > 2){# multi attribute link for (my $i = 2; $i < @link; $i++){ next if ($link[$i] eq $attribute->name); # skip broken hyperlink URL templates for now # use long winded method call to avoid exception throwing next if (!$query->getRegistry ->getDatasetByName($query->virtualSchema, $attribute->dataSetName) ->getConfigurationTree($attribute->interface) ->getAttributeByName($link[$i])); if($query->get('currentDS') ne $attribute->dataSetName) { my $tempDS = $query->get('currentDS'); $query->setDataset($attribute->dataSetName); $query->addAttribute($link[$i], $attribute->interface); $query->setDataset($tempDS); } else { $query->addAttribute($link[$i], $attribute->interface); } } } } } # set @attribute_positions, @attribute_url_positions and and @attribute_url # so nextRow can process hyperlinks my $final_dataset_order = $query->finalDatasetOrder; # establish the position of attributes and URL-only attributes in # final ResultTable my $original_attributes = $self->get('original_attributes'); my @attribute_positions; my @attribute_url_positions; my @attribute_url; my $att_counter = 0; my $extra_att_counter = 0; my $dataset_start = 0; my $extra_att_start = 0; foreach my $dataset(reverse @$final_dataset_order){ my @original_dataset_attributes; foreach (@{$original_attributes}){ push @original_dataset_attributes,$_ if ($_->dataSetName eq $dataset); } $dataset_start = $extra_att_start + $extra_att_counter; $extra_att_start = $dataset_start + @original_dataset_attributes; $att_counter = 0; $extra_att_counter = 0; foreach my $original_attribute(@original_dataset_attributes){ my @url_positions; my @link; if ($original_attribute->link){ @link = split(/\|/,$original_attribute->link); if (@link > 2){# multi attribute link for (my $i = 2; $i < @link; $i++){ # skip any that had broken links as above next if (!$query->getRegistry ->getDatasetByName($query->virtualSchema, $original_attribute->dataSetName) ->getConfigurationTree($original_attribute->interface) ->getAttributeByName($link[$i])); if ($link[$i] eq $original_attribute->name){ push @url_positions, $dataset_start+$att_counter; } else{ push @url_positions, $extra_att_start+$extra_att_counter; $extra_att_counter++; } } } else{ push @url_positions,$dataset_start+$att_counter; } } else{ push @url_positions,$dataset_start+$att_counter; } push @attribute_url_positions, \@url_positions; push @attribute_positions, $dataset_start+$att_counter; # Check $link[0] to find out what kind of link # this is. Then, look up the prefix for links of that kind # in SiteDefs.pm. If found, prefix it. If not, leave as-is. #my %prefixes = BioMart::Web::SiteDefs->getSettings('urlPrefixes'); my %prefixes; my $mart_registry = $query->getRegistry(); my $hash = $mart_registry->settingsParams(); foreach(keys %$hash) { if($_ eq "urlPrefixes") { %prefixes = %{$hash->{$_}}; } } my $resolvedLink = $link[1] ? ( (substr($link[1],0,1) eq '/') ? $prefixes{$link[0]} . $link[1] : $link[1] ) : $link[0]; push @attribute_url, $resolvedLink; $att_counter++; } } $self->set('attribute_positions',\@attribute_positions); $self->set('attribute_url_positions',\@attribute_url_positions); $self->set('attribute_url',\@attribute_url); # set dataset1_end #my $original_attributes = $self->get('original_attributes'); my @original_dataset_attributes; foreach my $dataset(reverse @$final_dataset_order){ foreach (@{$original_attributes}){ push @original_dataset_attributes,$_ if ($_->dataSetName eq $dataset); } } my ($first_dataset,$dataset1_end); foreach my $original_attribute(@original_dataset_attributes){ my $dataset_name = $original_attribute->pointedFromDataset || $original_attribute->dataSetName; if ($first_dataset && $first_dataset ne $dataset_name){ $self->set('dataset1_end',$dataset1_end-1); last; } $dataset1_end++; $self->set('dataset1_end',$dataset1_end-1); $first_dataset = $dataset_name; } } return $query; } sub getMimeType { return 'text/plain'; } sub getFileType { return 'txt'; } sub getFormatterDisplayName { return undef; } sub isBinary { return 0; } sub isSpecial { return 0; } 1;