Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/IdMapping/Serialisable.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/EnsEMBL/IdMapping/Serialisable.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,277 @@ +=head1 LICENSE + + Copyright (c) 1999-2012 The European Bioinformatics Institute and + Genome Research Limited. All rights reserved. + + This software is distributed under a modified Apache license. + For license details, please see + + http://www.ensembl.org/info/about/code_licence.html + +=head1 CONTACT + + Please email comments or questions to the public Ensembl + developers list at <dev@ensembl.org>. + + Questions may also be sent to the Ensembl help desk at + <helpdesk@ensembl.org>. + +=cut + +=head1 NAME + +Bio::EnsEMBL::IdMapping::Serialisable - base class for serialisable objects + +=head1 SYNOPSIS + + # instantiate an object which extends Serialisable + my $object = YourObject->new( + -DUMP_PATH => '/tmp', + -CACHE_FILE => 'object_cache.ser', + ); + + # serialise object to file + my $filesize = $object->write_to_file; + print LOG "Serialised object to file of size $filesize.\n"; + + # later, create another object defining the same serialisation + # location. specifying -LOAD_AUTO will automatically load it from the + # serialisation file. + my $object1 = YourObject->new( + -DUMP_PATH => '/tmp', + -CACHE_FILE => 'object_cache.ser', + -LOAD_AUTO => 1, + ); + + # alternatively, manually load the object from file + $object1->load_from_file; + +=head1 DESCRIPTION + +This is the base class for serialisable objects used by the +stable Id mapping. It's essentially an OO wrapper for Storable, +providing a method to store (write_to_file(()) and one to retrieve +(read_from_file()) serialised objects. + +This class is not instantiated itself, but rather extended by +implementing classes. + +=head1 METHODS + + new + write_to_file + read_from_file + dump_path + cache_file_name + cache_file + loaded + +=cut + +package Bio::EnsEMBL::IdMapping::Serialisable; + +use strict; +use warnings; +no warnings 'uninitialized'; + +use Bio::EnsEMBL::Utils::Argument qw(rearrange); +use Bio::EnsEMBL::Utils::Exception qw(throw warning); +use Bio::EnsEMBL::Utils::ScriptUtils qw(parse_bytes); +use Storable qw(nstore retrieve); + + +=head2 new + + Arg [DUMP_PATH] : String - path for object serialisation + Arg [CACHE_FILE] : String - filename of serialised object + Arg [AUTO_LOAD] : Boolean - determines whether object should be automatically + loaded on instantiation + Description : Constructor. + Return type : Bio::EnsEMBL::IdMapping::Serialisable implementing object + Exceptions : thrown on missing argument + Caller : implementing subclass + Status : At Risk + : under development + +=cut + +sub new { + my $caller = shift; + my $class = ref($caller) || $caller; + + my ($dump_path, $cache_file, $auto_load) = + rearrange([qw(DUMP_PATH CACHE_FILE AUTO_LOAD)], @_); + + throw("You must provide a cache file name") unless ($cache_file); + + my $self = {}; + bless ($self, $class); + + # initialise internal datastructure + $self->{'dump_path'} = $dump_path || '.'; + $self->{'cache_file_name'} = $cache_file; + + # automatically load serialised object from file if requested + if ($auto_load) { + if (-s $self->cache_file) { + $self->read_from_file; + $self->{'loaded'} = 1; + } + } + + return $self; +} + + +=head2 write_to_file + + Example : my $filesize = $object->write_to_file; + Description : Serialises an object to a file (determined by + $self->cache_file). + Return type : String - size of serialisation file + Exceptions : thrown on I/O errors + Caller : general + Status : At Risk + : under development + +=cut + +sub write_to_file { + my $self = shift; + + # create dump directory if it doesn't exist + if (my $dump_path = $self->dump_path) { + unless (-d $dump_path) { + system("mkdir -p $dump_path") == 0 or + throw("Unable to create directory $dump_path.\n"); + } + } + + my $cache_file = $self->cache_file; + + eval { nstore($self->{'cache'}, $cache_file) }; + if ($@) { + throw("Unable to store $cache_file: $@\n"); + } + + my $size = -s $cache_file; + return parse_bytes($size); +} + + +=head2 read_from_file + + Example : $object->read_from_file; + Description : Reads a serialised object from file (determined by + $self->cache_file). + Return type : Bio::EnsEMBL::IdMapping::Serialisable implementing object + Exceptions : thrown on I/O errors + Caller : general + Status : At Risk + : under development + +=cut + +sub read_from_file { + my $self = shift; + + my $cache_file = $self->cache_file; + + unless (-s $cache_file) { + throw("No valid cache file found at $cache_file."); + } + + eval { $self->{'cache'} = retrieve($cache_file); }; + if ($@) { + throw("Unable to retrieve cache: $@"); + } + + return $self; +} + + +=head2 dump_path + + Arg[1] : String - dump path for serialisation + Example : $object->dump_path('/tmp'); + Description : Getter/setter for the dump path for serialisation. + Return type : String + Exceptions : none + Caller : general + Status : At Risk + : under development + +=cut + +sub dump_path { + my $self = shift; + $self->{'dump_path'} = shift if (@_); + return $self->{'dump_path'}; +} + + +=head2 cache_file_name + + Arg[1] : String - file name for serialisation + Example : $object->cache_file_name('object_cache.ser'); + Description : Getter/setter for the file name for serialisation. + Return type : String + Exceptions : none + Caller : general + Status : At Risk + : under development + +=cut + +sub cache_file_name { + my $self = shift; + $self->{'cache_file_name'} = shift if (@_); + return $self->{'cache_file_name'}; +} + + +=head2 cache_file + + Example : my $cache_file = $object->cache_file; + Description : Returns the path and name of the serialised object file. + Return type : String + Exceptions : none + Caller : general + Status : At Risk + : under development + +=cut + +sub cache_file { + my $self = shift; + return $self->dump_path.'/'.$self->cache_file_name; +} + + +=head2 loaded + + Arg[1] : Boolean - "loaded" status + Example : if ($object->loaded) { + # do something with the object that was loaded from a file + } else { + # the object wasn't loaded but is new, so fill it + } + Description : Indicates whether a given object was loaded from its serialised + state on disk. + Return type : Boolean - TRUE if loaded from disk, FALSE otherwise + Exceptions : none + Caller : general + Status : At Risk + : under development + +=cut + +sub loaded { + my $self = shift; + $self->{'loaded'} = shift if (@_); + return $self->{'loaded'}; +} + + +1; +