MediaWiki REL1_39
JobSpecification.php
Go to the documentation of this file.
1<?php
25
44 protected $type;
45
47 protected $params;
48
50 protected $page;
51
53 protected $opts;
54
63 public function __construct(
64 $type, array $params, array $opts = [], PageReference $page = null
65 ) {
66 $this->validateParams( $params );
67 $this->validateParams( $opts );
68
69 $this->type = $type;
70 if ( $page ) {
71 // Make sure JobQueue classes can pull the title from parameters alone
72 if ( $page->getDBkey() !== '' ) {
73 $params += [
74 'namespace' => $page->getNamespace(),
75 'title' => $page->getDBkey()
76 ];
77 }
78 } else {
79 // We aim to remove the page from job specification and all we need
80 // is namespace/dbkey, so use LOCAL no matter what.
81 $page = PageReferenceValue::localReference( NS_SPECIAL, 'Badtitle/' . __CLASS__ );
82 }
83 $this->params = $params;
84 $this->page = $page;
85 $this->opts = $opts;
86 }
87
91 protected function validateParams( array $params ) {
92 foreach ( $params as $p => $v ) {
93 if ( is_array( $v ) ) {
94 $this->validateParams( $v );
95 } elseif ( !is_scalar( $v ) && $v !== null ) {
96 throw new UnexpectedValueException( "Job parameter $p is not JSON serializable." );
97 }
98 }
99 }
100
101 public function getType() {
102 return $this->type;
103 }
104
109 public function getTitle() {
110 wfDeprecated( __METHOD__, '1.37' );
111 return Title::castFromPageReference( $this->page );
112 }
113
114 public function getParams() {
115 return $this->params;
116 }
117
118 public function getReleaseTimestamp() {
119 return isset( $this->params['jobReleaseTimestamp'] )
120 ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
121 : null;
122 }
123
124 public function ignoreDuplicates() {
125 return !empty( $this->opts['removeDuplicates'] );
126 }
127
128 public function getDeduplicationInfo() {
129 $info = [
130 'type' => $this->getType(),
131 'params' => $this->getParams()
132 ];
133 if ( is_array( $info['params'] ) ) {
134 // Identical jobs with different "root" jobs should count as duplicates
135 unset( $info['params']['rootJobSignature'] );
136 unset( $info['params']['rootJobTimestamp'] );
137 // Likewise for jobs with different delay times
138 unset( $info['params']['jobReleaseTimestamp'] );
139 if ( isset( $this->opts['removeDuplicatesIgnoreParams'] ) ) {
140 foreach ( $this->opts['removeDuplicatesIgnoreParams'] as $field ) {
141 unset( $info['params'][$field] );
142 }
143 }
144 }
145
146 return $info;
147 }
148
149 public function getRootJobParams() {
150 return [
151 'rootJobSignature' => $this->params['rootJobSignature'] ?? null,
152 'rootJobTimestamp' => $this->params['rootJobTimestamp'] ?? null
153 ];
154 }
155
156 public function hasRootJobParams() {
157 return isset( $this->params['rootJobSignature'] )
158 && isset( $this->params['rootJobTimestamp'] );
159 }
160
161 public function isRootJob() {
162 return $this->hasRootJobParams() && !empty( $this->params['rootJobIsSelf'] );
163 }
164
169 public function toSerializableArray() {
170 return [
171 'type' => $this->type,
172 'params' => $this->params,
173 'opts' => $this->opts,
174 'title' => [
175 'ns' => $this->page->getNamespace(),
176 'key' => $this->page->getDBkey()
177 ]
178 ];
179 }
180
186 public static function newFromArray( array $map ) {
187 return new self(
188 $map['type'],
189 $map['params'],
190 $map['opts'],
191 PageReferenceValue::localReference( $map['title']['ns'], $map['title']['key'] )
192 );
193 }
194}
const NS_SPECIAL
Definition Defines.php:53
wfTimestampOrNull( $outputtype=TS_UNIX, $ts=null)
Return a formatted timestamp, or null if input is null.
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Logs a warning that a deprecated feature was used.
Job queue task description base code.
PageReference $page
array $params
Array of job parameters or false if none.
__construct( $type, array $params, array $opts=[], PageReference $page=null)
validateParams(array $params)
static newFromArray(array $map)
getDeduplicationInfo()
Subclasses may need to override this to make duplication detection work.
Immutable value object representing a page reference.
Interface for serializable objects that describe a job queue task.
Interface for objects (potentially) representing a page that can be viewable and linked to on a wiki.
getNamespace()
Returns the page's namespace number.
getDBkey()
Get the page title in DB key form.