-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPresetMappingFactory.php
91 lines (73 loc) · 3.01 KB
/
PresetMappingFactory.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
declare(strict_types=1);
/*
* This file is part of rekalogika/mapper package.
*
* (c) Priyadi Iman Nurcahyo <https://rekalogika.dev>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
namespace Rekalogika\Mapper\Transformer\Context;
use Rekalogika\Mapper\ObjectCache\ObjectCache;
use Rekalogika\Mapper\Transformer\Model\SplObjectStorageWrapper;
use Rekalogika\Mapper\Util\ClassUtil;
final readonly class PresetMappingFactory
{
private function __construct()
{
}
public static function fromObjectCache(ObjectCache $objectCache): PresetMapping
{
$objectCacheWeakMap = $objectCache->getInternalMapping();
/** @var SplObjectStorageWrapper<object,\ArrayObject<class-string,object>> */
$presetMapping = new SplObjectStorageWrapper(new \SplObjectStorage());
/**
* @var object $source
* @var \ArrayObject<class-string,object> $classToTargetMapping
*/
foreach ($objectCacheWeakMap as $source => $classToTargetMapping) {
foreach ($classToTargetMapping as $targetClass => $target) {
if (!$presetMapping->offsetExists($source)) {
/** @var \ArrayObject<class-string,object> */
$arrayObject = new \ArrayObject();
$presetMapping->offsetSet($source, $arrayObject);
}
$presetMapping->offsetGet($source)?->offsetSet($targetClass, $target);
}
}
return new PresetMapping($presetMapping);
}
public static function fromObjectCacheReversed(ObjectCache $objectCache): PresetMapping
{
$objectCacheWeakMap = $objectCache->getInternalMapping();
/** @var SplObjectStorageWrapper<object,\ArrayObject<class-string,object>> */
$presetMapping = new SplObjectStorageWrapper(new \SplObjectStorage());
/**
* @var object $source
* @var \ArrayObject<class-string,object> $classToTargetMapping
*/
foreach ($objectCacheWeakMap as $source => $classToTargetMapping) {
$newTargetClass = ClassUtil::determineRealClassFromPossibleProxy($source::class);
/** @var object */
$newTarget = $source;
/**
* @var string $targetClass
* @var object $target
*/
foreach ($classToTargetMapping as $targetClass => $target) {
if (!class_exists($targetClass)) {
continue;
}
$newSource = $target;
if (!$presetMapping->offsetExists($newSource)) {
/** @var \ArrayObject<class-string,object> */
$arrayObject = new \ArrayObject();
$presetMapping->offsetSet($newSource, $arrayObject);
}
$presetMapping->offsetGet($newSource)?->offsetSet($newTargetClass, $newTarget);
}
}
return new PresetMapping($presetMapping);
}
}