Completed
Push — master ( 11e3bd...1a1840 )
by
unknown
03:54
created

serializeDependencyMetadata()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.3142
c 0
b 0
f 0
cc 2
eloc 13
nc 2
nop 1
1
<?php
2
3
namespace WikibaseQuality\ConstraintReport\ConstraintCheck\Result;
4
5
use Wikibase\DataModel\Entity\EntityId;
6
use WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachingMetadata;
7
use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\ContextCursorSerializer;
8
use WikibaseQuality\ConstraintReport\ConstraintCheck\Message\ViolationMessageSerializer;
9
use WikibaseQuality\ConstraintReport\ConstraintSerializer;
10
11
/**
12
 * A serializer for {@link CheckResult}s.
13
 * Note that serializing the {@link CheckResult::getParameters parameters} is not (yet?) supported.
14
 *
15
 * @author Lucas Werkmeister
16
 * @license GPL-2.0-or-later
17
 */
18
class CheckResultSerializer {
19
20
	const KEY_CONTEXT_CURSOR = '|';
21
	const KEY_CONSTRAINT = 'c';
22
	const KEY_CHECK_RESULT_STATUS = 's';
23
	const KEY_VIOLATION_MESSAGE = 'm';
24
	const KEY_CACHING_METADATA = 'CM';
25
	const KEY_DEPENDENCY_METADATA = 'DM';
26
27
	const KEY_CACHING_METADATA_MAX_AGE = 'a';
28
29
	const KEY_DEPENDENCY_METADATA_ENTITY_IDS = 'e';
30
	const KEY_DEPENDENCY_METADATA_FUTURE_TIME = 'f';
31
32
	/**
33
	 * @var ConstraintSerializer
34
	 */
35
	private $constraintSerializer;
36
37
	/**
38
	 * @var ContextCursorSerializer
39
	 */
40
	private $contextCursorSerializer;
41
42
	/**
43
	 * @var ViolationMessageSerializer
44
	 */
45
	private $violationMessageSerializer;
46
47
	/**
48
	 * @var bool
49
	 */
50
	private $serializeDependencyMetadata;
51
52
	/**
53
	 * @param ConstraintSerializer $constraintSerializer
54
	 * @param ContextCursorSerializer $contextCursorSerializer
55
	 * @param ViolationMessageSerializer $violationMessageSerializer
56
	 * @param bool $serializeDependencyMetadata Whether to serialize the DependencyMetadata component
57
	 * of a result’s {@link CheckResult::getMetadata metadata} or not.
58
	 */
59
	public function __construct(
60
		ConstraintSerializer $constraintSerializer,
61
		ContextCursorSerializer $contextCursorSerializer,
62
		ViolationMessageSerializer $violationMessageSerializer,
63
		$serializeDependencyMetadata = true
64
	) {
65
		$this->constraintSerializer = $constraintSerializer;
66
		$this->contextCursorSerializer = $contextCursorSerializer;
67
		$this->violationMessageSerializer = $violationMessageSerializer;
68
		$this->serializeDependencyMetadata = $serializeDependencyMetadata;
69
	}
70
71
	/**
72
	 * @param CheckResult $checkResult
73
	 * @return array
74
	 */
75
	public function serialize( CheckResult $checkResult ) {
76
		$contextCursor = $checkResult->getContextCursor();
77
		$constraint = $checkResult->getConstraint();
78
		$violationMessage = $checkResult->getMessage();
79
		$cachingMetadata = $checkResult->getMetadata()->getCachingMetadata();
80
81
		$serialization = [
82
			self::KEY_CONTEXT_CURSOR => $this->contextCursorSerializer->serialize( $contextCursor ),
83
			self::KEY_CONSTRAINT => $this->constraintSerializer->serialize( $constraint ),
84
			self::KEY_CHECK_RESULT_STATUS => $checkResult->getStatus(),
85
			self::KEY_CACHING_METADATA => $this->serializeCachingMetadata( $cachingMetadata ),
86
		];
87
88
		if ( $violationMessage !== null ) {
89
			$serialization[self::KEY_VIOLATION_MESSAGE] =
90
				$this->violationMessageSerializer->serialize( $violationMessage );
0 ignored issues
show
Bug introduced by
It seems like $violationMessage defined by $checkResult->getMessage() on line 78 can also be of type string; however, WikibaseQuality\Constrai...Serializer::serialize() does only seem to accept object<WikibaseQuality\C...ssage\ViolationMessage>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
91
		}
92
93
		if ( $this->serializeDependencyMetadata ) {
94
			$serialization[self::KEY_DEPENDENCY_METADATA] =
95
				$this->serializeDependencyMetadata( $checkResult );
96
		}
97
98
		return $serialization;
99
	}
100
101
	/**
102
	 * @param CachingMetadata $cachingMetadata
103
	 * @return array
104
	 */
105
	private function serializeCachingMetadata( CachingMetadata $cachingMetadata ) {
106
		$maximumAge = $cachingMetadata->getMaximumAgeInSeconds();
107
108
		$serialization = [];
109
110
		if ( $maximumAge > 0 ) {
111
			$serialization[self::KEY_CACHING_METADATA_MAX_AGE] = $maximumAge;
112
		}
113
114
		return $serialization;
115
	}
116
117
	/**
118
	 * @param CheckResult $checkResult
119
	 * @return array
120
	 */
121
	private function serializeDependencyMetadata( CheckResult $checkResult ) {
122
		$dependencyMetadata = $checkResult->getMetadata()->getDependencyMetadata();
123
		$entityIds = $dependencyMetadata->getEntityIds();
124
		$futureTime = $dependencyMetadata->getFutureTime();
125
126
		$serialization = [
127
			self::KEY_DEPENDENCY_METADATA_ENTITY_IDS => array_map(
128
				function ( EntityId $entityId ) {
129
					return $entityId->getSerialization();
130
				},
131
				$entityIds
132
			),
133
		];
134
135
		if ( $futureTime !== null ) {
136
			$serialization[self::KEY_DEPENDENCY_METADATA_FUTURE_TIME] =
137
				$futureTime->getArrayValue();
138
		}
139
140
		return $serialization;
141
	}
142
143
}
144