1<?php
2/*
3** Zabbix
4** Copyright (C) 2001-2021 Zabbix SIA
5**
6** This program is free software; you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation; either version 2 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program; if not, write to the Free Software
18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19**/
20
21
22abstract class CAbstractScreenImporter extends CImporter {
23
24	/**
25	 * Prepare screen data for import.
26	 * Each screen element has reference to resource it represents, reference structure may differ depending on type.
27	 * Referenced database objects ids are stored to 'resourceid' field of screen items.
28	 *
29	 * @todo: api requests probably should be done in CReferencer class
30	 * @throws Exception if referenced object is not found in database
31	 *
32	 * @param array $screen
33	 *
34	 * @return array
35	 */
36	protected function resolveScreenReferences(array $screen) {
37		if (!empty($screen['screenitems'])) {
38			foreach ($screen['screenitems'] as &$screenItem) {
39				$resource = $screenItem['resource'];
40				if (empty($resource)) {
41					$screenItem['resourceid'] = 0;
42					continue;
43				}
44				if ($screenItem['rowspan'] == 0) {
45					$screenItem['rowspan'] = 1;
46				}
47				if ($screenItem['colspan'] == 0) {
48					$screenItem['colspan'] = 1;
49				}
50				if (!isset($screenItem['max_columns'])) {
51					$screenItem['max_columns'] = SCREEN_SURROGATE_MAX_COLUMNS_DEFAULT;
52				}
53				switch ($screenItem['resourcetype']) {
54					case SCREEN_RESOURCE_HOSTS_INFO:
55					case SCREEN_RESOURCE_TRIGGERS_INFO:
56					case SCREEN_RESOURCE_TRIGGERS_OVERVIEW:
57					case SCREEN_RESOURCE_DATA_OVERVIEW:
58					case SCREEN_RESOURCE_HOSTGROUP_TRIGGERS:
59						$screenItem['resourceid'] = $this->referencer->resolveGroup($resource['name']);
60						if (!$screenItem['resourceid']) {
61							throw new Exception(_s('Cannot find group "%1$s" used in screen "%2$s".',
62								$resource['name'], $screen['name']));
63						}
64						break;
65
66					case SCREEN_RESOURCE_HOST_TRIGGERS:
67						$screenItem['resourceid'] = $this->referencer->resolveHost($resource['host']);
68						if (!$screenItem['resourceid']) {
69							throw new Exception(_s('Cannot find host "%1$s" used in screen "%2$s".',
70								$resource['host'], $screen['name']));
71						}
72						break;
73
74					case SCREEN_RESOURCE_GRAPH:
75					case SCREEN_RESOURCE_LLD_GRAPH:
76						$hostId = $this->referencer->resolveHostOrTemplate($resource['host']);
77						$graphId = $this->referencer->resolveGraph($hostId, $resource['name']);
78
79						if (!$graphId) {
80							throw new Exception(_s('Cannot find graph "%1$s" used in screen "%2$s".',
81								$resource['name'], $screen['name']));
82						}
83
84						$screenItem['resourceid'] = $graphId;
85						break;
86
87					case SCREEN_RESOURCE_CLOCK:
88						if ($screenItem['style'] != TIME_TYPE_HOST) {
89							break;
90						}
91						// break; is not missing here
92
93					case SCREEN_RESOURCE_SIMPLE_GRAPH:
94					case SCREEN_RESOURCE_LLD_SIMPLE_GRAPH:
95					case SCREEN_RESOURCE_PLAIN_TEXT:
96						$hostId = $this->referencer->resolveHostOrTemplate($resource['host']);
97						$screenItem['resourceid'] = $this->referencer->resolveItem($hostId, $resource['key']);
98						if (!$screenItem['resourceid']) {
99							throw new Exception(_s('Cannot find item "%1$s" used in screen "%2$s".',
100									$resource['host'].':'.$resource['key'], $screen['name']));
101						}
102						break;
103
104					case SCREEN_RESOURCE_MAP:
105						$screenItem['resourceid'] = $this->referencer->resolveMap($resource['name']);
106						if (!$screenItem['resourceid']) {
107							throw new Exception(_s('Cannot find map "%1$s" used in screen "%2$s".',
108								$resource['name'], $screen['name']));
109						}
110						break;
111
112					case SCREEN_RESOURCE_SCREEN:
113						$screenItem['resourceid'] = $this->referencer->resolveScreen($resource['name']);
114						if (!$screenItem['resourceid']) {
115							throw new Exception(_s('Cannot find screen "%1$s" used in screen "%2$s".',
116								$resource['name'], $screen['name']));
117						}
118						break;
119
120					default:
121						$screenItem['resourceid'] = 0;
122						break;
123				}
124			}
125			unset($screenItem);
126		}
127
128		return $screen;
129	}
130}
131