Mercurial > pub > Impl
comparison Lib/DOM/Providers/Headlines.pm @ 0:03e58a454b20
Создан репозитарий
| author | Sergey |
|---|---|
| date | Tue, 14 Jul 2009 12:54:37 +0400 |
| parents | |
| children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:03e58a454b20 |
|---|---|
| 1 package DOM::Providers::Headlines::Headline; | |
| 2 use Common; | |
| 3 use Time::Local; | |
| 4 our @ISA = qw(Object); | |
| 5 | |
| 6 BEGIN { | |
| 7 DeclareProperty(Id => ACCESS_READ); | |
| 8 DeclareProperty(DateModify => ACCESS_READ); | |
| 9 DeclareProperty(DateExpire => ACCESS_READ); | |
| 10 DeclareProperty(URL => ACCESS_READ); | |
| 11 DeclareProperty(Text => ACCESS_READ); | |
| 12 DeclareProperty(Channel => ACCESS_READ); | |
| 13 } | |
| 14 | |
| 15 sub str2time { | |
| 16 my $str = shift; | |
| 17 | |
| 18 if ($str =~ /^(\d{4})-(\d{2})-(\d{2})(?:\s(\d{2}):(\d{2}):(\d{2}))?$/) { | |
| 19 my ($year,$month,$day,$hh,$mm,$ss) = ($1,$2-1,$3,(defined $4 ? $4 : 0),(defined $5 ? $5 : 0),(defined $6 ? $6 : 0)); | |
| 20 return timelocal($ss,$mm,$hh,$day,$month,$year); | |
| 21 } else { | |
| 22 die new Exception("A string '$str' isn't an ISO standard time"); | |
| 23 } | |
| 24 } | |
| 25 | |
| 26 sub IsActive { | |
| 27 my ($this) = @_; | |
| 28 my $timeExpire = str2time($this->{$DateExpire}); | |
| 29 | |
| 30 return ($timeExpire > time()); | |
| 31 } | |
| 32 | |
| 33 package DOM::Providers::Headlines::Collection; | |
| 34 use Common; | |
| 35 our @ISA = qw (Object); | |
| 36 | |
| 37 BEGIN { | |
| 38 DeclareProperty(Items => ACCESS_READ); | |
| 39 } | |
| 40 | |
| 41 sub CTOR { | |
| 42 my ($this,%args) = @_; | |
| 43 | |
| 44 foreach my $headline (@{$args{'Items'}}) { | |
| 45 $this->{$Items}->{$headline->Id()} = $headline if ($headline->IsActive) | |
| 46 } | |
| 47 } | |
| 48 | |
| 49 sub as_list { | |
| 50 my $this = shift; | |
| 51 | |
| 52 return [ map { $this->{$Items}->{$_} } sort keys %{$this->{$Items}} ]; | |
| 53 } | |
| 54 | |
| 55 sub GenerateRandomSequence { | |
| 56 my ($count,$max) = @_; | |
| 57 | |
| 58 my %hash; | |
| 59 $hash{rand()} = $_ foreach (0 .. $max - 1); | |
| 60 my @sequence = map { $hash{$_} } sort keys %hash; | |
| 61 return splice @sequence,0,$count; | |
| 62 } | |
| 63 | |
| 64 sub Random { | |
| 65 my ($this,$count) = @_; | |
| 66 | |
| 67 my $list = $this->as_list(); | |
| 68 | |
| 69 return [map { $list->[$_] } GenerateRandomSequence($count,scalar(@$list))]; | |
| 70 } | |
| 71 | |
| 72 sub Recent { | |
| 73 my ($this,$count) = @_; | |
| 74 | |
| 75 my @result = sort { $b->DateModify() cmp $a->DateModify() } values %{$this->{$Items}}; | |
| 76 splice @result,$count; | |
| 77 | |
| 78 return \@result; | |
| 79 } | |
| 80 | |
| 81 sub AddItem { | |
| 82 my ($this,$newItem) = @_; | |
| 83 | |
| 84 $this->{$Items}->{$newItem->Id()} = $newItem; | |
| 85 } | |
| 86 | |
| 87 package DOM::Providers::Headlines; | |
| 88 use Common; | |
| 89 use ObjectStore::Headlines; | |
| 90 | |
| 91 our $DBPath; | |
| 92 our $Encoding; | |
| 93 | |
| 94 my %Channels; | |
| 95 | |
| 96 eval { | |
| 97 LoadHeadlines(); | |
| 98 }; | |
| 99 | |
| 100 if ($@) { | |
| 101 my $err = $@; | |
| 102 if (ref $err eq 'Exception') { | |
| 103 die $err->ToString(); | |
| 104 } else { | |
| 105 die $err; | |
| 106 } | |
| 107 } | |
| 108 | |
| 109 | |
| 110 sub GetProviderInfo { | |
| 111 return { | |
| 112 Name => 'Headlines', | |
| 113 Host => 'DOM::Site', | |
| 114 Objects => \%Channels | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 sub LoadHeadlines { | |
| 119 my $dsHeadlines = new ObjectStore::Headlines(DBPath => $DBPath, HeadlineClass => 'DOM::Providers::Headlines::Headline', Encoding => $Encoding); | |
| 120 | |
| 121 foreach my $headline (@{$dsHeadlines->Search(Filter => sub { return $_[0]->IsActive(); } )}) { | |
| 122 my $channel = $headline->Channel() || 'main'; | |
| 123 $Channels{$channel} = new DOM::Providers::Headlines::Collection() if not exists $Channels{$channel}; | |
| 124 $Channels{$channel}->AddItem($headline); | |
| 125 } | |
| 126 } | |
| 127 | |
| 128 1; |
