Skip to content

Commit d3e6d25

Browse files
committed
Migrate ApplicationCache to an eager cache.
Use the commands for the `ApplicationAction` methods.
1 parent ab93d05 commit d3e6d25

12 files changed

+237
-126
lines changed

wcfsetup/install/files/lib/acp/action/UninstallPackageAction.class.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
use Psr\Http\Message\ResponseInterface;
77
use wcf\acp\page\PackageListPage;
88
use wcf\action\AbstractSecureAction;
9-
use wcf\data\application\ApplicationAction;
9+
use wcf\command\application\MarkApplicationAsTainted;
1010
use wcf\data\package\installation\queue\PackageInstallationQueue;
1111
use wcf\data\package\installation\queue\PackageInstallationQueueEditor;
1212
use wcf\data\package\Package;
13+
use wcf\system\application\ApplicationHandler;
1314
use wcf\system\exception\IllegalLinkException;
1415
use wcf\system\package\PackageUninstallationDispatcher;
1516
use wcf\system\request\LinkHandler;
@@ -116,8 +117,7 @@ protected function stepPrepare(): ResponseInterface
116117

117118
// mark package as tainted if it is an app
118119
if ($package->isApplication) {
119-
$applicationAction = new ApplicationAction([$package->packageID], 'markAsTainted');
120-
$applicationAction->executeAction();
120+
(new MarkApplicationAsTainted(ApplicationHandler::getInstance()->getApplicationByID($package->packageID)))();
121121
}
122122

123123
$this->installation->nodeBuilder->purgeNodes();

wcfsetup/install/files/lib/acp/form/ApplicationManagementForm.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
use wcf\data\page\PageNodeTree;
1010
use wcf\form\AbstractForm;
1111
use wcf\system\application\ApplicationHandler;
12-
use wcf\system\cache\builder\ApplicationCacheBuilder;
1312
use wcf\system\cache\builder\PageCacheBuilder;
1413
use wcf\system\cache\builder\RoutingCacheBuilder;
14+
use wcf\system\cache\eager\ApplicationCache;
1515
use wcf\system\exception\UserInputException;
1616
use wcf\system\Regex;
1717
use wcf\system\style\StyleHandler;
@@ -188,7 +188,7 @@ public function save()
188188
ApplicationHandler::rebuild();
189189

190190
// Reset caches to reflect the new landing pages.
191-
ApplicationCacheBuilder::getInstance()->reset();
191+
(new ApplicationCache())->rebuild();
192192
PageCacheBuilder::getInstance()->reset();
193193
RoutingCacheBuilder::getInstance()->reset();
194194
StyleHandler::resetStylesheets();

wcfsetup/install/files/lib/acp/form/RescueModeForm.class.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
namespace wcf\acp\form;
44

55
use Laminas\Diactoros\Response\RedirectResponse;
6+
use wcf\command\application\RebuildApplicationsCookieDomain;
67
use wcf\data\application\Application;
7-
use wcf\data\application\ApplicationAction;
88
use wcf\data\application\ApplicationEditor;
99
use wcf\data\application\ApplicationList;
1010
use wcf\data\user\authentication\failure\UserAuthenticationFailure;
@@ -333,9 +333,7 @@ public function save()
333333
]);
334334
}
335335

336-
// rebuild cookie domain and paths
337-
$applicationAction = new ApplicationAction([], 'rebuild');
338-
$applicationAction->executeAction();
336+
(new RebuildApplicationsCookieDomain())();
339337

