Completed
Push — master ( 6ddda3...b3ff9a )
by Blizzz
79:33 queued 57:29
created

Calendar   C

Complexity

Total Complexity 61

Size/Duplication

Total Lines 222
Duplicated Lines 19.37 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
dl 43
loc 222
rs 6.018
c 0
b 0
f 0
wmc 61
lcom 1
cbo 7

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 7 7 1
C parse() 24 70 24
D getParameters() 12 98 36

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like Calendar 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 Calendar, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * @copyright Copyright (c) 2016 Joas Schilling <[email protected]>
4
 *
5
 * @license GNU AGPL version 3 or any later version
6
 *
7
 * This program is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU Affero General Public License as
9
 * published by the Free Software Foundation, either version 3 of the
10
 * License, or (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU Affero General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Affero General Public License
18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
 *
20
 */
21
22
namespace OCA\DAV\CalDAV\Activity\Provider;
23
24
use OCP\Activity\IEvent;
25
use OCP\Activity\IEventMerger;
26
use OCP\Activity\IManager;
27
use OCP\IL10N;
28
use OCP\IURLGenerator;
29
use OCP\IUserManager;
30
use OCP\L10N\IFactory;
31
32
class Calendar extends Base {
33
34
	const SUBJECT_ADD = 'calendar_add';
35
	const SUBJECT_UPDATE = 'calendar_update';
36
	const SUBJECT_DELETE = 'calendar_delete';
37
	const SUBJECT_SHARE_USER = 'calendar_user_share';
38
	const SUBJECT_SHARE_GROUP = 'calendar_group_share';
39
	const SUBJECT_UNSHARE_USER = 'calendar_user_unshare';
40
	const SUBJECT_UNSHARE_GROUP = 'calendar_group_unshare';
41
42
	/** @var IFactory */
43
	protected $languageFactory;
44
45
	/** @var IL10N */
46
	protected $l;
47
48
	/** @var IURLGenerator */
49
	protected $url;
50
51
	/** @var IManager */
52
	protected $activityManager;
53
54
	/** @var IEventMerger */
55
	protected $eventMerger;
56
57
	/**
58
	 * @param IFactory $languageFactory
59
	 * @param IURLGenerator $url
60
	 * @param IManager $activityManager
61
	 * @param IUserManager $userManager
62
	 * @param IEventMerger $eventMerger
63
	 */
64 View Code Duplication
	public function __construct(IFactory $languageFactory, IURLGenerator $url, IManager $activityManager, IUserManager $userManager, IEventMerger $eventMerger) {
65
		parent::__construct($userManager);
66
		$this->languageFactory = $languageFactory;
67
		$this->url = $url;
68
		$this->activityManager = $activityManager;
69
		$this->eventMerger = $eventMerger;
70
	}
71
72
	/**
73
	 * @param string $language
74
	 * @param IEvent $event
75
	 * @param IEvent|null $previousEvent
76
	 * @return IEvent
77
	 * @throws \InvalidArgumentException
78
	 * @since 11.0.0
79
	 */
80
	public function parse($language, IEvent $event, IEvent $previousEvent = null) {
81
		if ($event->getApp() !== 'dav' || $event->getType() !== 'calendar') {
82
			throw new \InvalidArgumentException();
83
		}
84
85
		$this->l = $this->languageFactory->get('dav', $language);
86
87
		if ($this->activityManager->getRequirePNG()) {
88
			$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar-dark.png')));
89
		} else {
90
			$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar-dark.svg')));
91
		}
92
93
		if ($event->getSubject() === self::SUBJECT_ADD) {
94
			$subject = $this->l->t('{actor} created calendar {calendar}');
95
		} else if ($event->getSubject() === self::SUBJECT_ADD . '_self') {
96
			$subject = $this->l->t('You created calendar {calendar}');
97
		} else if ($event->getSubject() === self::SUBJECT_DELETE) {
98
			$subject = $this->l->t('{actor} deleted calendar {calendar}');
99
		} else if ($event->getSubject() === self::SUBJECT_DELETE . '_self') {
100
			$subject = $this->l->t('You deleted calendar {calendar}');
101
		} else if ($event->getSubject() === self::SUBJECT_UPDATE) {
102
			$subject = $this->l->t('{actor} updated calendar {calendar}');
103
		} else if ($event->getSubject() === self::SUBJECT_UPDATE . '_self') {
104
			$subject = $this->l->t('You updated calendar {calendar}');
105
106
		} else if ($event->getSubject() === self::SUBJECT_SHARE_USER) {
107
			$subject = $this->l->t('{actor} shared calendar {calendar} with you');
108 View Code Duplication
		} else if ($event->getSubject() === self::SUBJECT_SHARE_USER . '_you') {
109
			$subject = $this->l->t('You shared calendar {calendar} with {user}');
110
		} else if ($event->getSubject() === self::SUBJECT_SHARE_USER . '_by') {
111
			$subject = $this->l->t('{actor} shared calendar {calendar} with {user}');
112
		} else if ($event->getSubject() === self::SUBJECT_UNSHARE_USER) {
113
			$subject = $this->l->t('{actor} unshared calendar {calendar} from you');
114
		} else if ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_you') {
115
			$subject = $this->l->t('You unshared calendar {calendar} from {user}');
116
		} else if ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_by') {
117
			$subject = $this->l->t('{actor} unshared calendar {calendar} from {user}');
118
		} else if ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_self') {
119
			$subject = $this->l->t('{actor} unshared calendar {calendar} from themselves');
120
121
		} else if ($event->getSubject() === self::SUBJECT_SHARE_GROUP . '_you') {
122
			$subject = $this->l->t('You shared calendar {calendar} with group {group}');
123
		} else if ($event->getSubject() === self::SUBJECT_SHARE_GROUP . '_by') {
124
			$subject = $this->l->t('{actor} shared calendar {calendar} with group {group}');
125
		} else if ($event->getSubject() === self::SUBJECT_UNSHARE_GROUP . '_you') {
126
			$subject = $this->l->t('You unshared calendar {calendar} from group {group}');
127
		} else if ($event->getSubject() === self::SUBJECT_UNSHARE_GROUP . '_by') {
128
			$subject = $this->l->t('{actor} unshared calendar {calendar} from group {group}');
129
		} else {
130
			throw new \InvalidArgumentException();
131
		}
