ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilECSCmsTreeCommandQueueHandler.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
25{
26 private ilLogger $log;
27
28 private ?\ilECSSetting $server = null;
29 private int $mid = 0;
30
32 {
33 global $DIC;
34 $this->log = $DIC->logger()->wsrv();
35
36 $this->server = $server;
37 $this->init();
38 }
39
43 public function getServer(): ilECSSetting
44 {
45 return $this->server;
46 }
47
48
52 public function handleCreate(ilECSSetting $server, $a_content_id): bool
53 {
54 $this->log->debug('ECS cms tree create');
55
56
57 try {
58 $dir_reader = new ilECSDirectoryTreeConnector($this->getServer());
59 $res = $dir_reader->getDirectoryTree($a_content_id);
60 $nodes = $res->getResult();
61
62 if ($this->log->isHandling(ilLogLevel::DEBUG)) {
63 $this->log->dump($nodes, ilLogLevel::DEBUG);
64 }
65 } catch (ilECSConnectorException $e) {
66 $this->log->error('Tree creation failed with mesage ' . $e->getMessage());
67 return false;
68 }
69
70 $cms_tree = $nodes;
71 $data = new ilECSCmsData();
72 $data->setServerId($server->getServerId());
73 $data->setMid($this->mid);
74 $data->setCmsId($cms_tree->rootID);
75 $data->setTreeId($a_content_id);
76 $data->setTitle($cms_tree->directoryTreeTitle);
77 $data->setTerm($cms_tree->term);
78 $data->save();
79
80 $tree = new ilECSCmsTree($a_content_id);
81 $tree->insertRootNode($a_content_id, $data->getObjId());
82 $tree->setRootId($data->getObjId());
83
84
85 foreach ((array) $cms_tree->nodes as $node) {
86 // Add data entry
87 $data = new ilECSCmsData();
88 $data->setServerId($this->getServer()->getServerId());
89 $data->setMid($this->mid);
90 $data->setCmsId($node->id);
91 $data->setTreeId($a_content_id);
92 $data->setTitle($node->title);
93 $data->setTerm($node->term);
94 $data->save();
95
96 // add to tree
97 if ($node->parent->id) {
98 $parent_id = ilECSCmsData::lookupObjId(
99 $this->getServer()->getServerId(),
100 $this->mid,
101 $a_content_id,
102 $node->parent->id
103 );
104 $tree->insertNode($data->getObjId(), $parent_id);
105 }
106 }
107 return true;
108 }
109
113 public function handleDelete(ilECSSetting $server, int $a_content_id): bool
114 {
115 $this->log->debug('ECS cms tree delete');
116
117 $data = new ilECSCmsData();
118 $data->setServerId($this->getServer()->getServerId());
119 $data->setMid($this->mid);
120 $data->setTreeId($a_content_id);
121 $data->deleteTree();
122
123 $tree = new ilECSCmsTree($a_content_id);
124 $tree->deleteTree($tree->getNodeData(ilECSCmsTree::lookupRootId($a_content_id)));
125
127 $this->getServer()->getServerId(),
128 $this->mid,
129 $a_content_id
130 );
131 return true;
132 }
133
137 public function handleUpdate(ilECSSetting $server, $a_content_id): bool
138 {
139 $this->log->debug('ECS cms tree update');
140
141
142 // 1) Mark all nodes as deleted
143 // 2a) Delete cms tree
144 // 2) Add cms tree table entries
145 // 2) Replace the cms data table entries
146 // 3) Insert deleted tree nodes in tree
147 // 4) Sync tree
148
149 try {
150 $dir_reader = new ilECSDirectoryTreeConnector($this->getServer());
151 $res = $dir_reader->getDirectoryTree($a_content_id);
152 $nodes = $res->getResult();
153 if ($this->log->isHandling(ilLogLevel::DEBUG)) {
154 $this->log->dump($nodes, ilLogLevel::DEBUG);
155 }
156 } catch (ilECSConnectorException $e) {
157 $this->log->error('Tree creation failed with message ' . $e->getMessage());
158 return false;
159 }
160
161 // read old tree structure
162 $tree = new ilECSCmsTree($a_content_id);
163
164 $root_node = $tree->getNodeData(ilECSCmsTree::lookupRootId($a_content_id));
165
166 $old_nodes = array();
167 if ($root_node['child']) {
168 $old_nodes = $tree->getSubTree($root_node, true);
169 }
170
171 if ($this->log->isHandling(ilLogLevel::DEBUG)) {
172 $this->log->debug('Old tree data... ');
173 $this->log->dump($old_nodes, ilLogLevel::DEBUG);
174 }
175
176 // Delete old cms tree
177 ilECSCmsTree::deleteByTreeId($a_content_id);
178
179 // Mark all nodes in cms data as deleted
181 $this->getServer()->getServerId(),
182 $this->mid,
183 $a_content_id,
184 true
185 );
186
187 // Check for update or new entry
188 $cms_tree = $nodes;
189
190 $data_obj_id = ilECSCmsData::lookupObjId(
191 $this->getServer()->getServerId(),
192 $this->mid,
193 $a_content_id,
194 $cms_tree->rootID
195 );
196
197 $data = new ilECSCmsData($data_obj_id);
198 $data->setServerId($server->getServerId());
199 $data->setMid($this->mid);
200 $data->setCmsId($cms_tree->rootID);
201 $data->setTreeId($a_content_id);
202 $data->setTitle($cms_tree->directoryTreeTitle);
203 $data->setTerm($cms_tree->term);
204
205 if ($data_obj_id) {
206 $data->setDeleted(false);
207 $data->update();
208 } else {
209 $data->save();
210 }
211
212 $tree->insertRootNode($a_content_id, $data->getObjId());
213 $tree->setRootId($data->getObjId());
214
215
216 foreach ((array) $cms_tree->nodes as $node) {
217 $data_obj_id = ilECSCmsData::lookupObjId(
218 $this->getServer()->getServerId(),
219 $this->mid,
220 $a_content_id,
221 $node->id
222 );
223
224 // update data entry
225 $data = new ilECSCmsData($data_obj_id);
226 $data->setTitle($node->title);
227 $data->setTerm($node->term);
228 $data->setDeleted(false);
229
230 if ($data_obj_id) {
231 $data->update();
232 } else {
233 $data->setCmsId($node->id);
234 $data->setMid($this->mid);
235 $data->setServerId($this->getServer()->getServerId());
236 $data->setTreeId($a_content_id);
237 $data->setDeleted(false);
238 $data->save();
239
240 $data_obj_id = $data->getObjId();
241 }
242
243 // add to tree
244 $parent_id = ilECSCmsData::lookupObjId(
245 $this->getServer()->getServerId(),
246 $this->mid,
247 $a_content_id,
248 $node->parent->id
249 );
250 $tree->insertNode($data->getObjId(), $parent_id);
251 }
252
253 // Insert deleted nodes in tree
255 $this->getServer()->getServerId(),
256 $this->mid,
257 $a_content_id
258 );
259
260 foreach ($deleted as $obj_id) {
261 $parent = 0;
262 foreach ($old_nodes as $node) {
263 if ($node['child'] === $obj_id) {
264 $parent = $node['parent'];
265 break;
266 }
267 }
268
269 if ($parent && $tree->isInTree($parent)) {
270 $tree->insertNode($obj_id, $parent);
271 }
272 }
273
274 // Sync tree
275 $sync = new ilECSCmsTreeSynchronizer(
276 $this->getServer(),
277 $this->mid,
278 $a_content_id
279 );
280 $sync->sync();
281
282 return true;
283 }
284
288 private function init(): void
289 {
290 $this->mid = ilECSParticipantSettings::getInstanceByServerId($this->getServer()->getServerId())->lookupCmsMid();
291 }
292}
static lookupObjId(int $a_server_id, int $a_mid, int $a_tree_id, string $cms_id)
static findDeletedNodes(int $a_server_id, int $a_mid, int $a_tree_id)
Find deleted nodes Uses a left join since this is more robust.
static writeAllDeleted($a_server_id, $a_mid, $a_tree_id, $a_deleted_flag)
Write deleted status.
handleCreate(ilECSSetting $server, $a_content_id)
handleDelete(ilECSSetting $server, int $a_content_id)
Handle delete.
handleUpdate(ilECSSetting $server, $a_content_id)
Handle update.
static lookupRootId($a_tree_id)
lookup root id
static deleteByTreeId(int $a_tree_id)
Delete tree by tree_id.
static deleteMappings(int $a_server_id, int $a_mid, int $a_tree_id)
Delete mappings.
static getInstanceByServerId(int $a_server_id)
Get instance by server id.
getServerId()
Get current server id.
Component logger with individual log levels by component id.
Interface for all command queue handler classes.
$res
Definition: ltiservices.php:69
global $DIC
Definition: shib_login.php:26