Complex classes like AgileDashboardPlugin 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 AgileDashboardPlugin, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
28 | class AgileDashboardPlugin extends Plugin { |
||
29 | |||
30 | const PLUGIN_NAME = 'agiledashboard'; |
||
31 | |||
32 | private $service; |
||
|
|||
33 | |||
34 | /** @var AgileDashboard_SequenceIdManager */ |
||
35 | private $sequence_id_manager; |
||
36 | |||
37 | /** |
||
38 | * Plugin constructor |
||
39 | */ |
||
40 | public function __construct($id) { |
||
44 | |||
45 | public function getHooksAndCallbacks() { |
||
46 | // Do not load the plugin if tracker is not installed & active |
||
47 | if (defined('TRACKER_BASE_URL')) { |
||
48 | require_once dirname(__FILE__) .'/../../tracker/include/autoload.php'; |
||
49 | $this->_addHook('cssfile', 'cssfile', false); |
||
50 | $this->_addHook('javascript_file'); |
||
51 | $this->_addHook(Event::COMBINED_SCRIPTS, 'combined_scripts', false); |
||
52 | $this->_addHook(TRACKER_EVENT_INCLUDE_CSS_FILE, 'tracker_event_include_css_file', false); |
||
53 | $this->_addHook(TRACKER_EVENT_TRACKERS_DUPLICATED, 'tracker_event_trackers_duplicated', false); |
||
54 | $this->_addHook(TRACKER_EVENT_BUILD_ARTIFACT_FORM_ACTION, 'tracker_event_build_artifact_form_action', false); |
||
55 | $this->_addHook(TRACKER_EVENT_ARTIFACT_ASSOCIATION_EDITED, 'tracker_event_artifact_association_edited', false); |
||
56 | $this->_addHook(TRACKER_EVENT_REDIRECT_AFTER_ARTIFACT_CREATION_OR_UPDATE, 'tracker_event_redirect_after_artifact_creation_or_update', false); |
||
57 | $this->_addHook(TRACKER_EVENT_ARTIFACT_PARENTS_SELECTOR, 'event_artifact_parents_selector', false); |
||
58 | $this->_addHook(TRACKER_EVENT_MANAGE_SEMANTICS, 'tracker_event_manage_semantics', false); |
||
59 | $this->_addHook(TRACKER_EVENT_SEMANTIC_FROM_XML, 'tracker_event_semantic_from_xml'); |
||
60 | $this->_addHook(TRACKER_EVENT_SOAP_SEMANTICS, 'tracker_event_soap_semantics'); |
||
61 | $this->addHook(TRACKER_EVENT_GET_SEMANTIC_FACTORIES); |
||
62 | $this->addHook('plugin_statistics_service_usage'); |
||
63 | $this->addHook(TRACKER_EVENT_REPORT_DISPLAY_ADDITIONAL_CRITERIA); |
||
64 | $this->addHook(TRACKER_EVENT_REPORT_PROCESS_ADDITIONAL_QUERY); |
||
65 | $this->addHook(TRACKER_EVENT_REPORT_SAVE_ADDITIONAL_CRITERIA); |
||
66 | $this->addHook(TRACKER_EVENT_REPORT_LOAD_ADDITIONAL_CRITERIA); |
||
67 | $this->addHook(TRACKER_EVENT_FIELD_AUGMENT_DATA_FOR_REPORT); |
||
68 | $this->addHook(TRACKER_USAGE); |
||
69 | $this->addHook(TRACKER_EVENT_TRACKERS_CANNOT_USE_IN_HIERARCHY); |
||
70 | $this->addHook(Event::SERVICE_ICON); |
||
71 | $this->addHook(Event::SERVICES_ALLOWED_FOR_PROJECT); |
||
72 | $this->_addHook('register_project_creation'); |
||
73 | |||
74 | $this->_addHook(Event::IMPORT_XML_PROJECT_CARDWALL_DONE); |
||
75 | $this->addHook(Event::REST_RESOURCES); |
||
76 | $this->addHook(Event::REST_RESOURCES_V2); |
||
77 | $this->addHook(Event::REST_PROJECT_ADDITIONAL_INFORMATIONS); |
||
78 | $this->addHook(Event::REST_PROJECT_AGILE_ENDPOINTS); |
||
79 | $this->addHook(Event::REST_GET_PROJECT_PLANNINGS); |
||
80 | $this->addHook(Event::REST_OPTIONS_PROJECT_PLANNINGS); |
||
81 | $this->addHook(Event::REST_PROJECT_RESOURCES); |
||
82 | $this->addHook(Event::REST_GET_PROJECT_MILESTONES); |
||
83 | $this->addHook(Event::REST_OPTIONS_PROJECT_MILESTONES); |
||
84 | $this->addHook(Event::REST_GET_PROJECT_BACKLOG); |
||
85 | $this->addHook(Event::REST_PUT_PROJECT_BACKLOG); |
||
86 | $this->addHook(Event::REST_PATCH_PROJECT_BACKLOG); |
||
87 | $this->addHook(Event::REST_OPTIONS_PROJECT_BACKLOG); |
||
88 | $this->addHook(Event::GET_PROJECTID_FROM_URL); |
||
89 | $this->addHook(ITEM_PRIORITY_CHANGE); |
||
90 | } |
||
91 | |||
92 | if (defined('CARDWALL_BASE_URL')) { |
||
93 | $this->addHook(CARDWALL_EVENT_USE_STANDARD_JAVASCRIPT,'cardwall_event_use_standard_javascript'); |
||
94 | } |
||
95 | |||
96 | return parent::getHooksAndCallbacks(); |
||
97 | } |
||
98 | |||
99 | /** |
||
100 | * @see Plugin::getDependencies() |
||
101 | */ |
||
102 | public function getDependencies() { |
||
105 | |||
106 | public function getServiceShortname() { |
||
109 | |||
110 | public function service_icon($params) { |
||
113 | |||
114 | public function register_project_creation($params) { |
||
115 | $this->getConfigurationManager()->duplicate( |
||
116 | $params['group_id'], |
||
117 | $params['template_id'] |
||
118 | ); |
||
119 | } |
||
120 | |||
121 | /** |
||
122 | * @return AgileDashboard_ConfigurationManager |
||
123 | */ |
||
124 | private function getConfigurationManager() { |
||
125 | return new AgileDashboard_ConfigurationManager( |
||
126 | new AgileDashboard_ConfigurationDao() |
||
127 | ); |
||
128 | } |
||
129 | |||
130 | public function cardwall_event_get_swimline_tracker($params) { |
||
131 | $planning_factory = $this->getPlanningFactory(); |
||
132 | if ($planning = $planning_factory->getPlanningByPlanningTracker($params['tracker'])) { |
||
133 | $params['backlog_trackers'] = $planning->getBacklogTrackers(); |
||
134 | } |
||
135 | } |
||
136 | |||
137 | /** |
||
138 | * @see TRACKER_EVENT_REPORT_DISPLAY_ADDITIONAL_CRITERIA |
||
139 | */ |
||
140 | public function tracker_event_report_display_additional_criteria($params) { |
||
141 | $backlog_tracker = $params['tracker']; |
||
142 | if (! $backlog_tracker) { |
||
143 | return; |
||
144 | } |
||
145 | |||
146 | $planning_factory = $this->getPlanningFactory(); |
||
147 | $user = $this->getCurrentUser(); |
||
148 | $provider = new AgileDashboard_Milestone_MilestoneReportCriterionProvider( |
||
149 | new AgileDashboard_Milestone_SelectedMilestoneProvider( |
||
150 | $params['additional_criteria'], |
||
151 | $this->getMilestoneFactory(), |
||
152 | $user, |
||
153 | $backlog_tracker->getProject() |
||
154 | ), |
||
155 | new AgileDashboard_Milestone_MilestoneReportCriterionOptionsProvider( |
||
156 | new AgileDashboard_Planning_NearestPlanningTrackerProvider($planning_factory), |
||
157 | new AgileDashboard_Milestone_MilestoneDao(), |
||
158 | Tracker_HierarchyFactory::instance(), |
||
159 | $planning_factory |
||
160 | ) |
||
161 | ); |
||
162 | $additional_criterion = $provider->getCriterion($backlog_tracker, $user); |
||
163 | |||
164 | if (! $additional_criterion) { |
||
165 | return; |
||
166 | } |
||
167 | |||
168 | $params['array_of_html_criteria'][] = $additional_criterion; |
||
169 | } |
||
170 | |||
171 | /** |
||
172 | * @see TRACKER_EVENT_REPORT_PROCESS_ADDITIONAL_QUERY |
||
173 | */ |
||
174 | public function tracker_event_report_process_additional_query($params) { |
||
175 | $backlog_tracker = $params['tracker']; |
||
176 | |||
177 | $user = $params['user']; |
||
178 | $project = $backlog_tracker->getProject(); |
||
179 | |||
180 | $milestone_provider = new AgileDashboard_Milestone_SelectedMilestoneProvider($params['additional_criteria'], $this->getMilestoneFactory(), $user, $project); |
||
181 | $milestone = $milestone_provider->getMilestone(); |
||
182 | |||
183 | if ($milestone) { |
||
184 | $provider = new AgileDashboard_BacklogItem_SubBacklogItemProvider(new Tracker_ArtifactDao(), $this->getBacklogStrategyFactory(), $this->getBacklogItemCollectionFactory()); |
||
185 | $params['result'][] = $provider->getMatchingIds($milestone, $backlog_tracker, $user); |
||
186 | $params['search_performed'] = true; |
||
187 | } |
||
188 | } |
||
189 | |||
190 | /** |
||
191 | * @see TRACKER_EVENT_REPORT_SAVE_ADDITIONAL_CRITERIA |
||
192 | */ |
||
193 | public function tracker_event_report_save_additional_criteria($params) { |
||
194 | $dao = new MilestoneReportCriterionDao(); |
||
195 | $project = $params['report']->getTracker()->getProject(); |
||
196 | $user = $this->getCurrentUser(); |
||
197 | |||
198 | $milestone_provider = new AgileDashboard_Milestone_SelectedMilestoneProvider($params['additional_criteria'], $this->getMilestoneFactory(), $user, $project); |
||
199 | |||
200 | if ($milestone_provider->getMilestone()) { |
||
201 | $dao->save($params['report']->getId(), $milestone_provider->getMilestoneId()); |
||
202 | } else { |
||
203 | $dao->delete($params['report']->getId()); |
||
204 | } |
||
205 | } |
||
206 | |||
207 | /** |
||
208 | * @see TRACKER_EVENT_REPORT_LOAD_ADDITIONAL_CRITERIA |
||
209 | */ |
||
210 | public function tracker_event_report_load_additional_criteria($params) { |
||
211 | $dao = new MilestoneReportCriterionDao(); |
||
212 | $report_id = $params['report']->getId(); |
||
213 | $field_name = AgileDashboard_Milestone_MilestoneReportCriterionProvider::FIELD_NAME; |
||
214 | |||
215 | $row = $dao->searchByReportId($report_id)->getRow(); |
||
216 | if ($row){ |
||
217 | $params['additional_criteria_values'][$field_name]['value'] = $row['milestone_id']; |
||
218 | } |
||
219 | } |
||
220 | |||
221 | public function event_artifact_parents_selector($params) { |
||
222 | $artifact_parents_selector = new Planning_ArtifactParentsSelector( |
||
223 | $this->getArtifactFactory(), |
||
224 | PlanningFactory::build(), |
||
225 | $this->getMilestoneFactory(), |
||
226 | $this->getHierarchyFactory() |
||
227 | ); |
||
228 | $event_listener = new Planning_ArtifactParentsSelectorEventListener($this->getArtifactFactory(), $artifact_parents_selector, HTTPRequest::instance()); |
||
229 | $event_listener->process($params); |
||
230 | } |
||
231 | |||
232 | public function tracker_event_include_css_file($params) { |
||
235 | |||
236 | public function tracker_event_trackers_duplicated($params) { |
||
237 | PlanningFactory::build()->duplicatePlannings( |
||
238 | $params['group_id'], |
||
239 | $params['tracker_mapping'], |
||
240 | $params['ugroups_mapping'] |
||
241 | ); |
||
242 | |||
243 | $this->getKanbanManager()->duplicateKanbans($params['tracker_mapping'], $params['field_mapping']); |
||
244 | } |
||
245 | |||
246 | public function tracker_event_redirect_after_artifact_creation_or_update($params) { |
||
247 | $params_extractor = new AgileDashboard_PaneRedirectionExtractor(); |
||
248 | $artifact_linker = new Planning_ArtifactLinker($this->getArtifactFactory(), PlanningFactory::build()); |
||
249 | $last_milestone_artifact = $artifact_linker->linkBacklogWithPlanningItems($params['request'], $params['artifact']); |
||
250 | $requested_planning = $params_extractor->extractParametersFromRequest($params['request']); |
||
251 | |||
252 | if ($requested_planning) { |
||
253 | $this->redirectOrAppend($params['request'], $params['artifact'], $params['redirect'], $requested_planning, $last_milestone_artifact); |
||
254 | } |
||
255 | } |
||
256 | |||
257 | public function tracker_usage($params) { |
||
272 | |||
273 | private function redirectOrAppend(Codendi_Request $request, Tracker_Artifact $artifact, Tracker_Artifact_Redirect $redirect, $requested_planning, Tracker_Artifact $last_milestone_artifact = null) { |
||
274 | $planning = PlanningFactory::build()->getPlanning($requested_planning['planning_id']); |
||
275 | |||
276 | if ($planning && ! $redirect->stayInTracker()) { |
||
277 | $this->redirectToPlanning($artifact, $requested_planning, $planning, $redirect); |
||
278 | } elseif (! $redirect->stayInTracker()) { |
||
279 | $this->redirectToTopPlanning($artifact, $requested_planning, $redirect); |
||
280 | } else { |
||
281 | $this->setQueryParametersFromRequest($request, $redirect); |
||
282 | // Pass the right parameters so parent can be created in the right milestone (see updateBacklogs) |
||
283 | if ($planning && $last_milestone_artifact && $redirect->mode == Tracker_Artifact_Redirect::STATE_CREATE_PARENT) { |
||
284 | $redirect->query_parameters['child_milestone'] = $last_milestone_artifact->getId(); |
||
285 | } |
||
286 | } |
||
287 | } |
||
288 | |||
289 | private function redirectToPlanning(Tracker_Artifact $artifact, $requested_planning, Planning $planning, Tracker_Artifact_Redirect $redirect) { |
||
290 | $redirect_to_artifact = $requested_planning[AgileDashboard_PaneRedirectionExtractor::ARTIFACT_ID]; |
||
291 | if ($redirect_to_artifact == -1) { |
||
292 | $redirect_to_artifact = $artifact->getId(); |
||
293 | } |
||
294 | $redirect->base_url = '/plugins/agiledashboard/'; |
||
295 | $redirect->query_parameters = array( |
||
296 | 'group_id' => $planning->getGroupId(), |
||
297 | 'planning_id' => $planning->getId(), |
||
298 | 'action' => 'show', |
||
299 | 'aid' => $redirect_to_artifact, |
||
300 | 'pane' => $requested_planning[AgileDashboard_PaneRedirectionExtractor::PANE], |
||
301 | ); |
||
302 | } |
||
303 | |||
304 | private function redirectToTopPlanning(Tracker_Artifact $artifact, $requested_planning, Tracker_Artifact_Redirect $redirect) { |
||
305 | $redirect->base_url = '/plugins/agiledashboard/'; |
||
306 | $group_id = null; |
||
307 | |||
308 | if ($artifact->getTracker() && $artifact->getTracker()->getProject()) { |
||
309 | $group_id = $artifact->getTracker()->getProject()->getID(); |
||
310 | } |
||
311 | |||
312 | $redirect->query_parameters = array( |
||
313 | 'group_id' => $group_id, |
||
314 | 'action' => 'show-top', |
||
315 | 'pane' => $requested_planning['pane'], |
||
316 | ); |
||
317 | } |
||
318 | |||
319 | public function tracker_event_build_artifact_form_action($params) { |
||
320 | $this->setQueryParametersFromRequest($params['request'], $params['redirect']); |
||
321 | if ($params['request']->exist('child_milestone')) { |
||
322 | $params['redirect']->query_parameters['child_milestone'] = $params['request']->getValidated('child_milestone', 'uint', 0); |
||
323 | } |
||
324 | } |
||
325 | |||
326 | private function setQueryParametersFromRequest(Codendi_Request $request, Tracker_Artifact_Redirect $redirect) { |
||
327 | $params_extractor = new AgileDashboard_PaneRedirectionExtractor(); |
||
328 | $requested_planning = $params_extractor->extractParametersFromRequest($request); |
||
329 | if ($requested_planning) { |
||
330 | $key = 'planning['. $requested_planning[AgileDashboard_PaneRedirectionExtractor::PANE] .']['. $requested_planning[AgileDashboard_PaneRedirectionExtractor::PLANNING_ID] .']'; |
||
331 | $value = $requested_planning[AgileDashboard_PaneRedirectionExtractor::ARTIFACT_ID]; |
||
332 | $redirect->query_parameters[$key] = $value; |
||
333 | } |
||
334 | } |
||
335 | |||
336 | /** |
||
337 | * @return AgileDashboardPluginInfo |
||
338 | */ |
||
339 | public function getPluginInfo() { |
||
340 | if (!$this->pluginInfo) { |
||
341 | $this->pluginInfo = new AgileDashboardPluginInfo($this); |
||
342 | } |
||
343 | return $this->pluginInfo; |
||
344 | } |
||
345 | |||
346 | public function cssfile($params) { |
||
347 | if ($this->isAnAgiledashboardRequest()) { |
||
348 | echo '<link rel="stylesheet" type="text/css" href="'.$this->getThemePath().'/css/style.css" />'; |
||
349 | |||
350 | if ($this->isPlanningV2URL()) { |
||
351 | echo '<link rel="stylesheet" type="text/css" href="'.$this->getPluginPath().'/js/planning-v2/bin/assets/planning-v2.css" />'; |
||
352 | } |
||
353 | } |
||
354 | } |
||
355 | |||
356 | public function javascript_file() { |
||
365 | |||
366 | private function isAnAgiledashboardRequest() { |
||
369 | |||
370 | private function isKanbanURL() { |
||
371 | $request = HTTPRequest::instance(); |
||
372 | |||
373 | return $request->get('action') === 'showKanban'; |
||
374 | } |
||
375 | |||
376 | private function isPlanningV2URL() { |
||
377 | $request = HTTPRequest::instance(); |
||
378 | $pane_info_identifier = new AgileDashboard_PaneInfoIdentifier(); |
||
379 | |||
380 | return $pane_info_identifier->isPaneAPlanningV2($request->get('pane')); |
||
381 | } |
||
382 | |||
383 | public function combined_scripts($params) { |
||
384 | $params['scripts'] = array_merge( |
||
385 | $params['scripts'], |
||
386 | array( |
||
387 | $this->getPluginPath().'/js/load-more-milestones.js', |
||
388 | $this->getPluginPath().'/js/display-angular-feedback.js', |
||
389 | $this->getPluginPath().'/js/MilestoneContent.js', |
||
390 | $this->getPluginPath().'/js/planning.js', |
||
391 | $this->getPluginPath().'/js/OuterGlow.js', |
||
392 | $this->getPluginPath().'/js/expand-collapse.js', |
||
393 | $this->getPluginPath().'/js/planning-view.js', |
||
394 | $this->getPluginPath().'/js/ContentFilter.js', |
||
395 | $this->getPluginPath().'/js/home.js', |
||
396 | ) |
||
397 | ); |
||
398 | } |
||
399 | |||
400 | public function process(Codendi_Request $request) { |
||
401 | $builder = new AgileDashboardRouterBuilder(); |
||
402 | $router = $builder->build($request); |
||
403 | |||
404 | $router->route($request); |
||
405 | } |
||
406 | |||
407 | /** |
||
408 | * Builds a new PlanningFactory instance. |
||
409 | * |
||
410 | * @return PlanningFactory |
||
411 | */ |
||
412 | protected function getPlanningFactory() { |
||
415 | |||
416 | /** |
||
417 | * Builds a new Planning_MilestoneFactory instance. |
||
418 | * @return Planning_MilestoneFactory |
||
419 | */ |
||
420 | protected function getMilestoneFactory() { |
||
421 | return new Planning_MilestoneFactory( |
||
422 | $this->getPlanningFactory(), |
||
423 | $this->getArtifactFactory(), |
||
424 | Tracker_FormElementFactory::instance(), |
||
425 | $this->getTrackerFactory(), |
||
426 | $this->getStatusCounter(), |
||
427 | new PlanningPermissionsManager(), |
||
428 | new AgileDashboard_Milestone_MilestoneDao() |
||
429 | ); |
||
430 | } |
||
431 | |||
432 | private function getArtifactFactory() { |
||
435 | |||
436 | private function getHierarchyFactory() { |
||
439 | |||
440 | private function getBacklogStrategyFactory() { |
||
441 | return new AgileDashboard_Milestone_Backlog_BacklogStrategyFactory( |
||
442 | new AgileDashboard_BacklogItemDao(), |
||
443 | $this->getArtifactFactory(), |
||
444 | PlanningFactory::build() |
||
445 | ); |
||
446 | } |
||
447 | |||
448 | public function tracker_event_artifact_association_edited($params) { |
||
466 | |||
467 | /** |
||
468 | * @see Event::TRACKER_EVENT_MANAGE_SEMANTICS |
||
469 | */ |
||
470 | public function tracker_event_manage_semantics($parameters) { |
||
471 | $tracker = $parameters['tracker']; |
||
472 | /* @var $semantics Tracker_SemanticCollection */ |
||
473 | $semantics = $parameters['semantics']; |
||
474 | |||
475 | $effort_semantic = AgileDashBoard_Semantic_InitialEffort::load($tracker); |
||
476 | $semantics->add($effort_semantic->getShortName(), $effort_semantic); |
||
477 | } |
||
478 | |||
479 | /** |
||
480 | * @see Event::TRACKER_EVENT_SEMANTIC_FROM_XML |
||
481 | */ |
||
482 | public function tracker_event_semantic_from_xml(&$parameters) { |
||
483 | $tracker = $parameters['tracker']; |
||
484 | $xml = $parameters['xml']; |
||
485 | $xmlMapping = $parameters['xml_mapping']; |
||
486 | $type = $parameters['type']; |
||
487 | |||
488 | if ($type == AgileDashBoard_Semantic_InitialEffort::NAME) { |
||
489 | $parameters['semantic'] = $this->getSemanticInitialEffortFactory()->getInstanceFromXML($xml, $xmlMapping, $tracker); |
||
490 | } |
||
491 | } |
||
492 | |||
493 | /** |
||
494 | * @see TRACKER_EVENT_GET_SEMANTIC_FACTORIES |
||
495 | */ |
||
496 | public function tracker_event_get_semantic_factories($params) { |
||
499 | |||
500 | protected function getSemanticInitialEffortFactory() { |
||
503 | |||
504 | /** |
||
505 | * Augment $params['semantics'] with names of AgileDashboard semantics |
||
506 | * |
||
507 | * @see TRACKER_EVENT_SOAP_SEMANTICS |
||
508 | */ |
||
509 | public function tracker_event_soap_semantics(&$params) { |
||
512 | |||
513 | /** |
||
514 | * |
||
515 | * @param array $param |
||
516 | * Expected key/ values: |
||
517 | * project_id int The ID of the project for the import |
||
518 | * xml_content SimpleXmlObject A string of valid xml |
||
519 | * mapping array An array of mappings between xml tracker IDs and their true IDs |
||
520 | * |
||
521 | */ |
||
522 | public function import_xml_project_cardwall_done($params) { |
||
523 | $request = new HTTPRequest($params); |
||
524 | $request->set('action', 'import'); |
||
525 | $request->set('xml_content', $params['xml_content']); |
||
526 | $request->set('mapping', $params['mapping']); |
||
527 | $request->set('project_id', $params['project_id']); |
||
528 | |||
529 | $this->process($request); |
||
530 | } |
||
531 | |||
532 | public function plugin_statistics_service_usage($params) { |
||
533 | $dao = new AgileDashboard_Dao(); |
||
534 | $statistic_aggregator = new AgileDashboardStatisticsAggregator(); |
||
535 | $params['csv_exporter']->buildDatas($dao->getProjectsWithADActivated(), "Agile Dashboard activated"); |
||
536 | foreach ($statistic_aggregator->getStatisticsLabels() as $statistic_key => $statistic_name) { |
||
537 | $statistic_data = $statistic_aggregator->getStatistics( |
||
538 | $statistic_key, |
||
539 | $params['start_date'], |
||
540 | $params['end_date'] |
||
541 | ); |
||
542 | $params['csv_exporter']->buildDatas($statistic_data, $statistic_name); |
||
543 | } |
||
544 | } |
||
545 | |||
546 | /** |
||
547 | * @see REST_PROJECT_ADDITIONAL_INFORMATIONS |
||
548 | */ |
||
549 | public function rest_project_additional_informations($params) { |
||
550 | $planning_representation_class = '\\Tuleap\\AgileDashboard\\REST\\v1\\PlanningRepresentation'; |
||
551 | |||
552 | $root_planning = $this->getPlanningFactory()->getRootPlanning($this->getCurrentUser(), $params['project']->getGroupId()); |
||
553 | if (! $root_planning) { |
||
554 | return; |
||
555 | } |
||
556 | |||
557 | $planning_representation = new $planning_representation_class(); |
||
558 | $planning_representation->build($root_planning); |
||
559 | |||
560 | $params['informations'][$this->getName()]['root_planning'] = $planning_representation; |
||
561 | } |
||
562 | |||
563 | /** |
||
564 | * @see REST_RESOURCES |
||
565 | */ |
||
566 | public function rest_resources($params) { |
||
567 | $injector = new AgileDashboard_REST_ResourcesInjector(); |
||
568 | $injector->populate($params['restler']); |
||
569 | |||
570 | EventManager::instance()->processEvent( |
||
571 | AGILEDASHBOARD_EVENT_REST_RESOURCES, |
||
572 | $params |
||
573 | ); |
||
574 | } |
||
575 | |||
576 | /** |
||
577 | * @see REST_RESOURCES_V2 |
||
578 | */ |
||
579 | public function rest_resources_v2($params) { |
||
583 | |||
584 | /** |
||
585 | * @see REST_GET_PROJECT_PLANNINGS |
||
586 | */ |
||
587 | public function rest_get_project_plannings($params) { |
||
588 | $user = $this->getCurrentUser(); |
||
589 | $planning_resource = $this->buildRightVersionOfProjectPlanningsResource($params['version']); |
||
590 | |||
591 | $params['result'] = $planning_resource->get( |
||
592 | $user, |
||
593 | $params['project'], |
||
594 | $params['limit'], |
||
595 | $params['offset'] |
||
596 | ); |
||
597 | } |
||
598 | |||
599 | /** |
||
600 | * @see REST_OPTIONS_PROJECT_PLANNINGS |
||
601 | */ |
||
602 | public function rest_options_project_plannings($params) { |
||
603 | $user = $this->getCurrentUser(); |
||
604 | $planning_resource = $this->buildRightVersionOfProjectPlanningsResource($params['version']); |
||
605 | |||
606 | $params['result'] = $planning_resource->options( |
||
607 | $user, |
||
608 | $params['project'], |
||
609 | $params['limit'], |
||
610 | $params['offset'] |
||
611 | ); |
||
612 | } |
||
613 | |||
614 | private function buildRightVersionOfProjectPlanningsResource($version) { |
||
618 | |||
619 | /** |
||
620 | * @see Event::REST_PROJECT_RESOURCES |
||
621 | */ |
||
622 | public function rest_project_resources(array $params) { |
||
626 | |||
627 | /** |
||
628 | * @see REST_GET_PROJECT_MILESTONES |
||
629 | */ |
||
630 | public function rest_get_project_milestones($params) { |
||
631 | $user = $this->getCurrentUser(); |
||
632 | $milestone_resource = $this->buildRightVersionOfProjectMilestonesResource($params['version']); |
||
633 | |||
634 | $params['result'] = $milestone_resource->get( |
||
635 | $user, |
||
636 | $params['project'], |
||
637 | $params['representation_type'], |
||
638 | $params['query'], |
||
639 | $params['limit'], |
||
640 | $params['offset'], |
||
641 | $params['order'] |
||
642 | ); |
||
643 | } |
||
644 | |||
645 | /** |
||
646 | * @see REST_OPTIONS_PROJECT_MILESTONES |
||
647 | */ |
||
648 | public function rest_options_project_milestones($params) { |
||
649 | $user = $this->getCurrentUser(); |
||
650 | $milestone_resource = $this->buildRightVersionOfProjectMilestonesResource($params['version']); |
||
651 | |||
652 | $params['result'] = $milestone_resource->options( |
||
653 | $user, |
||
654 | $params['project'], |
||
655 | $params['limit'], |
||
656 | $params['offset'] |
||
657 | ); |
||
658 | } |
||
659 | |||
660 | private function buildRightVersionOfProjectMilestonesResource($version) { |
||
664 | |||
665 | /** |
||
666 | * @see REST_GET_PROJECT_BACKLOG |
||
667 | */ |
||
668 | public function rest_get_project_backlog($params) { |
||
669 | $user = $this->getCurrentUser(); |
||
670 | $project_backlog_resource = $this->buildRightVersionOfProjectBacklogResource($params['version']); |
||
671 | |||
672 | $params['result'] = $project_backlog_resource->get( |
||
673 | $user, |
||
674 | $params['project'], |
||
675 | $params['limit'], |
||
676 | $params['offset'] |
||
677 | ); |
||
678 | } |
||
679 | |||
680 | /** |
||
681 | * @see REST_OPTIONS_PROJECT_BACKLOG |
||
682 | */ |
||
683 | public function rest_options_project_backlog($params) { |
||
684 | $user = $this->getCurrentUser(); |
||
685 | $project_backlog_resource = $this->buildRightVersionOfProjectBacklogResource($params['version']); |
||
686 | |||
687 | $params['result'] = $project_backlog_resource->options( |
||
688 | $user, |
||
689 | $params['project'], |
||
690 | $params['limit'], |
||
691 | $params['offset'] |
||
692 | ); |
||
693 | } |
||
694 | |||
695 | /** |
||
696 | * @see REST_PUT_PROJECT_BACKLOG |
||
697 | */ |
||
698 | public function rest_put_project_backlog($params) { |
||
699 | $user = $this->getCurrentUser(); |
||
700 | $project_backlog_resource = $this->buildRightVersionOfProjectBacklogResource($params['version']); |
||
701 | |||
702 | $params['result'] = $project_backlog_resource->put( |
||
703 | $user, |
||
704 | $params['project'], |
||
705 | $params['ids'] |
||
706 | ); |
||
707 | } |
||
708 | |||
709 | /** |
||
710 | * @see REST_PATCH_PROJECT_BACKLOG |
||
711 | */ |
||
712 | public function rest_patch_project_backlog($params) { |
||
713 | $user = UserManager::instance()->getCurrentUser(); |
||
714 | $project_backlog_resource = $this->buildRightVersionOfProjectBacklogResource($params['version']); |
||
715 | |||
716 | $params['result'] = $project_backlog_resource->patch( |
||
717 | $user, |
||
718 | $params['project'], |
||
719 | $params['order'], |
||
720 | $params['add'] |
||
721 | ); |
||
722 | } |
||
723 | |||
724 | /** |
||
725 | * @see ITEM_PRIORITY_CHANGE |
||
726 | */ |
||
727 | public function item_priority_change($params) { |
||
728 | $planning_id = $this->getPlanningIdFromParameters($params); |
||
729 | |||
730 | $params['user_is_authorized'] = $this->getPlanningPermissionsManager()->userHasPermissionOnPlanning( |
||
731 | $planning_id, |
||
732 | $params['group_id'], |
||
733 | $params['user'], |
||
734 | PlanningPermissionsManager::PERM_PRIORITY_CHANGE |
||
735 | ); |
||
736 | } |
||
737 | |||
738 | private function getPlanningIdFromParameters($params) { |
||
739 | if ($params['milestone_id'] == 0) { |
||
740 | $planning = $this->getPlanningFactory()->getRootPlanning( |
||
741 | $params['user'], |
||
742 | $params['group_id'] |
||
743 | ); |
||
744 | |||
745 | return $planning->getId(); |
||
746 | } |
||
747 | |||
748 | $artifact = $this->getArtifactFactory()->getArtifactById($params['milestone_id']); |
||
749 | $milestone = $this->getMilestoneFactory()->getMilestoneFromArtifact($artifact); |
||
750 | |||
751 | return $milestone->getPlanningId(); |
||
752 | |||
753 | } |
||
754 | |||
755 | private function buildRightVersionOfProjectBacklogResource($version) { |
||
759 | |||
760 | private function getStatusCounter() { |
||
761 | return new AgileDashboard_Milestone_MilestoneStatusCounter( |
||
762 | new AgileDashboard_BacklogItemDao(), |
||
763 | new Tracker_ArtifactDao(), |
||
764 | $this->getArtifactFactory() |
||
765 | ); |
||
766 | } |
||
767 | |||
768 | /** @see Event::GET_PROJECTID_FROM_URL */ |
||
769 | public function get_projectid_from_url($params) { |
||
770 | if (strpos($params['url'],'/plugins/agiledashboard/') === 0) { |
||
771 | $params['project_id'] = $params['request']->get('group_id'); |
||
772 | } |
||
773 | } |
||
774 | |||
775 | /** |
||
776 | * @see TRACKER_EVENT_FIELD_AUGMENT_DATA_FOR_REPORT |
||
777 | */ |
||
778 | public function tracker_event_field_augment_data_for_report($params) { |
||
779 | if (! $this->isFieldPriority($params['field'])) { |
||
780 | return; |
||
781 | } |
||
782 | |||
783 | $params['result'] = $this->getFieldPriorityAugmenter()->getAugmentedDataForFieldPriority( |
||
784 | $this->getCurrentUser(), |
||
785 | $params['field']->getTracker()->getProject(), |
||
786 | $params['additional_criteria'], |
||
787 | $params['artifact_id'] |
||
788 | ); |
||
789 | } |
||
790 | |||
791 | private function getFieldPriorityAugmenter() { |
||
792 | return new AgileDashboard_FieldPriorityAugmenter( |
||
793 | $this->getSequenceIdManager(), |
||
794 | $this->getMilestoneFactory() |
||
795 | ); |
||
796 | } |
||
797 | |||
798 | private function isFieldPriority(Tracker_FormElement_Field $field) { |
||
801 | |||
802 | private function getSequenceIdManager() { |
||
803 | if (! $this->sequence_id_manager) { |
||
804 | $this->sequence_id_manager = new AgileDashboard_SequenceIdManager( |
||
805 | $this->getBacklogStrategyFactory(), |
||
806 | $this->getBacklogItemCollectionFactory() |
||
807 | ); |
||
808 | } |
||
809 | |||
810 | return $this->sequence_id_manager; |
||
811 | } |
||
812 | |||
813 | private function getBacklogItemCollectionFactory() { |
||
814 | return new AgileDashboard_Milestone_Backlog_BacklogItemCollectionFactory( |
||
815 | new AgileDashboard_BacklogItemDao(), |
||
816 | $this->getArtifactFactory(), |
||
817 | Tracker_FormElementFactory::instance(), |
||
818 | $this->getMilestoneFactory(), |
||
819 | $this->getPlanningFactory(), |
||
820 | new AgileDashboard_Milestone_Backlog_BacklogItemBuilder() |
||
821 | ); |
||
822 | } |
||
823 | |||
824 | public function cardwall_event_use_standard_javascript($params) { |
||
825 | $request = HTTPRequest::instance(); |
||
826 | $pane_info_identifier = new AgileDashboard_PaneInfoIdentifier(); |
||
827 | if ($pane_info_identifier->isPaneAPlanningV2($request->get('pane')) || $this->isKanbanURL()) { |
||
828 | $params['use_standard'] = false; |
||
829 | } |
||
830 | } |
||
831 | |||
832 | |||
833 | public function rest_project_agile_endpoints($params) { |
||
836 | |||
837 | public function tracker_event_trackers_cannot_use_in_hierarchy($params) { |
||
838 | $params['result'] = array_merge( |
||
839 | $params['result'], |
||
840 | $this->getHierarchyChecker()->getDeniedTrackersForATrackerHierarchy($params['tracker'], $params['user']) |
||
841 | ); |
||
842 | } |
||
843 | |||
844 | /** |
||
845 | * @return TrackerFactory |
||
846 | */ |
||
847 | private function getTrackerFactory() { |
||
850 | |||
851 | /** |
||
852 | * @return AgileDashboard_KanbanManager |
||
853 | */ |
||
854 | private function getKanbanManager() { |
||
855 | return new AgileDashboard_KanbanManager( |
||
856 | new AgileDashboard_KanbanDao(), |
||
857 | $this->getTrackerFactory(), |
||
858 | $this->getHierarchyChecker() |
||
859 | ); |
||
860 | } |
||
861 | |||
862 | private function getCurrentUser() { |
||
865 | |||
866 | private function getPlanningPermissionsManager() { |
||
869 | |||
870 | /** |
||
871 | * @return AgileDashboard_HierarchyChecker |
||
872 | */ |
||
873 | private function getHierarchyChecker() { |
||
874 | return new AgileDashboard_HierarchyChecker( |
||
875 | $this->getPlanningFactory(), |
||
876 | $this->getKanbanFactory(), |
||
877 | $this->getTrackerFactory() |
||
878 | ); |
||
879 | } |
||
880 | |||
881 | /** |
||
882 | * @return AgileDashboard_KanbanFactory |
||
883 | */ |
||
884 | private function getKanbanFactory() { |
||
885 | return new AgileDashboard_KanbanFactory( |
||
886 | TrackerFactory::instance(), |
||
887 | new AgileDashboard_KanbanDao() |
||
888 | |||
889 | ); |
||
890 | } |
||
891 | } |
||
892 |
This check marks private properties in classes that are never used. Those properties can be removed.