340338
// reload currently active application to avoid outdated cache data
341339
$application = ApplicationHandler::getInstance()->getActiveApplication();
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace wcf\command\application;
4+
5+
use wcf\data\application\Application;
6+
use wcf\data\application\ApplicationEditor;
7+
use wcf\system\cache\eager\ApplicationCache;
8+
9+
/**
10+
* Marking an application as tainted, prevents it from loading.
11+
* This should be called during the uninstallation.
12+
*
13+
* @author Olaf Braun
14+
* @copyright 2001-2025 WoltLab GmbH
15+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
16+
* @since 6.3
17+
*/
18+
final class MarkApplicationAsTainted
19+
{
20+
public function __construct(public readonly Application $application)
21+
{
22+
}
23+
24+
public function __invoke(): void
25+
{
26+
$applicationEditor = new ApplicationEditor($this->application);
27+
$applicationEditor->update(['isTainted' => 1]);
28+
29+
(new ApplicationCache())->rebuild();
30+
}
31+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
namespace wcf\command\application;
4+
5+
use wcf\data\application\Application;
6+
use wcf\data\application\ApplicationList;
7+
use wcf\system\cache\eager\ApplicationCache;
8+
use wcf\system\language\LanguageFactory;
9+
use wcf\system\Regex;
10+
use wcf\system\WCF;
11+
12+
/**
13+
* Rebuilds application cookie domains.
14+
*
15+
* @author Olaf Braun
16+
* @copyright 2001-2025 WoltLab GmbH
17+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
18+
* @since 6.3
19+
*/
20+
final class RebuildApplicationsCookieDomain
21+
{
22+
public function __construct()
23+
{
24+
}
25+
26+
public function __invoke(): void
27+
{
28+
$sql = "UPDATE wcf1_application
29+
SET cookieDomain = ?
30+
WHERE packageID = ?";
31+
$statement = WCF::getDB()->prepare($sql);
32+
33+
$regex = new Regex(':[0-9]+');
34+
35+
WCF::getDB()->beginTransaction();
36+
foreach ($this->getApplications() as $application) {
37+
$domainName = $application->domainName;
38+
if (\str_ends_with($regex->replace($domainName, ''), $application->cookieDomain)) {
39+
$domainName = $application->cookieDomain;
40+
}
41+
42+
$statement->execute([
43+
$domainName,
44+
$application->packageID,
45+
]);
46+
}
47+
WCF::getDB()->commitTransaction();
48+
49+
$this->resetCache();
50+
}
51+
52+
/**
53+
* @return Application[]
54+
*/
55+
private function getApplications(): array
56+
{
57+
$applicationList = new ApplicationList();
58+
$applicationList->readObjects();
59+
60+
return $applicationList->getObjects();
61+
}
62+
63+
private function resetCache(): void
64+
{
65+
LanguageFactory::getInstance()->deleteLanguageCache();
66+
(new ApplicationCache())->rebuild();
67+
}
68+
}

wcfsetup/install/files/lib/data/application/ApplicationAction.class.php

Lines changed: 8 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
namespace wcf\data\application;
44

5+
use wcf\command\application\MarkApplicationAsTainted;
6+
use wcf\command\application\RebuildApplicationsCookieDomain;
57
use wcf\data\AbstractDatabaseObjectAction;
6-
use wcf\system\cache\builder\ApplicationCacheBuilder;
7-
use wcf\system\language\LanguageFactory;
8-
use wcf\system\Regex;
9-
use wcf\system\WCF;
108

119
/**
1210
* Executes application-related actions.
@@ -24,61 +22,27 @@ class ApplicationAction extends AbstractDatabaseObjectAction
2422
*/
2523
protected $className = ApplicationEditor::class;
2624

27-
/**
28-
* application editor object
29-
* @var ApplicationEditor
30-
*/
31-
public $applicationEditor;
32-
3325
/**
3426
* Assigns a list of applications to a group and computes cookie domain.
3527
*
3628
* @return void
29+
*
30+
* @deprecated 6.3 use `RebuildApplicationsCookieDomain`
3731
*/
3832
public function rebuild()
3933
{
40-
if (empty($this->objects)) {
41-
$this->readObjects();
42-
}
43-
44-
$sql = "UPDATE wcf1_application
45-
SET cookieDomain = ?
46-
WHERE packageID = ?";
47-
$statement = WCF::getDB()->prepare($sql);
48-
49-
// calculate cookie domain
50-
$regex = new Regex(':[0-9]+');
51-
WCF::getDB()->beginTransaction();
52-
foreach ($this->getObjects() as $application) {
53-
$domainName = $application->domainName;
54-
if (\str_ends_with($regex->replace($domainName, ''), $application->cookieDomain)) {
55-
$domainName = $application->cookieDomain;
56-
}
57-
58-
$statement->execute([
59-
$domainName,
60-
$application->packageID,
61-
]);
62-
}
63-
WCF::getDB()->commitTransaction();
64-
65-
// rebuild templates
66-
LanguageFactory::getInstance()->deleteLanguageCache();
67-
68-
// reset application cache
69-
ApplicationCacheBuilder::getInstance()->reset();
34+
(new RebuildApplicationsCookieDomain())();
7035
}
7136

7237
/**
7338
* Marks an application as tainted, prevents loading it during uninstallation.
7439
*
7540
* @return void
41+
*
42+
* @deprecated 6.3 use `MarkApplicationAsTainted`
7643
*/
7744
public function markAsTainted()
7845
{
79-
$applicationEditor = $this->getSingleObject();
80-
$applicationEditor->update(['isTainted' => 1]);
81-
82-
ApplicationCacheBuilder::getInstance()->reset();
46+
(new MarkApplicationAsTainted($this->getSingleObject()->getDecoratedObject()))();
8347
}
8448
}

wcfsetup/install/files/lib/data/application/ApplicationEditor.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use wcf\data\DatabaseObjectEditor;
66
use wcf\data\IEditableCachedObject;
7-
use wcf\system\cache\builder\ApplicationCacheBuilder;
7+
use wcf\system\cache\eager\ApplicationCache;
88

99
/**
1010
* Provides functions to edit applications.
@@ -29,6 +29,6 @@ class ApplicationEditor extends DatabaseObjectEditor implements IEditableCachedO
2929
*/
3030
public static function resetCache()
3131
{
32-
ApplicationCacheBuilder::getInstance()->reset();
32+
(new ApplicationCache())->rebuild();
3333
}
3434
}

wcfsetup/install/files/lib/data/page/Page.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
use wcf\data\user\User;
1313
use wcf\system\acl\simple\SimpleAclResolver;
1414
use wcf\system\application\ApplicationHandler;
15-
use wcf\system\cache\builder\ApplicationCacheBuilder;
1615
use wcf\system\cache\builder\RoutingCacheBuilder;
16+
use wcf\system\cache\eager\ApplicationCache;
1717
use wcf\system\database\util\PreparedStatementConditionBuilder;
1818
use wcf\system\exception\SystemException;
1919
use wcf\system\language\LanguageFactory;
@@ -297,7 +297,7 @@ public function setAsLandingPage()
297297
WCF::getDB()->commitTransaction();
298298

299299
// reset caches to reflect new landing page
300-
ApplicationCacheBuilder::getInstance()->reset();
300+
(new ApplicationCache())->rebuild();
301301
RoutingCacheBuilder::getInstance()->reset();
302302
}
303303

0 commit comments

Comments
 (0)