Completed
Pull Request — master (#2092)
by Joas
08:22 queued 01:00
created

Provider   C

Complexity

Total Complexity 58

Size/Duplication

Total Lines 246
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
dl 0
loc 246
rs 6.3005
c 0
b 0
f 0
wmc 58
lcom 1
cbo 4

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
B parse() 0 20 6
C parseShortVersion() 0 33 7
C parseLongVersion() 0 60 14
C getParsedParameters() 0 34 14
C getRichParameters() 0 34 14
A getRichFileParameter() 0 10 1
A getRichUserParameter() 0 7 1

How to fix   Complexity   

Complex Class

Complex classes like Provider often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Provider, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * @copyright Copyright (c) 2016, ownCloud, Inc.
4
 *
5
 * @author Joas Schilling <[email protected]>
6
 *
7
 * @license AGPL-3.0
8
 *
9
 * This code is free software: you can redistribute it and/or modify
10
 * it under the terms of the GNU Affero General Public License, version 3,
11
 * as published by the Free Software Foundation.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
 * GNU Affero General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Affero General Public License, version 3,
19
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
20
 *
21
 */
22
23
namespace OCA\Files\Activity;
24
25
use OCP\Activity\IEvent;
26
use OCP\Activity\IManager;
27
use OCP\Activity\IProvider;
28
use OCP\IL10N;
29
use OCP\IURLGenerator;
30
31
class Provider implements IProvider {
32
33
	/** @var IL10N */
34
	protected $l;
35
36
	/** @var IURLGenerator */
37
	protected $url;
38
39
	/** @var IManager */
40
	protected $activityManager;
41
42
	/**
43
	 * @param IL10N $l
44
	 * @param IURLGenerator $url
45
	 * @param IManager $activityManager
46
	 */
47
	public function __construct(IL10N $l, IURLGenerator $url, IManager $activityManager) {
48
		$this->l = $l;
49
		$this->url = $url;
50
		$this->activityManager = $activityManager;
51
	}
52
53
	/**
54
	 * @param IEvent $event
55
	 * @param IEvent|null $previousEvent
56
	 * @return IEvent
57
	 * @throws \InvalidArgumentException
58
	 * @since 11.0.0
59
	 */
60
	public function parse(IEvent $event, IEvent $previousEvent = null) {
61
		if ($event->getApp() !== 'files') {
62
			throw new \InvalidArgumentException();
63
		}
64
65
		if ($previousEvent instanceof IEvent && $event->getSubject() !== $previousEvent->getSubject()) {
66
			// Different subject means not the same string, so no grouping
67
			$previousEvent = null;
0 ignored issues
show
Unused Code introduced by
$previousEvent is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
68
		}
69
70
		if ($this->activityManager->isFormattingFilteredObject()) {
71
			try {
72
				return $this->parseShortVersion($event);
73
			} catch (\InvalidArgumentException $e) {
74
				// Ignore and simply use the long version...
75
			}
76
		}
77
78
		return $this->parseLongVersion($event);
79
	}
80
81
	/**
82
	 * @param IEvent $event
83
	 * @return IEvent
84
	 * @throws \InvalidArgumentException
85
	 * @since 11.0.0
86
	 */
87
	public function parseShortVersion(IEvent $event) {
88
		$parsedParameters = $this->getParsedParameters($event->getSubject(), $event->getSubjectParameters());
89
		$richParameters = $this->getRichParameters($event->getSubject(), $event->getSubjectParameters());
90
91
		if ($event->getSubject() === 'created_by') {
92
			$event->setParsedSubject($this->l->t('Created by %s', [$parsedParameters[1]]))
93
				->setRichSubject($this->l->t('Created by {user1}'), ['user1' => $richParameters['user1']])
94
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'add-color.svg')));
95
		} else if ($event->getSubject() === 'changed_by') {
96
			$event->setParsedSubject($this->l->t('Changed by %2$s', [$parsedParameters[1]]))
97
				->setRichSubject($this->l->t('Changed by {user1}'), ['user1' => $richParameters['user1']])
98
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
99
		} else if ($event->getSubject() === 'deleted_by') {
100
			$event->setParsedSubject($this->l->t('Deleted by %2$s', [$parsedParameters[1]]))
101
				->setRichSubject($this->l->t('Deleted by {user1}'), ['user1' => $richParameters['user1']])
102
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'delete-color.svg')));
103
		} else if ($event->getSubject() === 'restored_by') {
104
			$event->setParsedSubject($this->l->t('Restored by %2$s', [$parsedParameters[1]]))
105
				->setRichSubject($this->l->t('Restored by {user1}'), ['user1' => $richParameters['user1']]);
106
		} else if ($event->getSubject() === 'renamed_by') {
107
			$event->setParsedSubject($this->l->t('Renamed by %2$s', [$parsedParameters[1]]))
108
				->setRichSubject($this->l->t('Renamed by {user1}'), ['user1' => $richParameters['user1']])
109
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
110
		} else if ($event->getSubject() === 'moved_by') {
111
			$event->setParsedSubject($this->l->t('Moved by %2$s', [$parsedParameters[1]]))
112
				->setRichSubject($this->l->t('Moved by {user1}'), ['user1' => $richParameters['user1']])
113
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
114
		} else {
115
			throw new \InvalidArgumentException();
116
		}