132
133
		$parsedParameters = $this->getParameters($event);
134
		$this->setSubjects($event, $subject, $parsedParameters);
135
136
		$event = $this->eventMerger->mergeEvents('calendar', $event, $previousEvent);
137
138
		if ($event->getChildEvent() === null) {
139
			if (isset($parsedParameters['user'])) {
140
				// Couldn't group by calendar, maybe we can group by users
141
				$event = $this->eventMerger->mergeEvents('user', $event, $previousEvent);
142
			} else if (isset($parsedParameters['group'])) {
143
				// Couldn't group by calendar, maybe we can group by groups
144
				$event = $this->eventMerger->mergeEvents('group', $event, $previousEvent);
145
			}
146
		}
147
148
		return $event;
149
	}
150
151
	/**
152
	 * @param IEvent $event
153
	 * @return array
154
	 */
155
	protected function getParameters(IEvent $event) {
156
		$subject = $event->getSubject();
157
		$parameters = $event->getSubjectParameters();
158
159
		// Nextcloud 13+
160
		if (isset($parameters['calendar'])) {
161
			switch ($subject) {
162
				case self::SUBJECT_ADD:
163
				case self::SUBJECT_ADD . '_self':
164
				case self::SUBJECT_DELETE:
165
				case self::SUBJECT_DELETE . '_self':
166
				case self::SUBJECT_UPDATE:
167
				case self::SUBJECT_UPDATE . '_self':
168
				case self::SUBJECT_SHARE_USER:
169
				case self::SUBJECT_UNSHARE_USER:
170
				case self::SUBJECT_UNSHARE_USER . '_self':
171
					return [
172
						'actor' => $this->generateUserParameter($parameters['actor']),
173
						'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
174
					];
175
				case self::SUBJECT_SHARE_USER . '_you':
176
				case self::SUBJECT_UNSHARE_USER . '_you':
177
					return [
178
						'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
179
						'user' => $this->generateUserParameter($parameters['user']),
180
					];
181
				case self::SUBJECT_SHARE_USER . '_by':
182
				case self::SUBJECT_UNSHARE_USER . '_by':
183
					return [
184
						'actor' => $this->generateUserParameter($parameters['actor']),
185
						'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
186
						'user' => $this->generateUserParameter($parameters['user']),
187
					];
188
				case self::SUBJECT_SHARE_GROUP . '_you':
189
				case self::SUBJECT_UNSHARE_GROUP . '_you':
190
					return [
191
						'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
192
						'group' => $this->generateGroupParameter($parameters['group']),
193
					];
194
				case self::SUBJECT_SHARE_GROUP . '_by':
195
				case self::SUBJECT_UNSHARE_GROUP . '_by':
196
					return [
197
						'actor' => $this->generateUserParameter($parameters['actor']),
198
						'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
199
						'group' => $this->generateGroupParameter($parameters['group']),
200
					];
201
			}
202
		}
203
204
		// Legacy - Do NOT Remove unless necessary
205
		// Removing this will break parsing of activities that were created on
206
		// Nextcloud 12, so we should keep this as long as it's acceptable.
207
		// Otherwise if people upgrade over multiple releases in a short period,
208
		// they will get the dead entries in their stream.
209
		switch ($subject) {
210
			case self::SUBJECT_ADD:
211
			case self::SUBJECT_ADD . '_self':
212
			case self::SUBJECT_DELETE:
213
			case self::SUBJECT_DELETE . '_self':
214
			case self::SUBJECT_UPDATE:
215
			case self::SUBJECT_UPDATE . '_self':
216
			case self::SUBJECT_SHARE_USER:
217
			case self::SUBJECT_UNSHARE_USER:
218
			case self::SUBJECT_UNSHARE_USER . '_self':
219
				return [
220
					'actor' => $this->generateUserParameter($parameters[0]),
221
					'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
222
				];
223
			case self::SUBJECT_SHARE_USER . '_you':
224
			case self::SUBJECT_UNSHARE_USER . '_you':
225
				return [
226
					'user' => $this->generateUserParameter($parameters[0]),
227
					'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
228
				];
229
			case self::SUBJECT_SHARE_USER . '_by':
230 View Code Duplication
			case self::SUBJECT_UNSHARE_USER . '_by':
231
				return [
232
					'user' => $this->generateUserParameter($parameters[0]),
233
					'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
234
					'actor' => $this->generateUserParameter($parameters[2]),
235
				];
236
			case self::SUBJECT_SHARE_GROUP . '_you':
237
			case self::SUBJECT_UNSHARE_GROUP . '_you':
238
				return [
239
					'group' => $this->generateGroupParameter($parameters[0]),
240
					'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
241
				];
242
			case self::SUBJECT_SHARE_GROUP . '_by':
243 View Code Duplication
			case self::SUBJECT_UNSHARE_GROUP . '_by':
244
				return [
245
					'group' => $this->generateGroupParameter($parameters[0]),
246
					'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
247
					'actor' => $this->generateUserParameter($parameters[2]),
248
				];
249
		}
250
251
		throw new \InvalidArgumentException();
252
	}
253
}
254