Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
76 / 76
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
PageUpdaterFactory
100.00% covered (success)
100.00%
76 / 76
100.00% covered (success)
100.00%
4 / 4
4
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
1
 newPageUpdater
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 newPageUpdaterForDerivedPageDataUpdater
100.00% covered (success)
100.00%
25 / 25
100.00% covered (success)
100.00%
1 / 1
1
 newDerivedPageDataUpdater
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * @license GPL-2.0-or-later
4 * @file
5 */
6
7namespace MediaWiki\Storage;
8
9use MediaWiki\ChangeTags\ChangeTagsStore;
10use MediaWiki\Config\ServiceOptions;
11use MediaWiki\Content\IContentHandlerFactory;
12use MediaWiki\Content\Transform\ContentTransformer;
13use MediaWiki\DomainEvent\DomainEventDispatcher;
14use MediaWiki\HookContainer\HookContainer;
15use MediaWiki\JobQueue\JobQueueGroup;
16use MediaWiki\Language\Language;
17use MediaWiki\MainConfigNames;
18use MediaWiki\Page\PageIdentity;
19use MediaWiki\Page\WikiPageFactory;
20use MediaWiki\Parser\ParserCache;
21use MediaWiki\Revision\RevisionRenderer;
22use MediaWiki\Revision\RevisionStore;
23use MediaWiki\Revision\SlotRoleRegistry;
24use MediaWiki\Title\TitleFormatter;
25use MediaWiki\User\UserGroupManager;
26use MediaWiki\User\UserIdentity;
27use Psr\Log\LoggerInterface;
28use Wikimedia\ObjectCache\WANObjectCache;
29use Wikimedia\Rdbms\ILBFactory;
30
31/**
32 * A factory for PageUpdater and DerivedPageDataUpdater instances.
33 *
34 * @since 1.37
35 * @ingroup Page
36 */
37class PageUpdaterFactory {
38
39    /**
40     * Options that have to be present in the ServiceOptions object passed to the constructor.
41     * @note must include PageUpdater::CONSTRUCTOR_OPTIONS
42     * @internal
43     */
44    public const CONSTRUCTOR_OPTIONS = [
45        MainConfigNames::ArticleCountMethod,
46        MainConfigNames::RCWatchCategoryMembership,
47        MainConfigNames::UseAutomaticEditSummaries,
48        MainConfigNames::ManualRevertSearchRadius,
49        MainConfigNames::UseRCPatrol,
50        MainConfigNames::ParsoidCacheConfig,
51        MainConfigNames::PageCreationLog,
52    ];
53
54    /** @var RevisionStore */
55    private $revisionStore;
56
57    /** @var RevisionRenderer */
58    private $revisionRenderer;
59
60    /** @var SlotRoleRegistry */
61    private $slotRoleRegistry;
62
63    /** @var ParserCache */
64    private $parserCache;
65
66    /** @var JobQueueGroup */
67    private $jobQueueGroup;
68
69    /** @var Language */
70    private $contLang;
71
72    /** @var ILBFactory */
73    private $loadbalancerFactory;
74
75    /** @var IContentHandlerFactory */
76    private $contentHandlerFactory;
77
78    /** @var DomainEventDispatcher */
79    private $eventDispatcher;
80
81    /** @var HookContainer */
82    private $hookContainer;
83
84    /** @var EditResultCache */
85    private $editResultCache;
86
87    /** @var LoggerInterface */
88    private $logger;
89
90    /** @var ServiceOptions */
91    private $options;
92
93    /** @var UserGroupManager */
94    private $userGroupManager;
95
96    /** @var TitleFormatter */
97    private $titleFormatter;
98
99    /** @var ContentTransformer */
100    private $contentTransformer;
101
102    /** @var PageEditStash */
103    private $pageEditStash;
104
105    /** @var WANObjectCache */
106    private $mainWANObjectCache;
107
108    /** @var WikiPageFactory */
109    private $wikiPageFactory;
110
111    /** @var string[] */
112    private $softwareTags;
113
114    private ChangeTagsStore $changeTagsStore;
115
116    /**
117     * @param RevisionStore $revisionStore
118     * @param RevisionRenderer $revisionRenderer
119     * @param SlotRoleRegistry $slotRoleRegistry
120     * @param ParserCache $parserCache
121     * @param JobQueueGroup $jobQueueGroup
122     * @param Language $contLang
123     * @param ILBFactory $loadbalancerFactory
124     * @param IContentHandlerFactory $contentHandlerFactory
125     * @param DomainEventDispatcher $eventDispatcher
126     * @param HookContainer $hookContainer
127     * @param EditResultCache $editResultCache
128     * @param LoggerInterface $logger
129     * @param ServiceOptions $options
130     * @param UserGroupManager $userGroupManager
131     * @param TitleFormatter $titleFormatter
132     * @param ContentTransformer $contentTransformer
133     * @param PageEditStash $pageEditStash
134     * @param WANObjectCache $mainWANObjectCache
135     * @param WikiPageFactory $wikiPageFactory
136     * @param ChangeTagsStore $changeTagsStore
137     * @param string[] $softwareTags
138     */
139    public function __construct(
140        RevisionStore $revisionStore,
141        RevisionRenderer $revisionRenderer,
142        SlotRoleRegistry $slotRoleRegistry,
143        ParserCache $parserCache,
144        JobQueueGroup $jobQueueGroup,
145        Language $contLang,
146        ILBFactory $loadbalancerFactory,
147        IContentHandlerFactory $contentHandlerFactory,
148        DomainEventDispatcher $eventDispatcher,
149        HookContainer $hookContainer,
150        EditResultCache $editResultCache,
151        LoggerInterface $logger,
152        ServiceOptions $options,
153        UserGroupManager $userGroupManager,
154        TitleFormatter $titleFormatter,
155        ContentTransformer $contentTransformer,
156        PageEditStash $pageEditStash,
157        WANObjectCache $mainWANObjectCache,
158        WikiPageFactory $wikiPageFactory,
159        ChangeTagsStore $changeTagsStore,
160        array $softwareTags
161    ) {
162        $options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS );
163
164        $this->revisionStore = $revisionStore;
165        $this->revisionRenderer = $revisionRenderer;
166        $this->slotRoleRegistry = $slotRoleRegistry;
167        $this->parserCache = $parserCache;
168        $this->jobQueueGroup = $jobQueueGroup;
169        $this->contLang = $contLang;
170        $this->loadbalancerFactory = $loadbalancerFactory;
171        $this->contentHandlerFactory = $contentHandlerFactory;
172        $this->eventDispatcher = $eventDispatcher;
173        $this->hookContainer = $hookContainer;
174        $this->editResultCache = $editResultCache;
175        $this->logger = $logger;
176        $this->options = $options;
177        $this->userGroupManager = $userGroupManager;
178        $this->titleFormatter = $titleFormatter;
179        $this->contentTransformer = $contentTransformer;
180        $this->pageEditStash = $pageEditStash;
181        $this->mainWANObjectCache = $mainWANObjectCache;
182        $this->softwareTags = $softwareTags;
183        $this->wikiPageFactory = $wikiPageFactory;
184        $this->changeTagsStore = $changeTagsStore;
185    }
186
187    /**
188     * Return a PageUpdater for building an update to a page.
189     *
190     * @internal For now, most code should keep using WikiPage::newPageUpdater() instead.
191     * @note We can only start using this method everywhere when WikiPage::prepareContentForEdit()
192     * and WikiPage::getCurrentUpdate() have been removed. For now, the WikiPage instance is
193     * used to make the state of an ongoing edit available to hook handlers.
194     *
195     * @param PageIdentity $page
196     * @param UserIdentity $user
197     *
198     * @return PageUpdater
199     * @since 1.37
200     */
201    public function newPageUpdater(
202        PageIdentity $page,
203        UserIdentity $user
204    ): PageUpdater {
205        return $this->newPageUpdaterForDerivedPageDataUpdater(
206            $page,
207            $user,
208            $this->newDerivedPageDataUpdater( $page )
209        );
210    }
211
212    /**
213     * Return a PageUpdater for building an update to a page, reusing the state of
214     * an existing DerivedPageDataUpdater.
215     *
216     * @param PageIdentity $page
217     * @param UserIdentity $user
218     * @param DerivedPageDataUpdater $derivedPageDataUpdater
219     *
220     * @return PageUpdater
221     * @internal needed by WikiPage to back the WikiPage::newPageUpdater method.
222     *
223     * @since 1.37
224     */
225    public function newPageUpdaterForDerivedPageDataUpdater(
226        PageIdentity $page,
227        UserIdentity $user,
228        DerivedPageDataUpdater $derivedPageDataUpdater
229    ): PageUpdater {
230        $pageUpdater = new PageUpdater(
231            $user,
232            $page,
233            $derivedPageDataUpdater,
234            $this->loadbalancerFactory,
235            $this->revisionStore,
236            $this->slotRoleRegistry,
237            $this->contentHandlerFactory,
238            $this->hookContainer,
239            $this->userGroupManager,
240            $this->titleFormatter,
241            new ServiceOptions(
242                PageUpdater::CONSTRUCTOR_OPTIONS,
243                $this->options
244            ),
245            $this->softwareTags,
246            $this->logger,
247            $this->wikiPageFactory
248        );
249
250        $pageUpdater->setUsePageCreationLog(
251            $this->options->get( MainConfigNames::PageCreationLog ) );
252
253        $pageUpdater->setUseAutomaticEditSummaries(
254            $this->options->get( MainConfigNames::UseAutomaticEditSummaries )
255        );
256
257        return $pageUpdater;
258    }
259
260    /**
261     * @param PageIdentity $page
262     *
263     * @return DerivedPageDataUpdater
264     * @internal Needed by WikiPage to back the deprecated prepareContentForEdit() method.
265     * @note Avoid direct usage of DerivedPageDataUpdater.
266     * @see docs/pageupdater.md for more information.
267     */
268    public function newDerivedPageDataUpdater( PageIdentity $page ): DerivedPageDataUpdater {
269        $derivedDataUpdater = new DerivedPageDataUpdater(
270            $this->options,
271            $page,
272            $this->revisionStore,
273            $this->revisionRenderer,
274            $this->slotRoleRegistry,
275            $this->parserCache,
276            $this->jobQueueGroup,
277            $this->contLang,
278            $this->loadbalancerFactory,
279            $this->contentHandlerFactory,
280            $this->hookContainer,
281            $this->eventDispatcher,
282            $this->editResultCache,
283            $this->contentTransformer,
284            $this->pageEditStash,
285            $this->mainWANObjectCache,
286            $this->wikiPageFactory,
287            $this->changeTagsStore,
288        );
289
290        $derivedDataUpdater->setLogger( $this->logger );
291        $derivedDataUpdater->setArticleCountMethod(
292            $this->options->get( MainConfigNames::ArticleCountMethod ) );
293
294        return $derivedDataUpdater;
295    }
296
297}