117
118
		return $event;
119
	}
120
121
	/**
122
	 * @param IEvent $event
123
	 * @return IEvent
124
	 * @throws \InvalidArgumentException
125
	 * @since 11.0.0
126
	 */
127
	public function parseLongVersion(IEvent $event) {
128
		$parsedParameters = $this->getParsedParameters($event->getSubject(), $event->getSubjectParameters());
129
		$richParameters = $this->getRichParameters($event->getSubject(), $event->getSubjectParameters());
130
131
		if ($event->getSubject() === 'created_self') {
132
			$event->setParsedSubject($this->l->t('You created %1$s', $parsedParameters))
133
				->setRichSubject($this->l->t('You created {file1}'), $richParameters)
134
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'add-color.svg')));
135
		} else if ($event->getSubject() === 'created_by') {
136
			$event->setParsedSubject($this->l->t('%2$s created %1$s', $parsedParameters))
137
				->setRichSubject($this->l->t('{user1} created {file1}'), $richParameters)
138
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'add-color.svg')));
139
		} else if ($event->getSubject() === 'created_public') {
140
			$event->setParsedSubject($this->l->t('%1$s was created in a public folder', $parsedParameters))
141
				->setRichSubject($this->l->t('{file1} was created in a public folder'), $richParameters)
142
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'add-color.svg')));
143
		} else if ($event->getSubject() === 'changed_self') {
144
			$event->setParsedSubject($this->l->t('You changed %1$s', $parsedParameters))
145
				->setRichSubject($this->l->t('You changed {file1}'), $richParameters)
146
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
147
		} else if ($event->getSubject() === 'changed_by') {
148
			$event->setParsedSubject($this->l->t('%2$s changed %1$s', $parsedParameters))
149
				->setRichSubject($this->l->t('{user1} changed {file1}'), $richParameters)
150
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
151
		} else if ($event->getSubject() === 'deleted_self') {
152
			$event->setParsedSubject($this->l->t('You deleted %1$s', $parsedParameters))
153
				->setRichSubject($this->l->t('You deleted {file1}'), $richParameters)
154
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'delete-color.svg')));
155
		} else if ($event->getSubject() === 'deleted_by') {
156
			$event->setParsedSubject($this->l->t('%2$s deleted %1$s', $parsedParameters))
157
				->setRichSubject($this->l->t('{user1} deleted {file1}'), $richParameters)
158
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'delete-color.svg')));
159
		} else if ($event->getSubject() === 'restored_self') {
160
			$event->setParsedSubject($this->l->t('You restored %1$s', $parsedParameters))
161
				->setRichSubject($this->l->t('You restored {file1}'), $richParameters);
162
		} else if ($event->getSubject() === 'restored_by') {
163
			$event->setParsedSubject($this->l->t('%2$s restored %1$s', $parsedParameters))
164
				->setRichSubject($this->l->t('{user1} restored {file1}'), $richParameters);
165
		} else if ($event->getSubject() === 'renamed_self') {
166
			$event->setParsedSubject($this->l->t('You renamed %2$s to %1$s', $parsedParameters))
167
				->setRichSubject($this->l->t('You renamed {file2} to {file1}'), $richParameters)
168
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
169
		} else if ($event->getSubject() === 'renamed_by') {
170
			$event->setParsedSubject($this->l->t('%2$s renamed %3$s to %1$s', $parsedParameters))
171
				->setRichSubject($this->l->t('{user1} renamed {file2} to {file1}'), $richParameters)
172
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
173
		} else if ($event->getSubject() === 'moved_self') {
174
			$event->setParsedSubject($this->l->t('You moved %2$s to %1$s', $parsedParameters))
175
				->setRichSubject($this->l->t('You moved {file2} to {file1}'), $richParameters)
176
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
177
		} else if ($event->getSubject() === 'moved_by') {
178
			$event->setParsedSubject($this->l->t('%2$s moved %3$s to %1$s', $parsedParameters))
179
				->setRichSubject($this->l->t('{user1} moved {file2} to {file1}'), $richParameters)
180
				->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg')));
181
		} else {
182
			throw new \InvalidArgumentException();
183
		}
