Mercurial > pub > Impl
diff Lib/DOM/Providers/Headlines.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 03e58a454b20 |
children |
line wrap: on
line diff
--- a/Lib/DOM/Providers/Headlines.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/DOM/Providers/Headlines.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,128 +1,128 @@ -package DOM::Providers::Headlines::Headline; -use Common; -use Time::Local; -our @ISA = qw(Object); - -BEGIN { - DeclareProperty(Id => ACCESS_READ); - DeclareProperty(DateModify => ACCESS_READ); - DeclareProperty(DateExpire => ACCESS_READ); - DeclareProperty(URL => ACCESS_READ); - DeclareProperty(Text => ACCESS_READ); - DeclareProperty(Channel => ACCESS_READ); -} - -sub str2time { - my $str = shift; - - if ($str =~ /^(\d{4})-(\d{2})-(\d{2})(?:\s(\d{2}):(\d{2}):(\d{2}))?$/) { - my ($year,$month,$day,$hh,$mm,$ss) = ($1,$2-1,$3,(defined $4 ? $4 : 0),(defined $5 ? $5 : 0),(defined $6 ? $6 : 0)); - return timelocal($ss,$mm,$hh,$day,$month,$year); - } else { - die new Exception("A string '$str' isn't an ISO standard time"); - } -} - -sub IsActive { - my ($this) = @_; - my $timeExpire = str2time($this->{$DateExpire}); - - return ($timeExpire > time()); -} - -package DOM::Providers::Headlines::Collection; -use Common; -our @ISA = qw (Object); - -BEGIN { - DeclareProperty(Items => ACCESS_READ); -} - -sub CTOR { - my ($this,%args) = @_; - - foreach my $headline (@{$args{'Items'}}) { - $this->{$Items}->{$headline->Id()} = $headline if ($headline->IsActive) - } -} - -sub as_list { - my $this = shift; - - return [ map { $this->{$Items}->{$_} } sort keys %{$this->{$Items}} ]; -} - -sub GenerateRandomSequence { - my ($count,$max) = @_; - - my %hash; - $hash{rand()} = $_ foreach (0 .. $max - 1); - my @sequence = map { $hash{$_} } sort keys %hash; - return splice @sequence,0,$count; -} - -sub Random { - my ($this,$count) = @_; - - my $list = $this->as_list(); - - return [map { $list->[$_] } GenerateRandomSequence($count,scalar(@$list))]; -} - -sub Recent { - my ($this,$count) = @_; - - my @result = sort { $b->DateModify() cmp $a->DateModify() } values %{$this->{$Items}}; - splice @result,$count; - - return \@result; -} - -sub AddItem { - my ($this,$newItem) = @_; - - $this->{$Items}->{$newItem->Id()} = $newItem; -} - -package DOM::Providers::Headlines; -use Common; -use ObjectStore::Headlines; - -our $DBPath; -our $Encoding; - -my %Channels; - -eval { - LoadHeadlines(); -}; - -if ($@) { - my $err = $@; - if (ref $err eq 'Exception') { - die $err->ToString(); - } else { - die $err; - } -} - - -sub GetProviderInfo { - return { - Name => 'Headlines', - Host => 'DOM::Site', - Objects => \%Channels - } -} - -sub LoadHeadlines { - my $dsHeadlines = new ObjectStore::Headlines(DBPath => $DBPath, HeadlineClass => 'DOM::Providers::Headlines::Headline', Encoding => $Encoding); - - foreach my $headline (@{$dsHeadlines->Search(Filter => sub { return $_[0]->IsActive(); } )}) { - my $channel = $headline->Channel() || 'main'; - $Channels{$channel} = new DOM::Providers::Headlines::Collection() if not exists $Channels{$channel}; - $Channels{$channel}->AddItem($headline); - } -} - -1; \ No newline at end of file +package DOM::Providers::Headlines::Headline; +use Common; +use Time::Local; +our @ISA = qw(Object); + +BEGIN { + DeclareProperty(Id => ACCESS_READ); + DeclareProperty(DateModify => ACCESS_READ); + DeclareProperty(DateExpire => ACCESS_READ); + DeclareProperty(URL => ACCESS_READ); + DeclareProperty(Text => ACCESS_READ); + DeclareProperty(Channel => ACCESS_READ); +} + +sub str2time { + my $str = shift; + + if ($str =~ /^(\d{4})-(\d{2})-(\d{2})(?:\s(\d{2}):(\d{2}):(\d{2}))?$/) { + my ($year,$month,$day,$hh,$mm,$ss) = ($1,$2-1,$3,(defined $4 ? $4 : 0),(defined $5 ? $5 : 0),(defined $6 ? $6 : 0)); + return timelocal($ss,$mm,$hh,$day,$month,$year); + } else { + die new Exception("A string '$str' isn't an ISO standard time"); + } +} + +sub IsActive { + my ($this) = @_; + my $timeExpire = str2time($this->{$DateExpire}); + + return ($timeExpire > time()); +} + +package DOM::Providers::Headlines::Collection; +use Common; +our @ISA = qw (Object); + +BEGIN { + DeclareProperty(Items => ACCESS_READ); +} + +sub CTOR { + my ($this,%args) = @_; + + foreach my $headline (@{$args{'Items'}}) { + $this->{$Items}->{$headline->Id()} = $headline if ($headline->IsActive) + } +} + +sub as_list { + my $this = shift; + + return [ map { $this->{$Items}->{$_} } sort keys %{$this->{$Items}} ]; +} + +sub GenerateRandomSequence { + my ($count,$max) = @_; + + my %hash; + $hash{rand()} = $_ foreach (0 .. $max - 1); + my @sequence = map { $hash{$_} } sort keys %hash; + return splice @sequence,0,$count; +} + +sub Random { + my ($this,$count) = @_; + + my $list = $this->as_list(); + + return [map { $list->[$_] } GenerateRandomSequence($count,scalar(@$list))]; +} + +sub Recent { + my ($this,$count) = @_; + + my @result = sort { $b->DateModify() cmp $a->DateModify() } values %{$this->{$Items}}; + splice @result,$count; + + return \@result; +} + +sub AddItem { + my ($this,$newItem) = @_; + + $this->{$Items}->{$newItem->Id()} = $newItem; +} + +package DOM::Providers::Headlines; +use Common; +use ObjectStore::Headlines; + +our $DBPath; +our $Encoding; + +my %Channels; + +eval { + LoadHeadlines(); +}; + +if ($@) { + my $err = $@; + if (ref $err eq 'Exception') { + die $err->ToString(); + } else { + die $err; + } +} + + +sub GetProviderInfo { + return { + Name => 'Headlines', + Host => 'DOM::Site', + Objects => \%Channels + } +} + +sub LoadHeadlines { + my $dsHeadlines = new ObjectStore::Headlines(DBPath => $DBPath, HeadlineClass => 'DOM::Providers::Headlines::Headline', Encoding => $Encoding); + + foreach my $headline (@{$dsHeadlines->Search(Filter => sub { return $_[0]->IsActive(); } )}) { + my $channel = $headline->Channel() || 'main'; + $Channels{$channel} = new DOM::Providers::Headlines::Collection() if not exists $Channels{$channel}; + $Channels{$channel}->AddItem($headline); + } +} + +1;