ILIAS  trunk Revision v12.0_alpha-1227-g7ff6d300864
class.ilComponentDefinitionReader.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22{
26 protected array $processors;
27
28 public function __construct(
30 ) {
31 $this->processors = $processor;
32 }
33
38 public function purge(): void
39 {
40 foreach ($this->processors as $p) {
41 $p->purge();
42 }
43 }
44
49 public function readComponentDefinitions(): void
50 {
51 foreach ($this->getComponents() as [$type, $component, $path]) {
52 $file = $this->readFile($path);
53 foreach ($this->processors as $processor) {
54 $processor->beginComponent($component, $type);
55 }
56 $this->parseComponentXML($type, $component, $file);
57 foreach ($this->processors as $processor) {
58 $processor->endComponent($component, $type);
59 }
60 }
61 }
62
63 protected function readFile(string $path): string
64 {
65 if (!file_exists($path)) {
66 throw new \InvalidArgumentException(
67 "Cannot find file $path."
68 );
69 }
70 return file_get_contents($path);
71 }
72
73 protected function parseComponentXML(string $type, string $component, string $xml): void
74 {
75 $xml_parser = xml_parser_create("UTF-8");
76 xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
77 xml_set_element_handler($xml_parser, $this->beginTag(...), $this->endTag(...));
78 if (!xml_parse($xml_parser, $xml)) {
79 $code = xml_get_error_code($xml_parser);
80 $line = xml_get_current_line_number($xml_parser);
81 $col = xml_get_current_column_number($xml_parser);
82 $msg = xml_error_string($code);
83 throw new \InvalidArgumentException(
84 "Error $code component xml of $type/$component, on line $line in column $col: $msg"
85 );
86 }
87 }
88
89 public function beginTag($_, string $name, array $attributes): void
90 {
91 foreach ($this->processors as $processor) {
92 $processor->beginTag($name, $attributes);
93 }
94 }
95
96 public function endTag($_, string $name): void
97 {
98 foreach ($this->processors as $processor) {
99 $processor->endTag($name);
100 }
101 }
102
106 protected function getComponents(): \Iterator
107 {
108 foreach (glob("components/*") as $component_namespace) {
109 $short_namespace = basename($component_namespace);
110 foreach ($this->getComponentInfo("components/" . $short_namespace, "module.xml") as $i) {
111 yield $i;
112 }
113 foreach ($this->getComponentInfo("components/" . $short_namespace, "service.xml") as $i) {
114 yield $i;
115 }
116 foreach ($this->getComponentInfo("components/" . $short_namespace, "component.xml") as $i) {
117 yield $i;
118 }
119 }
120 }
121
125 protected function getComponentInfo(string $type, string $name): \Iterator
126 {
127 $dir = __DIR__ . "/../../../../" . $type;
128 foreach ($this->getComponentPaths($dir, $name) as $c) {
129 yield [
130 $type,
131 $c,
132 realpath($dir . "/" . $c . "/" . $name)
133 ];
134 }
135 }
136
140 protected function getComponentPaths(string $root, string $name): \Iterator
141 {
142 $dir = opendir($root);
143 while ($sub = readdir($dir)) {
144 if ($sub === "." || $sub === "..") {
145 continue;
146 }
147 if (!is_dir($root . "/" . $sub)) {
148 continue;
149 }
150 if (!is_file($root . "/" . $sub . "/" . $name)) {
151 continue;
152 }
153 yield $sub;
154 }
155 }
156}
beginTag($_, string $name, array $attributes)
readComponentDefinitions()
This reads the component.xml of all components in the core and processes them with the provided proce...
__construct(ilComponentDefinitionProcessor ... $processor)
purge()
This methods is supposed to purge existing data in the registered processor.
parseComponentXML(string $type, string $component, string $xml)
$c
Definition: deliver.php:25
An ilComponentDefinitionProcessor processes some attributes from a component.xml (i....
$path
Definition: ltiservices.php:30