184
185
		return $event;
186
	}
187
188
	protected function getParsedParameters($subject, array $parameters) {
189
		switch ($subject) {
190
			case 'created_self':
191
			case 'created_public':
192
			case 'changed_self':
193
			case 'deleted_self':
194
			case 'restored_self':
195
			return [
196
				array_shift($parameters[0]),
197
			];
198
			case 'created_by':
199
			case 'changed_by':
200
			case 'deleted_by':
201
			case 'restored_by':
202
				return [
203
					array_shift($parameters[0]),
204
					$parameters[1],
205
				];
206
			case 'renamed_self':
207
			case 'moved_self':
208
				return [
209
					array_shift($parameters[0]),
210
					array_shift($parameters[1]),
211
				];
212
			case 'renamed_by':
213
			case 'moved_by':
214
				return [
215
					array_shift($parameters[0]),
216
					$parameters[1],
217
					array_shift($parameters[2]),
218
				];
219
		}
220
		return [];
221
	}
222
223
	protected function getRichParameters($subject, array $parameters) {
224
		switch ($subject) {
225
			case 'created_self':
226
			case 'created_public':
227
			case 'changed_self':
228
			case 'deleted_self':
229
			case 'restored_self':
230
				return [
231
					'file1' => $this->getRichFileParameter($parameters[0]),
232
				];
233
			case 'created_by':
234
			case 'changed_by':
235
			case 'deleted_by':
236
			case 'restored_by':
237
				return [
238
					'file1' => $this->getRichFileParameter($parameters[0]),
239
					'user1' => $this->getRichUserParameter($parameters[1]),
240
				];
241
			case 'renamed_self':
242
			case 'moved_self':
243
				return [
244
					'file1' => $this->getRichFileParameter($parameters[0]),
245
					'file2' => $this->getRichFileParameter($parameters[1]),
246
				];
247
			case 'renamed_by':
248
			case 'moved_by':
249
				return [
250
					'file1' => $this->getRichFileParameter($parameters[0]),
251
					'user1' => $this->getRichUserParameter($parameters[1]),
252
					'file2' => $this->getRichFileParameter($parameters[2]),
253
				];
254
		}
255
		return [];
256
	}
257
258
	protected function getRichFileParameter($parameter) {
259
		$path = reset($parameter);
260
		$id = key($parameter);
261
		return [
262
			'type' => 'file',
263
			'id' => $id,
264
			'name' => basename($path),
265
			'path' => $path,
266
		];
267
	}
268
269
	protected function getRichUserParameter($parameter) {
270
		return [
271
			'type' => 'user',
272
			'id' => $parameter,
273
			'name' => $parameter,// FIXME Use display name
274
		];
275
	}
276
}
277