root/branches/feature-server/plagger/lib/Plagger/Server.pm

Revision 734 (checked in by ko, 3 years ago)

Added to Server Push Type

Line 
1 package Plagger::Server;
2 use strict;
3
4 use Carp;
5
6 use base qw( Plagger Class::Accessor::Fast );
7 __PACKAGE__->mk_accessors( qw(config protocol) );
8
9 use Plagger::Server::Protocol;
10
11 sub bootstrap {
12     my($class, %opt) = @_;
13
14     my $self = bless {
15         conf  => {},
16         update => Plagger::Update->new,
17         subscription => Plagger::Subscription->new,
18         plugins_path => {},
19         plugins => [],
20         rewrite_tasks => []
21     }, $class;
22
23     my $config;
24     if (-e $opt{config} && -r _) {
25         $config = YAML::LoadFile($opt{config});
26         $self->load_include($config);
27         $self->{conf} = $config->{global};
28         $self->{conf}->{log} ||= { level => 'debug' };
29         $self->{config_path} = $opt{config};
30     } else {
31         croak "Plagger->bootstrap: $opt{config}: $!";
32     }
33     $self->config($config);
34
35     local *Plagger::context = sub { $self };
36
37     $self->protocol(Plagger::Server::Protocol->new);
38     $self->load_recipes($config);
39     $self->load_cache($opt{config});
40     $self->load_plugins(@{ $config->{plugins} || [] });
41     $self->rewrite_config if @{ $self->{rewrite_tasks} };
42     $self->server_run();
43 }
44
45 sub clear_session {
46     my $self = shift;
47
48     $self->update(Plagger::Update->new);
49     $self->subscription(Plagger::Subscription->new);
50 }
51
52 sub server_run {
53     my $self = shift;
54
55     $self->run_hook('protocol.load');
56
57     $self->run_hook('engine.load');
58
59     $self->run_hook('pull.init');
60     $self->run_hook('push.init');
61
62     $self->run_hook('push.start');
63
64     $self->run_hook('engine.run');
65 }
66
67 sub engine_run {
68     my $self = shift;
69     my $req = shift;
70
71     $self->log(debug => "engine_run.");
72
73     $self->run_hook('plugin.init');
74     $self->run_hook('subscription.load');
75
76     unless ( $self->is_loaded(qr/^Aggregator::/) ) {
77         $self->load_plugin({ module => 'Aggregator::Simple' });
78     }
79
80     for my $feed ($self->subscription->feeds) {
81         if (my $sub = $feed->aggregator) {
82             $sub->($self, { feed => $feed, req => $req });
83         } else {
84             my $ok = $self->run_hook_once('customfeed.handle', { feed => $feed, req => $req });
85             if (!$ok) {
86                 Plagger->context->log(error => $feed->url . " is not aggregated by any aggregator");
87                 Plagger->context->subscription->delete_feed($feed);
88             }
89         }
90     }
91
92     $self->run_hook('aggregator.finalize');
93
94     for my $feed ($self->update->feeds) {
95         $self->run_hook('pull.handle', { feed => $feed, req => $req });
96     }
97
98     for my $feed ($self->update->feeds) {
99         for my $entry ($feed->entries) {
100             $self->run_hook('update.entry.fixup', { feed => $feed, entry => $entry, req => $req });
101         }
102         $self->run_hook('update.feed.fixup', { feed => $feed, req => $req });
103     }
104
105     $self->run_hook('update.fixup');
106
107     $self->run_hook('smartfeed.init');
108     for my $feed ($self->update->feeds) {
109         for my $entry ($feed->entries) {
110             $self->run_hook('smartfeed.entry', { feed => $feed, entry => $entry, req => $req });
111         }
112         $self->run_hook('smartfeed.feed', { feed => $feed, req => $req });
113     }
114     $self->run_hook('smartfeed.finalize');
115
116     $self->run_hook('publish.init');
117     for my $feed ($self->update->feeds) {
118         for my $entry ($feed->entries) {
119             $self->run_hook('publish.entry.fixup', { feed => $feed, entry => $entry, req => $req });
120         }
121
122         $self->run_hook('publish.feed', { feed => $feed, req => $req });
123
124         for my $entry ($feed->entries) {
125             $self->run_hook('publish.entry', { feed => $feed, entry => $entry,  req => $req });
126         }
127     }
128     for my $feed ($self->update->feeds) {
129         $self->run_hook('pull.publish', { feed => $feed, req => $req });
130     }
131
132     $self->run_hook('publish.finalize');
133
134     $self->run_hook('pull.finalize', { req => $req });
135
136     $self->clear_session;
137 }
138
139 1;
140
Note: See TracBrowser for help on using the browser.